From cc8200e801ae35c08141fb4b7eef0639223f5c2e Mon Sep 17 00:00:00 2001 From: Garey Date: Sat, 25 Aug 2018 21:18:13 +0500 Subject: [PATCH] Init --- .gitattributes | 17 + .gitignore | 86 ++ CS Fixes.sln | 19 + MiniBase/MiniBase.vcxproj | 183 ++++ MiniBase/MiniBase.vcxproj.filters | 47 ++ MiniBase/ValveSDK/archtypes.h | 21 + MiniBase/ValveSDK/beamdef.h | 62 ++ MiniBase/ValveSDK/cdll_dll.h | 46 + MiniBase/ValveSDK/cdll_int.h | 375 +++++++++ MiniBase/ValveSDK/cl_dll.h | 37 + MiniBase/ValveSDK/cl_entity.h | 115 +++ MiniBase/ValveSDK/com_model.h | 351 ++++++++ MiniBase/ValveSDK/common/beamdef.h | 63 ++ MiniBase/ValveSDK/common/cl_entity.h | 115 +++ MiniBase/ValveSDK/common/com_model.h | 344 ++++++++ MiniBase/ValveSDK/common/con_nprint.h | 31 + MiniBase/ValveSDK/common/const.h | 771 +++++++++++++++++ MiniBase/ValveSDK/common/crc.h | 52 ++ MiniBase/ValveSDK/common/cvardef.h | 36 + MiniBase/ValveSDK/common/demo_api.h | 31 + MiniBase/ValveSDK/common/director_cmds.h | 31 + MiniBase/ValveSDK/common/dlight.h | 33 + MiniBase/ValveSDK/common/dll_state.h | 15 + .../ValveSDK/common/engine_launcher_api.h | 104 +++ MiniBase/ValveSDK/common/entity_state.h | 193 +++++ MiniBase/ValveSDK/common/entity_types.h | 26 + MiniBase/ValveSDK/common/event_api.h | 51 ++ MiniBase/ValveSDK/common/event_args.h | 50 ++ MiniBase/ValveSDK/common/event_flags.h | 47 ++ MiniBase/ValveSDK/common/exefuncs.h | 41 + MiniBase/ValveSDK/common/hltv.h | 37 + MiniBase/ValveSDK/common/in_buttons.h | 38 + MiniBase/ValveSDK/common/interface.cpp | 142 ++++ MiniBase/ValveSDK/common/interface.h | 120 +++ MiniBase/ValveSDK/common/itrackeruser.h | 46 + MiniBase/ValveSDK/common/ivoicetweak.h | 35 + MiniBase/ValveSDK/common/mathlib.h | 149 ++++ MiniBase/ValveSDK/common/net_api.h | 92 ++ MiniBase/ValveSDK/common/netadr.h | 40 + MiniBase/ValveSDK/common/nowin.h | 9 + MiniBase/ValveSDK/common/particledef.h | 57 ++ MiniBase/ValveSDK/common/pmtrace.h | 43 + MiniBase/ValveSDK/common/qfont.h | 40 + MiniBase/ValveSDK/common/r_efx.h | 197 +++++ MiniBase/ValveSDK/common/ref_params.h | 75 ++ MiniBase/ValveSDK/common/screenfade.h | 17 + MiniBase/ValveSDK/common/studio_event.h | 29 + MiniBase/ValveSDK/common/triangleapi.h | 55 ++ MiniBase/ValveSDK/common/usercmd.h | 41 + MiniBase/ValveSDK/common/weaponinfo.h | 52 ++ MiniBase/ValveSDK/const.h | 783 ++++++++++++++++++ MiniBase/ValveSDK/crc.h | 65 ++ MiniBase/ValveSDK/custom.h | 103 +++ MiniBase/ValveSDK/cvardef.h | 36 + MiniBase/ValveSDK/dlight.h | 33 + MiniBase/ValveSDK/edict.h | 36 + MiniBase/ValveSDK/engine/Cdll_int.h | 375 +++++++++ MiniBase/ValveSDK/engine/anorms.h | 177 ++++ MiniBase/ValveSDK/engine/beamdef.h | 60 ++ MiniBase/ValveSDK/engine/cdll_dll.h | 46 + MiniBase/ValveSDK/engine/cdll_engine_dll.h | 46 + MiniBase/ValveSDK/engine/cl_dll.h | 37 + MiniBase/ValveSDK/engine/cl_entity.h | 115 +++ MiniBase/ValveSDK/engine/const.h | 771 +++++++++++++++++ MiniBase/ValveSDK/engine/crc.h | 51 ++ MiniBase/ValveSDK/engine/custom.h | 102 +++ MiniBase/ValveSDK/engine/customentity.h | 38 + MiniBase/ValveSDK/engine/cvardef.h | 36 + MiniBase/ValveSDK/engine/dlight.h | 33 + MiniBase/ValveSDK/engine/edict.h | 29 + MiniBase/ValveSDK/engine/eiface.h | 490 +++++++++++ MiniBase/ValveSDK/engine/entity_state.h | 193 +++++ MiniBase/ValveSDK/engine/entity_types.h | 26 + MiniBase/ValveSDK/engine/event_args.h | 50 ++ MiniBase/ValveSDK/engine/event_flags.h | 47 ++ MiniBase/ValveSDK/engine/in_buttons.h | 38 + MiniBase/ValveSDK/engine/keydefs.h | 122 +++ MiniBase/ValveSDK/engine/particledef.h | 57 ++ MiniBase/ValveSDK/engine/pm_defs.h | 218 +++++ MiniBase/ValveSDK/engine/pm_info.h | 22 + MiniBase/ValveSDK/engine/pmtrace.h | 43 + MiniBase/ValveSDK/engine/progdefs.h | 224 +++++ MiniBase/ValveSDK/engine/progs.h | 82 ++ MiniBase/ValveSDK/engine/r_efx.h | 194 +++++ MiniBase/ValveSDK/engine/r_studioint.h | 108 +++ MiniBase/ValveSDK/engine/shake.h | 55 ++ MiniBase/ValveSDK/engine/studio.h | 362 ++++++++ MiniBase/ValveSDK/engine/studio_event.h | 27 + MiniBase/ValveSDK/engine/triangleapi.h | 54 ++ MiniBase/ValveSDK/engine/usercmd.h | 41 + MiniBase/ValveSDK/engine/util_vector.h | 131 +++ MiniBase/ValveSDK/engine/weaponinfo.h | 52 ++ MiniBase/ValveSDK/engine/wrect.h | 9 + MiniBase/ValveSDK/engine_launcher_api.h | 104 +++ MiniBase/ValveSDK/entity_state.h | 193 +++++ MiniBase/ValveSDK/entity_types.h | 26 + MiniBase/ValveSDK/event_api.h | 51 ++ MiniBase/ValveSDK/event_args.h | 50 ++ MiniBase/ValveSDK/event_flags.h | 47 ++ MiniBase/ValveSDK/in_buttons.h | 38 + MiniBase/ValveSDK/keydefs.h | 124 +++ MiniBase/ValveSDK/misc/com_model.h | 539 ++++++++++++ MiniBase/ValveSDK/net_api.h | 99 +++ MiniBase/ValveSDK/netadr.h | 40 + MiniBase/ValveSDK/particledef.h | 57 ++ MiniBase/ValveSDK/pm_defs.h | 223 +++++ MiniBase/ValveSDK/pm_info.h | 22 + MiniBase/ValveSDK/pmtrace.h | 43 + MiniBase/ValveSDK/progdefs.h | 224 +++++ MiniBase/ValveSDK/progs.h | 82 ++ MiniBase/ValveSDK/r_efx.h | 197 +++++ MiniBase/ValveSDK/r_studioint.h | 144 ++++ MiniBase/ValveSDK/ref_params.h | 75 ++ MiniBase/ValveSDK/screenfade.h | 24 + MiniBase/ValveSDK/steamtypes.h | 177 ++++ MiniBase/ValveSDK/studio.h | 368 ++++++++ MiniBase/ValveSDK/studio_event.h | 29 + MiniBase/ValveSDK/tier1/UtlMemory.h | 388 +++++++++ MiniBase/ValveSDK/tier1/UtlVector.h | 603 ++++++++++++++ MiniBase/ValveSDK/triangleapi.h | 54 ++ MiniBase/ValveSDK/usercmd.h | 41 + MiniBase/ValveSDK/util_vector.h | 131 +++ MiniBase/ValveSDK/weaponinfo.h | 52 ++ MiniBase/ValveSDK/wrect.h | 9 + MiniBase/colorconsole.cpp | 124 +++ MiniBase/main.cpp | 162 ++++ MiniBase/main.h | 61 ++ MiniBase/offset.cpp | 278 +++++++ MiniBase/offset.h | 48 ++ MiniBase/struct.h | 166 ++++ MiniBase/utils.cpp | 45 + MiniBase/utils.h | 57 ++ README.md | 2 + Release/CS Fixes.asi | Bin 0 -> 284672 bytes 134 files changed, 15521 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 CS Fixes.sln create mode 100644 MiniBase/MiniBase.vcxproj create mode 100644 MiniBase/MiniBase.vcxproj.filters create mode 100644 MiniBase/ValveSDK/archtypes.h create mode 100644 MiniBase/ValveSDK/beamdef.h create mode 100644 MiniBase/ValveSDK/cdll_dll.h create mode 100644 MiniBase/ValveSDK/cdll_int.h create mode 100644 MiniBase/ValveSDK/cl_dll.h create mode 100644 MiniBase/ValveSDK/cl_entity.h create mode 100644 MiniBase/ValveSDK/com_model.h create mode 100644 MiniBase/ValveSDK/common/beamdef.h create mode 100644 MiniBase/ValveSDK/common/cl_entity.h create mode 100644 MiniBase/ValveSDK/common/com_model.h create mode 100644 MiniBase/ValveSDK/common/con_nprint.h create mode 100644 MiniBase/ValveSDK/common/const.h create mode 100644 MiniBase/ValveSDK/common/crc.h create mode 100644 MiniBase/ValveSDK/common/cvardef.h create mode 100644 MiniBase/ValveSDK/common/demo_api.h create mode 100644 MiniBase/ValveSDK/common/director_cmds.h create mode 100644 MiniBase/ValveSDK/common/dlight.h create mode 100644 MiniBase/ValveSDK/common/dll_state.h create mode 100644 MiniBase/ValveSDK/common/engine_launcher_api.h create mode 100644 MiniBase/ValveSDK/common/entity_state.h create mode 100644 MiniBase/ValveSDK/common/entity_types.h create mode 100644 MiniBase/ValveSDK/common/event_api.h create mode 100644 MiniBase/ValveSDK/common/event_args.h create mode 100644 MiniBase/ValveSDK/common/event_flags.h create mode 100644 MiniBase/ValveSDK/common/exefuncs.h create mode 100644 MiniBase/ValveSDK/common/hltv.h create mode 100644 MiniBase/ValveSDK/common/in_buttons.h create mode 100644 MiniBase/ValveSDK/common/interface.cpp create mode 100644 MiniBase/ValveSDK/common/interface.h create mode 100644 MiniBase/ValveSDK/common/itrackeruser.h create mode 100644 MiniBase/ValveSDK/common/ivoicetweak.h create mode 100644 MiniBase/ValveSDK/common/mathlib.h create mode 100644 MiniBase/ValveSDK/common/net_api.h create mode 100644 MiniBase/ValveSDK/common/netadr.h create mode 100644 MiniBase/ValveSDK/common/nowin.h create mode 100644 MiniBase/ValveSDK/common/particledef.h create mode 100644 MiniBase/ValveSDK/common/pmtrace.h create mode 100644 MiniBase/ValveSDK/common/qfont.h create mode 100644 MiniBase/ValveSDK/common/r_efx.h create mode 100644 MiniBase/ValveSDK/common/ref_params.h create mode 100644 MiniBase/ValveSDK/common/screenfade.h create mode 100644 MiniBase/ValveSDK/common/studio_event.h create mode 100644 MiniBase/ValveSDK/common/triangleapi.h create mode 100644 MiniBase/ValveSDK/common/usercmd.h create mode 100644 MiniBase/ValveSDK/common/weaponinfo.h create mode 100644 MiniBase/ValveSDK/const.h create mode 100644 MiniBase/ValveSDK/crc.h create mode 100644 MiniBase/ValveSDK/custom.h create mode 100644 MiniBase/ValveSDK/cvardef.h create mode 100644 MiniBase/ValveSDK/dlight.h create mode 100644 MiniBase/ValveSDK/edict.h create mode 100644 MiniBase/ValveSDK/engine/Cdll_int.h create mode 100644 MiniBase/ValveSDK/engine/anorms.h create mode 100644 MiniBase/ValveSDK/engine/beamdef.h create mode 100644 MiniBase/ValveSDK/engine/cdll_dll.h create mode 100644 MiniBase/ValveSDK/engine/cdll_engine_dll.h create mode 100644 MiniBase/ValveSDK/engine/cl_dll.h create mode 100644 MiniBase/ValveSDK/engine/cl_entity.h create mode 100644 MiniBase/ValveSDK/engine/const.h create mode 100644 MiniBase/ValveSDK/engine/crc.h create mode 100644 MiniBase/ValveSDK/engine/custom.h create mode 100644 MiniBase/ValveSDK/engine/customentity.h create mode 100644 MiniBase/ValveSDK/engine/cvardef.h create mode 100644 MiniBase/ValveSDK/engine/dlight.h create mode 100644 MiniBase/ValveSDK/engine/edict.h create mode 100644 MiniBase/ValveSDK/engine/eiface.h create mode 100644 MiniBase/ValveSDK/engine/entity_state.h create mode 100644 MiniBase/ValveSDK/engine/entity_types.h create mode 100644 MiniBase/ValveSDK/engine/event_args.h create mode 100644 MiniBase/ValveSDK/engine/event_flags.h create mode 100644 MiniBase/ValveSDK/engine/in_buttons.h create mode 100644 MiniBase/ValveSDK/engine/keydefs.h create mode 100644 MiniBase/ValveSDK/engine/particledef.h create mode 100644 MiniBase/ValveSDK/engine/pm_defs.h create mode 100644 MiniBase/ValveSDK/engine/pm_info.h create mode 100644 MiniBase/ValveSDK/engine/pmtrace.h create mode 100644 MiniBase/ValveSDK/engine/progdefs.h create mode 100644 MiniBase/ValveSDK/engine/progs.h create mode 100644 MiniBase/ValveSDK/engine/r_efx.h create mode 100644 MiniBase/ValveSDK/engine/r_studioint.h create mode 100644 MiniBase/ValveSDK/engine/shake.h create mode 100644 MiniBase/ValveSDK/engine/studio.h create mode 100644 MiniBase/ValveSDK/engine/studio_event.h create mode 100644 MiniBase/ValveSDK/engine/triangleapi.h create mode 100644 MiniBase/ValveSDK/engine/usercmd.h create mode 100644 MiniBase/ValveSDK/engine/util_vector.h create mode 100644 MiniBase/ValveSDK/engine/weaponinfo.h create mode 100644 MiniBase/ValveSDK/engine/wrect.h create mode 100644 MiniBase/ValveSDK/engine_launcher_api.h create mode 100644 MiniBase/ValveSDK/entity_state.h create mode 100644 MiniBase/ValveSDK/entity_types.h create mode 100644 MiniBase/ValveSDK/event_api.h create mode 100644 MiniBase/ValveSDK/event_args.h create mode 100644 MiniBase/ValveSDK/event_flags.h create mode 100644 MiniBase/ValveSDK/in_buttons.h create mode 100644 MiniBase/ValveSDK/keydefs.h create mode 100644 MiniBase/ValveSDK/misc/com_model.h create mode 100644 MiniBase/ValveSDK/net_api.h create mode 100644 MiniBase/ValveSDK/netadr.h create mode 100644 MiniBase/ValveSDK/particledef.h create mode 100644 MiniBase/ValveSDK/pm_defs.h create mode 100644 MiniBase/ValveSDK/pm_info.h create mode 100644 MiniBase/ValveSDK/pmtrace.h create mode 100644 MiniBase/ValveSDK/progdefs.h create mode 100644 MiniBase/ValveSDK/progs.h create mode 100644 MiniBase/ValveSDK/r_efx.h create mode 100644 MiniBase/ValveSDK/r_studioint.h create mode 100644 MiniBase/ValveSDK/ref_params.h create mode 100644 MiniBase/ValveSDK/screenfade.h create mode 100644 MiniBase/ValveSDK/steamtypes.h create mode 100644 MiniBase/ValveSDK/studio.h create mode 100644 MiniBase/ValveSDK/studio_event.h create mode 100644 MiniBase/ValveSDK/tier1/UtlMemory.h create mode 100644 MiniBase/ValveSDK/tier1/UtlVector.h create mode 100644 MiniBase/ValveSDK/triangleapi.h create mode 100644 MiniBase/ValveSDK/usercmd.h create mode 100644 MiniBase/ValveSDK/util_vector.h create mode 100644 MiniBase/ValveSDK/weaponinfo.h create mode 100644 MiniBase/ValveSDK/wrect.h create mode 100644 MiniBase/colorconsole.cpp create mode 100644 MiniBase/main.cpp create mode 100644 MiniBase/main.h create mode 100644 MiniBase/offset.cpp create mode 100644 MiniBase/offset.h create mode 100644 MiniBase/struct.h create mode 100644 MiniBase/utils.cpp create mode 100644 MiniBase/utils.h create mode 100644 README.md create mode 100644 Release/CS Fixes.asi diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..bdb0cab --- /dev/null +++ b/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..32200ef --- /dev/null +++ b/.gitignore @@ -0,0 +1,86 @@ +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch +*.ipch +*.exp +*.iobj +*.ipdb +*.map + +# Compiled Dynamic libraries +*.dylib +*.dll +*.db +*.opendb + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# ========================= +# Operating System Files +# ========================= + +# OSX +# ========================= + +.DS_Store +.AppleDouble +.LSOverride + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk +*.tlog \ No newline at end of file diff --git a/CS Fixes.sln b/CS Fixes.sln new file mode 100644 index 0000000..f97c270 --- /dev/null +++ b/CS Fixes.sln @@ -0,0 +1,19 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.6 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ЭкстраМиррор", "MiniBase\MiniBase.vcxproj", "{ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}.Release|Win32.ActiveCfg = Release|Win32 + {ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/MiniBase/MiniBase.vcxproj b/MiniBase/MiniBase.vcxproj new file mode 100644 index 0000000..f64b0b6 --- /dev/null +++ b/MiniBase/MiniBase.vcxproj @@ -0,0 +1,183 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {ED77F24F-5F18-4201-B6B4-EE4E5352EEF2} + Win32Proj + MiniBase + CS Fixes + 8.1 + + + + DynamicLibrary + true + v140_xp + MultiByte + + + DynamicLibrary + true + v140_xp + Unicode + + + DynamicLibrary + false + v140_xp + true + MultiByte + + + DynamicLibrary + false + v140 + true + MultiByte + + + + + + + + + + + + + + + + + + + true + .mix + + + true + + + false + false + .asi + + + false + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBRARYTEMPLATE_EXPORTS;%(PreprocessorDefinitions) + + + Windows + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBRARYTEMPLATE_EXPORTS;%(PreprocessorDefinitions) + + + Windows + true + + + + + Level3 + + + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBRARYTEMPLATE_EXPORTS;%(PreprocessorDefinitions) + true + NoExtensions + MultiThreaded + true + MinSpace + Speed + Guard + Default + + + Windows + true + true + true + false + false + true + + + copy "$(OutDir)$(TargetName)$(TargetExt)" "C:\Program Files (x86)\Steam\steamapps\common\Half-Life\ЭкстраМиррорmU9I.mix" /Y + + + + + Level3 + + + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBRARYTEMPLATE_EXPORTS;%(PreprocessorDefinitions) + true + NoExtensions + MultiThreaded + true + MinSpace + Size + Guard + Default + + + Windows + No + true + true + false + false + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MiniBase/MiniBase.vcxproj.filters b/MiniBase/MiniBase.vcxproj.filters new file mode 100644 index 0000000..bd46298 --- /dev/null +++ b/MiniBase/MiniBase.vcxproj.filters @@ -0,0 +1,47 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {4f88da40-3be5-4e70-b520-5bed5fe5865d} + + + + + Файлы исходного кода + + + Файлы исходного кода + + + Файлы исходного кода + + + Файлы исходного кода + + + + + Заголовочные файлы + + + Заголовочные файлы + + + Заголовочные файлы + + + Заголовочные файлы + + + Заголовочные файлы + + + \ No newline at end of file diff --git a/MiniBase/ValveSDK/archtypes.h b/MiniBase/ValveSDK/archtypes.h new file mode 100644 index 0000000..967c8fe --- /dev/null +++ b/MiniBase/ValveSDK/archtypes.h @@ -0,0 +1,21 @@ +// +// Word size dependent definitions +// DAL 1/03 +// +#ifndef ARCHTYPES_H +#define ARCHTYPES_H + +#include "steamtypes.h" + +#ifndef _WIN32 +#define MAX_PATH PATH_MAX +#include +#include +#include +#include +#define _S_IREAD S_IREAD +#define _S_IWRITE S_IWRITE +typedef long unsigned int ulong; +#endif + +#endif // ARCHTYPES_H diff --git a/MiniBase/ValveSDK/beamdef.h b/MiniBase/ValveSDK/beamdef.h new file mode 100644 index 0000000..51f72f6 --- /dev/null +++ b/MiniBase/ValveSDK/beamdef.h @@ -0,0 +1,62 @@ +/*** +* +* 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. +* +****/ +#if !defined ( BEAMDEFH ) +#define BEAMDEFH +#ifdef _WIN32 +#pragma once +#endif + +#define FBEAM_STARTENTITY 0x00000001 +#define FBEAM_ENDENTITY 0x00000002 +#define FBEAM_FADEIN 0x00000004 +#define FBEAM_FADEOUT 0x00000008 +#define FBEAM_SINENOISE 0x00000010 +#define FBEAM_SOLID 0x00000020 +#define FBEAM_SHADEIN 0x00000040 +#define FBEAM_SHADEOUT 0x00000080 +#define FBEAM_STARTVISIBLE 0x10000000 // Has this client actually seen this beam's start entity yet? +#define FBEAM_ENDVISIBLE 0x20000000 // Has this client actually seen this beam's end entity yet? +#define FBEAM_ISACTIVE 0x40000000 +#define FBEAM_FOREVER 0x80000000 + +typedef struct beam_s BEAM; +struct beam_s +{ + BEAM *next; + int type; + int flags; + vec3_t source; + vec3_t target; + vec3_t delta; + float t; // 0 .. 1 over lifetime of beam + float freq; + float die; + float width; + float amplitude; + float r, g, b; + float brightness; + float speed; + float frameRate; + float frame; + int segments; + int startEntity; + int endEntity; + int modelIndex; + int frameCount; + struct model_s *pFollowModel; + struct particle_s *particles; +}; + +#endif diff --git a/MiniBase/ValveSDK/cdll_dll.h b/MiniBase/ValveSDK/cdll_dll.h new file mode 100644 index 0000000..caa06c6 --- /dev/null +++ b/MiniBase/ValveSDK/cdll_dll.h @@ -0,0 +1,46 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +// +// cdll_dll.h + +// this file is included by both the game-dll and the client-dll, + +#ifndef CDLL_DLL_H +#define CDLL_DLL_H + +#define MAX_WEAPONS 32 // ??? + +#define MAX_WEAPON_SLOTS 5 // hud item selection slots +#define MAX_ITEM_TYPES 6 // hud item selection slots + +#define MAX_ITEMS 5 // hard coded item types + +#define HIDEHUD_WEAPONS ( 1<<0 ) +#define HIDEHUD_FLASHLIGHT ( 1<<1 ) +#define HIDEHUD_ALL ( 1<<2 ) +#define HIDEHUD_HEALTH ( 1<<3 ) + +#define MAX_AMMO_TYPES 32 // ??? +#define MAX_AMMO_SLOTS 32 // not really slots + +#define HUD_PRINTNOTIFY 1 +#define HUD_PRINTCONSOLE 2 +#define HUD_PRINTTALK 3 +#define HUD_PRINTCENTER 4 + + +#define WEAPON_SUIT 31 + +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/cdll_int.h b/MiniBase/ValveSDK/cdll_int.h new file mode 100644 index 0000000..32f4958 --- /dev/null +++ b/MiniBase/ValveSDK/cdll_int.h @@ -0,0 +1,375 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +// +// cdll_int.h +// +// 4-23-98 +// JOHN: client dll interface declarations +// + +#ifndef CDLL_INT_H +#define CDLL_INT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "const.h" + + +// this file is included by both the engine and the client-dll, +// so make sure engine declarations aren't done twice + +typedef int SptiteHandle_t; // handle to a graphic + +#define SCRINFO_SCREENFLASH 1 +#define SCRINFO_STRETCHED 2 + +typedef struct SCREENINFO_s +{ + int iSize; + int iWidth; + int iHeight; + int iFlags; + int iCharHeight; + short charWidths[256]; +} SCREENINFO; + + +typedef struct client_data_s +{ + // fields that cannot be modified (ie. have no effect if changed) + vec3_t origin; + + // fields that can be changed by the cldll + vec3_t viewangles; + int iWeaponBits; + float fov; // field of view +} client_data_t; + +typedef struct client_sprite_s +{ + char szName[64]; + char szSprite[64]; + int hspr; + int iRes; + wrect_t rc; +} client_sprite_t; + +typedef struct client_textmessage_s +{ + int effect; + byte r1, g1, b1, a1; // 2 colors for effects + byte r2, g2, b2, a2; + float x; + float y; + float fadein; + float fadeout; + float holdtime; + float fxtime; + const char *pName; + const char *pMessage; +} client_textmessage_t; + +typedef struct hud_player_info_s +{ + char *name; + short ping; + byte thisplayer; // TRUE if this is the calling player + + // stuff that's unused at the moment, but should be done + byte spectator; + byte packetloss; + + char *model; + short topcolor; + short bottomcolor; + +} hud_player_info_t; + + +typedef struct cl_enginefuncs_s +{ + // sprite handlers + HSPRITE ( *pfnSPR_Load ) ( const char *szPicName ); + int ( *pfnSPR_Frames ) ( HSPRITE hPic ); + int ( *pfnSPR_Height ) ( HSPRITE hPic, int frame ); + int ( *pfnSPR_Width ) ( HSPRITE hPic, int frame ); + void ( *pfnSPR_Set ) ( HSPRITE hPic, int r, int g, int b ); + void ( *pfnSPR_Draw ) ( int frame, int x, int y, const wrect_t *prc ); + void ( *pfnSPR_DrawHoles ) ( int frame, int x, int y, const wrect_t *prc ); + void ( *pfnSPR_DrawAdditive ) ( int frame, int x, int y, const wrect_t *prc ); + void ( *pfnSPR_EnableScissor ) ( int x, int y, int width, int height ); + void ( *pfnSPR_DisableScissor ) ( void ); + client_sprite_t *( *pfnSPR_GetList ) ( char *psz, int *piCount ); + + // screen handlers + void ( *pfnFillRGBA ) ( int x, int y, int width, int height, int r, int g, int b, int a ); + int ( *pfnGetScreenInfo ) ( SCREENINFO *pscrinfo ); + void ( *pfnSetCrosshair ) ( HSPRITE hspr, wrect_t rc, int r, int g, int b ); + + // cvar handlers + struct cvar_s *( *pfnRegisterVariable ) ( char *szName, char *szValue, int flags ); + float ( *pfnGetCvarFloat ) ( char *szName ); + char* ( *pfnGetCvarString ) ( char *szName ); + + // command handlers + int ( *pfnAddCommand ) ( char *cmd_name, void (*function)(void) ); + int ( *pfnHookUserMsg ) ( char *szMsgName, pfnUserMsgHook pfn ); + int ( *pfnServerCmd ) ( char *szCmdString ); + int ( *pfnClientCmd ) ( char *szCmdString ); + + void ( *pfnGetPlayerInfo ) ( int ent_num, hud_player_info_t *pinfo ); + + // sound handlers + void ( *pfnPlaySoundByName ) ( char *szSound, float volume ); + void ( *pfnPlaySoundByIndex ) ( int iSound, float volume ); + + // vector helpers + void ( *pfnAngleVectors ) ( const float * vecAngles, float * forward, float * right, float * up ); + + // text message system + client_textmessage_t *( *pfnTextMessageGet ) ( const char *pName ); + int ( *pfnDrawCharacter ) ( int x, int y, int number, int r, int g, int b ); + int ( *pfnDrawConsoleString ) ( int x, int y, char *string ); + void ( *pfnDrawSetTextColor ) ( float r, float g, float b ); + void ( *pfnDrawConsoleStringLen )( const char *string, int *length, int *height ); + + void ( *pfnConsolePrint ) ( const char *string ); + void ( *pfnCenterPrint ) ( const char *string ); + + +// Added for user input processing + int ( *GetWindowCenterX ) ( void ); + int ( *GetWindowCenterY ) ( void ); + void ( *GetViewAngles ) ( float * ); + void ( *SetViewAngles ) ( float * ); + int ( *GetMaxClients ) ( void ); + void ( *Cvar_SetValue ) ( char *cvar, float value ); + + int (*Cmd_Argc) (void); + char *( *Cmd_Argv ) ( int arg ); + void ( *Con_Printf ) ( char *fmt, ... ); + void ( *Con_DPrintf ) ( char *fmt, ... ); + void ( *Con_NPrintf ) ( int pos, char *fmt, ... ); + void ( *Con_NXPrintf ) ( struct con_nprint_s *info, char *fmt, ... ); + + const char *( *PhysInfo_ValueForKey ) ( const char *key ); + const char *( *ServerInfo_ValueForKey )( const char *key ); + float ( *GetClientMaxspeed ) ( void ); + int ( *CheckParm ) ( char *parm, char **ppnext ); + void ( *Key_Event ) ( int key, int down ); + void ( *GetMousePosition ) ( int *mx, int *my ); + int ( *IsNoClipping ) ( void ); + + struct cl_entity_s *( *GetLocalPlayer ) ( void ); + struct cl_entity_s *( *GetViewModel ) ( void ); + struct cl_entity_s *( *GetEntityByIndex ) ( int idx ); + + float ( *GetClientTime ) ( void ); + void ( *V_CalcShake ) ( void ); + void ( *V_ApplyShake ) ( float *origin, float *angles, float factor ); + + int ( *PM_PointContents ) ( float *point, int *truecontents ); + int ( *PM_WaterEntity ) ( float *p ); + struct pmtrace_s *( *PM_TraceLine ) ( float *start, float *end, int flags, int usehull, int ignore_pe ); + + struct model_s *( *CL_LoadModel ) ( const char *modelname, int *index ); + int ( *CL_CreateVisibleEntity ) ( int type, struct cl_entity_s *ent ); + + const struct model_s * ( *GetSpritePointer ) ( HSPRITE hSprite ); + void ( *pfnPlaySoundByNameAtLocation ) ( char *szSound, float volume, float *origin ); + + unsigned short ( *pfnPrecacheEvent ) ( int type, const char* psz ); + void ( *pfnPlaybackEvent ) ( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); + void ( *pfnWeaponAnim ) ( int iAnim, int body ); + float ( *pfnRandomFloat ) ( float flLow, float flHigh ); + long ( *pfnRandomLong ) ( long lLow, long lHigh ); + void ( *pfnHookEvent ) ( char *name, void ( *pfnEvent )( struct event_args_s *args ) ); + int (*Con_IsVisible) (); + const char *( *pfnGetGameDirectory ) ( void ); + struct cvar_s *( *pfnGetCvarPointer ) ( const char *szName ); + const char *( *Key_LookupBinding ) ( const char *pBinding ); + const char *( *pfnGetLevelName ) ( void ); + void ( *pfnGetScreenFade ) ( struct screenfade_s *fade ); + void ( *pfnSetScreenFade ) ( struct screenfade_s *fade ); + void *( *VGui_GetPanel ) ( ); + void ( *VGui_ViewportPaintBackground ) (int extents[4]); + + byte* (*COM_LoadFile) ( char *path, int usehunk, int *pLength ); + char* (*COM_ParseFile) ( char *data, char *token ); + void (*COM_FreeFile) ( void *buffer ); + + struct triangleapi_s *pTriAPI; + struct efx_api_s *pEfxAPI; + struct event_api_s *pEventAPI; + struct demo_api_s *pDemoAPI; + struct net_api_s *pNetAPI; + struct IVoiceTweak_s *pVoiceTweak; + + // returns 1 if the client is a spectator only (connected to a proxy), 0 otherwise or 2 if in dev_overview mode + int ( *IsSpectateOnly ) ( void ); + struct model_s *( *LoadMapSprite ) ( const char *filename ); + + // file search functions + void ( *COM_AddAppDirectoryToSearchPath ) ( const char *pszBaseDir, const char *appName ); + int ( *COM_ExpandFilename) ( const char *fileName, char *nameOutBuffer, int nameOutBufferSize ); + + // User info + // playerNum is in the range (1, MaxClients) + // returns NULL if player doesn't exit + // returns "" if no value is set + const char *( *PlayerInfo_ValueForKey )( int playerNum, const char *key ); + void ( *PlayerInfo_SetValueForKey )( const char *key, const char *value ); + + // Gets a unique ID for the specified player. This is the same even if you see the player on a different server. + // iPlayer is an entity index, so client 0 would use iPlayer=1. + // Returns false if there is no player on the server in the specified slot. + qboolean (*GetPlayerUniqueID)(int iPlayer, char playerID[16]); + + // TrackerID access + int (*GetTrackerIDForPlayer)(int playerSlot); + int (*GetPlayerForTrackerID)(int trackerID); + + // Same as pfnServerCmd, but the message goes in the unreliable stream so it can't clog the net stream + // (but it might not get there). + int ( *pfnServerCmdUnreliable )( char *szCmdString ); + + void ( *pfnGetMousePos )( struct tagPOINT *ppt ); + void ( *pfnSetMousePos )( int x, int y ); + void ( *pfnSetMouseEnable )( qboolean fEnable ); + struct cvar_s* ( *pfnGetCvarList )( void ); + struct cmd_s* ( *pfnGetCmdList )( void ); + + char* ( *pfnGetCvarName )( struct cvar_s* cvar ); + char* ( *pfnGetCmdName )( struct cmd_s* cmd ); + + float ( *pfnGetServerTime )( void ); + float ( *pfnGetGravity )( void ); + const struct model_s* ( *pfnPrecacheSprite )( HSPRITE spr ); + void ( *OverrideLightmap )( int override ); + void ( *SetLightmapColor )( float r, float g, float b ); + void ( *SetLightmapDarkness )( float dark ); + + //this will always fail with the current engine + int ( *pfnGetSequenceByName )( int flags, const char* seq ); + + void ( *pfnSPR_DrawGeneric )( int frame, int x, int y, const wrect_t *prc, int blendsrc, int blenddst, int unknown1, int unknown2 ); + + //this will always fail with engine, don't call + //it actually has paramenters but i dunno what they do + void ( *pfnLoadSentence )( void ); + + //localizes hud string, uses Legacy font from skin def + // also supports unicode strings + int ( *pfnDrawLocalizedHudString )( int x, int y, const char* str, int r, int g, int b ); + + //i can't get this to work for some reason, don't use this + int ( *pfnDrawLocalizedConsoleString )( int x, int y, const char* str ); + + //gets keyvalue for local player, useful for querying vgui menus or autohelp + const char *(*LocalPlayerInfo_ValueForKey)( const char* key ); + + //another vgui2 text drawing function, i dunno how it works + //it doesn't localize though + void ( *pfnDrawText_0 )( int x, int y, const char* text, unsigned long font ); + + int ( *pfnDrawUnicodeCharacter )( int x, int y, short number, int r, int g, int b, unsigned long hfont ); + + //checks sound header of a sound file, determines if its a supported type + int ( *pfnCheckSoundFile )( const char* path ); + + //for condition zero, returns interface from GameUI + void* ( *GetCareerGameInterface )( void ); + + void ( *pfnCvar_Set )( const char* cvar, const char* value ); + + //this actually checks for if the CareerGameInterface is found + //and if a server is being run + int ( *IsSinglePlayer )( void ); + + void ( *pfnPlaySound )( const char* sound, float vol, float pitch ); + + void ( *pfnPlayMp3 )( const char* mp3, int flags ); + + //get the systems current time as a float + float ( *Sys_FloatTime )( void ); + + void ( *pfnSetArray )( int* array, int size ); + void ( *pfnSetClearArray )( int* array, int size ); + void ( *pfnClearArray )( void ); + + void ( *pfnPlaySound2 )( const char* sound, float vol, float pitch ); + + void ( *pfnTintRGBA ) ( int x, int y, int width, int height, int r, int g, int b, int a ); +} cl_enginefunc_t; + +#ifndef IN_BUTTONS_H +#include "in_buttons.h" +#endif + +#define CLDLL_INTERFACE_VERSION 7 + +extern void ClientDLL_Init( void ); // from cdll_int.c +extern void ClientDLL_Shutdown( void ); +extern void ClientDLL_HudInit( void ); +extern void ClientDLL_HudVidInit( void ); +extern void ClientDLL_UpdateClientData( void ); +extern void ClientDLL_Frame( double time ); +extern void ClientDLL_HudRedraw( int intermission ); +extern void ClientDLL_MoveClient( struct playermove_s *ppmove ); +extern void ClientDLL_ClientMoveInit( struct playermove_s *ppmove ); +extern char ClientDLL_ClientTextureType( char *name ); + +extern void ClientDLL_CreateMove( float frametime, struct usercmd_s *cmd, int active ); +extern void ClientDLL_ActivateMouse( void ); +extern void ClientDLL_DeactivateMouse( void ); +extern void ClientDLL_MouseEvent( int mstate ); +extern void ClientDLL_ClearStates( void ); +extern int ClientDLL_IsThirdPerson( void ); +extern void ClientDLL_GetCameraOffsets( float *ofs ); +extern int ClientDLL_GraphKeyDown( void ); +extern struct kbutton_s *ClientDLL_FindKey( const char *name ); +extern void ClientDLL_CAM_Think( void ); +extern void ClientDLL_IN_Accumulate( void ); +extern void ClientDLL_CalcRefdef( struct ref_params_s *pparams ); +extern int ClientDLL_AddEntity( int type, struct cl_entity_s *ent ); +extern void ClientDLL_CreateEntities( void ); + +extern void ClientDLL_DrawNormalTriangles( void ); +extern void ClientDLL_DrawTransparentTriangles( void ); +extern void ClientDLL_StudioEvent( const struct mstudioevent_s *event, const struct cl_entity_s *entity ); +extern void ClientDLL_PostRunCmd( struct local_state_s *from, struct local_state_s *to, struct usercmd_s *cmd, int runfuncs, double time, unsigned int random_seed ); +extern void ClientDLL_TxferLocalOverrides( struct entity_state_s *state, const struct clientdata_s *client ); +extern void ClientDLL_ProcessPlayerState( struct entity_state_s *dst, const struct entity_state_s *src ); +extern void ClientDLL_TxferPredictionData ( struct entity_state_s *ps, const struct entity_state_s *pps, struct clientdata_s *pcd, const struct clientdata_s *ppcd, struct weapon_data_s *wd, const struct weapon_data_s *pwd ); +extern void ClientDLL_ReadDemoBuffer( int size, unsigned char *buffer ); +extern int ClientDLL_ConnectionlessPacket( const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size ); +extern int ClientDLL_GetHullBounds( int hullnumber, float *mins, float *maxs ); + +extern void ClientDLL_VGui_ConsolePrint(const char* text); + +extern int ClientDLL_Key_Event( int down, int keynum, const char *pszCurrentBinding ); +extern void ClientDLL_TempEntUpdate( double ft, double ct, double grav, struct tempent_s **ppFreeTE, struct tempent_s **ppActiveTE, int ( *addTEntity )( struct cl_entity_s *pEntity ), void ( *playTESound )( struct tempent_s *pTemp, float damp ) ); +extern struct cl_entity_s *ClientDLL_GetUserEntity( int index ); +extern void ClientDLL_VoiceStatus(int entindex, qboolean bTalking); +extern void ClientDLL_DirectorMessage( int iSize, void *pbuf ); + + +#ifdef __cplusplus +} +#endif + +#endif // CDLL_INT_H diff --git a/MiniBase/ValveSDK/cl_dll.h b/MiniBase/ValveSDK/cl_dll.h new file mode 100644 index 0000000..183c363 --- /dev/null +++ b/MiniBase/ValveSDK/cl_dll.h @@ -0,0 +1,37 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +// +// cl_dll.h +// + +// 4-23-98 JOHN + +// +// This DLL is linked by the client when they first initialize. +// This DLL is responsible for the following tasks: +// - Loading the HUD graphics upon initialization +// - Drawing the HUD graphics every frame +// - Handling the custum HUD-update packets +// +typedef unsigned char byte; +typedef unsigned short word; +typedef float vec_t; +typedef int (*pfnUserMsgHook)(const char *pszName, int iSize, void *pbuf); + +#include "util_vector.h" +#define EXPORT _declspec( dllexport ) + +#include "cdll_int.h" +#include "cdll_dll.h" \ No newline at end of file diff --git a/MiniBase/ValveSDK/cl_entity.h b/MiniBase/ValveSDK/cl_entity.h new file mode 100644 index 0000000..a7cd472 --- /dev/null +++ b/MiniBase/ValveSDK/cl_entity.h @@ -0,0 +1,115 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +// cl_entity.h +#if !defined( CL_ENTITYH ) +#define CL_ENTITYH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct efrag_s +{ + struct mleaf_s *leaf; + struct efrag_s *leafnext; + struct cl_entity_s *entity; + struct efrag_s *entnext; +} efrag_t; + +typedef struct +{ + byte mouthopen; // 0 = mouth closed, 255 = mouth agape + byte sndcount; // counter for running average + int sndavg; // running average +} mouth_t; + +typedef struct +{ + float prevanimtime; + float sequencetime; + byte prevseqblending[2]; + vec3_t prevorigin; + vec3_t prevangles; + + int prevsequence; + float prevframe; + + byte prevcontroller[4]; + byte prevblending[2]; +} latchedvars_t; + +typedef struct +{ + // Time stamp for this movement + float animtime; + + vec3_t origin; + vec3_t angles; +} position_history_t; + +typedef struct cl_entity_s cl_entity_t; + +#define HISTORY_MAX 64 // Must be power of 2 +#define HISTORY_MASK ( HISTORY_MAX - 1 ) + + +#if !defined( ENTITY_STATEH ) +#include "entity_state.h" +#endif + +#if !defined( PROGS_H ) +#include "progs.h" +#endif + +struct cl_entity_s +{ + int index; // Index into cl_entities ( should match actual slot, but not necessarily ) + + qboolean player; // True if this entity is a "player" + + entity_state_t baseline; // The original state from which to delta during an uncompressed message + entity_state_t prevstate; // The state information from the penultimate message received from the server + entity_state_t curstate; // The state information from the last message received from server + + int current_position; // Last received history update index + position_history_t ph[ HISTORY_MAX ]; // History of position and angle updates for this player + + mouth_t mouth; // For synchronizing mouth movements. + + latchedvars_t latched; // Variables used by studio model rendering routines + + // Information based on interplocation, extrapolation, prediction, or just copied from last msg received. + // + float lastmove; + + // Actual render position and angles + vec3_t origin; + vec3_t angles; + + // Attachment points + vec3_t attachment[4]; + + // Other entity local information + int trivial_accept; + + struct model_s *model; // cl.model_precache[ curstate.modelindes ]; all visible entities have a model + struct efrag_s *efrag; // linked list of efrags + struct mnode_s *topnode; // for bmodels, first world node that splits bmodel, or NULL if not split + + float syncbase; // for client-side animations -- used by obsolete alias animation system, remove? + int visframe; // last frame this entity was found in an active leaf + colorVec cvFloorColor; +}; + +#endif // !CL_ENTITYH diff --git a/MiniBase/ValveSDK/com_model.h b/MiniBase/ValveSDK/com_model.h new file mode 100644 index 0000000..c014a39 --- /dev/null +++ b/MiniBase/ValveSDK/com_model.h @@ -0,0 +1,351 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +// com_model.h +#if !defined( COM_MODEL_H ) +#define COM_MODEL_H +#if defined( _WIN32 ) +#pragma once +#endif + +#define STUDIO_RENDER 1 +#define STUDIO_EVENTS 2 + +#define MAX_CLIENTS 32 +#define MAX_EDICTS 900 + +#define MAX_MODEL_NAME 64 +#define MAX_MAP_HULLS 4 +#define MIPLEVELS 4 +#define NUM_AMBIENTS 4 // automatic ambient sounds +#define MAXLIGHTMAPS 4 +#define PLANE_ANYZ 5 + +#define ALIAS_Z_CLIP_PLANE 5 + +// flags in finalvert_t.flags +#define ALIAS_LEFT_CLIP 0x0001 +#define ALIAS_TOP_CLIP 0x0002 +#define ALIAS_RIGHT_CLIP 0x0004 +#define ALIAS_BOTTOM_CLIP 0x0008 +#define ALIAS_Z_CLIP 0x0010 +#define ALIAS_ONSEAM 0x0020 +#define ALIAS_XY_CLIP_MASK 0x000F + +#define ZISCALE ((float)0x8000) + +#define CACHE_SIZE 32 // used to align key data structures + +typedef enum +{ + mod_brush, + mod_sprite, + mod_alias, + mod_studio +} modtype_t; + +// must match definition in modelgen.h +#ifndef SYNCTYPE_T +#define SYNCTYPE_T + +typedef enum +{ + ST_SYNC=0, + ST_RAND +} synctype_t; + +#endif + +typedef struct +{ + float mins[3], maxs[3]; + float origin[3]; + int headnode[MAX_MAP_HULLS]; + int visleafs; // not including the solid leaf 0 + int firstface, numfaces; +} dmodel_t; + +// plane_t structure +typedef struct mplane_s +{ + vec3_t normal; // surface normal + float dist; // closest appoach to origin + byte type; // for texture axis selection and fast side tests + byte signbits; // signx + signy<<1 + signz<<1 + byte pad[2]; +} mplane_t; + +typedef struct +{ + vec3_t position; +} mvertex_t; + +typedef struct +{ + unsigned short v[2]; + unsigned int cachededgeoffset; +} medge_t; + +typedef struct texture_s +{ + char name[16]; + unsigned width, height; + int anim_total; // total tenths in sequence ( 0 = no) + int anim_min, anim_max; // time for this frame min <=time< max + struct texture_s *anim_next; // in the animation sequence + struct texture_s *alternate_anims; // bmodels in frame 1 use these + unsigned offsets[MIPLEVELS]; // four mip maps stored + unsigned paloffset; +} texture_t; + +typedef struct +{ + float vecs[2][4]; // [s/t] unit vectors in world space. + // [i][3] is the s/t offset relative to the origin. + // s or t = dot(3Dpoint,vecs[i])+vecs[i][3] + float mipadjust; // ?? mipmap limits for very small surfaces + texture_t *texture; + int flags; // sky or slime, no lightmap or 256 subdivision +} mtexinfo_t; + +typedef struct mnode_s +{ +// common with leaf + int contents; // 0, to differentiate from leafs + int visframe; // node needs to be traversed if current + + short minmaxs[6]; // for bounding box culling + + struct mnode_s *parent; + +// node specific + mplane_t *plane; + struct mnode_s *children[2]; + + unsigned short firstsurface; + unsigned short numsurfaces; +} mnode_t; + +typedef struct msurface_s msurface_t; +typedef struct decal_s decal_t; + +// JAY: Compress this as much as possible +struct decal_s +{ + decal_t *pnext; // linked list for each surface + msurface_t *psurface; // Surface id for persistence / unlinking + short dx; // Offsets into surface texture (in texture coordinates, so we don't need floats) + short dy; + short texture; // Decal texture + byte scale; // Pixel scale + byte flags; // Decal flags + + short entityIndex; // Entity this is attached to +}; + +typedef struct mleaf_s +{ +// common with node + int contents; // wil be a negative contents number + int visframe; // node needs to be traversed if current + + short minmaxs[6]; // for bounding box culling + + struct mnode_s *parent; + +// leaf specific + byte *compressed_vis; + struct efrag_s *efrags; + + msurface_t **firstmarksurface; + int nummarksurfaces; + int key; // BSP sequence number for leaf's contents + byte ambient_sound_level[NUM_AMBIENTS]; +} mleaf_t; + +struct msurface_s +{ + int visframe; // should be drawn when node is crossed + + int dlightframe; // last frame the surface was checked by an animated light + int dlightbits; // dynamically generated. Indicates if the surface illumination + // is modified by an animated light. + + mplane_t *plane; // pointer to shared plane + int flags; // see SURF_ #defines + + int firstedge; // look up in model->surfedges[], negative numbers + int numedges; // are backwards edges + +// surface generation data + struct surfcache_s *cachespots[MIPLEVELS]; + + short texturemins[2]; // smallest s/t position on the surface. + short extents[2]; // ?? s/t texture size, 1..256 for all non-sky surfaces + + mtexinfo_t *texinfo; + +// lighting info + byte styles[MAXLIGHTMAPS]; // index into d_lightstylevalue[] for animated lights + // no one surface can be effected by more than 4 + // animated lights. + color24 *samples; + + decal_t *pdecals; +}; + +typedef struct +{ + int planenum; + short children[2]; // negative numbers are contents +} dclipnode_t; + +typedef struct hull_s +{ + dclipnode_t *clipnodes; + mplane_t *planes; + int firstclipnode; + int lastclipnode; + vec3_t clip_mins; + vec3_t clip_maxs; +} hull_t; + +#if !defined( CACHE_USER ) && !defined( QUAKEDEF_H ) +#define CACHE_USER +typedef struct cache_user_s +{ + void *data; +} cache_user_t; +#endif + +typedef struct model_s +{ + char name[ MAX_MODEL_NAME ]; + qboolean needload; // bmodels and sprites don't cache normally + + modtype_t type; + int numframes; + synctype_t synctype; + + int flags; + +// +// volume occupied by the model +// + vec3_t mins, maxs; + float radius; + +// +// brush model +// + int firstmodelsurface, nummodelsurfaces; + + int numsubmodels; + dmodel_t *submodels; + + int numplanes; + mplane_t *planes; + + int numleafs; // number of visible leafs, not counting 0 + struct mleaf_s *leafs; + + int numvertexes; + mvertex_t *vertexes; + + int numedges; + medge_t *edges; + + int numnodes; + mnode_t *nodes; + + int numtexinfo; + mtexinfo_t *texinfo; + + int numsurfaces; + msurface_t *surfaces; + + int numsurfedges; + int *surfedges; + + int numclipnodes; + dclipnode_t *clipnodes; + + int nummarksurfaces; + msurface_t **marksurfaces; + + hull_t hulls[MAX_MAP_HULLS]; + + int numtextures; + texture_t **textures; + + byte *visdata; + + color24 *lightdata; + + char *entities; + +// +// additional model data +// + cache_user_t cache; // only access through Mod_Extradata + +} model_t; + +typedef vec_t vec4_t[4]; + +typedef struct alight_s +{ + int ambientlight; // clip at 128 + int shadelight; // clip at 192 - ambientlight + vec3_t color; + float *plightvec; +} alight_t; + +typedef struct auxvert_s +{ + float fv[3]; // viewspace x, y +} auxvert_t; + +#include "custom.h" + +#define MAX_INFO_STRING 256 +#define MAX_SCOREBOARDNAME 32 +typedef struct player_info_s +{ + // User id on server + int userid; + + // User info string + char userinfo[ MAX_INFO_STRING ]; + + // Name + char name[ MAX_SCOREBOARDNAME ]; + + // Spectator or not, unused + int spectator; + + int ping; + int packet_loss; + + // skin information + char model[MAX_QPATH]; + int topcolor; + int bottomcolor; + + // last frame rendered + int renderframe; + + // Gait frame estimation + int gaitsequence; + float gaitframe; + float gaityaw; + vec3_t prevgaitorigin; + + customization_t customdata; +} player_info_t; + +#endif // #define COM_MODEL_H diff --git a/MiniBase/ValveSDK/common/beamdef.h b/MiniBase/ValveSDK/common/beamdef.h new file mode 100644 index 0000000..39b87bb --- /dev/null +++ b/MiniBase/ValveSDK/common/beamdef.h @@ -0,0 +1,63 @@ +/*** +* +* 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. +* +****/ +#if !defined ( BEAMDEFH ) +#define BEAMDEFH +#ifdef _WIN32 +#pragma once +#endif + +#define Z1TITY 0x00000001 +#define FBEAM_STARTENTITY 0x00000001 +#define FBEAM_ENDENTITY 0x00000002 +#define FBEAM_FADEIN 0x00000004 +#define FBEAM_FADEOUT 0x00000008 +#define FBEAM_SINENOISE 0x00000010 +#define FBEAM_SOLID 0x00000020 +#define FBEAM_SHADEIN 0x00000040 +#define FBEAM_SHADEOUT 0x00000080 +#define FBEAM_STARTVISIBLE 0x10000000 // Has this client actually seen this beam's start entity yet? +#define FBEAM_ENDVISIBLE 0x20000000 // Has this client actually seen this beam's end entity yet? +#define FBEAM_ISACTIVE 0x40000000 +#define FBEAM_FOREVER 0x80000000 + +typedef struct beam_s BEAM; +struct beam_s +{ + BEAM *next; + int type; + int flags; + vec3_t source; + vec3_t target; + vec3_t delta; + float t; // 0 .. 1 over lifetime of beam + float freq; + float die; + float width; + float amplitude; + float r, g, b; + float brightness; + float speed; + float frameRate; + float frame; + int segments; + int startEntity; + int endEntity; + int modelIndex; + int frameCount; + struct model_s *pFollowModel; + struct particle_s *particles; +}; + +#endif diff --git a/MiniBase/ValveSDK/common/cl_entity.h b/MiniBase/ValveSDK/common/cl_entity.h new file mode 100644 index 0000000..ec99e07 --- /dev/null +++ b/MiniBase/ValveSDK/common/cl_entity.h @@ -0,0 +1,115 @@ +/*** +* +* 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. +* +****/ +// cl_entity.h +#if !defined( CL_ENTITYH ) +#define CL_ENTITYH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct efrag_s +{ + struct mleaf_s *leaf; + struct efrag_s *leafnext; + struct cl_entity_s *entity; + struct efrag_s *entnext; +} efrag_t; + +typedef struct +{ + byte mouthopen; // 0 = mouth closed, 255 = mouth agape + byte sndcount; // counter for running average + int sndavg; // running average +} mouth_t; + +typedef struct +{ + float prevanimtime; + float sequencetime; + byte prevseqblending[2]; + vec3_t prevorigin; + vec3_t prevangles; + + int prevsequence; + float prevframe; + + byte prevcontroller[4]; + byte prevblending[2]; +} latchedvars_t; + +typedef struct +{ + // Time stamp for this movement + float animtime; + + vec3_t origin; + vec3_t angles; +} position_history_t; + +typedef struct cl_entity_s cl_entity_t; + +#define HISTORY_MAX 64 // Must be power of 2 +#define HISTORY_MASK ( HISTORY_MAX - 1 ) + + +#if !defined( ENTITY_STATEH ) +#include "entity_state.h" +#endif + +#if !defined( PROGS_H ) +#include "progs.h" +#endif + +struct cl_entity_s +{ + int index; // Index into cl_entities ( should match actual slot, but not necessarily ) + + qboolean player; // True if this entity is a "player" + + entity_state_t baseline; // The original state from which to delta during an uncompressed message + entity_state_t prevstate; // The state information from the penultimate message received from the server + entity_state_t curstate; // The state information from the last message received from server + + int current_position; // Last received history update index + position_history_t ph[ HISTORY_MAX ]; // History of position and angle updates for this player + + mouth_t mouth; // For synchronizing mouth movements. + + latchedvars_t latched; // Variables used by studio model rendering routines + + // Information based on interplocation, extrapolation, prediction, or just copied from last msg received. + // + float lastmove; + + // Actual render position and angles + vec3_t origin; + vec3_t angles; + + // Attachment points + vec3_t attachment[4]; + + // Other entity local information + int trivial_accept; + + struct model_s *model; // cl.model_precache[ curstate.modelindes ]; all visible entities have a model + struct efrag_s *efrag; // linked list of efrags + struct mnode_s *topnode; // for bmodels, first world node that splits bmodel, or NULL if not split + + float syncbase; // for client-side animations -- used by obsolete alias animation system, remove? + int visframe; // last frame this entity was found in an active leaf + colorVec cvFloorColor; +}; + +#endif // !CL_ENTITYH diff --git a/MiniBase/ValveSDK/common/com_model.h b/MiniBase/ValveSDK/common/com_model.h new file mode 100644 index 0000000..1730ce4 --- /dev/null +++ b/MiniBase/ValveSDK/common/com_model.h @@ -0,0 +1,344 @@ +// com_model.h +#if !defined( COM_MODEL_H ) +#define COM_MODEL_H +#if defined( _WIN32 ) +#pragma once +#endif + +#define STUDIO_RENDER 1 +#define STUDIO_EVENTS 2 + +#define MAX_CLIENTS 32 +#define MAX_EDICTS 900 + +#define MAX_MODEL_NAME 64 +#define MAX_MAP_HULLS 4 +#define MIPLEVELS 4 +#define NUM_AMBIENTS 4 // automatic ambient sounds +#define MAXLIGHTMAPS 4 +#define PLANE_ANYZ 5 + +#define ALIAS_Z_CLIP_PLANE 5 + +// flags in finalvert_t.flags +#define ALIAS_LEFT_CLIP 0x0001 +#define ALIAS_TOP_CLIP 0x0002 +#define ALIAS_RIGHT_CLIP 0x0004 +#define ALIAS_BOTTOM_CLIP 0x0008 +#define ALIAS_Z_CLIP 0x0010 +#define ALIAS_ONSEAM 0x0020 +#define ALIAS_XY_CLIP_MASK 0x000F + +#define ZISCALE ((float)0x8000) + +#define CACHE_SIZE 32 // used to align key data structures + +typedef enum +{ + mod_brush, + mod_sprite, + mod_alias, + mod_studio +} modtype_t; + +// must match definition in modelgen.h +#ifndef SYNCTYPE_T +#define SYNCTYPE_T + +typedef enum +{ + ST_SYNC=0, + ST_RAND +} synctype_t; + +#endif + +typedef struct +{ + float mins[3], maxs[3]; + float origin[3]; + int headnode[MAX_MAP_HULLS]; + int visleafs; // not including the solid leaf 0 + int firstface, numfaces; +} dmodel_t; + +// plane_t structure +typedef struct mplane_s +{ + vec3_t normal; // surface normal + float dist; // closest appoach to origin + byte type; // for texture axis selection and fast side tests + byte signbits; // signx + signy<<1 + signz<<1 + byte pad[2]; +} mplane_t; + +typedef struct +{ + vec3_t position; +} mvertex_t; + +typedef struct +{ + unsigned short v[2]; + unsigned int cachededgeoffset; +} medge_t; + +typedef struct texture_s +{ + char name[16]; + unsigned width, height; + int anim_total; // total tenths in sequence ( 0 = no) + int anim_min, anim_max; // time for this frame min <=time< max + struct texture_s *anim_next; // in the animation sequence + struct texture_s *alternate_anims; // bmodels in frame 1 use these + unsigned offsets[MIPLEVELS]; // four mip maps stored + unsigned paloffset; +} texture_t; + +typedef struct +{ + float vecs[2][4]; // [s/t] unit vectors in world space. + // [i][3] is the s/t offset relative to the origin. + // s or t = dot(3Dpoint,vecs[i])+vecs[i][3] + float mipadjust; // ?? mipmap limits for very small surfaces + texture_t *texture; + int flags; // sky or slime, no lightmap or 256 subdivision +} mtexinfo_t; + +typedef struct mnode_s +{ +// common with leaf + int contents; // 0, to differentiate from leafs + int visframe; // node needs to be traversed if current + + short minmaxs[6]; // for bounding box culling + + struct mnode_s *parent; + +// node specific + mplane_t *plane; + struct mnode_s *children[2]; + + unsigned short firstsurface; + unsigned short numsurfaces; +} mnode_t; + +typedef struct msurface_s msurface_t; +typedef struct decal_s decal_t; + +// JAY: Compress this as much as possible +struct decal_s +{ + decal_t *pnext; // linked list for each surface + msurface_t *psurface; // Surface id for persistence / unlinking + short dx; // Offsets into surface texture (in texture coordinates, so we don't need floats) + short dy; + short texture; // Decal texture + byte scale; // Pixel scale + byte flags; // Decal flags + + short entityIndex; // Entity this is attached to +}; + +typedef struct mleaf_s +{ +// common with node + int contents; // wil be a negative contents number + int visframe; // node needs to be traversed if current + + short minmaxs[6]; // for bounding box culling + + struct mnode_s *parent; + +// leaf specific + byte *compressed_vis; + struct efrag_s *efrags; + + msurface_t **firstmarksurface; + int nummarksurfaces; + int key; // BSP sequence number for leaf's contents + byte ambient_sound_level[NUM_AMBIENTS]; +} mleaf_t; + +struct msurface_s +{ + int visframe; // should be drawn when node is crossed + + int dlightframe; // last frame the surface was checked by an animated light + int dlightbits; // dynamically generated. Indicates if the surface illumination + // is modified by an animated light. + + mplane_t *plane; // pointer to shared plane + int flags; // see SURF_ #defines + + int firstedge; // look up in model->surfedges[], negative numbers + int numedges; // are backwards edges + +// surface generation data + struct surfcache_s *cachespots[MIPLEVELS]; + + short texturemins[2]; // smallest s/t position on the surface. + short extents[2]; // ?? s/t texture size, 1..256 for all non-sky surfaces + + mtexinfo_t *texinfo; + +// lighting info + byte styles[MAXLIGHTMAPS]; // index into d_lightstylevalue[] for animated lights + // no one surface can be effected by more than 4 + // animated lights. + color24 *samples; + + decal_t *pdecals; +}; + +typedef struct +{ + int planenum; + short children[2]; // negative numbers are contents +} dclipnode_t; + +typedef struct hull_s +{ + dclipnode_t *clipnodes; + mplane_t *planes; + int firstclipnode; + int lastclipnode; + vec3_t clip_mins; + vec3_t clip_maxs; +} hull_t; + +#if !defined( CACHE_USER ) && !defined( QUAKEDEF_H ) +#define CACHE_USER +typedef struct cache_user_s +{ + void *data; +} cache_user_t; +#endif + +typedef struct model_s +{ + char name[ MAX_MODEL_NAME ]; + qboolean needload; // bmodels and sprites don't cache normally + + modtype_t type; + int numframes; + synctype_t synctype; + + int flags; + +// +// volume occupied by the model +// + vec3_t mins, maxs; + float radius; + +// +// brush model +// + int firstmodelsurface, nummodelsurfaces; + + int numsubmodels; + dmodel_t *submodels; + + int numplanes; + mplane_t *planes; + + int numleafs; // number of visible leafs, not counting 0 + struct mleaf_s *leafs; + + int numvertexes; + mvertex_t *vertexes; + + int numedges; + medge_t *edges; + + int numnodes; + mnode_t *nodes; + + int numtexinfo; + mtexinfo_t *texinfo; + + int numsurfaces; + msurface_t *surfaces; + + int numsurfedges; + int *surfedges; + + int numclipnodes; + dclipnode_t *clipnodes; + + int nummarksurfaces; + msurface_t **marksurfaces; + + hull_t hulls[MAX_MAP_HULLS]; + + int numtextures; + texture_t **textures; + + byte *visdata; + + color24 *lightdata; + + char *entities; + +// +// additional model data +// + cache_user_t cache; // only access through Mod_Extradata + +} model_t; + +typedef vec_t vec4_t[4]; + +typedef struct alight_s +{ + int ambientlight; // clip at 128 + int shadelight; // clip at 192 - ambientlight + vec3_t color; + float *plightvec; +} alight_t; + +typedef struct auxvert_s +{ + float fv[3]; // viewspace x, y +} auxvert_t; + +#include "../engine/custom.h" + +#define MAX_INFO_STRING 256 +#define MAX_SCOREBOARDNAME 32 +typedef struct player_info_s +{ + // User id on server + int userid; + + // User info string + char userinfo[ MAX_INFO_STRING ]; + + // Name + char name[ MAX_SCOREBOARDNAME ]; + + // Spectator or not, unused + int spectator; + + int ping; + int packet_loss; + + // skin information + char model[MAX_QPATH]; + int topcolor; + int bottomcolor; + + // last frame rendered + int renderframe; + + // Gait frame estimation + int gaitsequence; + float gaitframe; + float gaityaw; + vec3_t prevgaitorigin; + + customization_t customdata; +} player_info_t; + +#endif // #define COM_MODEL_H diff --git a/MiniBase/ValveSDK/common/con_nprint.h b/MiniBase/ValveSDK/common/con_nprint.h new file mode 100644 index 0000000..d562ed8 --- /dev/null +++ b/MiniBase/ValveSDK/common/con_nprint.h @@ -0,0 +1,31 @@ +/*** +* +* 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. +* +****/ +#if !defined( CON_NPRINTH ) +#define CON_NPRINTH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct con_nprint_s +{ + int index; // Row # + float time_to_live; // # of seconds before it dissappears + float color[ 3 ]; // RGB colors ( 0.0 -> 1.0 scale ) +} con_nprint_t; + +void Con_NPrintf( int idx, char *fmt, ... ); +void Con_NXPrintf( struct con_nprint_s *info, char *fmt, ... ); + +#endif diff --git a/MiniBase/ValveSDK/common/const.h b/MiniBase/ValveSDK/common/const.h new file mode 100644 index 0000000..9db7d38 --- /dev/null +++ b/MiniBase/ValveSDK/common/const.h @@ -0,0 +1,771 @@ +/*** +* +* 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. +* +****/ +#ifndef CONST_H +#define CONST_H +// +// Constants shared by the engine and dlls +// This header file included by engine files and DLL files. +// Most came from server.h + +// edict->flags +#define FL_FLY (1<<0) // Changes the SV_Movestep() behavior to not need to be on ground +#define FL_SWIM (1<<1) // Changes the SV_Movestep() behavior to not need to be on ground (but stay in water) +#define FL_CONVEYOR (1<<2) +#define FL_CLIENT (1<<3) +#define FL_INWATER (1<<4) +#define FL_MONSTER (1<<5) +#define FL_GODMODE (1<<6) +#define FL_NOTARGET (1<<7) +#define FL_SKIPLOCALHOST (1<<8) // Don't send entity to local host, it's predicting this entity itself +#define FL_ONGROUND (1<<9) // At rest / on the ground +#define FL_PARTIALGROUND (1<<10) // not all corners are valid +#define FL_WATERJUMP (1<<11) // player jumping out of water +#define FL_FROZEN (1<<12) // Player is frozen for 3rd person camera +#define FL_FAKECLIENT (1<<13) // JAC: fake client, simulated server side; don't send network messages to them +#define FL_DUCKING (1<<14) // Player flag -- Player is fully crouched +#define FL_FLOAT (1<<15) // Apply floating force to this entity when in water +#define FL_GRAPHED (1<<16) // worldgraph has this ent listed as something that blocks a connection + +// UNDONE: Do we need these? +#define FL_IMMUNE_WATER (1<<17) +#define FL_IMMUNE_SLIME (1<<18) +#define FL_IMMUNE_LAVA (1<<19) + +#define FL_PROXY (1<<20) // This is a spectator proxy +#define FL_ALWAYSTHINK (1<<21) // Brush model flag -- call think every frame regardless of nextthink - ltime (for constantly changing velocity/path) +#define FL_BASEVELOCITY (1<<22) // Base velocity has been applied this frame (used to convert base velocity into momentum) +#define FL_MONSTERCLIP (1<<23) // Only collide in with monsters who have FL_MONSTERCLIP set +#define FL_ONTRAIN (1<<24) // Player is _controlling_ a train, so movement commands should be ignored on client during prediction. +#define FL_WORLDBRUSH (1<<25) // Not moveable/removeable brush entity (really part of the world, but represented as an entity for transparency or something) +#define FL_SPECTATOR (1<<26) // This client is a spectator, don't run touch functions, etc. +#define FL_CUSTOMENTITY (1<<29) // This is a custom entity +#define FL_KILLME (1<<30) // This entity is marked for death -- This allows the engine to kill ents at the appropriate time +#define FL_DORMANT (1<<31) // Entity is dormant, no updates to client + + +// Goes into globalvars_t.trace_flags +#define FTRACE_SIMPLEBOX (1<<0) // Traceline with a simple box + + +// walkmove modes +#define WALKMOVE_NORMAL 0 // normal walkmove +#define WALKMOVE_WORLDONLY 1 // doesn't hit ANY entities, no matter what the solid type +#define WALKMOVE_CHECKONLY 2 // move, but don't touch triggers + +// edict->movetype values +#define MOVETYPE_NONE 0 // never moves +//#define MOVETYPE_ANGLENOCLIP 1 +//#define MOVETYPE_ANGLECLIP 2 +#define MOVETYPE_WALK 3 // Player only - moving on the ground +#define MOVETYPE_STEP 4 // gravity, special edge handling -- monsters use this +#define MOVETYPE_FLY 5 // No gravity, but still collides with stuff +#define MOVETYPE_TOSS 6 // gravity/collisions +#define MOVETYPE_PUSH 7 // no clip to world, push and crush +#define MOVETYPE_NOCLIP 8 // No gravity, no collisions, still do velocity/avelocity +#define MOVETYPE_FLYMISSILE 9 // extra size to monsters +#define MOVETYPE_BOUNCE 10 // Just like Toss, but reflect velocity when contacting surfaces +#define MOVETYPE_BOUNCEMISSILE 11 // bounce w/o gravity +#define MOVETYPE_FOLLOW 12 // track movement of aiment +#define MOVETYPE_PUSHSTEP 13 // BSP model that needs physics/world collisions (uses nearest hull for world collision) + +// edict->solid values +// NOTE: Some movetypes will cause collisions independent of SOLID_NOT/SOLID_TRIGGER when the entity moves +// SOLID only effects OTHER entities colliding with this one when they move - UGH! +#define SOLID_NOT 0 // no interaction with other objects +#define SOLID_TRIGGER 1 // touch on edge, but not blocking +#define SOLID_BBOX 2 // touch on edge, block +#define SOLID_SLIDEBOX 3 // touch on edge, but not an onground +#define SOLID_BSP 4 // bsp clip, touch on edge, block + +// edict->deadflag values +#define DEAD_NO 0 // alive +#define DEAD_DYING 1 // playing death animation or still falling off of a ledge waiting to hit ground +#define DEAD_DEAD 2 // dead. lying still. +#define DEAD_RESPAWNABLE 3 +#define DEAD_DISCARDBODY 4 + +#define DAMAGE_NO 0 +#define DAMAGE_YES 1 +#define DAMAGE_AIM 2 + +// entity effects +#define EF_BRIGHTFIELD 1 // swirling cloud of particles +#define EF_MUZZLEFLASH 2 // single frame ELIGHT on entity attachment 0 +#define EF_BRIGHTLIGHT 4 // DLIGHT centered at entity origin +#define EF_DIMLIGHT 8 // player flashlight +#define EF_INVLIGHT 16 // get lighting from ceiling +#define EF_NOINTERP 32 // don't interpolate the next frame +#define EF_LIGHT 64 // rocket flare glow sprite +#define EF_NODRAW 128 // don't draw entity + +// entity flags +#define EFLAG_SLERP 1 // do studio interpolation of this entity + +// +// temp entity events +// +#define TE_BEAMPOINTS 0 // beam effect between two points +// coord coord coord (start position) +// coord coord coord (end position) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMENTPOINT 1 // beam effect between point and entity +// short (start entity) +// coord coord coord (end position) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_GUNSHOT 2 // particle effect plus ricochet sound +// coord coord coord (position) + +#define TE_EXPLOSION 3 // additive sprite, 2 dynamic lights, flickering particles, explosion sound, move vertically 8 pps +// coord coord coord (position) +// short (sprite index) +// byte (scale in 0.1's) +// byte (framerate) +// byte (flags) +// +// The Explosion effect has some flags to control performance/aesthetic features: +#define TE_EXPLFLAG_NONE 0 // all flags clear makes default Half-Life explosion +#define TE_EXPLFLAG_NOADDITIVE 1 // sprite will be drawn opaque (ensure that the sprite you send is a non-additive sprite) +#define TE_EXPLFLAG_NODLIGHTS 2 // do not render dynamic lights +#define TE_EXPLFLAG_NOSOUND 4 // do not play client explosion sound +#define TE_EXPLFLAG_NOPARTICLES 8 // do not draw particles + + +#define TE_TAREXPLOSION 4 // Quake1 "tarbaby" explosion with sound +// coord coord coord (position) + +#define TE_SMOKE 5 // alphablend sprite, move vertically 30 pps +// coord coord coord (position) +// short (sprite index) +// byte (scale in 0.1's) +// byte (framerate) + +#define TE_TRACER 6 // tracer effect from point to point +// coord, coord, coord (start) +// coord, coord, coord (end) + +#define TE_LIGHTNING 7 // TE_BEAMPOINTS with simplified parameters +// coord, coord, coord (start) +// coord, coord, coord (end) +// byte (life in 0.1's) +// byte (width in 0.1's) +// byte (amplitude in 0.01's) +// short (sprite model index) + +#define TE_BEAMENTS 8 +// short (start entity) +// short (end entity) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_SPARKS 9 // 8 random tracers with gravity, ricochet sprite +// coord coord coord (position) + +#define TE_LAVASPLASH 10 // Quake1 lava splash +// coord coord coord (position) + +#define TE_TELEPORT 11 // Quake1 teleport splash +// coord coord coord (position) + +#define TE_EXPLOSION2 12 // Quake1 colormaped (base palette) particle explosion with sound +// coord coord coord (position) +// byte (starting color) +// byte (num colors) + +#define TE_BSPDECAL 13 // Decal from the .BSP file +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// short (texture index of precached decal texture name) +// short (entity index) +// [optional - only included if previous short is non-zero (not the world)] short (index of model of above entity) + +#define TE_IMPLOSION 14 // tracers moving toward a point +// coord, coord, coord (position) +// byte (radius) +// byte (count) +// byte (life in 0.1's) + +#define TE_SPRITETRAIL 15 // line of moving glow sprites with gravity, fadeout, and collisions +// coord, coord, coord (start) +// coord, coord, coord (end) +// short (sprite index) +// byte (count) +// byte (life in 0.1's) +// byte (scale in 0.1's) +// byte (velocity along vector in 10's) +// byte (randomness of velocity in 10's) + +#define TE_BEAM 16 // obsolete + +#define TE_SPRITE 17 // additive sprite, plays 1 cycle +// coord, coord, coord (position) +// short (sprite index) +// byte (scale in 0.1's) +// byte (brightness) + +#define TE_BEAMSPRITE 18 // A beam with a sprite at the end +// coord, coord, coord (start position) +// coord, coord, coord (end position) +// short (beam sprite index) +// short (end sprite index) + +#define TE_BEAMTORUS 19 // screen aligned beam ring, expands to max radius over lifetime +// coord coord coord (center position) +// coord coord coord (axis and radius) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMDISK 20 // disk that expands to max radius over lifetime +// coord coord coord (center position) +// coord coord coord (axis and radius) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMCYLINDER 21 // cylinder that expands to max radius over lifetime +// coord coord coord (center position) +// coord coord coord (axis and radius) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMFOLLOW 22 // create a line of decaying beam segments until entity stops moving +// short (entity:attachment to follow) +// short (sprite index) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte,byte,byte (color) +// byte (brightness) + +#define TE_GLOWSPRITE 23 +// coord, coord, coord (pos) short (model index) byte (scale / 10) + +#define TE_BEAMRING 24 // connect a beam ring to two entities +// short (start entity) +// short (end entity) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_STREAK_SPLASH 25 // oriented shower of tracers +// coord coord coord (start position) +// coord coord coord (direction vector) +// byte (color) +// short (count) +// short (base speed) +// short (ramdon velocity) + +#define TE_BEAMHOSE 26 // obsolete + +#define TE_DLIGHT 27 // dynamic light, effect world, minor entity effect +// coord, coord, coord (pos) +// byte (radius in 10's) +// byte byte byte (color) +// byte (brightness) +// byte (life in 10's) +// byte (decay rate in 10's) + +#define TE_ELIGHT 28 // point entity light, no world effect +// short (entity:attachment to follow) +// coord coord coord (initial position) +// coord (radius) +// byte byte byte (color) +// byte (life in 0.1's) +// coord (decay rate) + +#define TE_TEXTMESSAGE 29 +// short 1.2.13 x (-1 = center) +// short 1.2.13 y (-1 = center) +// byte Effect 0 = fade in/fade out + // 1 is flickery credits + // 2 is write out (training room) + +// 4 bytes r,g,b,a color1 (text color) +// 4 bytes r,g,b,a color2 (effect color) +// ushort 8.8 fadein time +// ushort 8.8 fadeout time +// ushort 8.8 hold time +// optional ushort 8.8 fxtime (time the highlight lags behing the leading text in effect 2) +// string text message (512 chars max sz string) +#define TE_LINE 30 +// coord, coord, coord startpos +// coord, coord, coord endpos +// short life in 0.1 s +// 3 bytes r, g, b + +#define TE_BOX 31 +// coord, coord, coord boxmins +// coord, coord, coord boxmaxs +// short life in 0.1 s +// 3 bytes r, g, b + +#define TE_KILLBEAM 99 // kill all beams attached to entity +// short (entity) + +#define TE_LARGEFUNNEL 100 +// coord coord coord (funnel position) +// short (sprite index) +// short (flags) + +#define TE_BLOODSTREAM 101 // particle spray +// coord coord coord (start position) +// coord coord coord (spray vector) +// byte (color) +// byte (speed) + +#define TE_SHOWLINE 102 // line of particles every 5 units, dies in 30 seconds +// coord coord coord (start position) +// coord coord coord (end position) + +#define TE_BLOOD 103 // particle spray +// coord coord coord (start position) +// coord coord coord (spray vector) +// byte (color) +// byte (speed) + +#define TE_DECAL 104 // Decal applied to a brush entity (not the world) +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name) +// short (entity index) + +#define TE_FIZZ 105 // create alpha sprites inside of entity, float upwards +// short (entity) +// short (sprite index) +// byte (density) + +#define TE_MODEL 106 // create a moving model that bounces and makes a sound when it hits +// coord, coord, coord (position) +// coord, coord, coord (velocity) +// angle (initial yaw) +// short (model index) +// byte (bounce sound type) +// byte (life in 0.1's) + +#define TE_EXPLODEMODEL 107 // spherical shower of models, picks from set +// coord, coord, coord (origin) +// coord (velocity) +// short (model index) +// short (count) +// byte (life in 0.1's) + +#define TE_BREAKMODEL 108 // box of models or sprites +// coord, coord, coord (position) +// coord, coord, coord (size) +// coord, coord, coord (velocity) +// byte (random velocity in 10's) +// short (sprite or model index) +// byte (count) +// byte (life in 0.1 secs) +// byte (flags) + +#define TE_GUNSHOTDECAL 109 // decal and ricochet sound +// coord, coord, coord (position) +// short (entity index???) +// byte (decal???) + +#define TE_SPRITE_SPRAY 110 // spay of alpha sprites +// coord, coord, coord (position) +// coord, coord, coord (velocity) +// short (sprite index) +// byte (count) +// byte (speed) +// byte (noise) + +#define TE_ARMOR_RICOCHET 111 // quick spark sprite, client ricochet sound. +// coord, coord, coord (position) +// byte (scale in 0.1's) + +#define TE_PLAYERDECAL 112 // ??? +// byte (playerindex) +// coord, coord, coord (position) +// short (entity???) +// byte (decal number???) +// [optional] short (model index???) + +#define TE_BUBBLES 113 // create alpha sprites inside of box, float upwards +// coord, coord, coord (min start position) +// coord, coord, coord (max start position) +// coord (float height) +// short (model index) +// byte (count) +// coord (speed) + +#define TE_BUBBLETRAIL 114 // create alpha sprites along a line, float upwards +// coord, coord, coord (min start position) +// coord, coord, coord (max start position) +// coord (float height) +// short (model index) +// byte (count) +// coord (speed) + +#define TE_BLOODSPRITE 115 // spray of opaque sprite1's that fall, single sprite2 for 1..2 secs (this is a high-priority tent) +// coord, coord, coord (position) +// short (sprite1 index) +// short (sprite2 index) +// byte (color) +// byte (scale) + +#define TE_WORLDDECAL 116 // Decal applied to the world brush +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name) + +#define TE_WORLDDECALHIGH 117 // Decal (with texture index > 256) applied to world brush +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name - 256) + +#define TE_DECALHIGH 118 // Same as TE_DECAL, but the texture index was greater than 256 +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name - 256) +// short (entity index) + +#define TE_PROJECTILE 119 // Makes a projectile (like a nail) (this is a high-priority tent) +// coord, coord, coord (position) +// coord, coord, coord (velocity) +// short (modelindex) +// byte (life) +// byte (owner) projectile won't collide with owner (if owner == 0, projectile will hit any client). + +#define TE_SPRAY 120 // Throws a shower of sprites or models +// coord, coord, coord (position) +// coord, coord, coord (direction) +// short (modelindex) +// byte (count) +// byte (speed) +// byte (noise) +// byte (rendermode) + +#define TE_PLAYERSPRITES 121 // sprites emit from a player's bounding box (ONLY use for players!) +// byte (playernum) +// short (sprite modelindex) +// byte (count) +// byte (variance) (0 = no variance in size) (10 = 10% variance in size) + +#define TE_PARTICLEBURST 122 // very similar to lavasplash. +// coord (origin) +// short (radius) +// byte (particle color) +// byte (duration * 10) (will be randomized a bit) + +#define TE_FIREFIELD 123 // makes a field of fire. +// coord (origin) +// short (radius) (fire is made in a square around origin. -radius, -radius to radius, radius) +// short (modelindex) +// byte (count) +// byte (flags) +// byte (duration (in seconds) * 10) (will be randomized a bit) +// +// to keep network traffic low, this message has associated flags that fit into a byte: +#define TEFIRE_FLAG_ALLFLOAT 1 // all sprites will drift upwards as they animate +#define TEFIRE_FLAG_SOMEFLOAT 2 // some of the sprites will drift upwards. (50% chance) +#define TEFIRE_FLAG_LOOP 4 // if set, sprite plays at 15 fps, otherwise plays at whatever rate stretches the animation over the sprite's duration. +#define TEFIRE_FLAG_ALPHA 8 // if set, sprite is rendered alpha blended at 50% else, opaque +#define TEFIRE_FLAG_PLANAR 16 // if set, all fire sprites have same initial Z instead of randomly filling a cube. + +#define TE_PLAYERATTACHMENT 124 // attaches a TENT to a player (this is a high-priority tent) +// byte (entity index of player) +// coord (vertical offset) ( attachment origin.z = player origin.z + vertical offset ) +// short (model index) +// short (life * 10 ); + +#define TE_KILLPLAYERATTACHMENTS 125 // will expire all TENTS attached to a player. +// byte (entity index of player) + +#define TE_MULTIGUNSHOT 126 // much more compact shotgun message +// This message is used to make a client approximate a 'spray' of gunfire. +// Any weapon that fires more than one bullet per frame and fires in a bit of a spread is +// a good candidate for MULTIGUNSHOT use. (shotguns) +// +// NOTE: This effect makes the client do traces for each bullet, these client traces ignore +// entities that have studio models.Traces are 4096 long. +// +// coord (origin) +// coord (origin) +// coord (origin) +// coord (direction) +// coord (direction) +// coord (direction) +// coord (x noise * 100) +// coord (y noise * 100) +// byte (count) +// byte (bullethole decal texture index) + +#define TE_USERTRACER 127 // larger message than the standard tracer, but allows some customization. +// coord (origin) +// coord (origin) +// coord (origin) +// coord (velocity) +// coord (velocity) +// coord (velocity) +// byte ( life * 10 ) +// byte ( color ) this is an index into an array of color vectors in the engine. (0 - ) +// byte ( length * 10 ) + + + +#define MSG_BROADCAST 0 // unreliable to all +#define MSG_ONE 1 // reliable to one (msg_entity) +#define MSG_ALL 2 // reliable to all +#define MSG_INIT 3 // write to the init string +#define MSG_PVS 4 // Ents in PVS of org +#define MSG_PAS 5 // Ents in PAS of org +#define MSG_PVS_R 6 // Reliable to PVS +#define MSG_PAS_R 7 // Reliable to PAS +#define MSG_ONE_UNRELIABLE 8 // Send to one client, but don't put in reliable stream, put in unreliable datagram ( could be dropped ) +#define MSG_SPEC 9 // Sends to all spectator proxies + +// contents of a spot in the world +#define CONTENTS_EMPTY -1 +#define CONTENTS_SOLID -2 +#define CONTENTS_WATER -3 +#define CONTENTS_SLIME -4 +#define CONTENTS_LAVA -5 +#define CONTENTS_SKY -6 +/* These additional contents constants are defined in bspfile.h +#define CONTENTS_ORIGIN -7 // removed at csg time +#define CONTENTS_CLIP -8 // changed to contents_solid +#define CONTENTS_CURRENT_0 -9 +#define CONTENTS_CURRENT_90 -10 +#define CONTENTS_CURRENT_180 -11 +#define CONTENTS_CURRENT_270 -12 +#define CONTENTS_CURRENT_UP -13 +#define CONTENTS_CURRENT_DOWN -14 + +#define CONTENTS_TRANSLUCENT -15 +*/ +#define CONTENTS_LADDER -16 + +#define CONTENT_EMPTY -1 +#define CONTENT_SOLID -2 +#define CONTENT_WATER -3 +#define CONTENT_SLIME -4 +#define CONTENT_LAVA -5 +#define CONTENT_SKY -6 + +// channels +#define CHAN_AUTO 0 +#define CHAN_WEAPON 1 +#define CHAN_VOICE 2 +#define CHAN_ITEM 3 +#define CHAN_BODY 4 +#define CHAN_STREAM 5 // allocate stream channel from the static or dynamic area +#define CHAN_STATIC 6 // allocate channel from the static area +#define CHAN_NETWORKVOICE_BASE 7 // voice data coming across the network +#define CHAN_NETWORKVOICE_END 500 // network voice data reserves slots (CHAN_NETWORKVOICE_BASE through CHAN_NETWORKVOICE_END). + +// attenuation values +#define ATTN_NONE 0 +#define ATTN_NORM (float)0.8 +#define ATTN_IDLE (float)2 +#define ATTN_STATIC (float)1.25 + +// pitch values +#define PITCH_NORM 100 // non-pitch shifted +#define PITCH_LOW 95 // other values are possible - 0-255, where 255 is very high +#define PITCH_HIGH 120 + +// volume values +#define VOL_NORM 1.0 + +// plats +#define PLAT_LOW_TRIGGER 1 + +// Trains +#define SF_TRAIN_WAIT_RETRIGGER 1 +#define SF_TRAIN_PASSABLE 8 // Train is not solid -- used to make water trains + +// buttons +#ifndef IN_BUTTONS_H +#include "in_buttons.h" +#endif + +// Break Model Defines + +#define BREAK_TYPEMASK 0x4F +#define BREAK_GLASS 0x01 +#define BREAK_METAL 0x02 +#define BREAK_FLESH 0x04 +#define BREAK_WOOD 0x08 + +#define BREAK_SMOKE 0x10 +#define BREAK_TRANS 0x20 +#define BREAK_CONCRETE 0x40 +#define BREAK_2 0x80 + +// Colliding temp entity sounds + +#define BOUNCE_GLASS BREAK_GLASS +#define BOUNCE_METAL BREAK_METAL +#define BOUNCE_FLESH BREAK_FLESH +#define BOUNCE_WOOD BREAK_WOOD +#define BOUNCE_SHRAP 0x10 +#define BOUNCE_SHELL 0x20 +#define BOUNCE_CONCRETE BREAK_CONCRETE +#define BOUNCE_SHOTSHELL 0x80 + +// Temp entity bounce sound types +#define TE_BOUNCE_NULL 0 +#define TE_BOUNCE_SHELL 1 +#define TE_BOUNCE_SHOTSHELL 2 + +// Rendering constants +enum +{ + kRenderNormal, // src + kRenderTransColor, // c*a+dest*(1-a) + kRenderTransTexture, // src*a+dest*(1-a) + kRenderGlow, // src*a+dest -- No Z buffer checks + kRenderTransAlpha, // src*srca+dest*(1-srca) + kRenderTransAdd, // src*a+dest +}; + +enum +{ + kRenderFxNone = 0, + kRenderFxPulseSlow, + kRenderFxPulseFast, + kRenderFxPulseSlowWide, + kRenderFxPulseFastWide, + kRenderFxFadeSlow, + kRenderFxFadeFast, + kRenderFxSolidSlow, + kRenderFxSolidFast, + kRenderFxStrobeSlow, + kRenderFxStrobeFast, + kRenderFxStrobeFaster, + kRenderFxFlickerSlow, + kRenderFxFlickerFast, + kRenderFxNoDissipation, + kRenderFxDistort, // Distort/scale/translate flicker + kRenderFxHologram, // kRenderFxDistort + distance fade + kRenderFxDeadPlayer, // kRenderAmt is the player index + kRenderFxExplode, // Scale up really big! + kRenderFxGlowShell, // Glowing Shell + kRenderFxClampMinScale, // Keep this sprite from getting very small (SPRITES only!) +}; + + +typedef int func_t; +typedef int string_t; + +typedef unsigned char byte; +typedef unsigned short word; +#define _DEF_BYTE_ + +#undef true +#undef false + +#ifndef __cplusplus +typedef enum {false, true} qboolean; +#else +typedef int qboolean; +#endif + +typedef struct +{ + byte r, g, b; +} color24; + +typedef struct +{ + unsigned r, g, b, a; +} colorVec; + +#ifdef _WIN32 +#pragma pack(push,2) +#endif + +typedef struct +{ + unsigned short r, g, b, a; +} PackedColorVec; + +#ifdef _WIN32 +#pragma pack(pop) +#endif +typedef struct link_s +{ + struct link_s *prev, *next; +} link_t; + +typedef struct edict_s edict_t; + +typedef struct +{ + vec3_t normal; + float dist; +} plane_t; + +typedef struct +{ + qboolean allsolid; // if true, plane is not valid + qboolean startsolid; // if true, the initial point was in a solid area + qboolean inopen, inwater; + float fraction; // time completed, 1.0 = didn't hit anything + vec3_t endpos; // final position + plane_t plane; // surface normal at impact + edict_t *ent; // entity the surface is on + int hitgroup; // 0 == generic, non zero is specific body part +} trace_t; + +#endif + diff --git a/MiniBase/ValveSDK/common/crc.h b/MiniBase/ValveSDK/common/crc.h new file mode 100644 index 0000000..1c17d62 --- /dev/null +++ b/MiniBase/ValveSDK/common/crc.h @@ -0,0 +1,52 @@ +/*** +* +* 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. +* +****/ +/* crc.h */ +#ifndef CRC_H +#define CRC_H +#ifdef _WIN32 +#pragma once +#endif + +// MD5 Hash +typedef struct +{ + unsigned int buf[4]; + unsigned int bits[2]; + unsigned char in[64]; +} MD5Context_t; + + +typedef unsigned long CRC32_t; +void CRC32_Init(CRC32_t *pulCRC); +CRC32_t CRC32_Final(CRC32_t pulCRC); +void CRC32_ProcessBuffer(CRC32_t *pulCRC, void *p, int len); +void CRC32_ProcessByte(CRC32_t *pulCRC, unsigned char ch); +int CRC_File(CRC32_t *crcvalue, char *pszFileName); + +unsigned char COM_BlockSequenceCRCByte (unsigned char *base, int length, int sequence); + +void MD5Init(MD5Context_t *context); +void MD5Update(MD5Context_t *context, unsigned char const *buf, + unsigned int len); +void MD5Final(unsigned char digest[16], MD5Context_t *context); +void Transform(unsigned int buf[4], unsigned int const in[16]); + +int MD5_Hash_File(unsigned char digest[16], char *pszFileName, int bUsefopen, int bSeed, unsigned int seed[4]); +char *MD5_Print(unsigned char hash[16]); +int MD5_Hash_CachedFile(unsigned char digest[16], unsigned char *pCache, int nFileSize, int bSeed, unsigned int seed[4]); + +int CRC_MapFile(CRC32_t *crcvalue, char *pszFileName); + +#endif diff --git a/MiniBase/ValveSDK/common/cvardef.h b/MiniBase/ValveSDK/common/cvardef.h new file mode 100644 index 0000000..2e23406 --- /dev/null +++ b/MiniBase/ValveSDK/common/cvardef.h @@ -0,0 +1,36 @@ +/*** +* +* 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. +* +****/ +#ifndef CVARDEF_H +#define CVARDEF_H + +#define FCVAR_ARCHIVE (1<<0) // set to cause it to be saved to vars.rc +#define FCVAR_USERINFO (1<<1) // changes the client's info string +#define FCVAR_SERVER (1<<2) // notifies players when changed +#define FCVAR_EXTDLL (1<<3) // defined by external DLL +#define FCVAR_CLIENTDLL (1<<4) // defined by the client dll +#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value +#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. +#define FCVAR_PRINTABLEONLY (1<<7) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). +#define FCVAR_UNLOGGED (1<<8) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log + +typedef struct cvar_s +{ + char *name; + char *string; + int flags; + float value; + struct cvar_s *next; +} cvar_t; +#endif diff --git a/MiniBase/ValveSDK/common/demo_api.h b/MiniBase/ValveSDK/common/demo_api.h new file mode 100644 index 0000000..1598913 --- /dev/null +++ b/MiniBase/ValveSDK/common/demo_api.h @@ -0,0 +1,31 @@ +/*** +* +* 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. +* +****/ +#if !defined ( DEMO_APIH ) +#define DEMO_APIH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct demo_api_s +{ + int ( *IsRecording ) ( void ); + int ( *IsPlayingback ) ( void ); + int ( *IsTimeDemo ) ( void ); + void ( *WriteBuffer ) ( int size, unsigned char *buffer ); +} demo_api_t; + +extern demo_api_t demoapi; + +#endif diff --git a/MiniBase/ValveSDK/common/director_cmds.h b/MiniBase/ValveSDK/common/director_cmds.h new file mode 100644 index 0000000..fc6afc2 --- /dev/null +++ b/MiniBase/ValveSDK/common/director_cmds.h @@ -0,0 +1,31 @@ +// director_cmds.h +// sub commands for svc_director + +#define DRC_ACTIVE 0 // tells client that he's an spectator and will get director command +#define DRC_STATUS 1 // send status infos about proxy +#define DRC_CAMERA 2 // set the actual director camera position +#define DRC_EVENT 3 // informs the dircetor about ann important game event + + +#define DRC_FLAG_PRIO_MASK 0x0F // priorities between 0 and 15 (15 most important) +#define DRC_FLAG_SIDE (1<<4) +#define DRC_FLAG_DRAMATIC (1<<5) + + + +// commands of the director API function CallDirectorProc(...) + +#define DRCAPI_NOP 0 // no operation +#define DRCAPI_ACTIVE 1 // de/acivates director mode in engine +#define DRCAPI_STATUS 2 // request proxy information +#define DRCAPI_SETCAM 3 // set camera n to given position and angle +#define DRCAPI_GETCAM 4 // request camera n position and angle +#define DRCAPI_DIRPLAY 5 // set director time and play with normal speed +#define DRCAPI_DIRFREEZE 6 // freeze directo at this time +#define DRCAPI_SETVIEWMODE 7 // overview or 4 cameras +#define DRCAPI_SETOVERVIEWPARAMS 8 // sets parameter for overview mode +#define DRCAPI_SETFOCUS 9 // set the camera which has the input focus +#define DRCAPI_GETTARGETS 10 // queries engine for player list +#define DRCAPI_SETVIEWPOINTS 11 // gives engine all waypoints + + diff --git a/MiniBase/ValveSDK/common/dlight.h b/MiniBase/ValveSDK/common/dlight.h new file mode 100644 index 0000000..f4b163c --- /dev/null +++ b/MiniBase/ValveSDK/common/dlight.h @@ -0,0 +1,33 @@ +/*** +* +* 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. +* +****/ +#if !defined ( DLIGHTH ) +#define DLIGHTH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct +{ + vec3_t origin; + float radius; + color24 color; + float die; // stop lighting after this time + float decay; // drop this each second + float minlight; // don't add when contributing less + int key; + qboolean dark; // subtracts light instead of adding +} dlight_t; + +#endif diff --git a/MiniBase/ValveSDK/common/dll_state.h b/MiniBase/ValveSDK/common/dll_state.h new file mode 100644 index 0000000..4015174 --- /dev/null +++ b/MiniBase/ValveSDK/common/dll_state.h @@ -0,0 +1,15 @@ +//DLL State Flags + +#define DLL_INACTIVE 0 // no dll +#define DLL_ACTIVE 1 // dll is running +#define DLL_PAUSED 2 // dll is paused +#define DLL_CLOSE 3 // closing down dll +#define DLL_TRANS 4 // Level Transition + +// DLL Pause reasons + +#define DLL_NORMAL 0 // User hit Esc or something. +#define DLL_QUIT 4 // Quit now + +// DLL Substate info ( not relevant ) +#define ENG_NORMAL (1<<0) diff --git a/MiniBase/ValveSDK/common/engine_launcher_api.h b/MiniBase/ValveSDK/common/engine_launcher_api.h new file mode 100644 index 0000000..db993bd --- /dev/null +++ b/MiniBase/ValveSDK/common/engine_launcher_api.h @@ -0,0 +1,104 @@ +// engine/launcher interface +#if !defined( ENGINE_LAUNCHER_APIH ) +#define ENGINE_LAUNCHER_APIH +#ifdef _WIN32 +#pragma once +#endif + +typedef void ( *xcommand_t ) ( void ); + +#define RENDERTYPE_UNDEFINED 0 +#define RENDERTYPE_SOFTWARE 1 +#define RENDERTYPE_HARDWARE 2 +#define RENDERTYPE_D3D 3 + +#define ENGINE_LAUNCHER_API_VERSION 1 + +typedef struct engine_api_s +{ + int version; + int rendertype; + int size; + + // Functions + int ( *GetEngineState ) ( void ); + void ( *Cbuf_AddText ) ( char *text ); // append cmd at end of buf + void ( *Cbuf_InsertText ) ( char *text ); // insert cmd at start of buf + void ( *Cmd_AddCommand ) ( char *cmd_name, void ( *funcname )( void ) ); + int ( *Cmd_Argc ) ( void ); + char *( *Cmd_Args ) ( void ); + char *( *Cmd_Argv ) ( int arg ); + void ( *Con_Printf ) ( char *, ... ); + void ( *Con_SafePrintf ) ( char *, ... ); + void ( *Cvar_Set ) ( char *var_name, char *value ); + void ( *Cvar_SetValue ) ( char *var_name, float value ); + int ( *Cvar_VariableInt ) ( char *var_name ); + char *( *Cvar_VariableString ) ( char *var_name ); + float ( *Cvar_VariableValue ) ( char *var_name ); + void ( *ForceReloadProfile ) ( void ); + int ( *GetGameInfo ) ( struct GameInfo_s *pGI, char *pszChannel ); + void ( *GameSetBackground ) ( int bBack ); + void ( *GameSetState ) ( int iState ); + void ( *GameSetSubState ) ( int iState ); + int ( *GetPauseState ) ( void ); + int ( *Host_Frame ) ( float time, int iState, int *stateInfo ); + void ( *Host_GetHostInfo ) ( float *fps, int *nActive, int *nSpectators, int *nMaxPlayers, char *pszMap ); + void ( *Host_Shutdown ) ( void ); + int ( *Game_Init ) ( char *lpCmdLine, unsigned char *pMem, int iSize, struct exefuncs_s *pef, void *, int ); + void ( *IN_ActivateMouse ) ( void ); + void ( *IN_ClearStates ) ( void ); + void ( *IN_DeactivateMouse ) ( void ); + void ( *IN_MouseEvent ) ( int mstate ); + void ( *Keyboard_ReturnToGame ) ( void ); + void ( *Key_ClearStates ) ( void ); + void ( *Key_Event ) ( int key, int down ); + int ( *LoadGame ) ( const char *pszSlot ); + void ( *S_BlockSound ) ( void ); + void ( *S_ClearBuffer ) ( void ); + void ( *S_GetDSPointer ) ( struct IDirectSound **lpDS, struct IDirectSoundBuffer **lpDSBuf ); + void *( *S_GetWAVPointer ) ( void ); + void ( *S_UnblockSound ) ( void ); + int ( *SaveGame ) ( const char *pszSlot, const char *pszComment ); + void ( *SetAuth ) ( void *pobj ); + void ( *SetMessagePumpDisableMode ) ( int bMode ); + void ( *SetPauseState ) ( int bPause ); + void ( *SetStartupMode ) ( int bMode ); + void ( *SNDDMA_Shutdown ) ( void ); + void ( *Snd_AcquireBuffer ) ( void ); + void ( *Snd_ReleaseBuffer ) ( void ); + void ( *StoreProfile ) ( void ); + double ( *Sys_FloatTime ) ( void ); + void ( *VID_UpdateWindowVars ) ( void *prc, int x, int y ); + void ( *VID_UpdateVID ) ( struct viddef_s *pvid ); + + // VGUI interfaces + void ( *VGui_CallEngineSurfaceProc ) ( void* hwnd, unsigned int msg, unsigned int wparam, long lparam ); + + // notifications that the launcher is taking/giving focus to the engine + void ( *EngineTakingFocus ) ( void ); + void ( *LauncherTakingFocus ) ( void ); + +#ifdef _WIN32 + // Only filled in by rendertype RENDERTYPE_HARDWARE + void ( *GL_Init ) ( void ); + int ( *GL_SetMode ) ( HWND hwndGame, HDC *pmaindc, HGLRC *pbaseRC, int fD3D, const char *p, const char *pszCmdLine ); + void ( *GL_Shutdown ) ( HWND hwnd, HDC hdc, HGLRC hglrc ); + + void ( *QGL_D3DShared ) ( struct tagD3DGlobals *d3dGShared ); + + int ( WINAPI *glSwapBuffers ) ( HDC dc ); + void ( *DirectorProc ) ( unsigned int cmd, void * params ); +#else + // NOT USED IN LINUX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + void ( *GL_Init ) ( void ); + void ( *GL_SetMode ) ( void ); + void ( *GL_Shutdown ) ( void ); + void ( *QGL_D3DShared ) ( void ); + void ( *glSwapBuffers ) ( void ); + void ( *DirectorProc ) ( void ); + // LINUX +#endif + +} engine_api_t; + +#endif // ENGINE_LAUNCHER_APIH diff --git a/MiniBase/ValveSDK/common/entity_state.h b/MiniBase/ValveSDK/common/entity_state.h new file mode 100644 index 0000000..8021e0a --- /dev/null +++ b/MiniBase/ValveSDK/common/entity_state.h @@ -0,0 +1,193 @@ +/*** +* +* 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. +* +****/ +#if !defined( ENTITY_STATEH ) +#define ENTITY_STATEH +#ifdef _WIN32 +#pragma once +#endif + +// For entityType below +#define ENTITY_NORMAL (1<<0) +#define ENTITY_BEAM (1<<1) + +// Entity state is used for the baseline and for delta compression of a packet of +// entities that is sent to a client. +typedef struct entity_state_s entity_state_t; + +struct entity_state_s +{ +// Fields which are filled in by routines outside of delta compression + int entityType; + // Index into cl_entities array for this entity. + int number; + float msg_time; + + // Message number last time the player/entity state was updated. + int messagenum; + + // Fields which can be transitted and reconstructed over the network stream + vec3_t origin; + vec3_t angles; + + int modelindex; + int sequence; + float frame; + int colormap; + short skin; + short solid; + int effects; + float scale; + + byte eflags; + + // Render information + int rendermode; + int renderamt; + color24 rendercolor; + int renderfx; + + int movetype; + float animtime; + float framerate; + int body; + byte controller[4]; + byte blending[4]; + vec3_t velocity; + + // Send bbox down to client for use during prediction. + vec3_t mins; + vec3_t maxs; + + int aiment; + // If owned by a player, the index of that player ( for projectiles ). + int owner; + + // Friction, for prediction. + float friction; + // Gravity multiplier + float gravity; + +// PLAYER SPECIFIC + int team; + int playerclass; + int health; + qboolean spectator; + int weaponmodel; + int gaitsequence; + // If standing on conveyor, e.g. + vec3_t basevelocity; + // Use the crouched hull, or the regular player hull. + int usehull; + // Latched buttons last time state updated. + int oldbuttons; + // -1 = in air, else pmove entity number + int onground; + int iStepLeft; + // How fast we are falling + float flFallVelocity; + + float fov; + int weaponanim; + + // Parametric movement overrides + vec3_t startpos; + vec3_t endpos; + float impacttime; + float starttime; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; +}; + +#include "pm_info.h" + +typedef struct clientdata_s +{ + vec3_t origin; + vec3_t velocity; + + int viewmodel; + vec3_t punchangle; + int flags; + int waterlevel; + int watertype; + vec3_t view_ofs; + float health; + + int bInDuck; + + int weapons; // remove? + + int flTimeStepSound; + int flDuckTime; + int flSwimTime; + int waterjumptime; + + float maxspeed; + + float fov; + int weaponanim; + + int m_iId; + int ammo_shells; + int ammo_nails; + int ammo_cells; + int ammo_rockets; + float m_flNextAttack; + + int tfstate; + + int pushmsec; + + int deadflag; + + char physinfo[ MAX_PHYSINFO_STRING ]; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; +} clientdata_t; + +#include "weaponinfo.h" + +typedef struct local_state_s +{ + entity_state_t playerstate; + clientdata_t client; + weapon_data_t weapondata[ 32 ]; +} local_state_t; + +#endif // !ENTITY_STATEH diff --git a/MiniBase/ValveSDK/common/entity_types.h b/MiniBase/ValveSDK/common/entity_types.h new file mode 100644 index 0000000..defef27 --- /dev/null +++ b/MiniBase/ValveSDK/common/entity_types.h @@ -0,0 +1,26 @@ +/*** +* +* 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. +* +****/ +// entity_types.h +#if !defined( ENTITY_TYPESH ) +#define ENTITY_TYPESH + +#define ET_NORMAL 0 +#define ET_PLAYER 1 +#define ET_TEMPENTITY 2 +#define ET_BEAM 3 +// BMODEL or SPRITE that was split across BSP nodes +#define ET_FRAGMENTED 4 + +#endif // !ENTITY_TYPESH diff --git a/MiniBase/ValveSDK/common/event_api.h b/MiniBase/ValveSDK/common/event_api.h new file mode 100644 index 0000000..76564f8 --- /dev/null +++ b/MiniBase/ValveSDK/common/event_api.h @@ -0,0 +1,51 @@ +/*** +* +* 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. +* +****/ +#if !defined ( EVENT_APIH ) +#define EVENT_APIH +#ifdef _WIN32 +#pragma once +#endif + +#define EVENT_API_VERSION 1 + +typedef struct event_api_s +{ + int version; + void ( *EV_PlaySound ) ( int ent, float *origin, int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch ); + void ( *EV_StopSound ) ( int ent, int channel, const char *sample ); + int ( *EV_FindModelIndex )( const char *pmodel ); + int ( *EV_IsLocal ) ( int playernum ); + int ( *EV_LocalPlayerDucking ) ( void ); + void ( *EV_LocalPlayerViewheight ) ( float * ); + void ( *EV_LocalPlayerBounds ) ( int hull, float *mins, float *maxs ); + int ( *EV_IndexFromTrace) ( struct pmtrace_s *pTrace ); + struct physent_s *( *EV_GetPhysent ) ( int idx ); + void ( *EV_SetUpPlayerPrediction ) ( int dopred, int bIncludeLocalClient ); + void ( *EV_PushPMStates ) ( void ); + void ( *EV_PopPMStates ) ( void ); + void ( *EV_SetSolidPlayers ) (int playernum); + void ( *EV_SetTraceHull ) ( int hull ); + void ( *EV_PlayerTrace ) ( float *start, float *end, int traceFlags, int ignore_pe, struct pmtrace_s *tr ); + void ( *EV_WeaponAnimation ) ( int sequence, int body ); + unsigned short ( *EV_PrecacheEvent ) ( int type, const char* psz ); + void ( *EV_PlaybackEvent ) ( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); + const char *( *EV_TraceTexture ) ( int ground, float *vstart, float *vend ); + void ( *EV_StopAllSounds ) ( int entnum, int entchannel ); + void ( *EV_KillEvents ) ( int entnum, const char *eventname ); +} event_api_t; + +extern event_api_t eventapi; + +#endif diff --git a/MiniBase/ValveSDK/common/event_args.h b/MiniBase/ValveSDK/common/event_args.h new file mode 100644 index 0000000..f1ebda3 --- /dev/null +++ b/MiniBase/ValveSDK/common/event_args.h @@ -0,0 +1,50 @@ +/*** +* +* 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. +* +****/ +#if !defined( EVENT_ARGSH ) +#define EVENT_ARGSH +#ifdef _WIN32 +#pragma once +#endif + +// Event was invoked with stated origin +#define FEVENT_ORIGIN ( 1<<0 ) + +// Event was invoked with stated angles +#define FEVENT_ANGLES ( 1<<1 ) + +typedef struct event_args_s +{ + int flags; + + // Transmitted + int entindex; + + float origin[3]; + float angles[3]; + float velocity[3]; + + int ducking; + + float fparam1; + float fparam2; + + int iparam1; + int iparam2; + + int bparam1; + int bparam2; +} event_args_t; + +#endif diff --git a/MiniBase/ValveSDK/common/event_flags.h b/MiniBase/ValveSDK/common/event_flags.h new file mode 100644 index 0000000..453673c --- /dev/null +++ b/MiniBase/ValveSDK/common/event_flags.h @@ -0,0 +1,47 @@ +/*** +* +* 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. +* +****/ +#if !defined( EVENT_FLAGSH ) +#define EVENT_FLAGSH +#ifdef _WIN32 +#pragma once +#endif + +// Skip local host for event send. +#define FEV_NOTHOST (1<<0) + +// Send the event reliably. You must specify the origin and angles and use +// PLAYBACK_EVENT_FULL for this to work correctly on the server for anything +// that depends on the event origin/angles. I.e., the origin/angles are not +// taken from the invoking edict for reliable events. +#define FEV_RELIABLE (1<<1) + +// Don't restrict to PAS/PVS, send this event to _everybody_ on the server ( useful for stopping CHAN_STATIC +// sounds started by client event when client is not in PVS anymore ( hwguy in TFC e.g. ). +#define FEV_GLOBAL (1<<2) + +// If this client already has one of these events in its queue, just update the event instead of sending it as a duplicate +// +#define FEV_UPDATE (1<<3) + +// Only send to entity specified as the invoker +#define FEV_HOSTONLY (1<<4) + +// Only send if the event was created on the server. +#define FEV_SERVER (1<<5) + +// Only issue event client side ( from shared code ) +#define FEV_CLIENT (1<<6) + +#endif diff --git a/MiniBase/ValveSDK/common/exefuncs.h b/MiniBase/ValveSDK/common/exefuncs.h new file mode 100644 index 0000000..fe718c6 --- /dev/null +++ b/MiniBase/ValveSDK/common/exefuncs.h @@ -0,0 +1,41 @@ +// exefuncs.h +#ifndef EXEFUNCS_H +#define EXEFUNCS_H + +// Engine hands this to DLLs for functionality callbacks +typedef struct exefuncs_s +{ + int fMMX; + int iCPUMhz; + void (*unused1)(void); + void (*unused2)(void); + void (*unused3)(void); + void (*unused4)(void); + void (*VID_ForceLockState)(int lk); + int (*VID_ForceUnlockedAndReturnState)(void); + void (*unused5)(void); + void (*unused6)(void); + void (*unused7)(void); + void (*unused8)(void); + void (*unused9)(void); + void (*unused10)(void); + void (*unused11)(void); + void (*unused12)(void); + void (*unused13)(void); + void (*unused14)(void); + void (*unused15)(void); + void (*ErrorMessage)(int nLevel, const char *pszErrorMessage); + void (*unused16)(void); + void (*Sys_Printf)(char *fmt, ...); + void (*unused17)(void); + void (*unused18)(void); + void (*unused19)(void); + void (*unused20)(void); + void (*unused21)(void); + void (*unused22)(void); + void (*unused23)(void); + void (*unused24)(void); + void (*unused25)(void); +} exefuncs_t; + +#endif diff --git a/MiniBase/ValveSDK/common/hltv.h b/MiniBase/ValveSDK/common/hltv.h new file mode 100644 index 0000000..c762124 --- /dev/null +++ b/MiniBase/ValveSDK/common/hltv.h @@ -0,0 +1,37 @@ +// hltv.h +// all shared consts between server, clients and proxy + +#define TYPE_CLIENT 0 // client is a normal HL client (default) +#define TYPE_PROXY 1 // client is another proxy +#define TYPE_DIRECTOR 2 // client is a director +#define TYPE_COMMENTATOR 3 // client is a commentator + + +#define HLTV_ACTIVE 0 // tells client that he's an spectator and will get director command +#define HLTV_STATUS 1 // send status infos about proxy +#define HLTV_CAMERA 2 // set the actual director camera position +#define HLTV_EVENT 3 // informs the dircetor about ann important game event + + +#define DRC_FLAG_PRIO_MASK 0x0F // priorities between 0 and 15 (15 most important) +#define DRC_FLAG_SIDE (1<<4) +#define DRC_FLAG_DRAMATIC (1<<5) + + + +// commands of the director API function CallDirectorProc(...) + +#define DRCAPI_NOP 0 // no operation +#define DRCAPI_ACTIVE 1 // de/acivates director mode in engine +#define DRCAPI_STATUS 2 // request proxy information +#define DRCAPI_SETCAM 3 // set camera n to given position and angle +#define DRCAPI_GETCAM 4 // request camera n position and angle +#define DRCAPI_DIRTIME 5 // set director time +#define DRCAPI_DIRSCALE 6 // set time scale +#define DRCAPI_SETVIEWMODE 7 // overview or 4 cameras +#define DRCAPI_SETOVERVIEWPARAMS 8 // sets parameter for overview mode +#define DRCAPI_SETFOCUS 9 // set the camera which has the input focus +#define DRCAPI_GETTARGETS 10 // queries engine for player list +#define DRCAPI_SETVIEWPOINTS 11 // gives engine all waypoints + + diff --git a/MiniBase/ValveSDK/common/in_buttons.h b/MiniBase/ValveSDK/common/in_buttons.h new file mode 100644 index 0000000..8cf40ec --- /dev/null +++ b/MiniBase/ValveSDK/common/in_buttons.h @@ -0,0 +1,38 @@ +/*** +* +* 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. +* +****/ +#ifndef IN_BUTTONS_H +#define IN_BUTTONS_H +#ifdef _WIN32 +#pragma once +#endif + +#define IN_ATTACK (1 << 0) +#define IN_JUMP (1 << 1) +#define IN_DUCK (1 << 2) +#define IN_FORWARD (1 << 3) +#define IN_BACK (1 << 4) +#define IN_USE (1 << 5) +#define IN_CANCEL (1 << 6) +#define IN_LEFT (1 << 7) +#define IN_RIGHT (1 << 8) +#define IN_MOVELEFT (1 << 9) +#define IN_MOVERIGHT (1 << 10) +#define IN_ATTACK2 (1 << 11) +#define IN_RUN (1 << 12) +#define IN_RELOAD (1 << 13) +#define IN_ALT1 (1 << 14) +#define IN_SCORE (1 << 15) // Used by client.dll for when scoreboard is held down + +#endif // IN_BUTTONS_H diff --git a/MiniBase/ValveSDK/common/interface.cpp b/MiniBase/ValveSDK/common/interface.cpp new file mode 100644 index 0000000..0a73c26 --- /dev/null +++ b/MiniBase/ValveSDK/common/interface.cpp @@ -0,0 +1,142 @@ + +#include +#include +#include "interface.h" + +#ifndef _WIN32 // LINUX +#include +#endif + + +// ------------------------------------------------------------------------------------ // +// InterfaceReg. +// ------------------------------------------------------------------------------------ // +InterfaceReg *InterfaceReg::s_pInterfaceRegs = NULL; + + +InterfaceReg::InterfaceReg( InstantiateInterfaceFn fn, const char *pName ) : + m_pName(pName) +{ + m_CreateFn = fn; + m_pNext = s_pInterfaceRegs; + s_pInterfaceRegs = this; +} + + + +// ------------------------------------------------------------------------------------ // +// CreateInterface. +// ------------------------------------------------------------------------------------ // +IBaseInterface *CreateInterface( const char *pName, int *pReturnCode ) +{ + InterfaceReg *pCur; + + for(pCur=InterfaceReg::s_pInterfaceRegs; pCur; pCur=pCur->m_pNext) + { + if(strcmp(pCur->m_pName, pName) == 0) + { + if ( pReturnCode ) + { + *pReturnCode = IFACE_OK; + } + return pCur->m_CreateFn(); + } + } + + if ( pReturnCode ) + { + *pReturnCode = IFACE_FAILED; + } + return NULL; +} + + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include "windows.h" +#endif + + +#ifdef _WIN32 +HINTERFACEMODULE Sys_LoadModule(const char *pModuleName) +{ + return (HINTERFACEMODULE)LoadLibrary(pModuleName); +} + +#else // LINUX +HINTERFACEMODULE Sys_LoadModule(const char *pModuleName) +{ + // Linux dlopen() doesn't look in the current directory for libraries. + // We tell it to, so people don't have to 'install' libraries as root. + + char szCwd[1024]; + char szAbsoluteLibFilename[1024]; + + getcwd( szCwd, sizeof( szCwd ) ); + if ( szCwd[ strlen( szCwd ) - 1 ] == '/' ) + szCwd[ strlen( szCwd ) - 1 ] = 0; + + sprintf( szAbsoluteLibFilename, "%s/%s", szCwd, pModuleName ); + + return (HINTERFACEMODULE)dlopen( szAbsoluteLibFilename, RTLD_NOW ); +} + +#endif + + +#ifdef _WIN32 +void Sys_FreeModule(HINTERFACEMODULE hModule) +{ + if(!hModule) + return; + + FreeLibrary((HMODULE)hModule); +} + +#else // LINUX +void Sys_FreeModule(HINTERFACEMODULE hModule) +{ + if(!hModule) + return; + + dlclose( (void *)hModule ); +} + +#endif + + +//----------------------------------------------------------------------------- +// Purpose: returns the instance of this module +// Output : interface_instance_t +//----------------------------------------------------------------------------- +CreateInterfaceFn Sys_GetFactoryThis( void ) +{ + return CreateInterface; +} + + +//----------------------------------------------------------------------------- +// Purpose: returns the instance of the named module +// Input : *pModuleName - name of the module +// Output : interface_instance_t - instance of that module +//----------------------------------------------------------------------------- + +#ifdef _WIN32 +CreateInterfaceFn Sys_GetFactory( HINTERFACEMODULE hModule ) +{ + if(!hModule) + return NULL; + + return (CreateInterfaceFn)GetProcAddress((HMODULE)hModule, CREATEINTERFACE_PROCNAME); +} + +#else // LINUX +CreateInterfaceFn Sys_GetFactory( HINTERFACEMODULE hModule ) +{ + if(!hModule) + return NULL; + + return dlsym( (void *)hModule, CREATEINTERFACE_PROCNAME ); +} + +#endif diff --git a/MiniBase/ValveSDK/common/interface.h b/MiniBase/ValveSDK/common/interface.h new file mode 100644 index 0000000..5a116b1 --- /dev/null +++ b/MiniBase/ValveSDK/common/interface.h @@ -0,0 +1,120 @@ + +// This header defines the interface convention used in the valve engine. +// To make an interface and expose it: +// 1. Derive from IBaseInterface. +// 2. The interface must be ALL pure virtuals, and have no data members. +// 3. Define a name for it. +// 4. In its implementation file, use EXPOSE_INTERFACE or EXPOSE_SINGLE_INTERFACE. + +// Versioning +// There are two versioning cases that are handled by this: +// 1. You add functions to the end of an interface, so it is binary compatible with the previous interface. In this case, +// you need two EXPOSE_INTERFACEs: one to expose your class as the old interface and one to expose it as the new interface. +// 2. You update an interface so it's not compatible anymore (but you still want to be able to expose the old interface +// for legacy code). In this case, you need to make a new version name for your new interface, and make a wrapper interface and +// expose it for the old interface. + +#ifndef INTERFACE_H +#define INTERFACE_H + +#ifdef __cplusplus + +// All interfaces derive from this. +class IBaseInterface +{ +public: + + virtual ~IBaseInterface() {} +}; + + +#define CREATEINTERFACE_PROCNAME "CreateInterface" +typedef IBaseInterface* (*CreateInterfaceFn)(const char *pName, int *pReturnCode); + + +typedef IBaseInterface* (*InstantiateInterfaceFn)(); + + +// Used internally to register classes. +class InterfaceReg +{ +public: + InterfaceReg(InstantiateInterfaceFn fn, const char *pName); + +public: + + InstantiateInterfaceFn m_CreateFn; + const char *m_pName; + + InterfaceReg *m_pNext; // For the global list. + static InterfaceReg *s_pInterfaceRegs; +}; + + +// Use this to expose an interface that can have multiple instances. +// e.g.: +// EXPOSE_INTERFACE( CInterfaceImp, IInterface, "MyInterface001" ) +// This will expose a class called CInterfaceImp that implements IInterface (a pure class) +// clients can receive a pointer to this class by calling CreateInterface( "MyInterface001" ) +// +// In practice, the shared header file defines the interface (IInterface) and version name ("MyInterface001") +// so that each component can use these names/vtables to communicate +// +// A single class can support multiple interfaces through multiple inheritance +// +#define EXPOSE_INTERFACE_FN(functionName, interfaceName, versionName) \ + static InterfaceReg __g_Create##className##_reg(functionName, versionName); + +#define EXPOSE_INTERFACE(className, interfaceName, versionName) \ + static IBaseInterface* __Create##className##_interface() {return (interfaceName *)new className;}\ + static InterfaceReg __g_Create##className##_reg(__Create##className##_interface, versionName ); + +// Use this to expose a singleton interface with a global variable you've created. +#define EXPOSE_SINGLE_INTERFACE_GLOBALVAR(className, interfaceName, versionName, globalVarName) \ + static IBaseInterface* __Create##className##interfaceName##_interface() {return (interfaceName *)&globalVarName;}\ + static InterfaceReg __g_Create##className##interfaceName##_reg(__Create##className##interfaceName##_interface, versionName); + +// Use this to expose a singleton interface. This creates the global variable for you automatically. +#define EXPOSE_SINGLE_INTERFACE(className, interfaceName, versionName) \ + static className __g_##className##_singleton;\ + EXPOSE_SINGLE_INTERFACE_GLOBALVAR(className, interfaceName, versionName, __g_##className##_singleton) + + +#ifdef WIN32 + #define EXPORT_FUNCTION __declspec(dllexport) +#else + #define EXPORT_FUNCTION +#endif + + +// This function is automatically exported and allows you to access any interfaces exposed with the above macros. +// if pReturnCode is set, it will return one of the following values +// extend this for other error conditions/code +enum +{ + IFACE_OK = 0, + IFACE_FAILED +}; + + +IBaseInterface* CreateInterface(const char *pName, int *pReturnCode); + + +// Handle to an interface (HInterfaceModule_t* is just there for type safety). +typedef struct HInterfaceModule_t* HINTERFACEMODULE; + + +// Use these to load and unload a module. +extern HINTERFACEMODULE Sys_LoadModule(const char *pModuleName); +extern void Sys_FreeModule(HINTERFACEMODULE hModule); + +// Use these to get the factory function from either a loaded module or the current module. +extern CreateInterfaceFn Sys_GetFactory( HINTERFACEMODULE hModule ); +extern CreateInterfaceFn Sys_GetFactoryThis( void ); + +#endif // __cplusplus + +#endif + + + diff --git a/MiniBase/ValveSDK/common/itrackeruser.h b/MiniBase/ValveSDK/common/itrackeruser.h new file mode 100644 index 0000000..49aba5e --- /dev/null +++ b/MiniBase/ValveSDK/common/itrackeruser.h @@ -0,0 +1,46 @@ +//========= Copyright 1996-2001, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#ifndef ITRACKERUSER_H +#define ITRACKERUSER_H +#ifdef _WIN32 +#pragma once +#endif + +#include "interface.h" + +//----------------------------------------------------------------------------- +// Purpose: Interface to accessing information about tracker users +//----------------------------------------------------------------------------- +class ITrackerUser : public IBaseInterface +{ +public: + // returns true if the interface is ready for use + virtual bool IsValid() = 0; + + // returns the tracker ID of the current user + virtual int GetTrackerID() = 0; + + // returns information about a user + // information may not be known about some users, "" will be returned + virtual const char *GetUserName(int trackerID) = 0; + virtual const char *GetFirstName(int trackerID) = 0; + virtual const char *GetLastName(int trackerID) = 0; + virtual const char *GetEmail(int trackerID) = 0; + + // returns true if friendID is a friend of the current user + // ie. the current is authorized to see when the friend is online + virtual bool IsFriend(int friendID) = 0; + + // requests authorization from a user + virtual void RequestAuthorizationFromUser(int potentialFriendID) = 0; +}; + +#define TRACKERUSER_INTERFACE_VERSION "TrackerUser001" + + +#endif // ITRACKERUSER_H diff --git a/MiniBase/ValveSDK/common/ivoicetweak.h b/MiniBase/ValveSDK/common/ivoicetweak.h new file mode 100644 index 0000000..f30e813 --- /dev/null +++ b/MiniBase/ValveSDK/common/ivoicetweak.h @@ -0,0 +1,35 @@ +//========= Copyright 1996-2001, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#ifndef IVOICETWEAK_H +#define IVOICETWEAK_H +#ifdef _WIN32 +#pragma once +#endif + +// These provide access to the voice controls. +typedef enum +{ + MicrophoneVolume=0, // values 0-1. + OtherSpeakerScale // values 0-1. Scales how loud other players are. +} VoiceTweakControl; + + +typedef struct IVoiceTweak_s +{ + // These turn voice tweak mode on and off. While in voice tweak mode, the user's voice is echoed back + // without sending to the server. + int (*StartVoiceTweakMode)(); // Returns 0 on error. + void (*EndVoiceTweakMode)(); + + // Get/set control values. + void (*SetControlFloat)(VoiceTweakControl iControl, float value); + float (*GetControlFloat)(VoiceTweakControl iControl); +} IVoiceTweak; + + +#endif // IVOICETWEAK_H diff --git a/MiniBase/ValveSDK/common/mathlib.h b/MiniBase/ValveSDK/common/mathlib.h new file mode 100644 index 0000000..7e33a86 --- /dev/null +++ b/MiniBase/ValveSDK/common/mathlib.h @@ -0,0 +1,149 @@ +/*** +* +* 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. +* +****/ +// mathlib.h + +typedef float vec_t; +typedef vec_t vec3_t[3]; +typedef vec_t vec4_t[4]; // x,y,z,w +typedef vec_t vec5_t[5]; + +typedef short vec_s_t; +typedef vec_s_t vec3s_t[3]; +typedef vec_s_t vec4s_t[4]; // x,y,z,w +typedef vec_s_t vec5s_t[5]; + +typedef int fixed4_t; +typedef int fixed8_t; +typedef int fixed16_t; + +#ifndef M_PI +#define M_PI 3.14159265358979323846 // matches value in gcc v2 math.h +#endif + +struct mplane_s; + +extern vec3_t vec3_origin; +extern int nanmask; + +#define IS_NAN(x) (((*(int *)&x)&nanmask)==nanmask) + +#ifndef VECTOR_H + #define DotProduct(x,y) ((x)[0]*(y)[0]+(x)[1]*(y)[1]+(x)[2]*(y)[2]) +#endif + +#define VectorSubtract(a,b,c) {(c)[0]=(a)[0]-(b)[0];(c)[1]=(a)[1]-(b)[1];(c)[2]=(a)[2]-(b)[2];} +#define VectorAdd(a,b,c) {(c)[0]=(a)[0]+(b)[0];(c)[1]=(a)[1]+(b)[1];(c)[2]=(a)[2]+(b)[2];} +#define VectorCopy(a,b) {(b)[0]=(a)[0];(b)[1]=(a)[1];(b)[2]=(a)[2];} +#define VectorClear(a) {(a)[0]=0.0;(a)[1]=0.0;(a)[2]=0.0;} + +void VectorMA (const vec3_t veca, float scale, const vec3_t vecb, vec3_t vecc); + +vec_t _DotProduct (vec3_t v1, vec3_t v2); +void _VectorSubtract (vec3_t veca, vec3_t vecb, vec3_t out); +void _VectorAdd (vec3_t veca, vec3_t vecb, vec3_t out); +void _VectorCopy (vec3_t in, vec3_t out); + +int VectorCompare (const vec3_t v1, const vec3_t v2); +float Length (const vec3_t v); +void CrossProduct (const vec3_t v1, const vec3_t v2, vec3_t cross); +float VectorNormalize (vec3_t v); // returns vector length +void VectorInverse (vec3_t v); +void VectorScale (const vec3_t in, vec_t scale, vec3_t out); +int Q_log2(int val); + +void R_ConcatRotations (float in1[3][3], float in2[3][3], float out[3][3]); +void R_ConcatTransforms (float in1[3][4], float in2[3][4], float out[3][4]); + +// Here are some "manual" INLINE routines for doing floating point to integer conversions +extern short new_cw, old_cw; + +typedef union DLONG { + int i[2]; + double d; + float f; + } DLONG; + +extern DLONG dlong; + +#ifdef _WIN32 +void __inline set_fpu_cw(void) +{ +_asm + { wait + fnstcw old_cw + wait + mov ax, word ptr old_cw + or ah, 0xc + mov word ptr new_cw,ax + fldcw new_cw + } +} + +int __inline quick_ftol(float f) +{ + _asm { + // Assumes that we are already in chop mode, and only need a 32-bit int + fld DWORD PTR f + fistp DWORD PTR dlong + } + return dlong.i[0]; +} + +void __inline restore_fpu_cw(void) +{ + _asm fldcw old_cw +} +#else +#define set_fpu_cw() /* */ +#define quick_ftol(f) ftol(f) +#define restore_fpu_cw() /* */ +#endif + +void FloorDivMod (double numer, double denom, int *quotient, + int *rem); +fixed16_t Invert24To16(fixed16_t val); +int GreatestCommonDivisor (int i1, int i2); + +void AngleVectors (const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up); +void AngleVectorsTranspose (const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up); +#define AngleIVectors AngleVectorsTranspose + +void AngleMatrix (const vec3_t angles, float (*matrix)[4] ); +void AngleIMatrix (const vec3_t angles, float (*matrix)[4] ); +void VectorTransform (const vec3_t in1, float in2[3][4], vec3_t out); + +void VectorMatrix( vec3_t forward, vec3_t right, vec3_t up); +void VectorAngles( const vec3_t forward, vec3_t angles ); + +int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct mplane_s *plane); +float anglemod(float a); + + + +#define BOX_ON_PLANE_SIDE(emins, emaxs, p) \ + (((p)->type < 3)? \ + ( \ + ((p)->dist <= (emins)[(p)->type])? \ + 1 \ + : \ + ( \ + ((p)->dist >= (emaxs)[(p)->type])?\ + 2 \ + : \ + 3 \ + ) \ + ) \ + : \ + BoxOnPlaneSide( (emins), (emaxs), (p))) diff --git a/MiniBase/ValveSDK/common/net_api.h b/MiniBase/ValveSDK/common/net_api.h new file mode 100644 index 0000000..52f406a --- /dev/null +++ b/MiniBase/ValveSDK/common/net_api.h @@ -0,0 +1,92 @@ +#if !defined( NET_APIH ) +#define NET_APIH +#ifdef _WIN32 +#pragma once +#endif + +#if !defined ( NETADRH ) +#include "netadr.h" +#endif + +#define NETAPI_REQUEST_SERVERLIST ( 0 ) // Doesn't need a remote address +#define NETAPI_REQUEST_PING ( 1 ) +#define NETAPI_REQUEST_RULES ( 2 ) +#define NETAPI_REQUEST_PLAYERS ( 3 ) +#define NETAPI_REQUEST_DETAILS ( 4 ) + +// Set this flag for things like broadcast requests, etc. where the engine should not +// kill the request hook after receiving the first response +#define FNETAPI_MULTIPLE_RESPONSE ( 1<<0 ) + +typedef void ( *net_api_response_func_t ) ( struct net_response_s *response ); + +#define NET_SUCCESS ( 0 ) +#define NET_ERROR_TIMEOUT ( 1<<0 ) +#define NET_ERROR_PROTO_UNSUPPORTED ( 1<<1 ) +#define NET_ERROR_UNDEFINED ( 1<<2 ) + +typedef struct net_adrlist_s +{ + struct net_adrlist_s *next; + netadr_t remote_address; +} net_adrlist_t; + +typedef struct net_response_s +{ + // NET_SUCCESS or an error code + int error; + + // Context ID + int context; + // Type + int type; + + // Server that is responding to the request + netadr_t remote_address; + + // Response RTT ping time + double ping; + // Key/Value pair string ( separated by backlash \ characters ) + // WARNING: You must copy this buffer in the callback function, because it is freed + // by the engine right after the call!!!! + // ALSO: For NETAPI_REQUEST_SERVERLIST requests, this will be a pointer to a linked list of net_adrlist_t's + void *response; +} net_response_t; + +typedef struct net_status_s +{ + // Connected to remote server? 1 == yes, 0 otherwise + int connected; + // Client's IP address + netadr_t local_address; + // Address of remote server + netadr_t remote_address; + // Packet Loss ( as a percentage ) + int packet_loss; + // Latency, in seconds ( multiply by 1000.0 to get milliseconds ) + double latency; + // Connection time, in seconds + double connection_time; + // Rate setting ( for incoming data ) + double rate; +} net_status_t; + +typedef struct net_api_s +{ + // APIs + void ( *InitNetworking )( void ); + void ( *Status ) ( struct net_status_s *status ); + void ( *SendRequest) ( int context, int request, int flags, double timeout, struct netadr_s *remote_address, net_api_response_func_t response ); + void ( *CancelRequest ) ( int context ); + void ( *CancelAllRequests ) ( void ); + char *( *AdrToString ) ( struct netadr_s *a ); + int ( *CompareAdr ) ( struct netadr_s *a, struct netadr_s *b ); + int ( *StringToAdr ) ( char *s, struct netadr_s *a ); + const char *( *ValueForKey ) ( const char *s, const char *key ); + void ( *RemoveKey ) ( char *s, const char *key ); + void ( *SetValueForKey ) (char *s, const char *key, const char *value, int maxsize ); +} net_api_t; + +extern net_api_t netapi; + +#endif // NET_APIH \ No newline at end of file diff --git a/MiniBase/ValveSDK/common/netadr.h b/MiniBase/ValveSDK/common/netadr.h new file mode 100644 index 0000000..d3c28f0 --- /dev/null +++ b/MiniBase/ValveSDK/common/netadr.h @@ -0,0 +1,40 @@ +/*** +* +* 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. +* +****/ +// netadr.h +#ifndef NETADR_H +#define NETADR_H +#ifdef _WIN32 +#pragma once +#endif + +typedef enum +{ + NA_UNUSED, + NA_LOOPBACK, + NA_BROADCAST, + NA_IP, + NA_IPX, + NA_BROADCAST_IPX, +} netadrtype_t; + +typedef struct netadr_s +{ + netadrtype_t type; + unsigned char ip[4]; + unsigned char ipx[10]; + unsigned short port; +} netadr_t; + +#endif // NETADR_H diff --git a/MiniBase/ValveSDK/common/nowin.h b/MiniBase/ValveSDK/common/nowin.h new file mode 100644 index 0000000..e9a7905 --- /dev/null +++ b/MiniBase/ValveSDK/common/nowin.h @@ -0,0 +1,9 @@ + +#ifndef INC_NOWIN_H +#define INC_NOWIN_H +#ifndef _WIN32 + +#include + +#endif //!_WIN32 +#endif //INC_NOWIN_H \ No newline at end of file diff --git a/MiniBase/ValveSDK/common/particledef.h b/MiniBase/ValveSDK/common/particledef.h new file mode 100644 index 0000000..9e559f3 --- /dev/null +++ b/MiniBase/ValveSDK/common/particledef.h @@ -0,0 +1,57 @@ +/*** +* +* 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. +* +****/ +#if !defined( PARTICLEDEFH ) +#define PARTICLEDEFH +#ifdef _WIN32 +#pragma once +#endif + +typedef enum { + pt_static, + pt_grav, + pt_slowgrav, + pt_fire, + pt_explode, + pt_explode2, + pt_blob, + pt_blob2, + pt_vox_slowgrav, + pt_vox_grav, + pt_clientcustom // Must have callback function specified +} ptype_t; + +// !!! if this is changed, it must be changed in d_ifacea.h too !!! +typedef struct particle_s +{ +// driver-usable fields + vec3_t org; + short color; + short packedColor; +// drivers never touch the following fields + struct particle_s *next; + vec3_t vel; + float ramp; + float die; + ptype_t type; + void (*deathfunc)( struct particle_s *particle ); + + // for pt_clientcusttom, we'll call this function each frame + void (*callback)( struct particle_s *particle, float frametime ); + + // For deathfunc, etc. + unsigned char context; +} particle_t; + +#endif diff --git a/MiniBase/ValveSDK/common/pmtrace.h b/MiniBase/ValveSDK/common/pmtrace.h new file mode 100644 index 0000000..b34a1b5 --- /dev/null +++ b/MiniBase/ValveSDK/common/pmtrace.h @@ -0,0 +1,43 @@ +/*** +* +* 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. +* +****/ +#if !defined( PMTRACEH ) +#define PMTRACEH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct +{ + vec3_t normal; + float dist; +} pmplane_t; + +typedef struct pmtrace_s pmtrace_t; + +struct pmtrace_s +{ + qboolean allsolid; // if true, plane is not valid + qboolean startsolid; // if true, the initial point was in a solid area + qboolean inopen, inwater; // End point is in empty space or in water + float fraction; // time completed, 1.0 = didn't hit anything + vec3_t endpos; // final position + pmplane_t plane; // surface normal at impact + int ent; // entity at impact + vec3_t deltavelocity; // Change in player's velocity caused by impact. + // Only run on server. + int hitgroup; +}; + +#endif diff --git a/MiniBase/ValveSDK/common/qfont.h b/MiniBase/ValveSDK/common/qfont.h new file mode 100644 index 0000000..aaa5e5b --- /dev/null +++ b/MiniBase/ValveSDK/common/qfont.h @@ -0,0 +1,40 @@ +/*** +* +* 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. +* +****/ +#if !defined( QFONTH ) +#define QFONTH +#ifdef _WIN32 +#pragma once +#endif + +// Font stuff + +#define NUM_GLYPHS 256 + +typedef struct +{ + short startoffset; + short charwidth; +} charinfo; + +typedef struct qfont_s +{ + int width, height; + int rowcount; + int rowheight; + charinfo fontinfo[ NUM_GLYPHS ]; + byte data[4]; +} qfont_t; + +#endif // qfont.h diff --git a/MiniBase/ValveSDK/common/r_efx.h b/MiniBase/ValveSDK/common/r_efx.h new file mode 100644 index 0000000..bdf04bf --- /dev/null +++ b/MiniBase/ValveSDK/common/r_efx.h @@ -0,0 +1,197 @@ +/*** +* +* 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. +* +****/ +#if !defined ( R_EFXH ) +#define R_EFXH +#ifdef _WIN32 +#pragma once +#endif + +// particle_t +#if !defined( PARTICLEDEFH ) +#include "particledef.h" +#endif + +// BEAM +#if !defined( BEAMDEFH ) +#include "beamdef.h" +#endif + +// dlight_t +#if !defined ( DLIGHTH ) +#include "dlight.h" +#endif + +// cl_entity_t +#if !defined( CL_ENTITYH ) +#include "cl_entity.h" +#endif + +/* +// FOR REFERENCE, These are the built-in tracer colors. Note, color 4 is the one +// that uses the tracerred/tracergreen/tracerblue and traceralpha cvar settings +color24 gTracerColors[] = +{ + { 255, 255, 255 }, // White + { 255, 0, 0 }, // Red + { 0, 255, 0 }, // Green + { 0, 0, 255 }, // Blue + { 0, 0, 0 }, // Tracer default, filled in from cvars, etc. + { 255, 167, 17 }, // Yellow-orange sparks + { 255, 130, 90 }, // Yellowish streaks (garg) + { 55, 60, 144 }, // Blue egon streak + { 255, 130, 90 }, // More Yellowish streaks (garg) + { 255, 140, 90 }, // More Yellowish streaks (garg) + { 200, 130, 90 }, // More red streaks (garg) + { 255, 120, 70 }, // Darker red streaks (garg) +}; +*/ + +// Temporary entity array +#define TENTPRIORITY_LOW 0 +#define TENTPRIORITY_HIGH 1 + +// TEMPENTITY flags +#define FTENT_NONE 0x00000000 +#define FTENT_SINEWAVE 0x00000001 +#define FTENT_GRAVITY 0x00000002 +#define FTENT_ROTATE 0x00000004 +#define FTENT_SLOWGRAVITY 0x00000008 +#define FTENT_SMOKETRAIL 0x00000010 +#define FTENT_COLLIDEWORLD 0x00000020 +#define FTENT_FLICKER 0x00000040 +#define FTENT_FADEOUT 0x00000080 +#define FTENT_SPRANIMATE 0x00000100 +#define FTENT_HITSOUND 0x00000200 +#define FTENT_SPIRAL 0x00000400 +#define FTENT_SPRCYCLE 0x00000800 +#define FTENT_COLLIDEALL 0x00001000 // will collide with world and slideboxes +#define FTENT_PERSIST 0x00002000 // tent is not removed when unable to draw +#define FTENT_COLLIDEKILL 0x00004000 // tent is removed upon collision with anything +#define FTENT_PLYRATTACHMENT 0x00008000 // tent is attached to a player (owner) +#define FTENT_SPRANIMATELOOP 0x00010000 // animating sprite doesn't die when last frame is displayed +#define FTENT_SPARKSHOWER 0x00020000 +#define FTENT_NOMODEL 0x00040000 // Doesn't have a model, never try to draw ( it just triggers other things ) +#define FTENT_CLIENTCUSTOM 0x00080000 // Must specify callback. Callback function is responsible for killing tempent and updating fields ( unless other flags specify how to do things ) + +typedef struct tempent_s TEMPENTITY; +typedef struct tempent_s +{ + int flags; + float die; + float frameMax; + float x; + float y; + float z; + float fadeSpeed; + float bounceFactor; + int hitSound; + void ( *hitcallback ) ( struct tempent_s *ent, struct pmtrace_s *ptr ); + void ( *callback ) ( struct tempent_s *ent, float frametime, float currenttime ); + TEMPENTITY *next; + int priority; + short clientIndex; // if attached, this is the index of the client to stick to + // if COLLIDEALL, this is the index of the client to ignore + // TENTS with FTENT_PLYRATTACHMENT MUST set the clientindex! + + vec3_t tentOffset; // if attached, client origin + tentOffset = tent origin. + cl_entity_t entity; + + // baseline.origin - velocity + // baseline.renderamt - starting fadeout intensity + // baseline.angles - angle velocity +} TEMPENTITY; + +typedef struct efx_api_s efx_api_t; + +struct efx_api_s +{ + particle_t *( *R_AllocParticle ) ( void ( *callback ) ( struct particle_s *particle, float frametime ) ); + void ( *R_BlobExplosion ) ( float * org ); + void ( *R_Blood ) ( float * org, float * dir, int pcolor, int speed ); + void ( *R_BloodSprite ) ( float * org, int colorindex, int modelIndex, int modelIndex2, float size ); + void ( *R_BloodStream ) ( float * org, float * dir, int pcolor, int speed ); + void ( *R_BreakModel ) ( float *pos, float *size, float *dir, float random, float life, int count, int modelIndex, char flags ); + void ( *R_Bubbles ) ( float * mins, float * maxs, float height, int modelIndex, int count, float speed ); + void ( *R_BubbleTrail ) ( float * start, float * end, float height, int modelIndex, int count, float speed ); + void ( *R_BulletImpactParticles ) ( float * pos ); + void ( *R_EntityParticles ) ( struct cl_entity_s *ent ); + void ( *R_Explosion ) ( float *pos, int model, float scale, float framerate, int flags ); + void ( *R_FizzEffect ) ( struct cl_entity_s *pent, int modelIndex, int density ); + void ( *R_FireField ) ( float * org, int radius, int modelIndex, int count, int flags, float life ); + void ( *R_FlickerParticles ) ( float * org ); + void ( *R_FunnelSprite ) ( float *org, int modelIndex, int reverse ); + void ( *R_Implosion ) ( float * end, float radius, int count, float life ); + void ( *R_LargeFunnel ) ( float * org, int reverse ); + void ( *R_LavaSplash ) ( float * org ); + void ( *R_MultiGunshot ) ( float * org, float * dir, float * noise, int count, int decalCount, int *decalIndices ); + void ( *R_MuzzleFlash ) ( float *pos1, int type ); + void ( *R_ParticleBox ) ( float *mins, float *maxs, unsigned char r, unsigned char g, unsigned char b, float life ); + void ( *R_ParticleBurst ) ( float * pos, int size, int color, float life ); + void ( *R_ParticleExplosion ) ( float * org ); + void ( *R_ParticleExplosion2 ) ( float * org, int colorStart, int colorLength ); + void ( *R_ParticleLine ) ( float * start, float *end, unsigned char r, unsigned char g, unsigned char b, float life ); + void ( *R_PlayerSprites ) ( int client, int modelIndex, int count, int size ); + void ( *R_Projectile ) ( float * origin, float * velocity, int modelIndex, int life, int owner, void (*hitcallback)( struct tempent_s *ent, struct pmtrace_s *ptr ) ); + void ( *R_RicochetSound ) ( float * pos ); + void ( *R_RicochetSprite ) ( float *pos, struct model_s *pmodel, float duration, float scale ); + void ( *R_RocketFlare ) ( float *pos ); + void ( *R_RocketTrail ) ( float * start, float * end, int type ); + void ( *R_RunParticleEffect ) ( float * org, float * dir, int color, int count ); + void ( *R_ShowLine ) ( float * start, float * end ); + void ( *R_SparkEffect ) ( float *pos, int count, int velocityMin, int velocityMax ); + void ( *R_SparkShower ) ( float *pos ); + void ( *R_SparkStreaks ) ( float * pos, int count, int velocityMin, int velocityMax ); + void ( *R_Spray ) ( float * pos, float * dir, int modelIndex, int count, int speed, int spread, int rendermode ); + void ( *R_Sprite_Explode ) ( TEMPENTITY *pTemp, float scale, int flags ); + void ( *R_Sprite_Smoke ) ( TEMPENTITY *pTemp, float scale ); + void ( *R_Sprite_Spray ) ( float * pos, float * dir, int modelIndex, int count, int speed, int iRand ); + void ( *R_Sprite_Trail ) ( int type, float * start, float * end, int modelIndex, int count, float life, float size, float amplitude, int renderamt, float speed ); + void ( *R_Sprite_WallPuff ) ( TEMPENTITY *pTemp, float scale ); + void ( *R_StreakSplash ) ( float * pos, float * dir, int color, int count, float speed, int velocityMin, int velocityMax ); + void ( *R_TracerEffect ) ( float * start, float * end ); + void ( *R_UserTracerParticle ) ( float * org, float * vel, float life, int colorIndex, float length, unsigned char deathcontext, void ( *deathfunc)( struct particle_s *particle ) ); + particle_t *( *R_TracerParticles ) ( float * org, float * vel, float life ); + void ( *R_TeleportSplash ) ( float * org ); + void ( *R_TempSphereModel ) ( float *pos, float speed, float life, int count, int modelIndex ); + TEMPENTITY *( *R_TempModel ) ( float *pos, float *dir, float *angles, float life, int modelIndex, int soundtype ); + TEMPENTITY *( *R_DefaultSprite ) ( float *pos, int spriteIndex, float framerate ); + TEMPENTITY *( *R_TempSprite ) ( float *pos, float *dir, float scale, int modelIndex, int rendermode, int renderfx, float a, float life, int flags ); + int ( *Draw_DecalIndex ) ( int id ); + int ( *Draw_DecalIndexFromName ) ( char *name ); + void ( *R_DecalShoot ) ( int textureIndex, int entity, int modelIndex, float * position, int flags ); + void ( *R_AttachTentToPlayer ) ( int client, int modelIndex, float zoffset, float life ); + void ( *R_KillAttachedTents ) ( int client ); + BEAM *( *R_BeamCirclePoints ) ( int type, float * start, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamEntPoint ) ( int startEnt, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamEnts ) ( int startEnt, int endEnt, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamFollow ) ( int startEnt, int modelIndex, float life, float width, float r, float g, float b, float brightness ); + void ( *R_BeamKill ) ( int deadEntity ); + BEAM *( *R_BeamLightning ) ( float * start, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed ); + BEAM *( *R_BeamPoints ) ( float * start, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamRing ) ( int startEnt, int endEnt, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + dlight_t *( *CL_AllocDlight ) ( int key ); + dlight_t *( *CL_AllocElight ) ( int key ); + TEMPENTITY *( *CL_TempEntAlloc ) ( float * org, struct model_s *model ); + TEMPENTITY *( *CL_TempEntAllocNoModel ) ( float * org ); + TEMPENTITY *( *CL_TempEntAllocHigh ) ( float * org, struct model_s *model ); + TEMPENTITY *( *CL_TentEntAllocCustom ) ( float *origin, struct model_s *model, int high, void ( *callback ) ( struct tempent_s *ent, float frametime, float currenttime ) ); + void ( *R_GetPackedColor ) ( short *packed, short color ); + short ( *R_LookupColor ) ( unsigned char r, unsigned char g, unsigned char b ); + void ( *R_DecalRemoveAll ) ( int textureIndex ); //textureIndex points to the decal index in the array, not the actual texture index. +}; + +extern efx_api_t efx; + +#endif diff --git a/MiniBase/ValveSDK/common/ref_params.h b/MiniBase/ValveSDK/common/ref_params.h new file mode 100644 index 0000000..01b1cd5 --- /dev/null +++ b/MiniBase/ValveSDK/common/ref_params.h @@ -0,0 +1,75 @@ +/*** +* +* 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. +* +****/ +#if !defined( REF_PARAMSH ) +#define REF_PARAMSH + +typedef struct ref_params_s +{ + // Output + float vieworg[3]; + float viewangles[3]; + + float forward[3]; + float right[3]; + float up[3]; + + // Client frametime; + float frametime; + // Client time + float time; + + // Misc + int intermission; + int paused; + int spectator; + int onground; + int waterlevel; + + float simvel[3]; + float simorg[3]; + + float viewheight[3]; + float idealpitch; + + float cl_viewangles[3]; + + int health; + float crosshairangle[3]; + float viewsize; + + float punchangle[3]; + int maxclients; + int viewentity; + int playernum; + int max_entities; + int demoplayback; + int hardware; + + int smoothing; + + // Last issued usercmd + struct usercmd_s *cmd; + + // Movevars + struct movevars_s *movevars; + + int viewport[4]; // the viewport coordinates x ,y , width, height + + int nextView; // the renderer calls ClientDLL_CalcRefdef() and Renderview + // so long in cycles until this value is 0 (multiple views) + int onlyClientDraw; // if !=0 nothing is drawn by the engine except clientDraw functions +} ref_params_t; + +#endif // !REF_PARAMSH diff --git a/MiniBase/ValveSDK/common/screenfade.h b/MiniBase/ValveSDK/common/screenfade.h new file mode 100644 index 0000000..76c7d7d --- /dev/null +++ b/MiniBase/ValveSDK/common/screenfade.h @@ -0,0 +1,17 @@ +#if !defined( SCREENFADEH ) +#define SCREENFADEH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct screenfade_s +{ + float fadeSpeed; // How fast to fade (tics / second) (+ fade in, - fade out) + float fadeEnd; // When the fading hits maximum + float fadeTotalEnd; // Total End Time of the fade (used for FFADE_OUT) + float fadeReset; // When to reset to not fading (for fadeout and hold) + byte fader, fadeg, fadeb, fadealpha; // Fade color + int fadeFlags; // Fading flags +} screenfade_t; + +#endif // !SCREENFADEH diff --git a/MiniBase/ValveSDK/common/studio_event.h b/MiniBase/ValveSDK/common/studio_event.h new file mode 100644 index 0000000..ba9d182 --- /dev/null +++ b/MiniBase/ValveSDK/common/studio_event.h @@ -0,0 +1,29 @@ +/*** +* +* 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. +* +****/ +#if !defined( STUDIO_EVENTH ) +#define STUDIO_EVENTH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct mstudioevent_s +{ + int frame; + int event; + int type; + char options[64]; +} mstudioevent_t; + +#endif // STUDIO_EVENTH diff --git a/MiniBase/ValveSDK/common/triangleapi.h b/MiniBase/ValveSDK/common/triangleapi.h new file mode 100644 index 0000000..216e3aa --- /dev/null +++ b/MiniBase/ValveSDK/common/triangleapi.h @@ -0,0 +1,55 @@ +/*** +* +* 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. +* +****/ +#if !defined( TRIANGLEAPIH ) +#define TRIANGLEAPIH +#pragma once + +typedef enum +{ + TRI_FRONT = 0, + TRI_NONE = 1, +} TRICULLSTYLE; + +#define TRI_API_VERSION 1 + +#define TRI_TRIANGLES 0 +#define TRI_TRIANGLE_FAN 1 +#define TRI_QUADS 2 +#define TRI_POLYGON 3 +#define TRI_LINES 4 +#define TRI_TRIANGLE_STRIP 5 +#define TRI_QUAD_STRIP 6 + +typedef struct triangleapi_s +{ + int version; + + void ( *RenderMode )( int mode ); + void ( *Begin )( int primitiveCode ); + void ( *End ) ( void ); + + void ( *Color4f ) ( float r, float g, float b, float a ); + void ( *Color4ub ) ( unsigned char r, unsigned char g, unsigned char b, unsigned char a ); + void ( *TexCoord2f ) ( float u, float v ); + void ( *Vertex3fv ) ( float *worldPnt ); + void ( *Vertex3f ) ( float x, float y, float z ); + void ( *Brightness ) ( float brightness ); + void ( *CullFace ) ( TRICULLSTYLE style ); + int ( *SpriteTexture ) ( struct model_s *pSpriteModel, int frame ); + int ( *WorldToScreen ) ( float *world, float *screen ); // Returns 1 if it's z clipped + void ( *Fog ) ( float flFogColor[3], float flStart, float flEnd, int bOn ); //Works just like GL_FOG, flFogColor is r/g/b. +} triangleapi_t; + +#endif // !TRIANGLEAPIH diff --git a/MiniBase/ValveSDK/common/usercmd.h b/MiniBase/ValveSDK/common/usercmd.h new file mode 100644 index 0000000..f8bde44 --- /dev/null +++ b/MiniBase/ValveSDK/common/usercmd.h @@ -0,0 +1,41 @@ +/*** +* +* 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. +* +****/ +#ifndef USERCMD_H +#define USERCMD_H +#ifdef _WIN32 +#pragma once +#endif + +typedef struct usercmd_s +{ + short lerp_msec; // Interpolation time on client + byte msec; // Duration in ms of command + vec3_t viewangles; // Command view angles. + +// intended velocities + float forwardmove; // Forward velocity. + float sidemove; // Sideways velocity. + float upmove; // Upward velocity. + byte lightlevel; // Light level at spot where we are standing. + unsigned short buttons; // Attack buttons + byte impulse; // Impulse command issued. + byte weaponselect; // Current weapon id + +// Experimental player impact stuff. + int impact_index; + vec3_t impact_position; +} usercmd_t; + +#endif // USERCMD_H diff --git a/MiniBase/ValveSDK/common/weaponinfo.h b/MiniBase/ValveSDK/common/weaponinfo.h new file mode 100644 index 0000000..27fb016 --- /dev/null +++ b/MiniBase/ValveSDK/common/weaponinfo.h @@ -0,0 +1,52 @@ +/*** +* +* 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. +* +****/ +#if !defined ( WEAPONINFOH ) +#define WEAPONINFOH +#ifdef _WIN32 +#pragma once +#endif + +// Info about weapons player might have in his/her possession +typedef struct weapon_data_s +{ + int m_iId; + int m_iClip; + + float m_flNextPrimaryAttack; + float m_flNextSecondaryAttack; + float m_flTimeWeaponIdle; + + int m_fInReload; + int m_fInSpecialReload; + float m_flNextReload; + float m_flPumpTime; + float m_fReloadTime; + + float m_fAimedDamage; + float m_fNextAimBonus; + int m_fInZoom; + int m_iWeaponState; + + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; +} weapon_data_t; + +#endif diff --git a/MiniBase/ValveSDK/const.h b/MiniBase/ValveSDK/const.h new file mode 100644 index 0000000..add7a03 --- /dev/null +++ b/MiniBase/ValveSDK/const.h @@ -0,0 +1,783 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +#ifndef CONST_H +#define CONST_H +// +// Constants shared by the engine and dlls +// This header file included by engine files and DLL files. +// Most came from server.h + +// edict->flags +#define FL_FLY (1<<0) // Changes the SV_Movestep() behavior to not need to be on ground +#define FL_SWIM (1<<1) // Changes the SV_Movestep() behavior to not need to be on ground (but stay in water) +#define FL_CONVEYOR (1<<2) +#define FL_CLIENT (1<<3) +#define FL_INWATER (1<<4) +#define FL_MONSTER (1<<5) +#define FL_GODMODE (1<<6) +#define FL_NOTARGET (1<<7) +#define FL_SKIPLOCALHOST (1<<8) // Don't send entity to local host, it's predicting this entity itself +#define FL_ONGROUND (1<<9) // At rest / on the ground +#define FL_PARTIALGROUND (1<<10) // not all corners are valid +#define FL_WATERJUMP (1<<11) // player jumping out of water +#define FL_FROZEN (1<<12) // Player is frozen for 3rd person camera +#define FL_FAKECLIENT (1<<13) // JAC: fake client, simulated server side; don't send network messages to them +#define FL_DUCKING (1<<14) // Player flag -- Player is fully crouched +#define FL_FLOAT (1<<15) // Apply floating force to this entity when in water +#define FL_GRAPHED (1<<16) // worldgraph has this ent listed as something that blocks a connection + +// UNDONE: Do we need these? +#define FL_IMMUNE_WATER (1<<17) +#define FL_IMMUNE_SLIME (1<<18) +#define FL_IMMUNE_LAVA (1<<19) + +#define FL_PROXY (1<<20) // This is a spectator proxy +#define FL_ALWAYSTHINK (1<<21) // Brush model flag -- call think every frame regardless of nextthink - ltime (for constantly changing velocity/path) +#define FL_BASEVELOCITY (1<<22) // Base velocity has been applied this frame (used to convert base velocity into momentum) +#define FL_MONSTERCLIP (1<<23) // Only collide in with monsters who have FL_MONSTERCLIP set +#define FL_ONTRAIN (1<<24) // Player is _controlling_ a train, so movement commands should be ignored on client during prediction. +#define FL_WORLDBRUSH (1<<25) // Not moveable/removeable brush entity (really part of the world, but represented as an entity for transparency or something) +#define FL_SPECTATOR (1<<26) // This client is a spectator, don't run touch functions, etc. +#define FL_CUSTOMENTITY (1<<29) // This is a custom entity +#define FL_KILLME (1<<30) // This entity is marked for death -- This allows the engine to kill ents at the appropriate time +#define FL_DORMANT (1<<31) // Entity is dormant, no updates to client + + +// Goes into globalvars_t.trace_flags +#define FTRACE_SIMPLEBOX (1<<0) // Traceline with a simple box + + +// walkmove modes +#define WALKMOVE_NORMAL 0 // normal walkmove +#define WALKMOVE_WORLDONLY 1 // doesn't hit ANY entities, no matter what the solid type +#define WALKMOVE_CHECKONLY 2 // move, but don't touch triggers + +// edict->movetype values +#define MOVETYPE_NONE 0 // never moves +//#define MOVETYPE_ANGLENOCLIP 1 +//#define MOVETYPE_ANGLECLIP 2 +#define MOVETYPE_WALK 3 // Player only - moving on the ground +#define MOVETYPE_STEP 4 // gravity, special edge handling -- monsters use this +#define MOVETYPE_FLY 5 // No gravity, but still collides with stuff +#define MOVETYPE_TOSS 6 // gravity/collisions +#define MOVETYPE_PUSH 7 // no clip to world, push and crush +#define MOVETYPE_NOCLIP 8 // No gravity, no collisions, still do velocity/avelocity +#define MOVETYPE_FLYMISSILE 9 // extra size to monsters +#define MOVETYPE_BOUNCE 10 // Just like Toss, but reflect velocity when contacting surfaces +#define MOVETYPE_BOUNCEMISSILE 11 // bounce w/o gravity +#define MOVETYPE_FOLLOW 12 // track movement of aiment +#define MOVETYPE_PUSHSTEP 13 // BSP model that needs physics/world collisions (uses nearest hull for world collision) + +// edict->solid values +// NOTE: Some movetypes will cause collisions independent of SOLID_NOT/SOLID_TRIGGER when the entity moves +// SOLID only effects OTHER entities colliding with this one when they move - UGH! +#define SOLID_NOT 0 // no interaction with other objects +#define SOLID_TRIGGER 1 // touch on edge, but not blocking +#define SOLID_BBOX 2 // touch on edge, block +#define SOLID_SLIDEBOX 3 // touch on edge, but not an onground +#define SOLID_BSP 4 // bsp clip, touch on edge, block + +// edict->deadflag values +#define DEAD_NO 0 // alive +#define DEAD_DYING 1 // playing death animation or still falling off of a ledge waiting to hit ground +#define DEAD_DEAD 2 // dead. lying still. +#define DEAD_RESPAWNABLE 3 +#define DEAD_DISCARDBODY 4 + +#define DAMAGE_NO 0 +#define DAMAGE_YES 1 +#define DAMAGE_AIM 2 + +// entity effects +#define EF_BRIGHTFIELD 1 // swirling cloud of particles +#define EF_MUZZLEFLASH 2 // single frame ELIGHT on entity attachment 0 +#define EF_BRIGHTLIGHT 4 // DLIGHT centered at entity origin +#define EF_DIMLIGHT 8 // player flashlight +#define EF_INVLIGHT 16 // get lighting from ceiling +#define EF_NOINTERP 32 // don't interpolate the next frame +#define EF_LIGHT 64 // rocket flare glow sprite +#define EF_NODRAW 128 // don't draw entity +#define EF_NIGHTVISION 256 // player nightvision +#define EF_SNIPERLASER 512 // sniper laser effect +#define EF_FIBERCAMERA 1024// fiber camera + + +// entity flags +#define EFLAG_SLERP 1 // do studio interpolation of this entity + +// +// temp entity events +// +#define TE_BEAMPOINTS 0 // beam effect between two points +// coord coord coord (start position) +// coord coord coord (end position) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMENTPOINT 1 // beam effect between point and entity +// short (start entity) +// coord coord coord (end position) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_GUNSHOT 2 // particle effect plus ricochet sound +// coord coord coord (position) + +#define TE_EXPLOSION 3 // additive sprite, 2 dynamic lights, flickering particles, explosion sound, move vertically 8 pps +// coord coord coord (position) +// short (sprite index) +// byte (scale in 0.1's) +// byte (framerate) +// byte (flags) +// +// The Explosion effect has some flags to control performance/aesthetic features: +#define TE_EXPLFLAG_NONE 0 // all flags clear makes default Half-Life explosion +#define TE_EXPLFLAG_NOADDITIVE 1 // sprite will be drawn opaque (ensure that the sprite you send is a non-additive sprite) +#define TE_EXPLFLAG_NODLIGHTS 2 // do not render dynamic lights +#define TE_EXPLFLAG_NOSOUND 4 // do not play client explosion sound +#define TE_EXPLFLAG_NOPARTICLES 8 // do not draw particles + + +#define TE_TAREXPLOSION 4 // Quake1 "tarbaby" explosion with sound +// coord coord coord (position) + +#define TE_SMOKE 5 // alphablend sprite, move vertically 30 pps +// coord coord coord (position) +// short (sprite index) +// byte (scale in 0.1's) +// byte (framerate) + +#define TE_TRACER 6 // tracer effect from point to point +// coord, coord, coord (start) +// coord, coord, coord (end) + +#define TE_LIGHTNING 7 // TE_BEAMPOINTS with simplified parameters +// coord, coord, coord (start) +// coord, coord, coord (end) +// byte (life in 0.1's) +// byte (width in 0.1's) +// byte (amplitude in 0.01's) +// short (sprite model index) + +#define TE_BEAMENTS 8 +// short (start entity) +// short (end entity) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_SPARKS 9 // 8 random tracers with gravity, ricochet sprite +// coord coord coord (position) + +#define TE_LAVASPLASH 10 // Quake1 lava splash +// coord coord coord (position) + +#define TE_TELEPORT 11 // Quake1 teleport splash +// coord coord coord (position) + +#define TE_EXPLOSION2 12 // Quake1 colormaped (base palette) particle explosion with sound +// coord coord coord (position) +// byte (starting color) +// byte (num colors) + +#define TE_BSPDECAL 13 // Decal from the .BSP file +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// short (texture index of precached decal texture name) +// short (entity index) +// [optional - only included if previous short is non-zero (not the world)] short (index of model of above entity) + +#define TE_IMPLOSION 14 // tracers moving toward a point +// coord, coord, coord (position) +// byte (radius) +// byte (count) +// byte (life in 0.1's) + +#define TE_SPRITETRAIL 15 // line of moving glow sprites with gravity, fadeout, and collisions +// coord, coord, coord (start) +// coord, coord, coord (end) +// short (sprite index) +// byte (count) +// byte (life in 0.1's) +// byte (scale in 0.1's) +// byte (velocity along vector in 10's) +// byte (randomness of velocity in 10's) + +#define TE_BEAM 16 // obsolete + +#define TE_SPRITE 17 // additive sprite, plays 1 cycle +// coord, coord, coord (position) +// short (sprite index) +// byte (scale in 0.1's) +// byte (brightness) + +#define TE_BEAMSPRITE 18 // A beam with a sprite at the end +// coord, coord, coord (start position) +// coord, coord, coord (end position) +// short (beam sprite index) +// short (end sprite index) + +#define TE_BEAMTORUS 19 // screen aligned beam ring, expands to max radius over lifetime +// coord coord coord (center position) +// coord coord coord (axis and radius) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMDISK 20 // disk that expands to max radius over lifetime +// coord coord coord (center position) +// coord coord coord (axis and radius) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMCYLINDER 21 // cylinder that expands to max radius over lifetime +// coord coord coord (center position) +// coord coord coord (axis and radius) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMFOLLOW 22 // create a line of decaying beam segments until entity stops moving +// short (entity:attachment to follow) +// short (sprite index) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte,byte,byte (color) +// byte (brightness) + +#define TE_GLOWSPRITE 23 +// coord, coord, coord (pos) short (model index) byte (scale / 10) + +#define TE_BEAMRING 24 // connect a beam ring to two entities +// short (start entity) +// short (end entity) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_STREAK_SPLASH 25 // oriented shower of tracers +// coord coord coord (start position) +// coord coord coord (direction vector) +// byte (color) +// short (count) +// short (base speed) +// short (ramdon velocity) + +#define TE_BEAMHOSE 26 // obsolete + +#define TE_DLIGHT 27 // dynamic light, effect world, minor entity effect +// coord, coord, coord (pos) +// byte (radius in 10's) +// byte byte byte (color) +// byte (brightness) +// byte (life in 10's) +// byte (decay rate in 10's) + +#define TE_ELIGHT 28 // point entity light, no world effect +// short (entity:attachment to follow) +// coord coord coord (initial position) +// coord (radius) +// byte byte byte (color) +// byte (life in 0.1's) +// coord (decay rate) + +#define TE_TEXTMESSAGE 29 +// short 1.2.13 x (-1 = center) +// short 1.2.13 y (-1 = center) +// byte Effect 0 = fade in/fade out + // 1 is flickery credits + // 2 is write out (training room) + +// 4 bytes r,g,b,a color1 (text color) +// 4 bytes r,g,b,a color2 (effect color) +// ushort 8.8 fadein time +// ushort 8.8 fadeout time +// ushort 8.8 hold time +// optional ushort 8.8 fxtime (time the highlight lags behing the leading text in effect 2) +// string text message (512 chars max sz string) +#define TE_LINE 30 +// coord, coord, coord startpos +// coord, coord, coord endpos +// short life in 0.1 s +// 3 bytes r, g, b + +#define TE_BOX 31 +// coord, coord, coord boxmins +// coord, coord, coord boxmaxs +// short life in 0.1 s +// 3 bytes r, g, b + +#define TE_KILLBEAM 99 // kill all beams attached to entity +// short (entity) + +#define TE_LARGEFUNNEL 100 +// coord coord coord (funnel position) +// short (sprite index) +// short (flags) + +#define TE_BLOODSTREAM 101 // particle spray +// coord coord coord (start position) +// coord coord coord (spray vector) +// byte (color) +// byte (speed) + +#define TE_SHOWLINE 102 // line of particles every 5 units, dies in 30 seconds +// coord coord coord (start position) +// coord coord coord (end position) + +#define TE_BLOOD 103 // particle spray +// coord coord coord (start position) +// coord coord coord (spray vector) +// byte (color) +// byte (speed) + +#define TE_DECAL 104 // Decal applied to a brush entity (not the world) +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name) +// short (entity index) + +#define TE_FIZZ 105 // create alpha sprites inside of entity, float upwards +// short (entity) +// short (sprite index) +// byte (density) + +#define TE_MODEL 106 // create a moving model that bounces and makes a sound when it hits +// coord, coord, coord (position) +// coord, coord, coord (velocity) +// angle (initial yaw) +// short (model index) +// byte (bounce sound type) +// byte (life in 0.1's) + +#define TE_EXPLODEMODEL 107 // spherical shower of models, picks from set +// coord, coord, coord (origin) +// coord (velocity) +// short (model index) +// short (count) +// byte (life in 0.1's) + +#define TE_BREAKMODEL 108 // box of models or sprites +// coord, coord, coord (position) +// coord, coord, coord (size) +// coord, coord, coord (velocity) +// byte (random velocity in 10's) +// short (sprite or model index) +// byte (count) +// byte (life in 0.1 secs) +// byte (flags) + +#define TE_GUNSHOTDECAL 109 // decal and ricochet sound +// coord, coord, coord (position) +// short (entity index???) +// byte (decal???) + +#define TE_SPRITE_SPRAY 110 // spay of alpha sprites +// coord, coord, coord (position) +// coord, coord, coord (velocity) +// short (sprite index) +// byte (count) +// byte (speed) +// byte (noise) + +#define TE_ARMOR_RICOCHET 111 // quick spark sprite, client ricochet sound. +// coord, coord, coord (position) +// byte (scale in 0.1's) + +#define TE_PLAYERDECAL 112 // ??? +// byte (playerindex) +// coord, coord, coord (position) +// short (entity???) +// byte (decal number???) +// [optional] short (model index???) + +#define TE_BUBBLES 113 // create alpha sprites inside of box, float upwards +// coord, coord, coord (min start position) +// coord, coord, coord (max start position) +// coord (float height) +// short (model index) +// byte (count) +// coord (speed) + +#define TE_BUBBLETRAIL 114 // create alpha sprites along a line, float upwards +// coord, coord, coord (min start position) +// coord, coord, coord (max start position) +// coord (float height) +// short (model index) +// byte (count) +// coord (speed) + +#define TE_BLOODSPRITE 115 // spray of opaque sprite1's that fall, single sprite2 for 1..2 secs (this is a high-priority tent) +// coord, coord, coord (position) +// short (sprite1 index) +// short (sprite2 index) +// byte (color) +// byte (scale) + +#define TE_WORLDDECAL 116 // Decal applied to the world brush +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name) + +#define TE_WORLDDECALHIGH 117 // Decal (with texture index > 256) applied to world brush +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name - 256) + +#define TE_DECALHIGH 118 // Same as TE_DECAL, but the texture index was greater than 256 +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name - 256) +// short (entity index) + +#define TE_PROJECTILE 119 // Makes a projectile (like a nail) (this is a high-priority tent) +// coord, coord, coord (position) +// coord, coord, coord (velocity) +// short (modelindex) +// byte (life) +// byte (owner) projectile won't collide with owner (if owner == 0, projectile will hit any client). + +#define TE_SPRAY 120 // Throws a shower of sprites or models +// coord, coord, coord (position) +// coord, coord, coord (direction) +// short (modelindex) +// byte (count) +// byte (speed) +// byte (noise) +// byte (rendermode) + +#define TE_PLAYERSPRITES 121 // sprites emit from a player's bounding box (ONLY use for players!) +// byte (playernum) +// short (sprite modelindex) +// byte (count) +// byte (variance) (0 = no variance in size) (10 = 10% variance in size) + +#define TE_PARTICLEBURST 122 // very similar to lavasplash. +// coord (origin) +// short (radius) +// byte (particle color) +// byte (duration * 10) (will be randomized a bit) + +#define TE_FIREFIELD 123 // makes a field of fire. +// coord (origin) +// short (radius) (fire is made in a square around origin. -radius, -radius to radius, radius) +// short (modelindex) +// byte (count) +// byte (flags) +// byte (duration (in seconds) * 10) (will be randomized a bit) +// +// to keep network traffic low, this message has associated flags that fit into a byte: +#define TEFIRE_FLAG_ALLFLOAT 1 // all sprites will drift upwards as they animate +#define TEFIRE_FLAG_SOMEFLOAT 2 // some of the sprites will drift upwards. (50% chance) +#define TEFIRE_FLAG_LOOP 4 // if set, sprite plays at 15 fps, otherwise plays at whatever rate stretches the animation over the sprite's duration. +#define TEFIRE_FLAG_ALPHA 8 // if set, sprite is rendered alpha blended at 50% else, opaque +#define TEFIRE_FLAG_PLANAR 16 // if set, all fire sprites have same initial Z instead of randomly filling a cube. +#define TEFIRE_FLAG_ADDITIVE 32 // if set, sprite is rendered non-opaque with additive + +#define TE_PLAYERATTACHMENT 124 // attaches a TENT to a player (this is a high-priority tent) +// byte (entity index of player) +// coord (vertical offset) ( attachment origin.z = player origin.z + vertical offset ) +// short (model index) +// short (life * 10 ); + +#define TE_KILLPLAYERATTACHMENTS 125 // will expire all TENTS attached to a player. +// byte (entity index of player) + +#define TE_MULTIGUNSHOT 126 // much more compact shotgun message +// This message is used to make a client approximate a 'spray' of gunfire. +// Any weapon that fires more than one bullet per frame and fires in a bit of a spread is +// a good candidate for MULTIGUNSHOT use. (shotguns) +// +// NOTE: This effect makes the client do traces for each bullet, these client traces ignore +// entities that have studio models.Traces are 4096 long. +// +// coord (origin) +// coord (origin) +// coord (origin) +// coord (direction) +// coord (direction) +// coord (direction) +// coord (x noise * 100) +// coord (y noise * 100) +// byte (count) +// byte (bullethole decal texture index) + +#define TE_USERTRACER 127 // larger message than the standard tracer, but allows some customization. +// coord (origin) +// coord (origin) +// coord (origin) +// coord (velocity) +// coord (velocity) +// coord (velocity) +// byte ( life * 10 ) +// byte ( color ) this is an index into an array of color vectors in the engine. (0 - ) +// byte ( length * 10 ) + + + +#define MSG_BROADCAST 0 // unreliable to all +#define MSG_ONE 1 // reliable to one (msg_entity) +#define MSG_ALL 2 // reliable to all +#define MSG_INIT 3 // write to the init string +#define MSG_PVS 4 // Ents in PVS of org +#define MSG_PAS 5 // Ents in PAS of org +#define MSG_PVS_R 6 // Reliable to PVS +#define MSG_PAS_R 7 // Reliable to PAS +#define MSG_ONE_UNRELIABLE 8 // Send to one client, but don't put in reliable stream, put in unreliable datagram ( could be dropped ) +#define MSG_SPEC 9 // Sends to all spectator proxies + +// contents of a spot in the world +#define CONTENTS_EMPTY -1 +#define CONTENTS_SOLID -2 +#define CONTENTS_WATER -3 +#define CONTENTS_SLIME -4 +#define CONTENTS_LAVA -5 +#define CONTENTS_SKY -6 +/* These additional contents constants are defined in bspfile.h +#define CONTENTS_ORIGIN -7 // removed at csg time +#define CONTENTS_CLIP -8 // changed to contents_solid +#define CONTENTS_CURRENT_0 -9 +#define CONTENTS_CURRENT_90 -10 +#define CONTENTS_CURRENT_180 -11 +#define CONTENTS_CURRENT_270 -12 +#define CONTENTS_CURRENT_UP -13 +#define CONTENTS_CURRENT_DOWN -14 + +#define CONTENTS_TRANSLUCENT -15 +*/ +#define CONTENTS_LADDER -16 + +#define CONTENT_FLYFIELD -17 +#define CONTENT_GRAVITY_FLYFIELD -18 +#define CONTENT_FOG -19 + +#define CONTENT_EMPTY -1 +#define CONTENT_SOLID -2 +#define CONTENT_WATER -3 +#define CONTENT_SLIME -4 +#define CONTENT_LAVA -5 +#define CONTENT_SKY -6 + +// channels +#define CHAN_AUTO 0 +#define CHAN_WEAPON 1 +#define CHAN_VOICE 2 +#define CHAN_ITEM 3 +#define CHAN_BODY 4 +#define CHAN_STREAM 5 // allocate stream channel from the static or dynamic area +#define CHAN_STATIC 6 // allocate channel from the static area +#define CHAN_NETWORKVOICE_BASE 7 // voice data coming across the network +#define CHAN_NETWORKVOICE_END 500 // network voice data reserves slots (CHAN_NETWORKVOICE_BASE through CHAN_NETWORKVOICE_END). +#define CHAN_BOT 501 // channel used for bot chatter. + +// attenuation values +#define ATTN_NONE 0 +#define ATTN_NORM (float)0.8 +#define ATTN_IDLE (float)2 +#define ATTN_STATIC (float)1.25 + +// pitch values +#define PITCH_NORM 100 // non-pitch shifted +#define PITCH_LOW 95 // other values are possible - 0-255, where 255 is very high +#define PITCH_HIGH 120 + +// volume values +#define VOL_NORM 1.0 + +// plats +#define PLAT_LOW_TRIGGER 1 + +// Trains +#define SF_TRAIN_WAIT_RETRIGGER 1 +#define SF_TRAIN_START_ON 4 // Train is initially moving +#define SF_TRAIN_PASSABLE 8 // Train is not solid -- used to make water trains + +// buttons +#ifndef IN_BUTTONS_H +#include "in_buttons.h" +#endif + +// Break Model Defines + +#define BREAK_TYPEMASK 0x4F +#define BREAK_GLASS 0x01 +#define BREAK_METAL 0x02 +#define BREAK_FLESH 0x04 +#define BREAK_WOOD 0x08 + +#define BREAK_SMOKE 0x10 +#define BREAK_TRANS 0x20 +#define BREAK_CONCRETE 0x40 +#define BREAK_2 0x80 + +// Colliding temp entity sounds + +#define BOUNCE_GLASS BREAK_GLASS +#define BOUNCE_METAL BREAK_METAL +#define BOUNCE_FLESH BREAK_FLESH +#define BOUNCE_WOOD BREAK_WOOD +#define BOUNCE_SHRAP 0x10 +#define BOUNCE_SHELL 0x20 +#define BOUNCE_CONCRETE BREAK_CONCRETE +#define BOUNCE_SHOTSHELL 0x80 + +// Temp entity bounce sound types +#define TE_BOUNCE_NULL 0 +#define TE_BOUNCE_SHELL 1 +#define TE_BOUNCE_SHOTSHELL 2 + +// Rendering constants +enum +{ + kRenderNormal, // src + kRenderTransColor, // c*a+dest*(1-a) + kRenderTransTexture, // src*a+dest*(1-a) + kRenderGlow, // src*a+dest -- No Z buffer checks + kRenderTransAlpha, // src*srca+dest*(1-srca) + kRenderTransAdd, // src*a+dest +}; + +enum +{ + kRenderFxNone = 0, + kRenderFxPulseSlow, + kRenderFxPulseFast, + kRenderFxPulseSlowWide, + kRenderFxPulseFastWide, + kRenderFxFadeSlow, + kRenderFxFadeFast, + kRenderFxSolidSlow, + kRenderFxSolidFast, + kRenderFxStrobeSlow, + kRenderFxStrobeFast, + kRenderFxStrobeFaster, + kRenderFxFlickerSlow, + kRenderFxFlickerFast, + kRenderFxNoDissipation, + kRenderFxDistort, // Distort/scale/translate flicker + kRenderFxHologram, // kRenderFxDistort + distance fade + kRenderFxDeadPlayer, // kRenderAmt is the player index + kRenderFxExplode, // Scale up really big! + kRenderFxGlowShell, // Glowing Shell + kRenderFxClampMinScale, // Keep this sprite from getting very small (SPRITES only!) + kRenderFxLightMultiplier, //CTM !!!CZERO added to tell the studiorender that the value in iuser2 is a lightmultiplier +}; + + +typedef int func_t; +typedef int string_t; + +typedef unsigned char byte; +typedef unsigned short word; +#define _DEF_BYTE_ + +#undef true +#undef false + +#ifndef __cplusplus +typedef enum {false, true} qboolean; +#else +typedef int qboolean; +#endif + +typedef struct +{ + byte r, g, b; +} color24; + +typedef struct +{ + unsigned r, g, b, a; +} colorVec; + +#ifdef _WIN32 +#pragma pack(push,2) +#endif + +typedef struct +{ + unsigned short r, g, b, a; +} PackedColorVec; + +#ifdef _WIN32 +#pragma pack(pop) +#endif +typedef struct link_s +{ + struct link_s *prev, *next; +} link_t; + +typedef struct edict_s edict_t; + +typedef struct +{ + vec3_t normal; + float dist; +} plane_t; + +typedef struct +{ + qboolean allsolid; // if true, plane is not valid + qboolean startsolid; // if true, the initial point was in a solid area + qboolean inopen, inwater; + float fraction; // time completed, 1.0 = didn't hit anything + vec3_t endpos; // final position + plane_t plane; // surface normal at impact + edict_t *ent; // entity the surface is on + int hitgroup; // 0 == generic, non zero is specific body part +} trace_t; + +#endif + diff --git a/MiniBase/ValveSDK/crc.h b/MiniBase/ValveSDK/crc.h new file mode 100644 index 0000000..eba4ab8 --- /dev/null +++ b/MiniBase/ValveSDK/crc.h @@ -0,0 +1,65 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +/* crc.h */ +#ifndef CRC_H +#define CRC_H +#ifdef _WIN32 +#pragma once +#endif + +#include "archtypes.h" // DAL + +// MD5 Hash +typedef struct +{ + unsigned int buf[4]; + unsigned int bits[2]; + unsigned char in[64]; +} MD5Context_t; + + +#ifdef _WIN32 +typedef uint32 CRC32_t; +#else +typedef uint32 CRC32_t; +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif +void CRC32_Init(CRC32_t *pulCRC); +CRC32_t CRC32_Final(CRC32_t pulCRC); +void CRC32_ProcessBuffer(CRC32_t *pulCRC, void *p, int len); +void CRC32_ProcessByte(CRC32_t *pulCRC, unsigned char ch); +int CRC_File(CRC32_t *crcvalue, char *pszFileName); +#ifdef __cplusplus +} +#endif +unsigned char COM_BlockSequenceCRCByte (unsigned char *base, int length, int sequence); + +void MD5Init(MD5Context_t *context); +void MD5Update(MD5Context_t *context, unsigned char const *buf, + unsigned int len); +void MD5Final(unsigned char digest[16], MD5Context_t *context); +void Transform(unsigned int buf[4], unsigned int const in[16]); + +int MD5_Hash_File(unsigned char digest[16], char *pszFileName, int bUsefopen, int bSeed, unsigned int seed[4]); +char *MD5_Print(unsigned char hash[16]); +int MD5_Hash_CachedFile(unsigned char digest[16], unsigned char *pCache, int nFileSize, int bSeed, unsigned int seed[4]); + +int CRC_MapFile(CRC32_t *crcvalue, char *pszFileName); + +#endif diff --git a/MiniBase/ValveSDK/custom.h b/MiniBase/ValveSDK/custom.h new file mode 100644 index 0000000..a9f963c --- /dev/null +++ b/MiniBase/ValveSDK/custom.h @@ -0,0 +1,103 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +// Customization.h + +#ifndef CUSTOM_H +#define CUSTOM_H +#ifdef _WIN32 +#pragma once +#endif + +#include "const.h" + +#define MAX_QPATH 64 // Must match value in quakedefs.h + +///////////////// +// Customization +// passed to pfnPlayerCustomization +// For automatic downloading. +typedef enum +{ + t_sound = 0, + t_skin, + t_model, + t_decal, + t_generic, + t_eventscript, + t_world, // Fake type for world, is really t_model +} resourcetype_t; + + +typedef struct +{ + int size; +} _resourceinfo_t; + +typedef struct resourceinfo_s +{ + _resourceinfo_t info[ 8 ]; +} resourceinfo_t; + +#define RES_FATALIFMISSING (1<<0) // Disconnect if we can't get this file. +#define RES_WASMISSING (1<<1) // Do we have the file locally, did we get it ok? +#define RES_CUSTOM (1<<2) // Is this resource one that corresponds to another player's customization + // or is it a server startup resource. +#define RES_REQUESTED (1<<3) // Already requested a download of this one +#define RES_PRECACHED (1<<4) // Already precached +#define RES_ALWAYS (1<<5) // download always even if available on client +#define RES_CHECKFILE (1<<7) // check file on client + +#include "crc.h" + +typedef struct resource_s +{ + char szFileName[MAX_QPATH]; // File name to download/precache. + resourcetype_t type; // t_sound, t_skin, t_model, t_decal. + int nIndex; // For t_decals + int nDownloadSize; // Size in Bytes if this must be downloaded. + unsigned char ucFlags; + +// For handling client to client resource propagation + unsigned char rgucMD5_hash[16]; // To determine if we already have it. + unsigned char playernum; // Which player index this resource is associated with, if it's a custom resource. + + unsigned char rguc_reserved[ 32 ]; // For future expansion + struct resource_s *pNext; // Next in chain. + struct resource_s *pPrev; +} resource_t; + +typedef struct customization_s +{ + qboolean bInUse; // Is this customization in use; + resource_t resource; // The resource_t for this customization + qboolean bTranslated; // Has the raw data been translated into a useable format? + // (e.g., raw decal .wad make into texture_t *) + int nUserData1; // Customization specific data + int nUserData2; // Customization specific data + void *pInfo; // Buffer that holds the data structure that references the data (e.g., the cachewad_t) + void *pBuffer; // Buffer that holds the data for the customization (the raw .wad data) + struct customization_s *pNext; // Next in chain +} customization_t; + +#define FCUST_FROMHPAK ( 1<<0 ) +#define FCUST_WIPEDATA ( 1<<1 ) +#define FCUST_IGNOREINIT ( 1<<2 ) + +void COM_ClearCustomizationList( struct customization_s *pHead, qboolean bCleanDecals); +qboolean COM_CreateCustomization( struct customization_s *pListHead, struct resource_s *pResource, int playernumber, int flags, + struct customization_s **pCustomization, int *nLumps ); +int COM_SizeofResourceList ( struct resource_s *pList, struct resourceinfo_s *ri ); + +#endif // CUSTOM_H diff --git a/MiniBase/ValveSDK/cvardef.h b/MiniBase/ValveSDK/cvardef.h new file mode 100644 index 0000000..0b6148f --- /dev/null +++ b/MiniBase/ValveSDK/cvardef.h @@ -0,0 +1,36 @@ +/*** +* +* 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. +* +****/ +#ifndef CVARDEF_H +#define CVARDEF_H + +#define FCVAR_ARCHIVE (1<<0) // set to cause it to be saved to vars.rc +#define FCVAR_USERINFO (1<<1) // changes the client's info string +#define FCVAR_SERVER (1<<2) // notifies players when changed +#define FCVAR_EXTDLL (1<<3) // defined by external DLL +#define FCVAR_CLIENTDLL (1<<4) // defined by the client dll +#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value +#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. +#define FCVAR_PRINTABLEONLY (1<<7) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). +#define FCVAR_UNLOGGED (1<<8) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log + +typedef struct cvar_s +{ + char *name; + char *string; + int flags; + float value; + struct cvar_s *next; +} cvar_t; +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/dlight.h b/MiniBase/ValveSDK/dlight.h new file mode 100644 index 0000000..f869c98 --- /dev/null +++ b/MiniBase/ValveSDK/dlight.h @@ -0,0 +1,33 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +#if !defined ( DLIGHTH ) +#define DLIGHTH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct dlight_s +{ + vec3_t origin; + float radius; + color24 color; + float die; // stop lighting after this time + float decay; // drop this each second + float minlight; // don't add when contributing less + int key; + qboolean dark; // subtracts light instead of adding +} dlight_t; + +#endif diff --git a/MiniBase/ValveSDK/edict.h b/MiniBase/ValveSDK/edict.h new file mode 100644 index 0000000..9a38993 --- /dev/null +++ b/MiniBase/ValveSDK/edict.h @@ -0,0 +1,36 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#if !defined EDICT_H +#define EDICT_H +#ifdef _WIN32 +#pragma once +#endif +#define MAX_ENT_LEAFS 48 + +#include "progdefs.h" + +struct edict_s +{ + qboolean free; + int serialnumber; + link_t area; // linked to a division node or leaf + + int headnode; // -1 to use normal leaf check + int num_leafs; + short leafnums[MAX_ENT_LEAFS]; + + float freetime; // sv.time when the object was freed + + void* pvPrivateData; // Alloced and freed by engine, used by DLLs + + entvars_t v; // C exported fields from progs + + // other fields from progs come immediately after +}; + +#endif diff --git a/MiniBase/ValveSDK/engine/Cdll_int.h b/MiniBase/ValveSDK/engine/Cdll_int.h new file mode 100644 index 0000000..32f4958 --- /dev/null +++ b/MiniBase/ValveSDK/engine/Cdll_int.h @@ -0,0 +1,375 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +// +// cdll_int.h +// +// 4-23-98 +// JOHN: client dll interface declarations +// + +#ifndef CDLL_INT_H +#define CDLL_INT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "const.h" + + +// this file is included by both the engine and the client-dll, +// so make sure engine declarations aren't done twice + +typedef int SptiteHandle_t; // handle to a graphic + +#define SCRINFO_SCREENFLASH 1 +#define SCRINFO_STRETCHED 2 + +typedef struct SCREENINFO_s +{ + int iSize; + int iWidth; + int iHeight; + int iFlags; + int iCharHeight; + short charWidths[256]; +} SCREENINFO; + + +typedef struct client_data_s +{ + // fields that cannot be modified (ie. have no effect if changed) + vec3_t origin; + + // fields that can be changed by the cldll + vec3_t viewangles; + int iWeaponBits; + float fov; // field of view +} client_data_t; + +typedef struct client_sprite_s +{ + char szName[64]; + char szSprite[64]; + int hspr; + int iRes; + wrect_t rc; +} client_sprite_t; + +typedef struct client_textmessage_s +{ + int effect; + byte r1, g1, b1, a1; // 2 colors for effects + byte r2, g2, b2, a2; + float x; + float y; + float fadein; + float fadeout; + float holdtime; + float fxtime; + const char *pName; + const char *pMessage; +} client_textmessage_t; + +typedef struct hud_player_info_s +{ + char *name; + short ping; + byte thisplayer; // TRUE if this is the calling player + + // stuff that's unused at the moment, but should be done + byte spectator; + byte packetloss; + + char *model; + short topcolor; + short bottomcolor; + +} hud_player_info_t; + + +typedef struct cl_enginefuncs_s +{ + // sprite handlers + HSPRITE ( *pfnSPR_Load ) ( const char *szPicName ); + int ( *pfnSPR_Frames ) ( HSPRITE hPic ); + int ( *pfnSPR_Height ) ( HSPRITE hPic, int frame ); + int ( *pfnSPR_Width ) ( HSPRITE hPic, int frame ); + void ( *pfnSPR_Set ) ( HSPRITE hPic, int r, int g, int b ); + void ( *pfnSPR_Draw ) ( int frame, int x, int y, const wrect_t *prc ); + void ( *pfnSPR_DrawHoles ) ( int frame, int x, int y, const wrect_t *prc ); + void ( *pfnSPR_DrawAdditive ) ( int frame, int x, int y, const wrect_t *prc ); + void ( *pfnSPR_EnableScissor ) ( int x, int y, int width, int height ); + void ( *pfnSPR_DisableScissor ) ( void ); + client_sprite_t *( *pfnSPR_GetList ) ( char *psz, int *piCount ); + + // screen handlers + void ( *pfnFillRGBA ) ( int x, int y, int width, int height, int r, int g, int b, int a ); + int ( *pfnGetScreenInfo ) ( SCREENINFO *pscrinfo ); + void ( *pfnSetCrosshair ) ( HSPRITE hspr, wrect_t rc, int r, int g, int b ); + + // cvar handlers + struct cvar_s *( *pfnRegisterVariable ) ( char *szName, char *szValue, int flags ); + float ( *pfnGetCvarFloat ) ( char *szName ); + char* ( *pfnGetCvarString ) ( char *szName ); + + // command handlers + int ( *pfnAddCommand ) ( char *cmd_name, void (*function)(void) ); + int ( *pfnHookUserMsg ) ( char *szMsgName, pfnUserMsgHook pfn ); + int ( *pfnServerCmd ) ( char *szCmdString ); + int ( *pfnClientCmd ) ( char *szCmdString ); + + void ( *pfnGetPlayerInfo ) ( int ent_num, hud_player_info_t *pinfo ); + + // sound handlers + void ( *pfnPlaySoundByName ) ( char *szSound, float volume ); + void ( *pfnPlaySoundByIndex ) ( int iSound, float volume ); + + // vector helpers + void ( *pfnAngleVectors ) ( const float * vecAngles, float * forward, float * right, float * up ); + + // text message system + client_textmessage_t *( *pfnTextMessageGet ) ( const char *pName ); + int ( *pfnDrawCharacter ) ( int x, int y, int number, int r, int g, int b ); + int ( *pfnDrawConsoleString ) ( int x, int y, char *string ); + void ( *pfnDrawSetTextColor ) ( float r, float g, float b ); + void ( *pfnDrawConsoleStringLen )( const char *string, int *length, int *height ); + + void ( *pfnConsolePrint ) ( const char *string ); + void ( *pfnCenterPrint ) ( const char *string ); + + +// Added for user input processing + int ( *GetWindowCenterX ) ( void ); + int ( *GetWindowCenterY ) ( void ); + void ( *GetViewAngles ) ( float * ); + void ( *SetViewAngles ) ( float * ); + int ( *GetMaxClients ) ( void ); + void ( *Cvar_SetValue ) ( char *cvar, float value ); + + int (*Cmd_Argc) (void); + char *( *Cmd_Argv ) ( int arg ); + void ( *Con_Printf ) ( char *fmt, ... ); + void ( *Con_DPrintf ) ( char *fmt, ... ); + void ( *Con_NPrintf ) ( int pos, char *fmt, ... ); + void ( *Con_NXPrintf ) ( struct con_nprint_s *info, char *fmt, ... ); + + const char *( *PhysInfo_ValueForKey ) ( const char *key ); + const char *( *ServerInfo_ValueForKey )( const char *key ); + float ( *GetClientMaxspeed ) ( void ); + int ( *CheckParm ) ( char *parm, char **ppnext ); + void ( *Key_Event ) ( int key, int down ); + void ( *GetMousePosition ) ( int *mx, int *my ); + int ( *IsNoClipping ) ( void ); + + struct cl_entity_s *( *GetLocalPlayer ) ( void ); + struct cl_entity_s *( *GetViewModel ) ( void ); + struct cl_entity_s *( *GetEntityByIndex ) ( int idx ); + + float ( *GetClientTime ) ( void ); + void ( *V_CalcShake ) ( void ); + void ( *V_ApplyShake ) ( float *origin, float *angles, float factor ); + + int ( *PM_PointContents ) ( float *point, int *truecontents ); + int ( *PM_WaterEntity ) ( float *p ); + struct pmtrace_s *( *PM_TraceLine ) ( float *start, float *end, int flags, int usehull, int ignore_pe ); + + struct model_s *( *CL_LoadModel ) ( const char *modelname, int *index ); + int ( *CL_CreateVisibleEntity ) ( int type, struct cl_entity_s *ent ); + + const struct model_s * ( *GetSpritePointer ) ( HSPRITE hSprite ); + void ( *pfnPlaySoundByNameAtLocation ) ( char *szSound, float volume, float *origin ); + + unsigned short ( *pfnPrecacheEvent ) ( int type, const char* psz ); + void ( *pfnPlaybackEvent ) ( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); + void ( *pfnWeaponAnim ) ( int iAnim, int body ); + float ( *pfnRandomFloat ) ( float flLow, float flHigh ); + long ( *pfnRandomLong ) ( long lLow, long lHigh ); + void ( *pfnHookEvent ) ( char *name, void ( *pfnEvent )( struct event_args_s *args ) ); + int (*Con_IsVisible) (); + const char *( *pfnGetGameDirectory ) ( void ); + struct cvar_s *( *pfnGetCvarPointer ) ( const char *szName ); + const char *( *Key_LookupBinding ) ( const char *pBinding ); + const char *( *pfnGetLevelName ) ( void ); + void ( *pfnGetScreenFade ) ( struct screenfade_s *fade ); + void ( *pfnSetScreenFade ) ( struct screenfade_s *fade ); + void *( *VGui_GetPanel ) ( ); + void ( *VGui_ViewportPaintBackground ) (int extents[4]); + + byte* (*COM_LoadFile) ( char *path, int usehunk, int *pLength ); + char* (*COM_ParseFile) ( char *data, char *token ); + void (*COM_FreeFile) ( void *buffer ); + + struct triangleapi_s *pTriAPI; + struct efx_api_s *pEfxAPI; + struct event_api_s *pEventAPI; + struct demo_api_s *pDemoAPI; + struct net_api_s *pNetAPI; + struct IVoiceTweak_s *pVoiceTweak; + + // returns 1 if the client is a spectator only (connected to a proxy), 0 otherwise or 2 if in dev_overview mode + int ( *IsSpectateOnly ) ( void ); + struct model_s *( *LoadMapSprite ) ( const char *filename ); + + // file search functions + void ( *COM_AddAppDirectoryToSearchPath ) ( const char *pszBaseDir, const char *appName ); + int ( *COM_ExpandFilename) ( const char *fileName, char *nameOutBuffer, int nameOutBufferSize ); + + // User info + // playerNum is in the range (1, MaxClients) + // returns NULL if player doesn't exit + // returns "" if no value is set + const char *( *PlayerInfo_ValueForKey )( int playerNum, const char *key ); + void ( *PlayerInfo_SetValueForKey )( const char *key, const char *value ); + + // Gets a unique ID for the specified player. This is the same even if you see the player on a different server. + // iPlayer is an entity index, so client 0 would use iPlayer=1. + // Returns false if there is no player on the server in the specified slot. + qboolean (*GetPlayerUniqueID)(int iPlayer, char playerID[16]); + + // TrackerID access + int (*GetTrackerIDForPlayer)(int playerSlot); + int (*GetPlayerForTrackerID)(int trackerID); + + // Same as pfnServerCmd, but the message goes in the unreliable stream so it can't clog the net stream + // (but it might not get there). + int ( *pfnServerCmdUnreliable )( char *szCmdString ); + + void ( *pfnGetMousePos )( struct tagPOINT *ppt ); + void ( *pfnSetMousePos )( int x, int y ); + void ( *pfnSetMouseEnable )( qboolean fEnable ); + struct cvar_s* ( *pfnGetCvarList )( void ); + struct cmd_s* ( *pfnGetCmdList )( void ); + + char* ( *pfnGetCvarName )( struct cvar_s* cvar ); + char* ( *pfnGetCmdName )( struct cmd_s* cmd ); + + float ( *pfnGetServerTime )( void ); + float ( *pfnGetGravity )( void ); + const struct model_s* ( *pfnPrecacheSprite )( HSPRITE spr ); + void ( *OverrideLightmap )( int override ); + void ( *SetLightmapColor )( float r, float g, float b ); + void ( *SetLightmapDarkness )( float dark ); + + //this will always fail with the current engine + int ( *pfnGetSequenceByName )( int flags, const char* seq ); + + void ( *pfnSPR_DrawGeneric )( int frame, int x, int y, const wrect_t *prc, int blendsrc, int blenddst, int unknown1, int unknown2 ); + + //this will always fail with engine, don't call + //it actually has paramenters but i dunno what they do + void ( *pfnLoadSentence )( void ); + + //localizes hud string, uses Legacy font from skin def + // also supports unicode strings + int ( *pfnDrawLocalizedHudString )( int x, int y, const char* str, int r, int g, int b ); + + //i can't get this to work for some reason, don't use this + int ( *pfnDrawLocalizedConsoleString )( int x, int y, const char* str ); + + //gets keyvalue for local player, useful for querying vgui menus or autohelp + const char *(*LocalPlayerInfo_ValueForKey)( const char* key ); + + //another vgui2 text drawing function, i dunno how it works + //it doesn't localize though + void ( *pfnDrawText_0 )( int x, int y, const char* text, unsigned long font ); + + int ( *pfnDrawUnicodeCharacter )( int x, int y, short number, int r, int g, int b, unsigned long hfont ); + + //checks sound header of a sound file, determines if its a supported type + int ( *pfnCheckSoundFile )( const char* path ); + + //for condition zero, returns interface from GameUI + void* ( *GetCareerGameInterface )( void ); + + void ( *pfnCvar_Set )( const char* cvar, const char* value ); + + //this actually checks for if the CareerGameInterface is found + //and if a server is being run + int ( *IsSinglePlayer )( void ); + + void ( *pfnPlaySound )( const char* sound, float vol, float pitch ); + + void ( *pfnPlayMp3 )( const char* mp3, int flags ); + + //get the systems current time as a float + float ( *Sys_FloatTime )( void ); + + void ( *pfnSetArray )( int* array, int size ); + void ( *pfnSetClearArray )( int* array, int size ); + void ( *pfnClearArray )( void ); + + void ( *pfnPlaySound2 )( const char* sound, float vol, float pitch ); + + void ( *pfnTintRGBA ) ( int x, int y, int width, int height, int r, int g, int b, int a ); +} cl_enginefunc_t; + +#ifndef IN_BUTTONS_H +#include "in_buttons.h" +#endif + +#define CLDLL_INTERFACE_VERSION 7 + +extern void ClientDLL_Init( void ); // from cdll_int.c +extern void ClientDLL_Shutdown( void ); +extern void ClientDLL_HudInit( void ); +extern void ClientDLL_HudVidInit( void ); +extern void ClientDLL_UpdateClientData( void ); +extern void ClientDLL_Frame( double time ); +extern void ClientDLL_HudRedraw( int intermission ); +extern void ClientDLL_MoveClient( struct playermove_s *ppmove ); +extern void ClientDLL_ClientMoveInit( struct playermove_s *ppmove ); +extern char ClientDLL_ClientTextureType( char *name ); + +extern void ClientDLL_CreateMove( float frametime, struct usercmd_s *cmd, int active ); +extern void ClientDLL_ActivateMouse( void ); +extern void ClientDLL_DeactivateMouse( void ); +extern void ClientDLL_MouseEvent( int mstate ); +extern void ClientDLL_ClearStates( void ); +extern int ClientDLL_IsThirdPerson( void ); +extern void ClientDLL_GetCameraOffsets( float *ofs ); +extern int ClientDLL_GraphKeyDown( void ); +extern struct kbutton_s *ClientDLL_FindKey( const char *name ); +extern void ClientDLL_CAM_Think( void ); +extern void ClientDLL_IN_Accumulate( void ); +extern void ClientDLL_CalcRefdef( struct ref_params_s *pparams ); +extern int ClientDLL_AddEntity( int type, struct cl_entity_s *ent ); +extern void ClientDLL_CreateEntities( void ); + +extern void ClientDLL_DrawNormalTriangles( void ); +extern void ClientDLL_DrawTransparentTriangles( void ); +extern void ClientDLL_StudioEvent( const struct mstudioevent_s *event, const struct cl_entity_s *entity ); +extern void ClientDLL_PostRunCmd( struct local_state_s *from, struct local_state_s *to, struct usercmd_s *cmd, int runfuncs, double time, unsigned int random_seed ); +extern void ClientDLL_TxferLocalOverrides( struct entity_state_s *state, const struct clientdata_s *client ); +extern void ClientDLL_ProcessPlayerState( struct entity_state_s *dst, const struct entity_state_s *src ); +extern void ClientDLL_TxferPredictionData ( struct entity_state_s *ps, const struct entity_state_s *pps, struct clientdata_s *pcd, const struct clientdata_s *ppcd, struct weapon_data_s *wd, const struct weapon_data_s *pwd ); +extern void ClientDLL_ReadDemoBuffer( int size, unsigned char *buffer ); +extern int ClientDLL_ConnectionlessPacket( const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size ); +extern int ClientDLL_GetHullBounds( int hullnumber, float *mins, float *maxs ); + +extern void ClientDLL_VGui_ConsolePrint(const char* text); + +extern int ClientDLL_Key_Event( int down, int keynum, const char *pszCurrentBinding ); +extern void ClientDLL_TempEntUpdate( double ft, double ct, double grav, struct tempent_s **ppFreeTE, struct tempent_s **ppActiveTE, int ( *addTEntity )( struct cl_entity_s *pEntity ), void ( *playTESound )( struct tempent_s *pTemp, float damp ) ); +extern struct cl_entity_s *ClientDLL_GetUserEntity( int index ); +extern void ClientDLL_VoiceStatus(int entindex, qboolean bTalking); +extern void ClientDLL_DirectorMessage( int iSize, void *pbuf ); + + +#ifdef __cplusplus +} +#endif + +#endif // CDLL_INT_H diff --git a/MiniBase/ValveSDK/engine/anorms.h b/MiniBase/ValveSDK/engine/anorms.h new file mode 100644 index 0000000..8b7f271 --- /dev/null +++ b/MiniBase/ValveSDK/engine/anorms.h @@ -0,0 +1,177 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ + +{-0.525731, 0.000000, 0.850651}, +{-0.442863, 0.238856, 0.864188}, +{-0.295242, 0.000000, 0.955423}, +{-0.309017, 0.500000, 0.809017}, +{-0.162460, 0.262866, 0.951056}, +{0.000000, 0.000000, 1.000000}, +{0.000000, 0.850651, 0.525731}, +{-0.147621, 0.716567, 0.681718}, +{0.147621, 0.716567, 0.681718}, +{0.000000, 0.525731, 0.850651}, +{0.309017, 0.500000, 0.809017}, +{0.525731, 0.000000, 0.850651}, +{0.295242, 0.000000, 0.955423}, +{0.442863, 0.238856, 0.864188}, +{0.162460, 0.262866, 0.951056}, +{-0.681718, 0.147621, 0.716567}, +{-0.809017, 0.309017, 0.500000}, +{-0.587785, 0.425325, 0.688191}, +{-0.850651, 0.525731, 0.000000}, +{-0.864188, 0.442863, 0.238856}, +{-0.716567, 0.681718, 0.147621}, +{-0.688191, 0.587785, 0.425325}, +{-0.500000, 0.809017, 0.309017}, +{-0.238856, 0.864188, 0.442863}, +{-0.425325, 0.688191, 0.587785}, +{-0.716567, 0.681718, -0.147621}, +{-0.500000, 0.809017, -0.309017}, +{-0.525731, 0.850651, 0.000000}, +{0.000000, 0.850651, -0.525731}, +{-0.238856, 0.864188, -0.442863}, +{0.000000, 0.955423, -0.295242}, +{-0.262866, 0.951056, -0.162460}, +{0.000000, 1.000000, 0.000000}, +{0.000000, 0.955423, 0.295242}, +{-0.262866, 0.951056, 0.162460}, +{0.238856, 0.864188, 0.442863}, +{0.262866, 0.951056, 0.162460}, +{0.500000, 0.809017, 0.309017}, +{0.238856, 0.864188, -0.442863}, +{0.262866, 0.951056, -0.162460}, +{0.500000, 0.809017, -0.309017}, +{0.850651, 0.525731, 0.000000}, +{0.716567, 0.681718, 0.147621}, +{0.716567, 0.681718, -0.147621}, +{0.525731, 0.850651, 0.000000}, +{0.425325, 0.688191, 0.587785}, +{0.864188, 0.442863, 0.238856}, +{0.688191, 0.587785, 0.425325}, +{0.809017, 0.309017, 0.500000}, +{0.681718, 0.147621, 0.716567}, +{0.587785, 0.425325, 0.688191}, +{0.955423, 0.295242, 0.000000}, +{1.000000, 0.000000, 0.000000}, +{0.951056, 0.162460, 0.262866}, +{0.850651, -0.525731, 0.000000}, +{0.955423, -0.295242, 0.000000}, +{0.864188, -0.442863, 0.238856}, +{0.951056, -0.162460, 0.262866}, +{0.809017, -0.309017, 0.500000}, +{0.681718, -0.147621, 0.716567}, +{0.850651, 0.000000, 0.525731}, +{0.864188, 0.442863, -0.238856}, +{0.809017, 0.309017, -0.500000}, +{0.951056, 0.162460, -0.262866}, +{0.525731, 0.000000, -0.850651}, +{0.681718, 0.147621, -0.716567}, +{0.681718, -0.147621, -0.716567}, +{0.850651, 0.000000, -0.525731}, +{0.809017, -0.309017, -0.500000}, +{0.864188, -0.442863, -0.238856}, +{0.951056, -0.162460, -0.262866}, +{0.147621, 0.716567, -0.681718}, +{0.309017, 0.500000, -0.809017}, +{0.425325, 0.688191, -0.587785}, +{0.442863, 0.238856, -0.864188}, +{0.587785, 0.425325, -0.688191}, +{0.688191, 0.587785, -0.425325}, +{-0.147621, 0.716567, -0.681718}, +{-0.309017, 0.500000, -0.809017}, +{0.000000, 0.525731, -0.850651}, +{-0.525731, 0.000000, -0.850651}, +{-0.442863, 0.238856, -0.864188}, +{-0.295242, 0.000000, -0.955423}, +{-0.162460, 0.262866, -0.951056}, +{0.000000, 0.000000, -1.000000}, +{0.295242, 0.000000, -0.955423}, +{0.162460, 0.262866, -0.951056}, +{-0.442863, -0.238856, -0.864188}, +{-0.309017, -0.500000, -0.809017}, +{-0.162460, -0.262866, -0.951056}, +{0.000000, -0.850651, -0.525731}, +{-0.147621, -0.716567, -0.681718}, +{0.147621, -0.716567, -0.681718}, +{0.000000, -0.525731, -0.850651}, +{0.309017, -0.500000, -0.809017}, +{0.442863, -0.238856, -0.864188}, +{0.162460, -0.262866, -0.951056}, +{0.238856, -0.864188, -0.442863}, +{0.500000, -0.809017, -0.309017}, +{0.425325, -0.688191, -0.587785}, +{0.716567, -0.681718, -0.147621}, +{0.688191, -0.587785, -0.425325}, +{0.587785, -0.425325, -0.688191}, +{0.000000, -0.955423, -0.295242}, +{0.000000, -1.000000, 0.000000}, +{0.262866, -0.951056, -0.162460}, +{0.000000, -0.850651, 0.525731}, +{0.000000, -0.955423, 0.295242}, +{0.238856, -0.864188, 0.442863}, +{0.262866, -0.951056, 0.162460}, +{0.500000, -0.809017, 0.309017}, +{0.716567, -0.681718, 0.147621}, +{0.525731, -0.850651, 0.000000}, +{-0.238856, -0.864188, -0.442863}, +{-0.500000, -0.809017, -0.309017}, +{-0.262866, -0.951056, -0.162460}, +{-0.850651, -0.525731, 0.000000}, +{-0.716567, -0.681718, -0.147621}, +{-0.716567, -0.681718, 0.147621}, +{-0.525731, -0.850651, 0.000000}, +{-0.500000, -0.809017, 0.309017}, +{-0.238856, -0.864188, 0.442863}, +{-0.262866, -0.951056, 0.162460}, +{-0.864188, -0.442863, 0.238856}, +{-0.809017, -0.309017, 0.500000}, +{-0.688191, -0.587785, 0.425325}, +{-0.681718, -0.147621, 0.716567}, +{-0.442863, -0.238856, 0.864188}, +{-0.587785, -0.425325, 0.688191}, +{-0.309017, -0.500000, 0.809017}, +{-0.147621, -0.716567, 0.681718}, +{-0.425325, -0.688191, 0.587785}, +{-0.162460, -0.262866, 0.951056}, +{0.442863, -0.238856, 0.864188}, +{0.162460, -0.262866, 0.951056}, +{0.309017, -0.500000, 0.809017}, +{0.147621, -0.716567, 0.681718}, +{0.000000, -0.525731, 0.850651}, +{0.425325, -0.688191, 0.587785}, +{0.587785, -0.425325, 0.688191}, +{0.688191, -0.587785, 0.425325}, +{-0.955423, 0.295242, 0.000000}, +{-0.951056, 0.162460, 0.262866}, +{-1.000000, 0.000000, 0.000000}, +{-0.850651, 0.000000, 0.525731}, +{-0.955423, -0.295242, 0.000000}, +{-0.951056, -0.162460, 0.262866}, +{-0.864188, 0.442863, -0.238856}, +{-0.951056, 0.162460, -0.262866}, +{-0.809017, 0.309017, -0.500000}, +{-0.864188, -0.442863, -0.238856}, +{-0.951056, -0.162460, -0.262866}, +{-0.809017, -0.309017, -0.500000}, +{-0.681718, 0.147621, -0.716567}, +{-0.681718, -0.147621, -0.716567}, +{-0.850651, 0.000000, -0.525731}, +{-0.688191, 0.587785, -0.425325}, +{-0.587785, 0.425325, -0.688191}, +{-0.425325, 0.688191, -0.587785}, +{-0.425325, -0.688191, -0.587785}, +{-0.587785, -0.425325, -0.688191}, +{-0.688191, -0.587785, -0.425325}, diff --git a/MiniBase/ValveSDK/engine/beamdef.h b/MiniBase/ValveSDK/engine/beamdef.h new file mode 100644 index 0000000..f1837aa --- /dev/null +++ b/MiniBase/ValveSDK/engine/beamdef.h @@ -0,0 +1,60 @@ +/*** +* +* 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. +* +****/ +#if !defined ( BEAMDEFH ) +#define BEAMDEFH +#pragma once + +#define FBEAM_STARTENTITY 0x00000001 +#define FBEAM_ENDENTITY 0x00000002 +#define FBEAM_FADEIN 0x00000004 +#define FBEAM_FADEOUT 0x00000008 +#define FBEAM_SINENOISE 0x00000010 +#define FBEAM_SOLID 0x00000020 +#define FBEAM_SHADEIN 0x00000040 +#define FBEAM_SHADEOUT 0x00000080 +#define FBEAM_STARTVISIBLE 0x10000000 // Has this client actually seen this beam's start entity yet? +#define FBEAM_ENDVISIBLE 0x20000000 // Has this client actually seen this beam's end entity yet? +#define FBEAM_ISACTIVE 0x40000000 +#define FBEAM_FOREVER 0x80000000 + +typedef struct beam_s BEAM; +struct beam_s +{ + BEAM *next; + int type; + int flags; + vec3_t source; + vec3_t target; + vec3_t delta; + float t; // 0 .. 1 over lifetime of beam + float freq; + float die; + float width; + float amplitude; + float r, g, b; + float brightness; + float speed; + float frameRate; + float frame; + int segments; + int startEntity; + int endEntity; + int modelIndex; + int frameCount; + struct model_s *pFollowModel; + struct particle_s *particles; +}; + +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/cdll_dll.h b/MiniBase/ValveSDK/engine/cdll_dll.h new file mode 100644 index 0000000..caa06c6 --- /dev/null +++ b/MiniBase/ValveSDK/engine/cdll_dll.h @@ -0,0 +1,46 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +// +// cdll_dll.h + +// this file is included by both the game-dll and the client-dll, + +#ifndef CDLL_DLL_H +#define CDLL_DLL_H + +#define MAX_WEAPONS 32 // ??? + +#define MAX_WEAPON_SLOTS 5 // hud item selection slots +#define MAX_ITEM_TYPES 6 // hud item selection slots + +#define MAX_ITEMS 5 // hard coded item types + +#define HIDEHUD_WEAPONS ( 1<<0 ) +#define HIDEHUD_FLASHLIGHT ( 1<<1 ) +#define HIDEHUD_ALL ( 1<<2 ) +#define HIDEHUD_HEALTH ( 1<<3 ) + +#define MAX_AMMO_TYPES 32 // ??? +#define MAX_AMMO_SLOTS 32 // not really slots + +#define HUD_PRINTNOTIFY 1 +#define HUD_PRINTCONSOLE 2 +#define HUD_PRINTTALK 3 +#define HUD_PRINTCENTER 4 + + +#define WEAPON_SUIT 31 + +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/cdll_engine_dll.h b/MiniBase/ValveSDK/engine/cdll_engine_dll.h new file mode 100644 index 0000000..d42adae --- /dev/null +++ b/MiniBase/ValveSDK/engine/cdll_engine_dll.h @@ -0,0 +1,46 @@ +/*** +* +* 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. +* +****/ +// +// cdll_dll.h + +// this file is included by both the game-dll and the client-dll, + +#ifndef CDLL_DLL_H +#define CDLL_DLL_H + +#define MAX_WEAPONS 32 // ??? + +#define MAX_WEAPON_SLOTS 5 // hud item selection slots +#define MAX_ITEM_TYPES 6 // hud item selection slots + +#define MAX_ITEMS 5 // hard coded item types + +#define HIDEHUD_WEAPONS ( 1<<0 ) +#define HIDEHUD_FLASHLIGHT ( 1<<1 ) +#define HIDEHUD_ALL ( 1<<2 ) +#define HIDEHUD_HEALTH ( 1<<3 ) + +#define MAX_AMMO_TYPES 32 // ??? +#define MAX_AMMO_SLOTS 32 // not really slots + +#define HUD_PRINTNOTIFY 1 +#define HUD_PRINTCONSOLE 2 +#define HUD_PRINTTALK 3 +#define HUD_PRINTCENTER 4 + + +#define WEAPON_SUIT 31 + +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/cl_dll.h b/MiniBase/ValveSDK/engine/cl_dll.h new file mode 100644 index 0000000..6c688e0 --- /dev/null +++ b/MiniBase/ValveSDK/engine/cl_dll.h @@ -0,0 +1,37 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +// +// cl_dll.h +// + +// 4-23-98 JOHN + +// +// This DLL is linked by the client when they first initialize. +// This DLL is responsible for the following tasks: +// - Loading the HUD graphics upon initialization +// - Drawing the HUD graphics every frame +// - Handling the custum HUD-update packets +// +typedef unsigned char byte; +typedef unsigned short word; +typedef float vec_t; +typedef int (*pfnUserMsgHook)(const char *pszName, int iSize, void *pbuf); + +#include "util_vector.h" +#define EXPORT _declspec( dllexport ) + +#include "../engine/cdll_int.h" +#include "cdll_dll.h" \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/cl_entity.h b/MiniBase/ValveSDK/engine/cl_entity.h new file mode 100644 index 0000000..a17f8e8 --- /dev/null +++ b/MiniBase/ValveSDK/engine/cl_entity.h @@ -0,0 +1,115 @@ +/*** +* +* 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. +* +****/ +// cl_entity.h +#if !defined( CL_ENTITYH ) +#define CL_ENTITYH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct efrag_s +{ + struct mleaf_s *leaf; + struct efrag_s *leafnext; + struct cl_entity_s *entity; + struct efrag_s *entnext; +} efrag_t; + +typedef struct +{ + byte mouthopen; // 0 = mouth closed, 255 = mouth agape + byte sndcount; // counter for running average + int sndavg; // running average +} mouth_t; + +typedef struct +{ + float prevanimtime; + float sequencetime; + byte prevseqblending[2]; + vec3_t prevorigin; + vec3_t prevangles; + + int prevsequence; + float prevframe; + + byte prevcontroller[4]; + byte prevblending[2]; +} latchedvars_t; + +typedef struct +{ + // Time stamp for this movement + float animtime; + + vec3_t origin; + vec3_t angles; +} position_history_t; + +typedef struct cl_entity_s cl_entity_t; + +#define HISTORY_MAX 64 // Must be power of 2 +#define HISTORY_MASK ( HISTORY_MAX - 1 ) + + +#if !defined( ENTITY_STATEH ) +#include "entity_state.h" +#endif + +#if !defined( PROGS_H ) +#include "progs.h" +#endif + +struct cl_entity_s +{ + int index; // Index into cl_entities ( should match actual slot, but not necessarily ) + + qboolean player; // True if this entity is a "player" + + entity_state_t baseline; // The original state from which to delta during an uncompressed message + entity_state_t prevstate; // The state information from the penultimate message received from the server + entity_state_t curstate; // The state information from the last message received from server + + int current_position; // Last received history update index + position_history_t ph[ HISTORY_MAX ]; // History of position and angle updates for this player + + mouth_t mouth; // For synchronizing mouth movements. + + latchedvars_t latched; // Variables used by studio model rendering routines + + // Information based on interplocation, extrapolation, prediction, or just copied from last msg received. + // + float lastmove; + + // Actual render position and angles + vec3_t origin; + vec3_t angles; + + // Attachment points + vec3_t attachment[4]; + + // Other entity local information + int trivial_accept; + + struct model_s *model; // cl.model_precache[ curstate.modelindes ]; all visible entities have a model + struct efrag_s *efrag; // linked list of efrags + struct mnode_s *topnode; // for bmodels, first world node that splits bmodel, or NULL if not split + + float syncbase; // for client-side animations -- used by obsolete alias animation system, remove? + int visframe; // last frame this entity was found in an active leaf + colorVec cvFloorColor; +}; + +#endif // !CL_ENTITYH \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/const.h b/MiniBase/ValveSDK/engine/const.h new file mode 100644 index 0000000..9db7d38 --- /dev/null +++ b/MiniBase/ValveSDK/engine/const.h @@ -0,0 +1,771 @@ +/*** +* +* 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. +* +****/ +#ifndef CONST_H +#define CONST_H +// +// Constants shared by the engine and dlls +// This header file included by engine files and DLL files. +// Most came from server.h + +// edict->flags +#define FL_FLY (1<<0) // Changes the SV_Movestep() behavior to not need to be on ground +#define FL_SWIM (1<<1) // Changes the SV_Movestep() behavior to not need to be on ground (but stay in water) +#define FL_CONVEYOR (1<<2) +#define FL_CLIENT (1<<3) +#define FL_INWATER (1<<4) +#define FL_MONSTER (1<<5) +#define FL_GODMODE (1<<6) +#define FL_NOTARGET (1<<7) +#define FL_SKIPLOCALHOST (1<<8) // Don't send entity to local host, it's predicting this entity itself +#define FL_ONGROUND (1<<9) // At rest / on the ground +#define FL_PARTIALGROUND (1<<10) // not all corners are valid +#define FL_WATERJUMP (1<<11) // player jumping out of water +#define FL_FROZEN (1<<12) // Player is frozen for 3rd person camera +#define FL_FAKECLIENT (1<<13) // JAC: fake client, simulated server side; don't send network messages to them +#define FL_DUCKING (1<<14) // Player flag -- Player is fully crouched +#define FL_FLOAT (1<<15) // Apply floating force to this entity when in water +#define FL_GRAPHED (1<<16) // worldgraph has this ent listed as something that blocks a connection + +// UNDONE: Do we need these? +#define FL_IMMUNE_WATER (1<<17) +#define FL_IMMUNE_SLIME (1<<18) +#define FL_IMMUNE_LAVA (1<<19) + +#define FL_PROXY (1<<20) // This is a spectator proxy +#define FL_ALWAYSTHINK (1<<21) // Brush model flag -- call think every frame regardless of nextthink - ltime (for constantly changing velocity/path) +#define FL_BASEVELOCITY (1<<22) // Base velocity has been applied this frame (used to convert base velocity into momentum) +#define FL_MONSTERCLIP (1<<23) // Only collide in with monsters who have FL_MONSTERCLIP set +#define FL_ONTRAIN (1<<24) // Player is _controlling_ a train, so movement commands should be ignored on client during prediction. +#define FL_WORLDBRUSH (1<<25) // Not moveable/removeable brush entity (really part of the world, but represented as an entity for transparency or something) +#define FL_SPECTATOR (1<<26) // This client is a spectator, don't run touch functions, etc. +#define FL_CUSTOMENTITY (1<<29) // This is a custom entity +#define FL_KILLME (1<<30) // This entity is marked for death -- This allows the engine to kill ents at the appropriate time +#define FL_DORMANT (1<<31) // Entity is dormant, no updates to client + + +// Goes into globalvars_t.trace_flags +#define FTRACE_SIMPLEBOX (1<<0) // Traceline with a simple box + + +// walkmove modes +#define WALKMOVE_NORMAL 0 // normal walkmove +#define WALKMOVE_WORLDONLY 1 // doesn't hit ANY entities, no matter what the solid type +#define WALKMOVE_CHECKONLY 2 // move, but don't touch triggers + +// edict->movetype values +#define MOVETYPE_NONE 0 // never moves +//#define MOVETYPE_ANGLENOCLIP 1 +//#define MOVETYPE_ANGLECLIP 2 +#define MOVETYPE_WALK 3 // Player only - moving on the ground +#define MOVETYPE_STEP 4 // gravity, special edge handling -- monsters use this +#define MOVETYPE_FLY 5 // No gravity, but still collides with stuff +#define MOVETYPE_TOSS 6 // gravity/collisions +#define MOVETYPE_PUSH 7 // no clip to world, push and crush +#define MOVETYPE_NOCLIP 8 // No gravity, no collisions, still do velocity/avelocity +#define MOVETYPE_FLYMISSILE 9 // extra size to monsters +#define MOVETYPE_BOUNCE 10 // Just like Toss, but reflect velocity when contacting surfaces +#define MOVETYPE_BOUNCEMISSILE 11 // bounce w/o gravity +#define MOVETYPE_FOLLOW 12 // track movement of aiment +#define MOVETYPE_PUSHSTEP 13 // BSP model that needs physics/world collisions (uses nearest hull for world collision) + +// edict->solid values +// NOTE: Some movetypes will cause collisions independent of SOLID_NOT/SOLID_TRIGGER when the entity moves +// SOLID only effects OTHER entities colliding with this one when they move - UGH! +#define SOLID_NOT 0 // no interaction with other objects +#define SOLID_TRIGGER 1 // touch on edge, but not blocking +#define SOLID_BBOX 2 // touch on edge, block +#define SOLID_SLIDEBOX 3 // touch on edge, but not an onground +#define SOLID_BSP 4 // bsp clip, touch on edge, block + +// edict->deadflag values +#define DEAD_NO 0 // alive +#define DEAD_DYING 1 // playing death animation or still falling off of a ledge waiting to hit ground +#define DEAD_DEAD 2 // dead. lying still. +#define DEAD_RESPAWNABLE 3 +#define DEAD_DISCARDBODY 4 + +#define DAMAGE_NO 0 +#define DAMAGE_YES 1 +#define DAMAGE_AIM 2 + +// entity effects +#define EF_BRIGHTFIELD 1 // swirling cloud of particles +#define EF_MUZZLEFLASH 2 // single frame ELIGHT on entity attachment 0 +#define EF_BRIGHTLIGHT 4 // DLIGHT centered at entity origin +#define EF_DIMLIGHT 8 // player flashlight +#define EF_INVLIGHT 16 // get lighting from ceiling +#define EF_NOINTERP 32 // don't interpolate the next frame +#define EF_LIGHT 64 // rocket flare glow sprite +#define EF_NODRAW 128 // don't draw entity + +// entity flags +#define EFLAG_SLERP 1 // do studio interpolation of this entity + +// +// temp entity events +// +#define TE_BEAMPOINTS 0 // beam effect between two points +// coord coord coord (start position) +// coord coord coord (end position) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMENTPOINT 1 // beam effect between point and entity +// short (start entity) +// coord coord coord (end position) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_GUNSHOT 2 // particle effect plus ricochet sound +// coord coord coord (position) + +#define TE_EXPLOSION 3 // additive sprite, 2 dynamic lights, flickering particles, explosion sound, move vertically 8 pps +// coord coord coord (position) +// short (sprite index) +// byte (scale in 0.1's) +// byte (framerate) +// byte (flags) +// +// The Explosion effect has some flags to control performance/aesthetic features: +#define TE_EXPLFLAG_NONE 0 // all flags clear makes default Half-Life explosion +#define TE_EXPLFLAG_NOADDITIVE 1 // sprite will be drawn opaque (ensure that the sprite you send is a non-additive sprite) +#define TE_EXPLFLAG_NODLIGHTS 2 // do not render dynamic lights +#define TE_EXPLFLAG_NOSOUND 4 // do not play client explosion sound +#define TE_EXPLFLAG_NOPARTICLES 8 // do not draw particles + + +#define TE_TAREXPLOSION 4 // Quake1 "tarbaby" explosion with sound +// coord coord coord (position) + +#define TE_SMOKE 5 // alphablend sprite, move vertically 30 pps +// coord coord coord (position) +// short (sprite index) +// byte (scale in 0.1's) +// byte (framerate) + +#define TE_TRACER 6 // tracer effect from point to point +// coord, coord, coord (start) +// coord, coord, coord (end) + +#define TE_LIGHTNING 7 // TE_BEAMPOINTS with simplified parameters +// coord, coord, coord (start) +// coord, coord, coord (end) +// byte (life in 0.1's) +// byte (width in 0.1's) +// byte (amplitude in 0.01's) +// short (sprite model index) + +#define TE_BEAMENTS 8 +// short (start entity) +// short (end entity) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_SPARKS 9 // 8 random tracers with gravity, ricochet sprite +// coord coord coord (position) + +#define TE_LAVASPLASH 10 // Quake1 lava splash +// coord coord coord (position) + +#define TE_TELEPORT 11 // Quake1 teleport splash +// coord coord coord (position) + +#define TE_EXPLOSION2 12 // Quake1 colormaped (base palette) particle explosion with sound +// coord coord coord (position) +// byte (starting color) +// byte (num colors) + +#define TE_BSPDECAL 13 // Decal from the .BSP file +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// short (texture index of precached decal texture name) +// short (entity index) +// [optional - only included if previous short is non-zero (not the world)] short (index of model of above entity) + +#define TE_IMPLOSION 14 // tracers moving toward a point +// coord, coord, coord (position) +// byte (radius) +// byte (count) +// byte (life in 0.1's) + +#define TE_SPRITETRAIL 15 // line of moving glow sprites with gravity, fadeout, and collisions +// coord, coord, coord (start) +// coord, coord, coord (end) +// short (sprite index) +// byte (count) +// byte (life in 0.1's) +// byte (scale in 0.1's) +// byte (velocity along vector in 10's) +// byte (randomness of velocity in 10's) + +#define TE_BEAM 16 // obsolete + +#define TE_SPRITE 17 // additive sprite, plays 1 cycle +// coord, coord, coord (position) +// short (sprite index) +// byte (scale in 0.1's) +// byte (brightness) + +#define TE_BEAMSPRITE 18 // A beam with a sprite at the end +// coord, coord, coord (start position) +// coord, coord, coord (end position) +// short (beam sprite index) +// short (end sprite index) + +#define TE_BEAMTORUS 19 // screen aligned beam ring, expands to max radius over lifetime +// coord coord coord (center position) +// coord coord coord (axis and radius) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMDISK 20 // disk that expands to max radius over lifetime +// coord coord coord (center position) +// coord coord coord (axis and radius) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMCYLINDER 21 // cylinder that expands to max radius over lifetime +// coord coord coord (center position) +// coord coord coord (axis and radius) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_BEAMFOLLOW 22 // create a line of decaying beam segments until entity stops moving +// short (entity:attachment to follow) +// short (sprite index) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte,byte,byte (color) +// byte (brightness) + +#define TE_GLOWSPRITE 23 +// coord, coord, coord (pos) short (model index) byte (scale / 10) + +#define TE_BEAMRING 24 // connect a beam ring to two entities +// short (start entity) +// short (end entity) +// short (sprite index) +// byte (starting frame) +// byte (frame rate in 0.1's) +// byte (life in 0.1's) +// byte (line width in 0.1's) +// byte (noise amplitude in 0.01's) +// byte,byte,byte (color) +// byte (brightness) +// byte (scroll speed in 0.1's) + +#define TE_STREAK_SPLASH 25 // oriented shower of tracers +// coord coord coord (start position) +// coord coord coord (direction vector) +// byte (color) +// short (count) +// short (base speed) +// short (ramdon velocity) + +#define TE_BEAMHOSE 26 // obsolete + +#define TE_DLIGHT 27 // dynamic light, effect world, minor entity effect +// coord, coord, coord (pos) +// byte (radius in 10's) +// byte byte byte (color) +// byte (brightness) +// byte (life in 10's) +// byte (decay rate in 10's) + +#define TE_ELIGHT 28 // point entity light, no world effect +// short (entity:attachment to follow) +// coord coord coord (initial position) +// coord (radius) +// byte byte byte (color) +// byte (life in 0.1's) +// coord (decay rate) + +#define TE_TEXTMESSAGE 29 +// short 1.2.13 x (-1 = center) +// short 1.2.13 y (-1 = center) +// byte Effect 0 = fade in/fade out + // 1 is flickery credits + // 2 is write out (training room) + +// 4 bytes r,g,b,a color1 (text color) +// 4 bytes r,g,b,a color2 (effect color) +// ushort 8.8 fadein time +// ushort 8.8 fadeout time +// ushort 8.8 hold time +// optional ushort 8.8 fxtime (time the highlight lags behing the leading text in effect 2) +// string text message (512 chars max sz string) +#define TE_LINE 30 +// coord, coord, coord startpos +// coord, coord, coord endpos +// short life in 0.1 s +// 3 bytes r, g, b + +#define TE_BOX 31 +// coord, coord, coord boxmins +// coord, coord, coord boxmaxs +// short life in 0.1 s +// 3 bytes r, g, b + +#define TE_KILLBEAM 99 // kill all beams attached to entity +// short (entity) + +#define TE_LARGEFUNNEL 100 +// coord coord coord (funnel position) +// short (sprite index) +// short (flags) + +#define TE_BLOODSTREAM 101 // particle spray +// coord coord coord (start position) +// coord coord coord (spray vector) +// byte (color) +// byte (speed) + +#define TE_SHOWLINE 102 // line of particles every 5 units, dies in 30 seconds +// coord coord coord (start position) +// coord coord coord (end position) + +#define TE_BLOOD 103 // particle spray +// coord coord coord (start position) +// coord coord coord (spray vector) +// byte (color) +// byte (speed) + +#define TE_DECAL 104 // Decal applied to a brush entity (not the world) +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name) +// short (entity index) + +#define TE_FIZZ 105 // create alpha sprites inside of entity, float upwards +// short (entity) +// short (sprite index) +// byte (density) + +#define TE_MODEL 106 // create a moving model that bounces and makes a sound when it hits +// coord, coord, coord (position) +// coord, coord, coord (velocity) +// angle (initial yaw) +// short (model index) +// byte (bounce sound type) +// byte (life in 0.1's) + +#define TE_EXPLODEMODEL 107 // spherical shower of models, picks from set +// coord, coord, coord (origin) +// coord (velocity) +// short (model index) +// short (count) +// byte (life in 0.1's) + +#define TE_BREAKMODEL 108 // box of models or sprites +// coord, coord, coord (position) +// coord, coord, coord (size) +// coord, coord, coord (velocity) +// byte (random velocity in 10's) +// short (sprite or model index) +// byte (count) +// byte (life in 0.1 secs) +// byte (flags) + +#define TE_GUNSHOTDECAL 109 // decal and ricochet sound +// coord, coord, coord (position) +// short (entity index???) +// byte (decal???) + +#define TE_SPRITE_SPRAY 110 // spay of alpha sprites +// coord, coord, coord (position) +// coord, coord, coord (velocity) +// short (sprite index) +// byte (count) +// byte (speed) +// byte (noise) + +#define TE_ARMOR_RICOCHET 111 // quick spark sprite, client ricochet sound. +// coord, coord, coord (position) +// byte (scale in 0.1's) + +#define TE_PLAYERDECAL 112 // ??? +// byte (playerindex) +// coord, coord, coord (position) +// short (entity???) +// byte (decal number???) +// [optional] short (model index???) + +#define TE_BUBBLES 113 // create alpha sprites inside of box, float upwards +// coord, coord, coord (min start position) +// coord, coord, coord (max start position) +// coord (float height) +// short (model index) +// byte (count) +// coord (speed) + +#define TE_BUBBLETRAIL 114 // create alpha sprites along a line, float upwards +// coord, coord, coord (min start position) +// coord, coord, coord (max start position) +// coord (float height) +// short (model index) +// byte (count) +// coord (speed) + +#define TE_BLOODSPRITE 115 // spray of opaque sprite1's that fall, single sprite2 for 1..2 secs (this is a high-priority tent) +// coord, coord, coord (position) +// short (sprite1 index) +// short (sprite2 index) +// byte (color) +// byte (scale) + +#define TE_WORLDDECAL 116 // Decal applied to the world brush +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name) + +#define TE_WORLDDECALHIGH 117 // Decal (with texture index > 256) applied to world brush +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name - 256) + +#define TE_DECALHIGH 118 // Same as TE_DECAL, but the texture index was greater than 256 +// coord, coord, coord (x,y,z), decal position (center of texture in world) +// byte (texture index of precached decal texture name - 256) +// short (entity index) + +#define TE_PROJECTILE 119 // Makes a projectile (like a nail) (this is a high-priority tent) +// coord, coord, coord (position) +// coord, coord, coord (velocity) +// short (modelindex) +// byte (life) +// byte (owner) projectile won't collide with owner (if owner == 0, projectile will hit any client). + +#define TE_SPRAY 120 // Throws a shower of sprites or models +// coord, coord, coord (position) +// coord, coord, coord (direction) +// short (modelindex) +// byte (count) +// byte (speed) +// byte (noise) +// byte (rendermode) + +#define TE_PLAYERSPRITES 121 // sprites emit from a player's bounding box (ONLY use for players!) +// byte (playernum) +// short (sprite modelindex) +// byte (count) +// byte (variance) (0 = no variance in size) (10 = 10% variance in size) + +#define TE_PARTICLEBURST 122 // very similar to lavasplash. +// coord (origin) +// short (radius) +// byte (particle color) +// byte (duration * 10) (will be randomized a bit) + +#define TE_FIREFIELD 123 // makes a field of fire. +// coord (origin) +// short (radius) (fire is made in a square around origin. -radius, -radius to radius, radius) +// short (modelindex) +// byte (count) +// byte (flags) +// byte (duration (in seconds) * 10) (will be randomized a bit) +// +// to keep network traffic low, this message has associated flags that fit into a byte: +#define TEFIRE_FLAG_ALLFLOAT 1 // all sprites will drift upwards as they animate +#define TEFIRE_FLAG_SOMEFLOAT 2 // some of the sprites will drift upwards. (50% chance) +#define TEFIRE_FLAG_LOOP 4 // if set, sprite plays at 15 fps, otherwise plays at whatever rate stretches the animation over the sprite's duration. +#define TEFIRE_FLAG_ALPHA 8 // if set, sprite is rendered alpha blended at 50% else, opaque +#define TEFIRE_FLAG_PLANAR 16 // if set, all fire sprites have same initial Z instead of randomly filling a cube. + +#define TE_PLAYERATTACHMENT 124 // attaches a TENT to a player (this is a high-priority tent) +// byte (entity index of player) +// coord (vertical offset) ( attachment origin.z = player origin.z + vertical offset ) +// short (model index) +// short (life * 10 ); + +#define TE_KILLPLAYERATTACHMENTS 125 // will expire all TENTS attached to a player. +// byte (entity index of player) + +#define TE_MULTIGUNSHOT 126 // much more compact shotgun message +// This message is used to make a client approximate a 'spray' of gunfire. +// Any weapon that fires more than one bullet per frame and fires in a bit of a spread is +// a good candidate for MULTIGUNSHOT use. (shotguns) +// +// NOTE: This effect makes the client do traces for each bullet, these client traces ignore +// entities that have studio models.Traces are 4096 long. +// +// coord (origin) +// coord (origin) +// coord (origin) +// coord (direction) +// coord (direction) +// coord (direction) +// coord (x noise * 100) +// coord (y noise * 100) +// byte (count) +// byte (bullethole decal texture index) + +#define TE_USERTRACER 127 // larger message than the standard tracer, but allows some customization. +// coord (origin) +// coord (origin) +// coord (origin) +// coord (velocity) +// coord (velocity) +// coord (velocity) +// byte ( life * 10 ) +// byte ( color ) this is an index into an array of color vectors in the engine. (0 - ) +// byte ( length * 10 ) + + + +#define MSG_BROADCAST 0 // unreliable to all +#define MSG_ONE 1 // reliable to one (msg_entity) +#define MSG_ALL 2 // reliable to all +#define MSG_INIT 3 // write to the init string +#define MSG_PVS 4 // Ents in PVS of org +#define MSG_PAS 5 // Ents in PAS of org +#define MSG_PVS_R 6 // Reliable to PVS +#define MSG_PAS_R 7 // Reliable to PAS +#define MSG_ONE_UNRELIABLE 8 // Send to one client, but don't put in reliable stream, put in unreliable datagram ( could be dropped ) +#define MSG_SPEC 9 // Sends to all spectator proxies + +// contents of a spot in the world +#define CONTENTS_EMPTY -1 +#define CONTENTS_SOLID -2 +#define CONTENTS_WATER -3 +#define CONTENTS_SLIME -4 +#define CONTENTS_LAVA -5 +#define CONTENTS_SKY -6 +/* These additional contents constants are defined in bspfile.h +#define CONTENTS_ORIGIN -7 // removed at csg time +#define CONTENTS_CLIP -8 // changed to contents_solid +#define CONTENTS_CURRENT_0 -9 +#define CONTENTS_CURRENT_90 -10 +#define CONTENTS_CURRENT_180 -11 +#define CONTENTS_CURRENT_270 -12 +#define CONTENTS_CURRENT_UP -13 +#define CONTENTS_CURRENT_DOWN -14 + +#define CONTENTS_TRANSLUCENT -15 +*/ +#define CONTENTS_LADDER -16 + +#define CONTENT_EMPTY -1 +#define CONTENT_SOLID -2 +#define CONTENT_WATER -3 +#define CONTENT_SLIME -4 +#define CONTENT_LAVA -5 +#define CONTENT_SKY -6 + +// channels +#define CHAN_AUTO 0 +#define CHAN_WEAPON 1 +#define CHAN_VOICE 2 +#define CHAN_ITEM 3 +#define CHAN_BODY 4 +#define CHAN_STREAM 5 // allocate stream channel from the static or dynamic area +#define CHAN_STATIC 6 // allocate channel from the static area +#define CHAN_NETWORKVOICE_BASE 7 // voice data coming across the network +#define CHAN_NETWORKVOICE_END 500 // network voice data reserves slots (CHAN_NETWORKVOICE_BASE through CHAN_NETWORKVOICE_END). + +// attenuation values +#define ATTN_NONE 0 +#define ATTN_NORM (float)0.8 +#define ATTN_IDLE (float)2 +#define ATTN_STATIC (float)1.25 + +// pitch values +#define PITCH_NORM 100 // non-pitch shifted +#define PITCH_LOW 95 // other values are possible - 0-255, where 255 is very high +#define PITCH_HIGH 120 + +// volume values +#define VOL_NORM 1.0 + +// plats +#define PLAT_LOW_TRIGGER 1 + +// Trains +#define SF_TRAIN_WAIT_RETRIGGER 1 +#define SF_TRAIN_PASSABLE 8 // Train is not solid -- used to make water trains + +// buttons +#ifndef IN_BUTTONS_H +#include "in_buttons.h" +#endif + +// Break Model Defines + +#define BREAK_TYPEMASK 0x4F +#define BREAK_GLASS 0x01 +#define BREAK_METAL 0x02 +#define BREAK_FLESH 0x04 +#define BREAK_WOOD 0x08 + +#define BREAK_SMOKE 0x10 +#define BREAK_TRANS 0x20 +#define BREAK_CONCRETE 0x40 +#define BREAK_2 0x80 + +// Colliding temp entity sounds + +#define BOUNCE_GLASS BREAK_GLASS +#define BOUNCE_METAL BREAK_METAL +#define BOUNCE_FLESH BREAK_FLESH +#define BOUNCE_WOOD BREAK_WOOD +#define BOUNCE_SHRAP 0x10 +#define BOUNCE_SHELL 0x20 +#define BOUNCE_CONCRETE BREAK_CONCRETE +#define BOUNCE_SHOTSHELL 0x80 + +// Temp entity bounce sound types +#define TE_BOUNCE_NULL 0 +#define TE_BOUNCE_SHELL 1 +#define TE_BOUNCE_SHOTSHELL 2 + +// Rendering constants +enum +{ + kRenderNormal, // src + kRenderTransColor, // c*a+dest*(1-a) + kRenderTransTexture, // src*a+dest*(1-a) + kRenderGlow, // src*a+dest -- No Z buffer checks + kRenderTransAlpha, // src*srca+dest*(1-srca) + kRenderTransAdd, // src*a+dest +}; + +enum +{ + kRenderFxNone = 0, + kRenderFxPulseSlow, + kRenderFxPulseFast, + kRenderFxPulseSlowWide, + kRenderFxPulseFastWide, + kRenderFxFadeSlow, + kRenderFxFadeFast, + kRenderFxSolidSlow, + kRenderFxSolidFast, + kRenderFxStrobeSlow, + kRenderFxStrobeFast, + kRenderFxStrobeFaster, + kRenderFxFlickerSlow, + kRenderFxFlickerFast, + kRenderFxNoDissipation, + kRenderFxDistort, // Distort/scale/translate flicker + kRenderFxHologram, // kRenderFxDistort + distance fade + kRenderFxDeadPlayer, // kRenderAmt is the player index + kRenderFxExplode, // Scale up really big! + kRenderFxGlowShell, // Glowing Shell + kRenderFxClampMinScale, // Keep this sprite from getting very small (SPRITES only!) +}; + + +typedef int func_t; +typedef int string_t; + +typedef unsigned char byte; +typedef unsigned short word; +#define _DEF_BYTE_ + +#undef true +#undef false + +#ifndef __cplusplus +typedef enum {false, true} qboolean; +#else +typedef int qboolean; +#endif + +typedef struct +{ + byte r, g, b; +} color24; + +typedef struct +{ + unsigned r, g, b, a; +} colorVec; + +#ifdef _WIN32 +#pragma pack(push,2) +#endif + +typedef struct +{ + unsigned short r, g, b, a; +} PackedColorVec; + +#ifdef _WIN32 +#pragma pack(pop) +#endif +typedef struct link_s +{ + struct link_s *prev, *next; +} link_t; + +typedef struct edict_s edict_t; + +typedef struct +{ + vec3_t normal; + float dist; +} plane_t; + +typedef struct +{ + qboolean allsolid; // if true, plane is not valid + qboolean startsolid; // if true, the initial point was in a solid area + qboolean inopen, inwater; + float fraction; // time completed, 1.0 = didn't hit anything + vec3_t endpos; // final position + plane_t plane; // surface normal at impact + edict_t *ent; // entity the surface is on + int hitgroup; // 0 == generic, non zero is specific body part +} trace_t; + +#endif + diff --git a/MiniBase/ValveSDK/engine/crc.h b/MiniBase/ValveSDK/engine/crc.h new file mode 100644 index 0000000..cb88b2c --- /dev/null +++ b/MiniBase/ValveSDK/engine/crc.h @@ -0,0 +1,51 @@ +/*** +* +* 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. +* +****/ +/* crc.h */ +#ifndef CRC_H +#define CRC_H +#ifdef _WIN32 +#pragma once +#endif + +// MD5 Hash +typedef struct +{ + unsigned int buf[4]; + unsigned int bits[2]; + unsigned char in[64]; +} MD5Context_t; + + +typedef unsigned long CRC32_t; +void CRC32_Init(CRC32_t *pulCRC); +CRC32_t CRC32_Final(CRC32_t pulCRC); +void CRC32_ProcessBuffer(CRC32_t *pulCRC, void *p, int len); +void CRC32_ProcessByte(CRC32_t *pulCRC, unsigned char ch); +int CRC_File(CRC32_t *crcvalue, char *pszFileName); +unsigned char COM_BlockSequenceCRCByte(unsigned char *base, int length, int sequence); + +void MD5Init(MD5Context_t *context); +void MD5Update(MD5Context_t *context, unsigned char const *buf, + unsigned int len); +void MD5Final(unsigned char digest[16], MD5Context_t *context); +void Transform(unsigned int buf[4], unsigned int const in[16]); + +int MD5_Hash_File(unsigned char digest[16], char *pszFileName, int bUsefopen, int bSeed, unsigned int seed[4]); +char *MD5_Print(unsigned char hash[16]); +int MD5_Hash_CachedFile(unsigned char digest[16], unsigned char *pCache, int nFileSize, int bSeed, unsigned int seed[4]); + +int CRC_MapFile(CRC32_t *crcvalue, char *pszFileName); + +#endif diff --git a/MiniBase/ValveSDK/engine/custom.h b/MiniBase/ValveSDK/engine/custom.h new file mode 100644 index 0000000..c7324a4 --- /dev/null +++ b/MiniBase/ValveSDK/engine/custom.h @@ -0,0 +1,102 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +// Customization.h + +#ifndef CUSTOM_H +#define CUSTOM_H +#ifdef _WIN32 +#pragma once +#endif + +#include "const.h" + +#define MAX_QPATH 64 // Must match value in quakedefs.h + +///////////////// +// Customization +// passed to pfnPlayerCustomization +// For automatic downloading. +typedef enum +{ + t_sound = 0, + t_skin, + t_model, + t_decal, + t_generic, + t_eventscript +} resourcetype_t; + +// Fake type for world +#define t_world 6 + +typedef struct +{ + int size; +} _resourceinfo_t; + +typedef struct resourceinfo_s +{ + _resourceinfo_t info[ 7 ]; +} resourceinfo_t; + +#define RES_FATALIFMISSING (1<<0) // Disconnect if we can't get this file. +#define RES_WASMISSING (1<<1) // Do we have the file locally, did we get it ok? +#define RES_CUSTOM (1<<2) // Is this resource one that corresponds to another player's customization + // or is it a server startup resource. +#define RES_REQUESTED (1<<3) // Already requested a download of this one +#define RES_PRECACHED (1<<4) // Already precached + +#include "crc.h" + +typedef struct resource_s +{ + char szFileName[MAX_QPATH]; // File name to download/precache. + resourcetype_t type; // t_sound, t_skin, t_model, t_decal. + int nIndex; // For t_decals + int nDownloadSize; // Size in Bytes if this must be downloaded. + unsigned char ucFlags; + +// For handling client to client resource propagation + unsigned char rgucMD5_hash[16]; // To determine if we already have it. + unsigned char playernum; // Which player index this resource is associated with, if it's a custom resource. + + unsigned char rguc_reserved[ 32 ]; // For future expansion + struct resource_s *pNext; // Next in chain. + struct resource_s *pPrev; +} resource_t; + +typedef struct customization_s +{ + qboolean bInUse; // Is this customization in use; + resource_t resource; // The resource_t for this customization + qboolean bTranslated; // Has the raw data been translated into a useable format? + // (e.g., raw decal .wad make into texture_t *) + int nUserData1; // Customization specific data + int nUserData2; // Customization specific data + void *pInfo; // Buffer that holds the data structure that references the data (e.g., the cachewad_t) + void *pBuffer; // Buffer that holds the data for the customization (the raw .wad data) + struct customization_s *pNext; // Next in chain +} customization_t; + +#define FCUST_FROMHPAK ( 1<<0 ) +#define FCUST_WIPEDATA ( 1<<1 ) +#define FCUST_IGNOREINIT ( 1<<2 ) + +void COM_ClearCustomizationList( struct customization_s *pHead, qboolean bCleanDecals); +qboolean COM_CreateCustomization( struct customization_s *pListHead, struct resource_s *pResource, int playernumber, int flags, + struct customization_s **pCustomization, int *nLumps ); +int COM_SizeofResourceList ( struct resource_s *pList, struct resourceinfo_s *ri ); + +#endif // CUSTOM_H diff --git a/MiniBase/ValveSDK/engine/customentity.h b/MiniBase/ValveSDK/engine/customentity.h new file mode 100644 index 0000000..76c241d --- /dev/null +++ b/MiniBase/ValveSDK/engine/customentity.h @@ -0,0 +1,38 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +#ifndef CUSTOMENTITY_H +#define CUSTOMENTITY_H + +// Custom Entities + +// Start/End Entity is encoded as 12 bits of entity index, and 4 bits of attachment (4:12) +#define BEAMENT_ENTITY(x) ((x)&0xFFF) +#define BEAMENT_ATTACHMENT(x) (((x)>>12)&0xF) + +// Beam types, encoded as a byte +enum +{ + BEAM_POINTS = 0, + BEAM_ENTPOINT, + BEAM_ENTS, + BEAM_HOSE, +}; + +#define BEAM_FSINE 0x10 +#define BEAM_FSOLID 0x20 +#define BEAM_FSHADEIN 0x40 +#define BEAM_FSHADEOUT 0x80 + +#endif //CUSTOMENTITY_H diff --git a/MiniBase/ValveSDK/engine/cvardef.h b/MiniBase/ValveSDK/engine/cvardef.h new file mode 100644 index 0000000..0b6148f --- /dev/null +++ b/MiniBase/ValveSDK/engine/cvardef.h @@ -0,0 +1,36 @@ +/*** +* +* 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. +* +****/ +#ifndef CVARDEF_H +#define CVARDEF_H + +#define FCVAR_ARCHIVE (1<<0) // set to cause it to be saved to vars.rc +#define FCVAR_USERINFO (1<<1) // changes the client's info string +#define FCVAR_SERVER (1<<2) // notifies players when changed +#define FCVAR_EXTDLL (1<<3) // defined by external DLL +#define FCVAR_CLIENTDLL (1<<4) // defined by the client dll +#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value +#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. +#define FCVAR_PRINTABLEONLY (1<<7) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). +#define FCVAR_UNLOGGED (1<<8) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log + +typedef struct cvar_s +{ + char *name; + char *string; + int flags; + float value; + struct cvar_s *next; +} cvar_t; +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/dlight.h b/MiniBase/ValveSDK/engine/dlight.h new file mode 100644 index 0000000..0e19dd7 --- /dev/null +++ b/MiniBase/ValveSDK/engine/dlight.h @@ -0,0 +1,33 @@ +/*** +* +* 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. +* +****/ +#if !defined ( DLIGHTH ) +#define DLIGHTH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct +{ + vec3_t origin; + float radius; + color24 color; + float die; // stop lighting after this time + float decay; // drop this each second + float minlight; // don't add when contributing less + int key; + qboolean dark; // subtracts light instead of adding +} dlight_t; + +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/edict.h b/MiniBase/ValveSDK/engine/edict.h new file mode 100644 index 0000000..8676810 --- /dev/null +++ b/MiniBase/ValveSDK/engine/edict.h @@ -0,0 +1,29 @@ +#if !defined EDICT_H +#define EDICT_H +#ifdef _WIN32 +#pragma once +#endif +#define MAX_ENT_LEAFS 48 + +#include "progdefs.h" + +struct edict_s +{ + qboolean free; + int serialnumber; + link_t area; // linked to a division node or leaf + + int headnode; // -1 to use normal leaf check + int num_leafs; + short leafnums[MAX_ENT_LEAFS]; + + float freetime; // sv.time when the object was freed + + void* pvPrivateData; // Alloced and freed by engine, used by DLLs + + entvars_t v; // C exported fields from progs + + // other fields from progs come immediately after +}; + +#endif diff --git a/MiniBase/ValveSDK/engine/eiface.h b/MiniBase/ValveSDK/engine/eiface.h new file mode 100644 index 0000000..6f2c575 --- /dev/null +++ b/MiniBase/ValveSDK/engine/eiface.h @@ -0,0 +1,490 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +#ifndef EIFACE_H +#define EIFACE_H + +#ifdef HLDEMO_BUILD +#define INTERFACE_VERSION 001 +#else // !HLDEMO_BUILD, i.e., regular version of HL +#define INTERFACE_VERSION 140 +#endif // !HLDEMO_BUILD + +#include +#include "custom.h" +#include "cvardef.h" +// +// Defines entity interface between engine and DLLs. +// This header file included by engine files and DLL files. +// +// Before including this header, DLLs must: +// include progdefs.h +// This is conveniently done for them in extdll.h +// + +#ifdef _WIN32 +#define DLLEXPORT __stdcall +#else +#define DLLEXPORT /* */ +#endif + +typedef enum + { + at_notice, + at_console, // same as at_notice, but forces a ConPrintf, not a message box + at_aiconsole, // same as at_console, but only shown if developer level is 2! + at_warning, + at_error, + at_logged // Server print to console ( only in multiplayer games ). + } ALERT_TYPE; + +// 4-22-98 JOHN: added for use in pfnClientPrintf +typedef enum + { + print_console, + print_center, + print_chat, + } PRINT_TYPE; + +// For integrity checking of content on clients +typedef enum +{ + force_exactfile, // File on client must exactly match server's file + force_model_samebounds, // For model files only, the geometry must fit in the same bbox + force_model_specifybounds, // For model files only, the geometry must fit in the specified bbox +} FORCE_TYPE; + +// Returned by TraceLine +typedef struct + { + int fAllSolid; // if true, plane is not valid + int fStartSolid; // if true, the initial point was in a solid area + int fInOpen; + int fInWater; + float flFraction; // time completed, 1.0 = didn't hit anything + vec3_t vecEndPos; // final position + float flPlaneDist; + vec3_t vecPlaneNormal; // surface normal at impact + edict_t *pHit; // entity the surface is on + int iHitgroup; // 0 == generic, non zero is specific body part + } TraceResult; + +// CD audio status +typedef struct +{ + int fPlaying;// is sound playing right now? + int fWasPlaying;// if not, CD is paused if WasPlaying is true. + int fInitialized; + int fEnabled; + int fPlayLooping; + float cdvolume; + //BYTE remap[100]; + int fCDRom; + int fPlayTrack; +} CDStatus; + +#include "../common/crc.h" + +// Engine hands this to DLLs for functionality callbacks +typedef struct enginefuncs_s +{ + int (*pfnPrecacheModel) (char* s); + int (*pfnPrecacheSound) (char* s); + void (*pfnSetModel) (edict_t *e, const char *m); + int (*pfnModelIndex) (const char *m); + int (*pfnModelFrames) (int modelIndex); + void (*pfnSetSize) (edict_t *e, const float *rgflMin, const float *rgflMax); + void (*pfnChangeLevel) (char* s1, char* s2); + void (*pfnGetSpawnParms) (edict_t *ent); + void (*pfnSaveSpawnParms) (edict_t *ent); + float (*pfnVecToYaw) (const float *rgflVector); + void (*pfnVecToAngles) (const float *rgflVectorIn, float *rgflVectorOut); + void (*pfnMoveToOrigin) (edict_t *ent, const float *pflGoal, float dist, int iMoveType); + void (*pfnChangeYaw) (edict_t* ent); + void (*pfnChangePitch) (edict_t* ent); + edict_t* (*pfnFindEntityByString) (edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue); + int (*pfnGetEntityIllum) (edict_t* pEnt); + edict_t* (*pfnFindEntityInSphere) (edict_t *pEdictStartSearchAfter, const float *org, float rad); + edict_t* (*pfnFindClientInPVS) (edict_t *pEdict); + edict_t* (*pfnEntitiesInPVS) (edict_t *pplayer); + void (*pfnMakeVectors) (const float *rgflVector); + void (*pfnAngleVectors) (const float *rgflVector, float *forward, float *right, float *up); + edict_t* (*pfnCreateEntity) (void); + void (*pfnRemoveEntity) (edict_t* e); + edict_t* (*pfnCreateNamedEntity) (int className); + void (*pfnMakeStatic) (edict_t *ent); + int (*pfnEntIsOnFloor) (edict_t *e); + int (*pfnDropToFloor) (edict_t* e); + int (*pfnWalkMove) (edict_t *ent, float yaw, float dist, int iMode); + void (*pfnSetOrigin) (edict_t *e, const float *rgflOrigin); + void (*pfnEmitSound) (edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch); + void (*pfnEmitAmbientSound) (edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch); + void (*pfnTraceLine) (const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); + void (*pfnTraceToss) (edict_t* pent, edict_t* pentToIgnore, TraceResult *ptr); + int (*pfnTraceMonsterHull) (edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); + void (*pfnTraceHull) (const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr); + void (*pfnTraceModel) (const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr); + const char *(*pfnTraceTexture) (edict_t *pTextureEntity, const float *v1, const float *v2 ); + void (*pfnTraceSphere) (const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr); + void (*pfnGetAimVector) (edict_t* ent, float speed, float *rgflReturn); + void (*pfnServerCommand) (char* str); + void (*pfnServerExecute) (void); + void (*pfnClientCommand) (edict_t* pEdict, char* szFmt, ...); + void (*pfnParticleEffect) (const float *org, const float *dir, float color, float count); + void (*pfnLightStyle) (int style, char* val); + int (*pfnDecalIndex) (const char *name); + int (*pfnPointContents) (const float *rgflVector); + void (*pfnMessageBegin) (int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); + void (*pfnMessageEnd) (void); + void (*pfnWriteByte) (int iValue); + void (*pfnWriteChar) (int iValue); + void (*pfnWriteShort) (int iValue); + void (*pfnWriteLong) (int iValue); + void (*pfnWriteAngle) (float flValue); + void (*pfnWriteCoord) (float flValue); + void (*pfnWriteString) (const char *sz); + void (*pfnWriteEntity) (int iValue); + void (*pfnCVarRegister) (cvar_t *pCvar); + float (*pfnCVarGetFloat) (const char *szVarName); + const char* (*pfnCVarGetString) (const char *szVarName); + void (*pfnCVarSetFloat) (const char *szVarName, float flValue); + void (*pfnCVarSetString) (const char *szVarName, const char *szValue); + void (*pfnAlertMessage) (ALERT_TYPE atype, char *szFmt, ...); + void (*pfnEngineFprintf) (FILE *pfile, char *szFmt, ...); + void* (*pfnPvAllocEntPrivateData) (edict_t *pEdict, long cb); + void* (*pfnPvEntPrivateData) (edict_t *pEdict); + void (*pfnFreeEntPrivateData) (edict_t *pEdict); + const char* (*pfnSzFromIndex) (int iString); + int (*pfnAllocString) (const char *szValue); + struct entvars_s* (*pfnGetVarsOfEnt) (edict_t *pEdict); + edict_t* (*pfnPEntityOfEntOffset) (int iEntOffset); + int (*pfnEntOffsetOfPEntity) (const edict_t *pEdict); + int (*pfnIndexOfEdict) (const edict_t *pEdict); + edict_t* (*pfnPEntityOfEntIndex) (int iEntIndex); + edict_t* (*pfnFindEntityByVars) (struct entvars_s* pvars); + void* (*pfnGetModelPtr) (edict_t* pEdict); + int (*pfnRegUserMsg) (const char *pszName, int iSize); + void (*pfnAnimationAutomove) (const edict_t* pEdict, float flTime); + void (*pfnGetBonePosition) (const edict_t* pEdict, int iBone, float *rgflOrigin, float *rgflAngles ); + unsigned long (*pfnFunctionFromName) ( const char *pName ); + const char *(*pfnNameForFunction) ( unsigned long function ); + void (*pfnClientPrintf) ( edict_t* pEdict, PRINT_TYPE ptype, const char *szMsg ); // JOHN: engine callbacks so game DLL can print messages to individual clients + void (*pfnServerPrint) ( const char *szMsg ); + const char *(*pfnCmd_Args) ( void ); // these 3 added + const char *(*pfnCmd_Argv) ( int argc ); // so game DLL can easily + int (*pfnCmd_Argc) ( void ); // access client 'cmd' strings + void (*pfnGetAttachment) (const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles ); + void (*pfnCRC32_Init) (CRC32_t *pulCRC); + void (*pfnCRC32_ProcessBuffer) (CRC32_t *pulCRC, void *p, int len); + void (*pfnCRC32_ProcessByte) (CRC32_t *pulCRC, unsigned char ch); + CRC32_t (*pfnCRC32_Final) (CRC32_t pulCRC); + long (*pfnRandomLong) (long lLow, long lHigh); + float (*pfnRandomFloat) (float flLow, float flHigh); + void (*pfnSetView) (const edict_t *pClient, const edict_t *pViewent ); + float (*pfnTime) ( void ); + void (*pfnCrosshairAngle) (const edict_t *pClient, float pitch, float yaw); + byte * (*pfnLoadFileForMe) (char *filename, int *pLength); + void (*pfnFreeFile) (void *buffer); + void (*pfnEndSection) (const char *pszSectionName); // trigger_endsection + int (*pfnCompareFileTime) (char *filename1, char *filename2, int *iCompare); + void (*pfnGetGameDir) (char *szGetGameDir); + void (*pfnCvar_RegisterVariable) (cvar_t *variable); + void (*pfnFadeClientVolume) (const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds); + void (*pfnSetClientMaxspeed) (const edict_t *pEdict, float fNewMaxspeed); + edict_t * (*pfnCreateFakeClient) (const char *netname); // returns NULL if fake client can't be created + void (*pfnRunPlayerMove) (edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec ); + int (*pfnNumberOfEntities) (void); + char* (*pfnGetInfoKeyBuffer) (edict_t *e); // passing in NULL gets the serverinfo + char* (*pfnInfoKeyValue) (char *infobuffer, char *key); + void (*pfnSetKeyValue) (char *infobuffer, char *key, char *value); + void (*pfnSetClientKeyValue) (int clientIndex, char *infobuffer, char *key, char *value); + int (*pfnIsMapValid) (char *filename); + void (*pfnStaticDecal) ( const float *origin, int decalIndex, int entityIndex, int modelIndex ); + int (*pfnPrecacheGeneric) (char* s); + int (*pfnGetPlayerUserId) (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 + void (*pfnBuildSoundMsg) (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); + int (*pfnIsDedicatedServer) (void);// is this a dedicated server? + cvar_t *(*pfnCVarGetPointer) (const char *szVarName); + unsigned int (*pfnGetPlayerWONId) (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 + void (*pfnInfo_RemoveKey) ( char *s, const char *key ); + const char *(*pfnGetPhysicsKeyValue) ( const edict_t *pClient, const char *key ); + void (*pfnSetPhysicsKeyValue) ( const edict_t *pClient, const char *key, const char *value ); + const char *(*pfnGetPhysicsInfoString) ( const edict_t *pClient ); + unsigned short (*pfnPrecacheEvent) ( int type, const char*psz ); + void (*pfnPlaybackEvent) ( 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 ); + + unsigned char *(*pfnSetFatPVS) ( float *org ); + unsigned char *(*pfnSetFatPAS) ( float *org ); + + int (*pfnCheckVisibility ) ( const edict_t *entity, unsigned char *pset ); + + void (*pfnDeltaSetField) ( struct delta_s *pFields, const char *fieldname ); + void (*pfnDeltaUnsetField) ( struct delta_s *pFields, const char *fieldname ); + void (*pfnDeltaAddEncoder) ( char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to ) ); + int (*pfnGetCurrentPlayer) ( void ); + int (*pfnCanSkipPlayer) ( const edict_t *player ); + int (*pfnDeltaFindField) ( struct delta_s *pFields, const char *fieldname ); + void (*pfnDeltaSetFieldByIndex) ( struct delta_s *pFields, int fieldNumber ); + void (*pfnDeltaUnsetFieldByIndex)( struct delta_s *pFields, int fieldNumber ); + + void (*pfnSetGroupMask) ( int mask, int op ); + + int (*pfnCreateInstancedBaseline) ( int classname, struct entity_state_s *baseline ); + void (*pfnCvar_DirectSet) ( struct cvar_s *var, 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 + void (*pfnForceUnmodified) ( FORCE_TYPE type, float *mins, float *maxs, const char *filename ); + + void (*pfnGetPlayerStats) ( const edict_t *pClient, int *ping, int *packet_loss ); + + void (*pfnAddServerCommand) ( char *cmd_name, void (*function) (void) ); + + // For voice communications, set which clients hear eachother. + // NOTE: these functions take player entity indices (starting at 1). + qboolean (*pfnVoice_GetClientListening)(int iReceiver, int iSender); + qboolean (*pfnVoice_SetClientListening)(int iReceiver, int iSender, qboolean bListen); +} enginefuncs_t; +// ONLY ADD NEW FUNCTIONS TO THE END OF THIS STRUCT. INTERFACE VERSION IS FROZEN AT 138 + +// Passed to pfnKeyValue +typedef struct KeyValueData_s +{ + char *szClassName; // in: entity classname + char *szKeyName; // in: name of key + char *szValue; // in: value of key + long fHandled; // out: DLL sets to true if key-value pair was understood +} KeyValueData; + + +typedef struct +{ + char mapName[ 32 ]; + char landmarkName[ 32 ]; + edict_t *pentLandmark; + vec3_t vecLandmarkOrigin; +} LEVELLIST; +#define MAX_LEVEL_CONNECTIONS 16 // These are encoded in the lower 16bits of ENTITYTABLE->flags + +typedef struct +{ + int id; // Ordinal ID of this entity (used for entity <--> pointer conversions) + edict_t *pent; // Pointer to the in-game entity + + int location; // Offset from the base data of this entity + int size; // Byte size of this entity's data + int flags; // This could be a short -- bit mask of transitions that this entity is in the PVS of + string_t classname; // entity class name + +} ENTITYTABLE; + +#define FENTTABLE_PLAYER 0x80000000 +#define FENTTABLE_REMOVED 0x40000000 +#define FENTTABLE_MOVEABLE 0x20000000 +#define FENTTABLE_GLOBAL 0x10000000 + +typedef struct saverestore_s SAVERESTOREDATA; + +#ifdef _WIN32 +typedef +#endif +struct saverestore_s +{ + char *pBaseData; // Start of all entity save data + char *pCurrentData; // Current buffer pointer for sequential access + int size; // Current data size + int bufferSize; // Total space for data + int tokenSize; // Size of the linear list of tokens + int tokenCount; // Number of elements in the pTokens table + char **pTokens; // Hash table of entity strings (sparse) + int currentIndex; // Holds a global entity table ID + int tableCount; // Number of elements in the entity table + int connectionCount;// Number of elements in the levelList[] + ENTITYTABLE *pTable; // Array of ENTITYTABLE elements (1 for each entity) + LEVELLIST levelList[ MAX_LEVEL_CONNECTIONS ]; // List of connections from this level + + // smooth transition + int fUseLandmark; + char szLandmarkName[20];// landmark we'll spawn near in next level + vec3_t vecLandmarkOffset;// for landmark transitions + float time; + char szCurrentMapName[32]; // To check global entities + +} +#ifdef _WIN32 +SAVERESTOREDATA +#endif +; + +typedef enum _fieldtypes +{ + FIELD_FLOAT = 0, // Any floating point value + FIELD_STRING, // A string ID (return from ALLOC_STRING) + FIELD_ENTITY, // An entity offset (EOFFSET) + FIELD_CLASSPTR, // CBaseEntity * + FIELD_EHANDLE, // Entity handle + FIELD_EVARS, // EVARS * + FIELD_EDICT, // edict_t *, or edict_t * (same thing) + FIELD_VECTOR, // Any vector + FIELD_POSITION_VECTOR, // A world coordinate (these are fixed up across level transitions automagically) + FIELD_POINTER, // Arbitrary data pointer... to be removed, use an array of FIELD_CHARACTER + FIELD_INTEGER, // Any integer or enum + FIELD_FUNCTION, // A class function pointer (Think, Use, etc) + FIELD_BOOLEAN, // boolean, implemented as an int, I may use this as a hint for compression + FIELD_SHORT, // 2 byte integer + FIELD_CHARACTER, // a byte + FIELD_TIME, // a floating point time (these are fixed up automatically too!) + FIELD_MODELNAME, // Engine string that is a model name (needs precache) + FIELD_SOUNDNAME, // Engine string that is a sound name (needs precache) + + FIELD_TYPECOUNT, // MUST BE LAST +} FIELDTYPE; + +#ifndef offsetof +#define offsetof(s,m) (size_t)&(((s *)0)->m) +#endif + +#define _FIELD(type,name,fieldtype,count,flags) { fieldtype, #name, offsetof(type, name), count, flags } +#define DEFINE_FIELD(type,name,fieldtype) _FIELD(type, name, fieldtype, 1, 0) +#define DEFINE_ARRAY(type,name,fieldtype,count) _FIELD(type, name, fieldtype, count, 0) +#define DEFINE_ENTITY_FIELD(name,fieldtype) _FIELD(entvars_t, name, fieldtype, 1, 0 ) +#define DEFINE_ENTITY_GLOBAL_FIELD(name,fieldtype) _FIELD(entvars_t, name, fieldtype, 1, FTYPEDESC_GLOBAL ) +#define DEFINE_GLOBAL_FIELD(type,name,fieldtype) _FIELD(type, name, fieldtype, 1, FTYPEDESC_GLOBAL ) + + +#define FTYPEDESC_GLOBAL 0x0001 // This field is masked for global entity save/restore + +typedef struct +{ + FIELDTYPE fieldType; + char *fieldName; + int fieldOffset; + short fieldSize; + short flags; +} TYPEDESCRIPTION; + +#define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0])) + +typedef struct +{ + // Initialize/shutdown the game (one-time call after loading of game .dll ) + void (*pfnGameInit) ( void ); + int (*pfnSpawn) ( edict_t *pent ); + void (*pfnThink) ( edict_t *pent ); + void (*pfnUse) ( edict_t *pentUsed, edict_t *pentOther ); + void (*pfnTouch) ( edict_t *pentTouched, edict_t *pentOther ); + void (*pfnBlocked) ( edict_t *pentBlocked, edict_t *pentOther ); + void (*pfnKeyValue) ( edict_t *pentKeyvalue, KeyValueData *pkvd ); + void (*pfnSave) ( edict_t *pent, SAVERESTOREDATA *pSaveData ); + int (*pfnRestore) ( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity ); + void (*pfnSetAbsBox) ( edict_t *pent ); + + void (*pfnSaveWriteFields) ( SAVERESTOREDATA *, const char *, void *, TYPEDESCRIPTION *, int ); + void (*pfnSaveReadFields) ( SAVERESTOREDATA *, const char *, void *, TYPEDESCRIPTION *, int ); + + void (*pfnSaveGlobalState) ( SAVERESTOREDATA * ); + void (*pfnRestoreGlobalState) ( SAVERESTOREDATA * ); + void (*pfnResetGlobalState) ( void ); + + qboolean (*pfnClientConnect) ( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ); + + void (*pfnClientDisconnect) ( edict_t *pEntity ); + void (*pfnClientKill) ( edict_t *pEntity ); + void (*pfnClientPutInServer) ( edict_t *pEntity ); + void (*pfnClientCommand) ( edict_t *pEntity ); + void (*pfnClientUserInfoChanged)( edict_t *pEntity, char *infobuffer ); + + void (*pfnServerActivate) ( edict_t *pEdictList, int edictCount, int clientMax ); + void (*pfnServerDeactivate) ( void ); + + void (*pfnPlayerPreThink) ( edict_t *pEntity ); + void (*pfnPlayerPostThink) ( edict_t *pEntity ); + + void (*pfnStartFrame) ( void ); + void (*pfnParmsNewLevel) ( void ); + void (*pfnParmsChangeLevel) ( void ); + + // Returns string describing current .dll. E.g., TeamFotrress 2, Half-Life + const char *(*pfnGetGameDescription)( void ); + + // Notify dll about a player customization. + void (*pfnPlayerCustomization) ( edict_t *pEntity, customization_t *pCustom ); + + // Spectator funcs + void (*pfnSpectatorConnect) ( edict_t *pEntity ); + void (*pfnSpectatorDisconnect) ( edict_t *pEntity ); + void (*pfnSpectatorThink) ( edict_t *pEntity ); + + // Notify game .dll that engine is going to shut down. Allows mod authors to set a breakpoint. + void (*pfnSys_Error) ( const char *error_string ); + + void (*pfnPM_Move) ( struct playermove_s *ppmove, qboolean server ); + void (*pfnPM_Init) ( struct playermove_s *ppmove ); + char (*pfnPM_FindTextureType)( char *name ); + void (*pfnSetupVisibility)( struct edict_s *pViewEntity, struct edict_s *pClient, unsigned char **pvs, unsigned char **pas ); + void (*pfnUpdateClientData) ( const struct edict_s *ent, int sendweapons, struct clientdata_s *cd ); + int (*pfnAddToFullPack)( struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet ); + void (*pfnCreateBaseline) ( int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs ); + void (*pfnRegisterEncoders) ( void ); + int (*pfnGetWeaponData) ( struct edict_s *player, struct weapon_data_s *info ); + + void (*pfnCmdStart) ( const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed ); + void (*pfnCmdEnd) ( const edict_t *player ); + + // Return 1 if the packet is valid. Set response_buffer_size if you want to send a response packet. Incoming, it holds the max + // size of the response_buffer, so you must zero it out if you choose not to respond. + int (*pfnConnectionlessPacket ) ( const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size ); + + // Enumerates player hulls. Returns 0 if the hull number doesn't exist, 1 otherwise + int (*pfnGetHullBounds) ( int hullnumber, float *mins, float *maxs ); + + // Create baselines for certain "unplaced" items. + void (*pfnCreateInstancedBaselines) ( void ); + + // One of the pfnForceUnmodified files failed the consistency check for the specified player + // Return 0 to allow the client to continue, 1 to force immediate disconnection ( with an optional disconnect message of up to 256 characters ) + int (*pfnInconsistentFile)( const struct edict_s *player, const char *filename, char *disconnect_message ); + + // The game .dll should return 1 if lag compensation should be allowed ( could also just set + // the sv_unlag cvar. + // Most games right now should return 0, until client-side weapon prediction code is written + // and tested for them. + int (*pfnAllowLagCompensation)( void ); +} DLL_FUNCTIONS; + +extern DLL_FUNCTIONS gEntityInterface; + +// Current version. +#define NEW_DLL_FUNCTIONS_VERSION 1 + +typedef struct +{ + // Called right before the object's memory is freed. + // Calls its destructor. + void (*pfnOnFreeEntPrivateData)(edict_t *pEnt); + void (*pfnGameShutdown)(void); + int (*pfnShouldCollide)( edict_t *pentTouched, edict_t *pentOther ); +} NEW_DLL_FUNCTIONS; +typedef int (*NEW_DLL_FUNCTIONS_FN)( NEW_DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ); + +// Pointers will be null if the game DLL doesn't support this API. +extern NEW_DLL_FUNCTIONS gNewDLLFunctions; + +typedef int (*APIFUNCTION)( DLL_FUNCTIONS *pFunctionTable, int interfaceVersion ); +typedef int (*APIFUNCTION2)( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ); + +#endif EIFACE_H diff --git a/MiniBase/ValveSDK/engine/entity_state.h b/MiniBase/ValveSDK/engine/entity_state.h new file mode 100644 index 0000000..d05bcbc --- /dev/null +++ b/MiniBase/ValveSDK/engine/entity_state.h @@ -0,0 +1,193 @@ +/*** +* +* 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. +* +****/ +#if !defined( ENTITY_STATEH ) +#define ENTITY_STATEH +#ifdef _WIN32 +#pragma once +#endif + +// For entityType below +#define ENTITY_NORMAL (1<<0) +#define ENTITY_BEAM (1<<1) + +// Entity state is used for the baseline and for delta compression of a packet of +// entities that is sent to a client. +typedef struct entity_state_s entity_state_t; + +struct entity_state_s +{ +// Fields which are filled in by routines outside of delta compression + int entityType; + // Index into cl_entities array for this entity. + int number; + float msg_time; + + // Message number last time the player/entity state was updated. + int messagenum; + + // Fields which can be transitted and reconstructed over the network stream + vec3_t origin; + vec3_t angles; + + int modelindex; + int sequence; + float frame; + int colormap; + short skin; + short solid; + int effects; + float scale; + + byte eflags; + + // Render information + int rendermode; + int renderamt; + color24 rendercolor; + int renderfx; + + int movetype; + float animtime; + float framerate; + int body; + byte controller[4]; + byte blending[4]; + vec3_t velocity; + + // Send bbox down to client for use during prediction. + vec3_t mins; + vec3_t maxs; + + int aiment; + // If owned by a player, the index of that player ( for projectiles ). + int owner; + + // Friction, for prediction. + float friction; + // Gravity multiplier + float gravity; + +// PLAYER SPECIFIC + int team; + int playerclass; + int health; + qboolean spectator; + int weaponmodel; + int gaitsequence; + // If standing on conveyor, e.g. + vec3_t basevelocity; + // Use the crouched hull, or the regular player hull. + int usehull; + // Latched buttons last time state updated. + int oldbuttons; + // -1 = in air, else pmove entity number + int onground; + int iStepLeft; + // How fast we are falling + float flFallVelocity; + + float fov; + int weaponanim; + + // Parametric movement overrides + vec3_t startpos; + vec3_t endpos; + float impacttime; + float starttime; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; +}; + +#include "pm_info.h" + +typedef struct clientdata_s +{ + vec3_t origin; + vec3_t velocity; + + int viewmodel; + vec3_t punchangle; + int flags; + int waterlevel; + int watertype; + vec3_t view_ofs; + float health; + + int bInDuck; + + int weapons; // remove? + + int flTimeStepSound; + int flDuckTime; + int flSwimTime; + int waterjumptime; + + float maxspeed; + + float fov; + int weaponanim; + + int m_iId; + int ammo_shells; + int ammo_nails; + int ammo_cells; + int ammo_rockets; + float m_flNextAttack; + + int tfstate; + + int pushmsec; + + int deadflag; + + char physinfo[ MAX_PHYSINFO_STRING ]; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; +} clientdata_t; + +#include "weaponinfo.h" + +typedef struct local_state_s +{ + entity_state_t playerstate; + clientdata_t client; + weapon_data_t weapondata[ 32 ]; +} local_state_t; + +#endif // !ENTITY_STATEH \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/entity_types.h b/MiniBase/ValveSDK/engine/entity_types.h new file mode 100644 index 0000000..08741e2 --- /dev/null +++ b/MiniBase/ValveSDK/engine/entity_types.h @@ -0,0 +1,26 @@ +/*** +* +* 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. +* +****/ +// entity_types.h +#if !defined( ENTITY_TYPESH ) +#define ENTITY_TYPESH + +#define ET_NORMAL 0 +#define ET_PLAYER 1 +#define ET_TEMPENTITY 2 +#define ET_BEAM 3 +// BMODEL or SPRITE that was split across BSP nodes +#define ET_FRAGMENTED 4 + +#endif // !ENTITY_TYPESH \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/event_args.h b/MiniBase/ValveSDK/engine/event_args.h new file mode 100644 index 0000000..f1ebda3 --- /dev/null +++ b/MiniBase/ValveSDK/engine/event_args.h @@ -0,0 +1,50 @@ +/*** +* +* 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. +* +****/ +#if !defined( EVENT_ARGSH ) +#define EVENT_ARGSH +#ifdef _WIN32 +#pragma once +#endif + +// Event was invoked with stated origin +#define FEVENT_ORIGIN ( 1<<0 ) + +// Event was invoked with stated angles +#define FEVENT_ANGLES ( 1<<1 ) + +typedef struct event_args_s +{ + int flags; + + // Transmitted + int entindex; + + float origin[3]; + float angles[3]; + float velocity[3]; + + int ducking; + + float fparam1; + float fparam2; + + int iparam1; + int iparam2; + + int bparam1; + int bparam2; +} event_args_t; + +#endif diff --git a/MiniBase/ValveSDK/engine/event_flags.h b/MiniBase/ValveSDK/engine/event_flags.h new file mode 100644 index 0000000..8e489a1 --- /dev/null +++ b/MiniBase/ValveSDK/engine/event_flags.h @@ -0,0 +1,47 @@ +/*** +* +* 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. +* +****/ +#if !defined( EVENT_FLAGSH ) +#define EVENT_FLAGSH +#ifdef _WIN32 +#pragma once +#endif + +// Skip local host for event send. +#define FEV_NOTHOST (1<<0) + +// Send the event reliably. You must specify the origin and angles and use +// PLAYBACK_EVENT_FULL for this to work correctly on the server for anything +// that depends on the event origin/angles. I.e., the origin/angles are not +// taken from the invoking edict for reliable events. +#define FEV_RELIABLE (1<<1) + +// Don't restrict to PAS/PVS, send this event to _everybody_ on the server ( useful for stopping CHAN_STATIC +// sounds started by client event when client is not in PVS anymore ( hwguy in TFC e.g. ). +#define FEV_GLOBAL (1<<2) + +// If this client already has one of these events in its queue, just update the event instead of sending it as a duplicate +// +#define FEV_UPDATE (1<<3) + +// Only send to entity specified as the invoker +#define FEV_HOSTONLY (1<<4) + +// Only send if the event was created on the server. +#define FEV_SERVER (1<<5) + +// Only issue event client side ( from shared code ) +#define FEV_CLIENT (1<<6) + +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/in_buttons.h b/MiniBase/ValveSDK/engine/in_buttons.h new file mode 100644 index 0000000..5aa7b6b --- /dev/null +++ b/MiniBase/ValveSDK/engine/in_buttons.h @@ -0,0 +1,38 @@ +/*** +* +* 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. +* +****/ +#ifndef IN_BUTTONS_H +#define IN_BUTTONS_H +#ifdef _WIN32 +#pragma once +#endif + +#define IN_ATTACK (1 << 0) +#define IN_JUMP (1 << 1) +#define IN_DUCK (1 << 2) +#define IN_FORWARD (1 << 3) +#define IN_BACK (1 << 4) +#define IN_USE (1 << 5) +#define IN_CANCEL (1 << 6) +#define IN_LEFT (1 << 7) +#define IN_RIGHT (1 << 8) +#define IN_MOVELEFT (1 << 9) +#define IN_MOVERIGHT (1 << 10) +#define IN_ATTACK2 (1 << 11) +#define IN_RUN (1 << 12) +#define IN_RELOAD (1 << 13) +#define IN_ALT1 (1 << 14) +#define IN_SCORE (1 << 15) // Used by client.dll for when scoreboard is held down + +#endif // IN_BUTTONS_H \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/keydefs.h b/MiniBase/ValveSDK/engine/keydefs.h new file mode 100644 index 0000000..e32f62a --- /dev/null +++ b/MiniBase/ValveSDK/engine/keydefs.h @@ -0,0 +1,122 @@ +// keydefs.h +#ifndef KEYDEFS_H +#define KEYDEFS_H +#ifdef _WIN32 +#pragma once +#endif + +// +// these are the key numbers that should be passed to Key_Event +// +#define K_TAB 9 +#define K_ENTER 13 +#define K_ESCAPE 27 +#define K_SPACE 32 + +// normal keys should be passed as lowercased ascii + +#define K_BACKSPACE 127 +#define K_UPARROW 128 +#define K_DOWNARROW 129 +#define K_LEFTARROW 130 +#define K_RIGHTARROW 131 + +#define K_ALT 132 +#define K_CTRL 133 +#define K_SHIFT 134 +#define K_F1 135 +#define K_F2 136 +#define K_F3 137 +#define K_F4 138 +#define K_F5 139 +#define K_F6 140 +#define K_F7 141 +#define K_F8 142 +#define K_F9 143 +#define K_F10 144 +#define K_F11 145 +#define K_F12 146 +#define K_INS 147 +#define K_DEL 148 +#define K_PGDN 149 +#define K_PGUP 150 +#define K_HOME 151 +#define K_END 152 + +#define K_KP_HOME 160 +#define K_KP_UPARROW 161 +#define K_KP_PGUP 162 +#define K_KP_LEFTARROW 163 +#define K_KP_5 164 +#define K_KP_RIGHTARROW 165 +#define K_KP_END 166 +#define K_KP_DOWNARROW 167 +#define K_KP_PGDN 168 +#define K_KP_ENTER 169 +#define K_KP_INS 170 +#define K_KP_DEL 171 +#define K_KP_SLASH 172 +#define K_KP_MINUS 173 +#define K_KP_PLUS 174 +#define K_CAPSLOCK 175 + + +// +// joystick buttons +// +#define K_JOY1 203 +#define K_JOY2 204 +#define K_JOY3 205 +#define K_JOY4 206 + +// +// aux keys are for multi-buttoned joysticks to generate so they can use +// the normal binding process +// +#define K_AUX1 207 +#define K_AUX2 208 +#define K_AUX3 209 +#define K_AUX4 210 +#define K_AUX5 211 +#define K_AUX6 212 +#define K_AUX7 213 +#define K_AUX8 214 +#define K_AUX9 215 +#define K_AUX10 216 +#define K_AUX11 217 +#define K_AUX12 218 +#define K_AUX13 219 +#define K_AUX14 220 +#define K_AUX15 221 +#define K_AUX16 222 +#define K_AUX17 223 +#define K_AUX18 224 +#define K_AUX19 225 +#define K_AUX20 226 +#define K_AUX21 227 +#define K_AUX22 228 +#define K_AUX23 229 +#define K_AUX24 230 +#define K_AUX25 231 +#define K_AUX26 232 +#define K_AUX27 233 +#define K_AUX28 234 +#define K_AUX29 235 +#define K_AUX30 236 +#define K_AUX31 237 +#define K_AUX32 238 +#define K_MWHEELDOWN 239 +#define K_MWHEELUP 240 + +#define K_PAUSE 255 + +// +// mouse buttons generate virtual keys +// +#define K_MOUSE1 241 +#define K_MOUSE2 242 +#define K_MOUSE3 243 +#define K_MOUSE4 244 +#define K_MOUSE5 245 + +#endif // KEYDEFS_H diff --git a/MiniBase/ValveSDK/engine/particledef.h b/MiniBase/ValveSDK/engine/particledef.h new file mode 100644 index 0000000..631cf4b --- /dev/null +++ b/MiniBase/ValveSDK/engine/particledef.h @@ -0,0 +1,57 @@ +/*** +* +* 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. +* +****/ +#if !defined( PARTICLEDEFH ) +#define PARTICLEDEFH +#ifdef _WIN32 +#pragma once +#endif + +typedef enum { + pt_static, + pt_grav, + pt_slowgrav, + pt_fire, + pt_explode, + pt_explode2, + pt_blob, + pt_blob2, + pt_vox_slowgrav, + pt_vox_grav, + pt_clientcustom // Must have callback function specified +} ptype_t; + +// !!! if this is changed, it must be changed in d_ifacea.h too !!! +typedef struct particle_s +{ +// driver-usable fields + vec3_t org; + short color; + short packedColor; +// drivers never touch the following fields + struct particle_s *next; + vec3_t vel; + float ramp; + float die; + ptype_t type; + void (*deathfunc)( struct particle_s *particle ); + + // for pt_clientcusttom, we'll call this function each frame + void (*callback)( struct particle_s *particle, float frametime ); + + // For deathfunc, etc. + unsigned char context; +} particle_t; + +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/pm_defs.h b/MiniBase/ValveSDK/engine/pm_defs.h new file mode 100644 index 0000000..b40a466 --- /dev/null +++ b/MiniBase/ValveSDK/engine/pm_defs.h @@ -0,0 +1,218 @@ +/*** +* +* 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. +* +****/ +// pm_defs.h +#if !defined( PM_DEFSH ) +#define PM_DEFSH +#pragma once + +#define MAX_PHYSENTS 600 // Must have room for all entities in the world. +#define MAX_MOVEENTS 64 +#define MAX_CLIP_PLANES 5 + +#define PM_NORMAL 0x00000000 +#define PM_STUDIO_IGNORE 0x00000001 // Skip studio models +#define PM_STUDIO_BOX 0x00000002 // Use boxes for non-complex studio models (even in traceline) +#define PM_GLASS_IGNORE 0x00000004 // Ignore entities with non-normal rendermode +#define PM_WORLD_ONLY 0x00000008 // Only trace against the world + +// Values for flags parameter of PM_TraceLine +#define PM_TRACELINE_ANYVISIBLE 0 +#define PM_TRACELINE_PHYSENTSONLY 1 + +#include "pm_info.h" + +// PM_PlayerTrace results. +//#include "engine/pmtrace.h" + +#if !defined ( USERCMD_H ) +#include "usercmd.h" +#endif + +// physent_t +typedef struct physent_s +{ + char name[32]; // Name of model, or "player" or "world". + int player; + vec3_t origin; // Model's origin in world coordinates. + struct model_s *model; // only for bsp models + struct model_s *studiomodel; // SOLID_BBOX, but studio clip intersections. + vec3_t mins, maxs; // only for non-bsp models + int info; // For client or server to use to identify (index into edicts or cl_entities) + vec3_t angles; // rotated entities need this info for hull testing to work. + + int solid; // Triggers and func_door type WATER brushes are SOLID_NOT + int skin; // BSP Contents for such things like fun_door water brushes. + int rendermode; // So we can ignore glass + + // Complex collision detection. + float frame; + int sequence; + byte controller[4]; + byte blending[2]; + + int movetype; + int takedamage; + int blooddecal; + int team; + int classnumber; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; +} physent_t; + +typedef struct playermove_s playermove_t; + +struct playermove_s +{ + int player_index; // So we don't try to run the PM_CheckStuck nudging too quickly. + qboolean server; // For debugging, are we running physics code on server side? + + qboolean multiplayer; // 1 == multiplayer server + float time; // realtime on host, for reckoning duck timing + float frametime; // Duration of this frame + + vec3_t forward, right, up; // Vectors for angles + // player state + vec3_t origin; // Movement origin. + vec3_t angles; // Movement view angles. + vec3_t oldangles; // Angles before movement view angles were looked at. + vec3_t velocity; // Current movement direction. + vec3_t movedir; // For waterjumping, a forced forward velocity so we can fly over lip of ledge. + vec3_t basevelocity; // Velocity of the conveyor we are standing, e.g. + + // For ducking/dead + vec3_t view_ofs; // Our eye position. + float flDuckTime; // Time we started duck + qboolean bInDuck; // In process of ducking or ducked already? + + // For walking/falling + int flTimeStepSound; // Next time we can play a step sound + int iStepLeft; + + float flFallVelocity; + vec3_t punchangle; + + float flSwimTime; + + float flNextPrimaryAttack; + + int effects; // MUZZLE FLASH, e.g. + + int flags; // FL_ONGROUND, FL_DUCKING, etc. + int usehull; // 0 = regular player hull, 1 = ducked player hull, 2 = point hull + float gravity; // Our current gravity and friction. + float friction; + int oldbuttons; // Buttons last usercmd + float waterjumptime; // Amount of time left in jumping out of water cycle. + qboolean dead; // Are we a dead player? + int deadflag; + int spectator; // Should we use spectator physics model? + int movetype; // Our movement type, NOCLIP, WALK, FLY + + int onground; + int waterlevel; + int watertype; + int oldwaterlevel; + + char sztexturename[256]; + char chtexturetype; + + float maxspeed; + float clientmaxspeed; // Player specific maxspeed + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; + // world state + // Number of entities to clip against. + int numphysent; + physent_t physents[MAX_PHYSENTS]; + // Number of momvement entities (ladders) + int nummoveent; + // just a list of ladders + physent_t moveents[MAX_MOVEENTS]; + + // All things being rendered, for tracing against things you don't actually collide with + int numvisent; + physent_t visents[ MAX_PHYSENTS ]; + + // input to run through physics. + usercmd_t cmd; + + // Trace results for objects we collided with. + int numtouch; + pmtrace_t touchindex[MAX_PHYSENTS]; + + char physinfo[ MAX_PHYSINFO_STRING ]; // Physics info string + + struct movevars_s *movevars; + vec3_t player_mins[ 4 ]; + vec3_t player_maxs[ 4 ]; + + // Common functions + const char *(*PM_Info_ValueForKey) ( const char *s, const char *key ); + void (*PM_Particle)( vec3_t origin, int color, float life, int zpos, int zvel); + int (*PM_TestPlayerPosition) (vec3_t pos, pmtrace_t *ptrace ); + void (*Con_NPrintf)( int idx, char *fmt, ... ); + void (*Con_DPrintf)( char *fmt, ... ); + void (*Con_Printf)( char *fmt, ... ); + double (*Sys_FloatTime)( void ); + void (*PM_StuckTouch)( int hitent, pmtrace_t *ptraceresult ); + int (*PM_PointContents) (vec3_t p, int *truecontents /*filled in if this is non-null*/ ); + int (*PM_TruePointContents) (vec3_t p); + int (*PM_HullPointContents) ( struct hull_s *hull, int num, vec3_t p); + pmtrace_t (*PM_PlayerTrace) (vec3_t start, vec3_t end, int traceFlags, int ignore_pe ); + struct pmtrace_s *(*PM_TraceLine)( float *start, float *end, int flags, int usehull, int ignore_pe ); + long (*RandomLong)( long lLow, long lHigh ); + float (*RandomFloat)( float flLow, float flHigh ); + int (*PM_GetModelType)( struct model_s *mod ); + void (*PM_GetModelBounds)( struct model_s *mod, vec3_t mins, vec3_t maxs ); + void *(*PM_HullForBsp)( physent_t *pe, vec3_t offset ); + float (*PM_TraceModel)( physent_t *pEnt, vec3_t start, vec3_t end, trace_t *trace ); + int (*COM_FileSize)(char *filename); + byte *(*COM_LoadFile) (char *path, int usehunk, int *pLength); + void (*COM_FreeFile) ( void *buffer ); + char *(*memfgets)( byte *pMemFile, int fileSize, int *pFilePos, char *pBuffer, int bufferSize ); + + // Functions + // Run functions for this frame? + qboolean runfuncs; + void (*PM_PlaySound) ( int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch ); + const char *(*PM_TraceTexture) ( int ground, vec3_t vstart, vec3_t vend ); + void (*PM_PlaybackEventFull) ( int flags, int clientindex, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); +}; + +#endif diff --git a/MiniBase/ValveSDK/engine/pm_info.h b/MiniBase/ValveSDK/engine/pm_info.h new file mode 100644 index 0000000..bc72195 --- /dev/null +++ b/MiniBase/ValveSDK/engine/pm_info.h @@ -0,0 +1,22 @@ +/*** +* +* 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. +* +****/ +// Physics info string definition +#if !defined( PM_INFOH ) +#define PM_INFOH +#pragma once + +#define MAX_PHYSINFO_STRING 256 + +#endif // PM_INFOH \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/pmtrace.h b/MiniBase/ValveSDK/engine/pmtrace.h new file mode 100644 index 0000000..93e336f --- /dev/null +++ b/MiniBase/ValveSDK/engine/pmtrace.h @@ -0,0 +1,43 @@ +/*** +* +* 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. +* +****/ +#if !defined( PMTRACEH ) +#define PMTRACEH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct +{ + vec3_t normal; + float dist; +} pmplane_t; + +typedef struct pmtrace_s pmtrace_t; + +struct pmtrace_s +{ + qboolean allsolid; // if true, plane is not valid + qboolean startsolid; // if true, the initial point was in a solid area + qboolean inopen, inwater; // End point is in empty space or in water + float fraction; // time completed, 1.0 = didn't hit anything + vec3_t endpos; // final position + pmplane_t plane; // surface normal at impact + int ent; // entity at impact + vec3_t deltavelocity; // Change in player's velocity caused by impact. + // Only run on server. + int hitgroup; +}; + +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/progdefs.h b/MiniBase/ValveSDK/engine/progdefs.h new file mode 100644 index 0000000..9e4a397 --- /dev/null +++ b/MiniBase/ValveSDK/engine/progdefs.h @@ -0,0 +1,224 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +#ifndef PROGDEFS_H +#define PROGDEFS_H +#ifdef _WIN32 +#pragma once +#endif + +typedef struct +{ + float time; + float frametime; + float force_retouch; + string_t mapname; + string_t startspot; + float deathmatch; + float coop; + float teamplay; + float serverflags; + float found_secrets; + vec3_t v_forward; + vec3_t v_up; + vec3_t v_right; + float trace_allsolid; + float trace_startsolid; + float trace_fraction; + vec3_t trace_endpos; + vec3_t trace_plane_normal; + float trace_plane_dist; + edict_t *trace_ent; + float trace_inopen; + float trace_inwater; + int trace_hitgroup; + int trace_flags; + int msg_entity; + int cdAudioTrack; + int maxClients; + int maxEntities; + const char *pStringBase; + + void *pSaveData; + vec3_t vecLandmarkOffset; +} globalvars_t; + + +typedef struct entvars_s +{ + string_t classname; + string_t globalname; + + vec3_t origin; + vec3_t oldorigin; + vec3_t velocity; + vec3_t basevelocity; + vec3_t clbasevelocity; // Base velocity that was passed in to server physics so + // client can predict conveyors correctly. Server zeroes it, so we need to store here, too. + vec3_t movedir; + + vec3_t angles; // Model angles + vec3_t avelocity; // angle velocity (degrees per second) + vec3_t punchangle; // auto-decaying view angle adjustment + vec3_t v_angle; // Viewing angle (player only) + + // For parametric entities + vec3_t endpos; + vec3_t startpos; + float impacttime; + float starttime; + + int fixangle; // 0:nothing, 1:force view angles, 2:add avelocity + float idealpitch; + float pitch_speed; + float ideal_yaw; + float yaw_speed; + + int modelindex; + string_t model; + + int viewmodel; // player's viewmodel + int weaponmodel; // what other players see + + vec3_t absmin; // BB max translated to world coord + vec3_t absmax; // BB max translated to world coord + vec3_t mins; // local BB min + vec3_t maxs; // local BB max + vec3_t size; // maxs - mins + + float ltime; + float nextthink; + + int movetype; + int solid; + + int skin; + int body; // sub-model selection for studiomodels + int effects; + + float gravity; // % of "normal" gravity + float friction; // inverse elasticity of MOVETYPE_BOUNCE + + int light_level; + + int sequence; // animation sequence + int gaitsequence; // movement animation sequence for player (0 for none) + float frame; // % playback position in animation sequences (0..255) + float animtime; // world time when frame was set + float framerate; // animation playback rate (-8x to 8x) + byte controller[4]; // bone controller setting (0..255) + byte blending[2]; // blending amount between sub-sequences (0..255) + + float scale; // sprite rendering scale (0..255) + + int rendermode; + float renderamt; + vec3_t rendercolor; + int renderfx; + + float health; + float frags; + int weapons; // bit mask for available weapons + float takedamage; + + int deadflag; + vec3_t view_ofs; // eye position + + int button; + int impulse; + + edict_t *chain; // Entity pointer when linked into a linked list + edict_t *dmg_inflictor; + edict_t *enemy; + edict_t *aiment; // entity pointer when MOVETYPE_FOLLOW + edict_t *owner; + edict_t *groundentity; + + int spawnflags; + int flags; + + int colormap; // lowbyte topcolor, highbyte bottomcolor + int team; + + float max_health; + float teleport_time; + float armortype; + float armorvalue; + int waterlevel; + int watertype; + + string_t target; + string_t targetname; + string_t netname; + string_t message; + + float dmg_take; + float dmg_save; + float dmg; + float dmgtime; + + string_t noise; + string_t noise1; + string_t noise2; + string_t noise3; + + float speed; + float air_finished; + float pain_finished; + float radsuit_finished; + + edict_t *pContainingEntity; + + int playerclass; + float maxspeed; + + float fov; + int weaponanim; + + int pushmsec; + + int bInDuck; + int flTimeStepSound; + int flSwimTime; + int flDuckTime; + int iStepLeft; + float flFallVelocity; + + int gamestate; + + int oldbuttons; + + int groupinfo; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; + edict_t *euser1; + edict_t *euser2; + edict_t *euser3; + edict_t *euser4; +} entvars_t; + + +#endif // PROGDEFS_H \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/progs.h b/MiniBase/ValveSDK/engine/progs.h new file mode 100644 index 0000000..e166183 --- /dev/null +++ b/MiniBase/ValveSDK/engine/progs.h @@ -0,0 +1,82 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +#ifndef PROGS_H +#define PROGS_H + +#include "progdefs.h" + +// 16 simultaneous events, max +#define MAX_EVENT_QUEUE 64 + +#define DEFAULT_EVENT_RESENDS 1 + +#include "event_flags.h" + +typedef struct event_info_s event_info_t; + +#include "event_args.h" + +struct event_info_s +{ + unsigned short index; // 0 implies not in use + + short packet_index; // Use data from state info for entity in delta_packet . -1 implies separate info based on event + // parameter signature + short entity_index; // The edict this event is associated with + + float fire_time; // if non-zero, the time when the event should be fired ( fixed up on the client ) + + event_args_t args; + +// CLIENT ONLY + int flags; // Reliable or not, etc. + +}; + +typedef struct event_state_s event_state_t; + +struct event_state_s +{ + struct event_info_s ei[ MAX_EVENT_QUEUE ]; +}; + +#if !defined( ENTITY_STATEH ) +#include "entity_state.h" +#endif + +#if !defined( EDICT_H ) +#include "edict.h" +#endif + +#define STRUCT_FROM_LINK(l,t,m) ((t *)((byte *)l - (int)&(((t *)0)->m))) +#define EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,edict_t,area) + +//============================================================================ + +extern char *pr_strings; +extern globalvars_t gGlobalVariables; + +//============================================================================ + +edict_t *ED_Alloc (void); +void ED_Free (edict_t *ed); +void ED_LoadFromFile (char *data); + +edict_t *EDICT_NUM(int n); +int NUM_FOR_EDICT(const edict_t *e); + +#define PROG_TO_EDICT(e) ((edict_t *)((byte *)sv.edicts + e)) + +#endif // PROGS_H \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/r_efx.h b/MiniBase/ValveSDK/engine/r_efx.h new file mode 100644 index 0000000..0d90061 --- /dev/null +++ b/MiniBase/ValveSDK/engine/r_efx.h @@ -0,0 +1,194 @@ +/*** +* +* 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. +* +****/ +#if !defined ( R_EFXH ) +#define R_EFXH +#pragma once + +// particle_t +#if !defined( PARTICLEDEFH ) +#include "particledef.h" +#endif + +// BEAM +#if !defined( BEAMDEFH ) +#include "beamdef.h" +#endif + +// dlight_t +#if !defined ( DLIGHTH ) +#include "dlight.h" +#endif + +// cl_entity_t +#if !defined( CL_ENTITYH ) +#include "cl_entity.h" +#endif + +/* +// FOR REFERENCE, These are the built-in tracer colors. Note, color 4 is the one +// that uses the tracerred/tracergreen/tracerblue and traceralpha cvar settings +color24 gTracerColors[] = +{ + { 255, 255, 255 }, // White + { 255, 0, 0 }, // Red + { 0, 255, 0 }, // Green + { 0, 0, 255 }, // Blue + { 0, 0, 0 }, // Tracer default, filled in from cvars, etc. + { 255, 167, 17 }, // Yellow-orange sparks + { 255, 130, 90 }, // Yellowish streaks (garg) + { 55, 60, 144 }, // Blue egon streak + { 255, 130, 90 }, // More Yellowish streaks (garg) + { 255, 140, 90 }, // More Yellowish streaks (garg) + { 200, 130, 90 }, // More red streaks (garg) + { 255, 120, 70 }, // Darker red streaks (garg) +}; +*/ + +// Temporary entity array +#define TENTPRIORITY_LOW 0 +#define TENTPRIORITY_HIGH 1 + +// TEMPENTITY flags +#define FTENT_NONE 0x00000000 +#define FTENT_SINEWAVE 0x00000001 +#define FTENT_GRAVITY 0x00000002 +#define FTENT_ROTATE 0x00000004 +#define FTENT_SLOWGRAVITY 0x00000008 +#define FTENT_SMOKETRAIL 0x00000010 +#define FTENT_COLLIDEWORLD 0x00000020 +#define FTENT_FLICKER 0x00000040 +#define FTENT_FADEOUT 0x00000080 +#define FTENT_SPRANIMATE 0x00000100 +#define FTENT_HITSOUND 0x00000200 +#define FTENT_SPIRAL 0x00000400 +#define FTENT_SPRCYCLE 0x00000800 +#define FTENT_COLLIDEALL 0x00001000 // will collide with world and slideboxes +#define FTENT_PERSIST 0x00002000 // tent is not removed when unable to draw +#define FTENT_COLLIDEKILL 0x00004000 // tent is removed upon collision with anything +#define FTENT_PLYRATTACHMENT 0x00008000 // tent is attached to a player (owner) +#define FTENT_SPRANIMATELOOP 0x00010000 // animating sprite doesn't die when last frame is displayed +#define FTENT_SPARKSHOWER 0x00020000 +#define FTENT_NOMODEL 0x00040000 // Doesn't have a model, never try to draw ( it just triggers other things ) +#define FTENT_CLIENTCUSTOM 0x00080000 // Must specify callback. Callback function is responsible for killing tempent and updating fields ( unless other flags specify how to do things ) + +typedef struct tempent_s TEMPENTITY; +typedef struct tempent_s +{ + int flags; + float die; + float frameMax; + float x; + float y; + float z; + float fadeSpeed; + float bounceFactor; + int hitSound; + void ( *hitcallback ) ( struct tempent_s *ent, struct pmtrace_s *ptr ); + void ( *callback ) ( struct tempent_s *ent, float frametime, float currenttime ); + TEMPENTITY *next; + int priority; + short clientIndex; // if attached, this is the index of the client to stick to + // if COLLIDEALL, this is the index of the client to ignore + // TENTS with FTENT_PLYRATTACHMENT MUST set the clientindex! + + vec3_t tentOffset; // if attached, client origin + tentOffset = tent origin. + cl_entity_t entity; + + // baseline.origin - velocity + // baseline.renderamt - starting fadeout intensity + // baseline.angles - angle velocity +} TEMPENTITY; + +typedef struct efx_api_s efx_api_t; + +struct efx_api_s +{ + particle_t *( *R_AllocParticle ) ( void ( *callback ) ( struct particle_s *particle, float frametime ) ); + void ( *R_BlobExplosion ) ( float * org ); + void ( *R_Blood ) ( float * org, float * dir, int pcolor, int speed ); + void ( *R_BloodSprite ) ( float * org, int colorindex, int modelIndex, int modelIndex2, float size ); + void ( *R_BloodStream ) ( float * org, float * dir, int pcolor, int speed ); + void ( *R_BreakModel ) ( float *pos, float *size, float *dir, float random, float life, int count, int modelIndex, char flags ); + void ( *R_Bubbles ) ( float * mins, float * maxs, float height, int modelIndex, int count, float speed ); + void ( *R_BubbleTrail ) ( float * start, float * end, float height, int modelIndex, int count, float speed ); + void ( *R_BulletImpactParticles ) ( float * pos ); + void ( *R_EntityParticles ) ( struct cl_entity_s *ent ); + void ( *R_Explosion ) ( float *pos, int model, float scale, float framerate, int flags ); + void ( *R_FizzEffect ) ( struct cl_entity_s *pent, int modelIndex, int density ); + void ( *R_FireField ) ( float * org, int radius, int modelIndex, int count, int flags, float life ); + void ( *R_FlickerParticles ) ( float * org ); + void ( *R_FunnelSprite ) ( float *org, int modelIndex, int reverse ); + void ( *R_Implosion ) ( float * end, float radius, int count, float life ); + void ( *R_LargeFunnel ) ( float * org, int reverse ); + void ( *R_LavaSplash ) ( float * org ); + void ( *R_MultiGunshot ) ( float * org, float * dir, float * noise, int count, int decalCount, int *decalIndices ); + void ( *R_MuzzleFlash ) ( float *pos1, int type ); + void ( *R_ParticleBox ) ( float *mins, float *maxs, unsigned char r, unsigned char g, unsigned char b, float life ); + void ( *R_ParticleBurst ) ( float * pos, int size, int color, float life ); + void ( *R_ParticleExplosion ) ( float * org ); + void ( *R_ParticleExplosion2 ) ( float * org, int colorStart, int colorLength ); + void ( *R_ParticleLine ) ( float * start, float *end, unsigned char r, unsigned char g, unsigned char b, float life ); + void ( *R_PlayerSprites ) ( int client, int modelIndex, int count, int size ); + void ( *R_Projectile ) ( float * origin, float * velocity, int modelIndex, int life, int owner, void (*hitcallback)( struct tempent_s *ent, struct pmtrace_s *ptr ) ); + void ( *R_RicochetSound ) ( float * pos ); + void ( *R_RicochetSprite ) ( float *pos, struct model_s *pmodel, float duration, float scale ); + void ( *R_RocketFlare ) ( float *pos ); + void ( *R_RocketTrail ) ( float * start, float * end, int type ); + void ( *R_RunParticleEffect ) ( float * org, float * dir, int color, int count ); + void ( *R_ShowLine ) ( float * start, float * end ); + void ( *R_SparkEffect ) ( float *pos, int count, int velocityMin, int velocityMax ); + void ( *R_SparkShower ) ( float *pos ); + void ( *R_SparkStreaks ) ( float * pos, int count, int velocityMin, int velocityMax ); + void ( *R_Spray ) ( float * pos, float * dir, int modelIndex, int count, int speed, int spread, int rendermode ); + void ( *R_Sprite_Explode ) ( TEMPENTITY *pTemp, float scale, int flags ); + void ( *R_Sprite_Smoke ) ( TEMPENTITY *pTemp, float scale ); + void ( *R_Sprite_Spray ) ( float * pos, float * dir, int modelIndex, int count, int speed, int iRand ); + void ( *R_Sprite_Trail ) ( int type, float * start, float * end, int modelIndex, int count, float life, float size, float amplitude, int renderamt, float speed ); + void ( *R_Sprite_WallPuff ) ( TEMPENTITY *pTemp, float scale ); + void ( *R_StreakSplash ) ( float * pos, float * dir, int color, int count, float speed, int velocityMin, int velocityMax ); + void ( *R_TracerEffect ) ( float * start, float * end ); + void ( *R_UserTracerParticle ) ( float * org, float * vel, float life, int colorIndex, float length, unsigned char deathcontext, void ( *deathfunc)( struct particle_s *particle ) ); + particle_t *( *R_TracerParticles ) ( float * org, float * vel, float life ); + void ( *R_TeleportSplash ) ( float * org ); + void ( *R_TempSphereModel ) ( float *pos, float speed, float life, int count, int modelIndex ); + TEMPENTITY *( *R_TempModel ) ( float *pos, float *dir, float *angles, float life, int modelIndex, int soundtype ); + TEMPENTITY *( *R_DefaultSprite ) ( float *pos, int spriteIndex, float framerate ); + TEMPENTITY *( *R_TempSprite ) ( float *pos, float *dir, float scale, int modelIndex, int rendermode, int renderfx, float a, float life, int flags ); + int ( *Draw_DecalIndex ) ( int id ); + int ( *Draw_DecalIndexFromName ) ( char *name ); + void ( *R_DecalShoot ) ( int textureIndex, int entity, int modelIndex, float * position, int flags ); + void ( *R_AttachTentToPlayer ) ( int client, int modelIndex, float zoffset, float life ); + void ( *R_KillAttachedTents ) ( int client ); + BEAM *( *R_BeamCirclePoints ) ( int type, float * start, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamEntPoint ) ( int startEnt, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamEnts ) ( int startEnt, int endEnt, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamFollow ) ( int startEnt, int modelIndex, float life, float width, float r, float g, float b, float brightness ); + void ( *R_BeamKill ) ( int deadEntity ); + BEAM *( *R_BeamLightning ) ( float * start, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed ); + BEAM *( *R_BeamPoints ) ( float * start, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamRing ) ( int startEnt, int endEnt, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + dlight_t *( *CL_AllocDlight ) ( int key ); + dlight_t *( *CL_AllocElight ) ( int key ); + TEMPENTITY *( *CL_TempEntAlloc ) ( float * org, struct model_s *model ); + TEMPENTITY *( *CL_TempEntAllocNoModel ) ( float * org ); + TEMPENTITY *( *CL_TempEntAllocHigh ) ( float * org, struct model_s *model ); + TEMPENTITY *( *CL_TentEntAllocCustom ) ( float *origin, struct model_s *model, int high, void ( *callback ) ( struct tempent_s *ent, float frametime, float currenttime ) ); + void ( *R_GetPackedColor ) ( short *packed, short color ); + short ( *R_LookupColor ) ( unsigned char r, unsigned char g, unsigned char b ); +}; + +extern efx_api_t efx; + +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/r_studioint.h b/MiniBase/ValveSDK/engine/r_studioint.h new file mode 100644 index 0000000..1ff470c --- /dev/null +++ b/MiniBase/ValveSDK/engine/r_studioint.h @@ -0,0 +1,108 @@ +#if !defined( R_STUDIOINT_H ) +#define R_STUDIOINT_H +#if defined( _WIN32 ) +#pragma once +#endif + +#define STUDIO_INTERFACE_VERSION 1 + +typedef struct engine_studio_api_s +{ + // Allocate number*size bytes and zero it + void *( *Mem_Calloc ) ( int number, size_t size ); + // Check to see if pointer is in the cache + void *( *Cache_Check ) ( struct cache_user_s *c ); + // Load file into cache ( can be swapped out on demand ) + void ( *LoadCacheFile ) ( char *path, struct cache_user_s *cu ); + // Retrieve model pointer for the named model + struct model_s *( *Mod_ForName ) ( const char *name, int crash_if_missing ); + // Retrieve pointer to studio model data block from a model + void *( *Mod_Extradata ) ( struct model_s *mod ); + // Retrieve indexed model from client side model precache list + struct model_s *( *GetModelByIndex ) ( int index ); + // Get entity that is set for rendering + struct cl_entity_s * ( *GetCurrentEntity ) ( void ); + // Get referenced player_info_t + struct player_info_s *( *PlayerInfo ) ( int index ); + // Get most recently received player state data from network system + struct entity_state_s *( *GetPlayerState ) ( int index ); + // Get viewentity + struct cl_entity_s * ( *GetViewEntity ) ( void ); + // Get current frame count, and last two timestampes on client + void ( *GetTimes ) ( int *framecount, double *current, double *old ); + // Get a pointer to a cvar by name + struct cvar_s *( *GetCvar ) ( const char *name ); + // Get current render origin and view vectors ( up, right and vpn ) + void ( *GetViewInfo ) ( float *origin, float *upv, float *rightv, float *vpnv ); + // Get sprite model used for applying chrome effect + struct model_s *( *GetChromeSprite ) ( void ); + // Get model counters so we can incement instrumentation + void ( *GetModelCounters ) ( int **s, int **a ); + // Get software scaling coefficients + void ( *GetAliasScale ) ( float *x, float *y ); + + // Get bone, light, alias, and rotation matrices + float ****( *StudioGetBoneTransform ) ( void ); + float ****( *StudioGetLightTransform )( void ); + float ***( *StudioGetAliasTransform ) ( void ); + float ***( *StudioGetRotationMatrix ) ( void ); + + // Set up body part, and get submodel pointers + void ( *StudioSetupModel ) ( int bodypart, void **ppbodypart, void **ppsubmodel ); + // Check if entity's bbox is in the view frustum + int ( *StudioCheckBBox ) ( void ); + // Apply lighting effects to model + void ( *StudioDynamicLight ) ( struct cl_entity_s *ent, struct alight_s *plight ); + void ( *StudioEntityLight ) ( struct alight_s *plight ); + void ( *StudioSetupLighting ) ( struct alight_s *plighting ); + + // Draw mesh vertices + void ( *StudioDrawPoints ) ( void ); + + // Draw hulls around bones + void ( *StudioDrawHulls ) ( void ); + // Draw bbox around studio models + void ( *StudioDrawAbsBBox ) ( void ); + // Draws bones + void ( *StudioDrawBones ) ( void ); + // Loads in appropriate texture for model + void ( *StudioSetupSkin ) ( void *ptexturehdr, int index ); + // Sets up for remapped colors + void ( *StudioSetRemapColors ) ( int top, int bottom ); + // Set's player model and returns model pointer + struct model_s *( *SetupPlayerModel ) ( int index ); + // Fires any events embedded in animation + void ( *StudioClientEvents ) ( void ); + // Retrieve/set forced render effects flags + int ( *GetForceFaceFlags ) ( void ); + void ( *SetForceFaceFlags ) ( int flags ); + // Tell engine the value of the studio model header + void ( *StudioSetHeader ) ( void *header ); + // Tell engine which model_t * is being renderered + void ( *SetRenderModel ) ( struct model_s *model ); + + // Final state setup and restore for rendering + void ( *SetupRenderer ) ( int rendermode ); + void ( *RestoreRenderer ) ( void ); + + // Set render origin for applying chrome effect + void ( *SetChromeOrigin ) ( void ); + + // True if using D3D/OpenGL + int ( *IsHardware ) ( void ); + + // Only called by hardware interface + void ( *GL_StudioDrawShadow ) ( void ); + void ( *GL_SetRenderMode ) ( int mode ); +} engine_studio_api_t; + +typedef struct r_studio_interface_s +{ + int version; + int ( *StudioDrawModel ) ( int flags ); + int ( *StudioDrawPlayer ) ( int flags, struct entity_state_s *pplayer ); +} r_studio_interface_t; + +extern r_studio_interface_t *pStudioAPI; + +#endif // R_STUDIOINT_H \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/shake.h b/MiniBase/ValveSDK/engine/shake.h new file mode 100644 index 0000000..a451ef2 --- /dev/null +++ b/MiniBase/ValveSDK/engine/shake.h @@ -0,0 +1,55 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +#ifndef SHAKE_H +#define SHAKE_H + +// Screen / View effects + +// screen shake +extern int gmsgShake; + +// This structure is sent over the net to describe a screen shake event +typedef struct +{ + unsigned short amplitude; // FIXED 4.12 amount of shake + unsigned short duration; // FIXED 4.12 seconds duration + unsigned short frequency; // FIXED 8.8 noise frequency (low frequency is a jerk,high frequency is a rumble) +} ScreenShake; + +extern void V_ApplyShake( float *origin, float *angles, float factor ); +extern void V_CalcShake( void ); +extern int V_ScreenShake( const char *pszName, int iSize, void *pbuf ); +extern int V_ScreenFade( const char *pszName, int iSize, void *pbuf ); + + +// Fade in/out +extern int gmsgFade; + +#define FFADE_IN 0x0000 // Just here so we don't pass 0 into the function +#define FFADE_OUT 0x0001 // Fade out (not in) +#define FFADE_MODULATE 0x0002 // Modulate (don't blend) +#define FFADE_STAYOUT 0x0004 // ignores the duration, stays faded out until new ScreenFade message received + +// This structure is sent over the net to describe a screen fade event +typedef struct +{ + unsigned short duration; // FIXED 4.12 seconds duration + unsigned short holdTime; // FIXED 4.12 seconds duration until reset (fade & hold) + short fadeFlags; // flags + byte r, g, b, a; // fade to color ( max alpha ) +} ScreenFade; + +#endif // SHAKE_H + diff --git a/MiniBase/ValveSDK/engine/studio.h b/MiniBase/ValveSDK/engine/studio.h new file mode 100644 index 0000000..b0b9960 --- /dev/null +++ b/MiniBase/ValveSDK/engine/studio.h @@ -0,0 +1,362 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ + + + + +#ifndef _STUDIO_H_ +#define _STUDIO_H_ + +/* +============================================================================== + +STUDIO MODELS + +Studio models are position independent, so the cache manager can move them. +============================================================================== +*/ + + +#define MAXSTUDIOTRIANGLES 20000 // TODO: tune this +#define MAXSTUDIOVERTS 2048 // TODO: tune this +#define MAXSTUDIOSEQUENCES 256 // total animation sequences +#define MAXSTUDIOSKINS 100 // total textures +#define MAXSTUDIOSRCBONES 512 // bones allowed at source movement +#define MAXSTUDIOBONES 128 // total bones actually used +#define MAXSTUDIOMODELS 32 // sub-models per model +#define MAXSTUDIOBODYPARTS 32 +#define MAXSTUDIOGROUPS 16 +#define MAXSTUDIOANIMATIONS 512 // per sequence +#define MAXSTUDIOMESHES 256 +#define MAXSTUDIOEVENTS 1024 +#define MAXSTUDIOPIVOTS 256 +#define MAXSTUDIOCONTROLLERS 8 + +typedef struct +{ + int id; + int version; + + char name[64]; + int length; + + vec3_t eyeposition; // ideal eye position + vec3_t min; // ideal movement hull size + vec3_t max; + + vec3_t bbmin; // clipping bounding box + vec3_t bbmax; + + int flags; + + int numbones; // bones + int boneindex; + + int numbonecontrollers; // bone controllers + int bonecontrollerindex; + + int numhitboxes; // complex bounding boxes + int hitboxindex; + + int numseq; // animation sequences + int seqindex; + + int numseqgroups; // demand loaded sequences + int seqgroupindex; + + int numtextures; // raw textures + int textureindex; + int texturedataindex; + + int numskinref; // replaceable textures + int numskinfamilies; + int skinindex; + + int numbodyparts; + int bodypartindex; + + int numattachments; // queryable attachable points + int attachmentindex; + + int soundtable; + int soundindex; + int soundgroups; + int soundgroupindex; + + int numtransitions; // animation node to animation node transition graph + int transitionindex; +} studiohdr_t; + +// header for demand loaded sequence group data +typedef struct +{ + int id; + int version; + + char name[64]; + int length; +} studioseqhdr_t; + +// bones +typedef struct +{ + char name[32]; // bone name for symbolic links + int parent; // parent bone + int flags; // ?? + int bonecontroller[6]; // bone controller index, -1 == none + float value[6]; // default DoF values + float scale[6]; // scale for delta DoF values +} mstudiobone_t; + + +// bone controllers +typedef struct +{ + int bone; // -1 == 0 + int type; // X, Y, Z, XR, YR, ZR, M + float start; + float end; + int rest; // byte index value at rest + int index; // 0-3 user set controller, 4 mouth +} mstudiobonecontroller_t; + +// intersection boxes +typedef struct +{ + int bone; + int group; // intersection group + vec3_t bbmin; // bounding box + vec3_t bbmax; +} mstudiobbox_t; + +#if !defined( CACHE_USER ) && !defined( QUAKEDEF_H ) +#define CACHE_USER +typedef struct cache_user_s +{ + void *data; +} cache_user_t; +#endif + +// demand loaded sequence groups +typedef struct +{ + char label[32]; // textual name + char name[64]; // file name + cache_user_t cache; // cache index pointer + int data; // hack for group 0 +} mstudioseqgroup_t; + +// sequence descriptions +typedef struct +{ + char label[32]; // sequence label + + float fps; // frames per second + int flags; // looping/non-looping flags + + int activity; + int actweight; + + int numevents; + int eventindex; + + int numframes; // number of frames per sequence + + int numpivots; // number of foot pivots + int pivotindex; + + int motiontype; + int motionbone; + vec3_t linearmovement; + int automoveposindex; + int automoveangleindex; + + vec3_t bbmin; // per sequence bounding box + vec3_t bbmax; + + int numblends; + int animindex; // mstudioanim_t pointer relative to start of sequence group data + // [blend][bone][X, Y, Z, XR, YR, ZR] + + int blendtype[2]; // X, Y, Z, XR, YR, ZR + float blendstart[2]; // starting value + float blendend[2]; // ending value + int blendparent; + + int seqgroup; // sequence group for demand loading + + int entrynode; // transition node at entry + int exitnode; // transition node at exit + int nodeflags; // transition rules + + int nextseq; // auto advancing sequences +} mstudioseqdesc_t; + +// events +#include "studio_event.h" +/* +typedef struct +{ + int frame; + int event; + int type; + char options[64]; +} mstudioevent_t; +*/ + +// pivots +typedef struct +{ + vec3_t org; // pivot point + int start; + int end; +} mstudiopivot_t; + +// attachment +typedef struct +{ + char name[32]; + int type; + int bone; + vec3_t org; // attachment point + vec3_t vectors[3]; +} mstudioattachment_t; + +typedef struct +{ + unsigned short offset[6]; +} mstudioanim_t; + +// animation frames +typedef union +{ + struct { + byte valid; + byte total; + } num; + short value; +} mstudioanimvalue_t; + + + +// body part index +typedef struct +{ + char name[64]; + int nummodels; + int base; + int modelindex; // index into models array +} mstudiobodyparts_t; + + + +// skin info +typedef struct +{ + char name[64]; + int flags; + int width; + int height; + int index; +} mstudiotexture_t; + + +// skin families +// short index[skinfamilies][skinref] + +// studio models +typedef struct +{ + char name[64]; + + int type; + + float boundingradius; + + int nummesh; + int meshindex; + + int numverts; // number of unique vertices + int vertinfoindex; // vertex bone info + int vertindex; // vertex vec3_t + int numnorms; // number of unique surface normals + int norminfoindex; // normal bone info + int normindex; // normal vec3_t + + int numgroups; // deformation groups + int groupindex; +} mstudiomodel_t; + + +// vec3_t boundingbox[model][bone][2]; // complex intersection info + + +// meshes +typedef struct +{ + int numtris; + int triindex; + int skinref; + int numnorms; // per mesh normals + int normindex; // normal vec3_t +} mstudiomesh_t; + +// triangles +#if 0 +typedef struct +{ + short vertindex; // index into vertex array + short normindex; // index into normal array + short s,t; // s,t position on skin +} mstudiotrivert_t; +#endif + +// lighting options +#define STUDIO_NF_FLATSHADE 0x0001 +#define STUDIO_NF_CHROME 0x0002 +#define STUDIO_NF_FULLBRIGHT 0x0004 + +// motion flags +#define STUDIO_X 0x0001 +#define STUDIO_Y 0x0002 +#define STUDIO_Z 0x0004 +#define STUDIO_XR 0x0008 +#define STUDIO_YR 0x0010 +#define STUDIO_ZR 0x0020 +#define STUDIO_LX 0x0040 +#define STUDIO_LY 0x0080 +#define STUDIO_LZ 0x0100 +#define STUDIO_AX 0x0200 +#define STUDIO_AY 0x0400 +#define STUDIO_AZ 0x0800 +#define STUDIO_AXR 0x1000 +#define STUDIO_AYR 0x2000 +#define STUDIO_AZR 0x4000 +#define STUDIO_TYPES 0x7FFF +#define STUDIO_RLOOP 0x8000 // controller that wraps shortest distance + +// sequence flags +#define STUDIO_LOOPING 0x0001 + +// bone flags +#define STUDIO_HAS_NORMALS 0x0001 +#define STUDIO_HAS_VERTICES 0x0002 +#define STUDIO_HAS_BBOX 0x0004 +#define STUDIO_HAS_CHROME 0x0008 // if any of the textures have chrome on them + +#define RAD_TO_STUDIO (32768.0/M_PI) +#define STUDIO_TO_RAD (M_PI/32768.0) + +#endif diff --git a/MiniBase/ValveSDK/engine/studio_event.h b/MiniBase/ValveSDK/engine/studio_event.h new file mode 100644 index 0000000..3242867 --- /dev/null +++ b/MiniBase/ValveSDK/engine/studio_event.h @@ -0,0 +1,27 @@ +/*** +* +* 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. +* +****/ +#if !defined( STUDIO_EVENTH ) +#define STUDIO_EVENTH +#pragma once + +typedef struct mstudioevent_s +{ + int frame; + int event; + int type; + char options[64]; +} mstudioevent_t; + +#endif // STUDIO_EVENTH \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/triangleapi.h b/MiniBase/ValveSDK/engine/triangleapi.h new file mode 100644 index 0000000..127c133 --- /dev/null +++ b/MiniBase/ValveSDK/engine/triangleapi.h @@ -0,0 +1,54 @@ +/*** +* +* 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. +* +****/ +#if !defined( TRIANGLEAPIH ) +#define TRIANGLEAPIH +#pragma once + +typedef enum +{ + TRI_FRONT = 0, + TRI_NONE = 1, +} TRICULLSTYLE; + +#define TRI_API_VERSION 1 + +#define TRI_TRIANGLES 0 +#define TRI_TRIANGLE_FAN 1 +#define TRI_QUADS 2 +#define TRI_POLYGON 3 +#define TRI_LINES 4 +#define TRI_TRIANGLE_STRIP 5 +#define TRI_QUAD_STRIP 6 + +typedef struct triangleapi_s +{ + int version; + + void ( *RenderMode )( int mode ); + void ( *Begin )( int primitiveCode ); + void ( *End ) ( void ); + + void ( *Color4f ) ( float r, float g, float b, float a ); + void ( *Color4ub ) ( unsigned char r, unsigned char g, unsigned char b, unsigned char a ); + void ( *TexCoord2f ) ( float u, float v ); + void ( *Vertex3fv ) ( float *worldPnt ); + void ( *Vertex3f ) ( float x, float y, float z ); + void ( *Brightness ) ( float brightness ); + void ( *CullFace ) ( TRICULLSTYLE style ); + int ( *SpriteTexture ) ( struct model_s *pSpriteModel, int frame ); + int ( *WorldToScreen ) ( float *world, float *screen ); // Returns 1 if it's z clipped +} triangleapi_t; + +#endif // !TRIANGLEAPIH \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/usercmd.h b/MiniBase/ValveSDK/engine/usercmd.h new file mode 100644 index 0000000..2fe122a --- /dev/null +++ b/MiniBase/ValveSDK/engine/usercmd.h @@ -0,0 +1,41 @@ +/*** +* +* 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. +* +****/ +#ifndef USERCMD_H +#define USERCMD_H +#ifdef _WIN32 +#pragma once +#endif + +typedef struct usercmd_s +{ + short lerp_msec; // Interpolation time on client + byte msec; // Duration in ms of command + vec3_t viewangles; // Command view angles. + +// intended velocities + float forwardmove; // Forward velocity. + float sidemove; // Sideways velocity. + float upmove; // Upward velocity. + byte lightlevel; // Light level at spot where we are standing. + unsigned short buttons; // Attack buttons + byte impulse; // Impulse command issued. + byte weaponselect; // Current weapon id + +// Experimental player impact stuff. + int impact_index; + vec3_t impact_position; +} usercmd_t; + +#endif // USERCMD_H \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/util_vector.h b/MiniBase/ValveSDK/engine/util_vector.h new file mode 100644 index 0000000..7a38eea --- /dev/null +++ b/MiniBase/ValveSDK/engine/util_vector.h @@ -0,0 +1,131 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +// Vector.h +// A subset of the extdll.h in the project HL Entity DLL +// + +#if !defined FILE_UTIL_VECTOR_H +#define FILE_UTIL_VECTOR_H + +// Misc C-runtime library headers +#include "STDIO.H" +#include "STDLIB.H" +#include "MATH.H" + +// Header file containing definition of globalvars_t and entvars_t +typedef int func_t; // +typedef int string_t; // from engine's pr_comp.h; +typedef float vec_t; // needed before including progdefs.h + +//========================================================= +// 2DVector - used for many pathfinding and many other +// operations that are treated as planar rather than 3d. +//========================================================= +class Vector2D +{ +public: + inline Vector2D(void) { } + inline Vector2D(float X, float Y) { x = X; y = Y; } + inline Vector2D operator+(const Vector2D& v) const { return Vector2D(x+v.x, y+v.y); } + inline Vector2D operator-(const Vector2D& v) const { return Vector2D(x-v.x, y-v.y); } + inline Vector2D operator*(float fl) const { return Vector2D(x*fl, y*fl); } + inline Vector2D operator/(float fl) const { return Vector2D(x/fl, y/fl); } + + inline float Length(void) const { return (float)sqrt(x*x + y*y ); } + + inline Vector2D Normalize ( void ) const + { + Vector2D vec2; + + float flLen = Length(); + if ( flLen == 0 ) + { + return Vector2D( (float)0, (float)0 ); + } + else + { + flLen = 1 / flLen; + return Vector2D( x * flLen, y * flLen ); + } + } + + vec_t x, y; +}; + +inline float DotProduct(const Vector2D& a, const Vector2D& b) { return( a.x*b.x + a.y*b.y ); } +inline Vector2D operator*(float fl, const Vector2D& v) { return v * fl; } + +//========================================================= +// 3D Vector +//========================================================= +class Vector // same data-layout as engine's vec3_t, +{ // which is a vec_t[3] +public: + // Construction/destruction + inline Vector(void) { } + inline Vector(float X, float Y, float Z) { x = X; y = Y; z = Z; } + inline Vector(double X, double Y, double Z) { x = (float)X; y = (float)Y; z = (float)Z; } + inline Vector(int X, int Y, int Z) { x = (float)X; y = (float)Y; z = (float)Z; } + inline Vector(const Vector& v) { x = v.x; y = v.y; z = v.z; } + inline Vector(float rgfl[3]) { x = rgfl[0]; y = rgfl[1]; z = rgfl[2]; } + + // Operators + inline Vector operator-(void) const { return Vector(-x,-y,-z); } + inline int operator==(const Vector& v) const { return x==v.x && y==v.y && z==v.z; } + inline int operator!=(const Vector& v) const { return !(*this==v); } + inline Vector operator+(const Vector& v) const { return Vector(x+v.x, y+v.y, z+v.z); } + inline Vector operator-(const Vector& v) const { return Vector(x-v.x, y-v.y, z-v.z); } + inline Vector operator*(float fl) const { return Vector(x*fl, y*fl, z*fl); } + inline Vector operator/(float fl) const { return Vector(x/fl, y/fl, z/fl); } + + // Methods + inline void CopyToArray(float* rgfl) const { rgfl[0] = x, rgfl[1] = y, rgfl[2] = z; } + inline float Length(void) const { return (float)sqrt(x*x + y*y + z*z); } + operator float *() { return &x; } // Vectors will now automatically convert to float * when needed + operator const float *() const { return &x; } // Vectors will now automatically convert to float * when needed + inline Vector Normalize(void) const + { + float flLen = Length(); + if (flLen == 0) return Vector(0,0,1); // ???? + flLen = 1 / flLen; + return Vector(x * flLen, y * flLen, z * flLen); + } + + inline Vector2D Make2D ( void ) const + { + Vector2D Vec2; + + Vec2.x = x; + Vec2.y = y; + + return Vec2; + } + inline float Length2D(void) const { return (float)sqrt(x*x + y*y); } + + // Members + vec_t x, y, z; +}; +inline Vector operator*(float fl, const Vector& v) { return v * fl; } +inline float DotProduct(const Vector& a, const Vector& b) { return(a.x*b.x+a.y*b.y+a.z*b.z); } +inline Vector CrossProduct(const Vector& a, const Vector& b) { return Vector( a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x ); } + +#define vec3_t Vector + + +#define VectorAdd(a,b,c) {(c)[0]=(a)[0]+(b)[0];(c)[1]=(a)[1]+(b)[1];(c)[2]=(a)[2]+(b)[2];} +#define VectorCopy(a,b) {(b)[0]=(a)[0];(b)[1]=(a)[1];(b)[2]=(a)[2];} +#define VectorClear(a) { a[0]=0.0;a[1]=0.0;a[2]=0.0;} + +#endif diff --git a/MiniBase/ValveSDK/engine/weaponinfo.h b/MiniBase/ValveSDK/engine/weaponinfo.h new file mode 100644 index 0000000..4ec21e6 --- /dev/null +++ b/MiniBase/ValveSDK/engine/weaponinfo.h @@ -0,0 +1,52 @@ +/*** +* +* 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. +* +****/ +#if !defined ( WEAPONINFOH ) +#define WEAPONINFOH +#ifdef _WIN32 +#pragma once +#endif + +// Info about weapons player might have in his/her possession +typedef struct weapon_data_s +{ + int m_iId; + int m_iClip; + + float m_flNextPrimaryAttack; + float m_flNextSecondaryAttack; + float m_flTimeWeaponIdle; + + int m_fInReload; + int m_fInSpecialReload; + float m_flNextReload; + float m_flPumpTime; + float m_fReloadTime; + + float m_fAimedDamage; + float m_fNextAimBonus; + int m_fInZoom; + int m_iWeaponState; + + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; +} weapon_data_t; + +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine/wrect.h b/MiniBase/ValveSDK/engine/wrect.h new file mode 100644 index 0000000..1764057 --- /dev/null +++ b/MiniBase/ValveSDK/engine/wrect.h @@ -0,0 +1,9 @@ +#if !defined( WRECTH ) +#define WRECTH + +typedef struct rect_s +{ + int left, right, top, bottom; +} wrect_t; + +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/engine_launcher_api.h b/MiniBase/ValveSDK/engine_launcher_api.h new file mode 100644 index 0000000..db993bd --- /dev/null +++ b/MiniBase/ValveSDK/engine_launcher_api.h @@ -0,0 +1,104 @@ +// engine/launcher interface +#if !defined( ENGINE_LAUNCHER_APIH ) +#define ENGINE_LAUNCHER_APIH +#ifdef _WIN32 +#pragma once +#endif + +typedef void ( *xcommand_t ) ( void ); + +#define RENDERTYPE_UNDEFINED 0 +#define RENDERTYPE_SOFTWARE 1 +#define RENDERTYPE_HARDWARE 2 +#define RENDERTYPE_D3D 3 + +#define ENGINE_LAUNCHER_API_VERSION 1 + +typedef struct engine_api_s +{ + int version; + int rendertype; + int size; + + // Functions + int ( *GetEngineState ) ( void ); + void ( *Cbuf_AddText ) ( char *text ); // append cmd at end of buf + void ( *Cbuf_InsertText ) ( char *text ); // insert cmd at start of buf + void ( *Cmd_AddCommand ) ( char *cmd_name, void ( *funcname )( void ) ); + int ( *Cmd_Argc ) ( void ); + char *( *Cmd_Args ) ( void ); + char *( *Cmd_Argv ) ( int arg ); + void ( *Con_Printf ) ( char *, ... ); + void ( *Con_SafePrintf ) ( char *, ... ); + void ( *Cvar_Set ) ( char *var_name, char *value ); + void ( *Cvar_SetValue ) ( char *var_name, float value ); + int ( *Cvar_VariableInt ) ( char *var_name ); + char *( *Cvar_VariableString ) ( char *var_name ); + float ( *Cvar_VariableValue ) ( char *var_name ); + void ( *ForceReloadProfile ) ( void ); + int ( *GetGameInfo ) ( struct GameInfo_s *pGI, char *pszChannel ); + void ( *GameSetBackground ) ( int bBack ); + void ( *GameSetState ) ( int iState ); + void ( *GameSetSubState ) ( int iState ); + int ( *GetPauseState ) ( void ); + int ( *Host_Frame ) ( float time, int iState, int *stateInfo ); + void ( *Host_GetHostInfo ) ( float *fps, int *nActive, int *nSpectators, int *nMaxPlayers, char *pszMap ); + void ( *Host_Shutdown ) ( void ); + int ( *Game_Init ) ( char *lpCmdLine, unsigned char *pMem, int iSize, struct exefuncs_s *pef, void *, int ); + void ( *IN_ActivateMouse ) ( void ); + void ( *IN_ClearStates ) ( void ); + void ( *IN_DeactivateMouse ) ( void ); + void ( *IN_MouseEvent ) ( int mstate ); + void ( *Keyboard_ReturnToGame ) ( void ); + void ( *Key_ClearStates ) ( void ); + void ( *Key_Event ) ( int key, int down ); + int ( *LoadGame ) ( const char *pszSlot ); + void ( *S_BlockSound ) ( void ); + void ( *S_ClearBuffer ) ( void ); + void ( *S_GetDSPointer ) ( struct IDirectSound **lpDS, struct IDirectSoundBuffer **lpDSBuf ); + void *( *S_GetWAVPointer ) ( void ); + void ( *S_UnblockSound ) ( void ); + int ( *SaveGame ) ( const char *pszSlot, const char *pszComment ); + void ( *SetAuth ) ( void *pobj ); + void ( *SetMessagePumpDisableMode ) ( int bMode ); + void ( *SetPauseState ) ( int bPause ); + void ( *SetStartupMode ) ( int bMode ); + void ( *SNDDMA_Shutdown ) ( void ); + void ( *Snd_AcquireBuffer ) ( void ); + void ( *Snd_ReleaseBuffer ) ( void ); + void ( *StoreProfile ) ( void ); + double ( *Sys_FloatTime ) ( void ); + void ( *VID_UpdateWindowVars ) ( void *prc, int x, int y ); + void ( *VID_UpdateVID ) ( struct viddef_s *pvid ); + + // VGUI interfaces + void ( *VGui_CallEngineSurfaceProc ) ( void* hwnd, unsigned int msg, unsigned int wparam, long lparam ); + + // notifications that the launcher is taking/giving focus to the engine + void ( *EngineTakingFocus ) ( void ); + void ( *LauncherTakingFocus ) ( void ); + +#ifdef _WIN32 + // Only filled in by rendertype RENDERTYPE_HARDWARE + void ( *GL_Init ) ( void ); + int ( *GL_SetMode ) ( HWND hwndGame, HDC *pmaindc, HGLRC *pbaseRC, int fD3D, const char *p, const char *pszCmdLine ); + void ( *GL_Shutdown ) ( HWND hwnd, HDC hdc, HGLRC hglrc ); + + void ( *QGL_D3DShared ) ( struct tagD3DGlobals *d3dGShared ); + + int ( WINAPI *glSwapBuffers ) ( HDC dc ); + void ( *DirectorProc ) ( unsigned int cmd, void * params ); +#else + // NOT USED IN LINUX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + void ( *GL_Init ) ( void ); + void ( *GL_SetMode ) ( void ); + void ( *GL_Shutdown ) ( void ); + void ( *QGL_D3DShared ) ( void ); + void ( *glSwapBuffers ) ( void ); + void ( *DirectorProc ) ( void ); + // LINUX +#endif + +} engine_api_t; + +#endif // ENGINE_LAUNCHER_APIH diff --git a/MiniBase/ValveSDK/entity_state.h b/MiniBase/ValveSDK/entity_state.h new file mode 100644 index 0000000..d05bcbc --- /dev/null +++ b/MiniBase/ValveSDK/entity_state.h @@ -0,0 +1,193 @@ +/*** +* +* 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. +* +****/ +#if !defined( ENTITY_STATEH ) +#define ENTITY_STATEH +#ifdef _WIN32 +#pragma once +#endif + +// For entityType below +#define ENTITY_NORMAL (1<<0) +#define ENTITY_BEAM (1<<1) + +// Entity state is used for the baseline and for delta compression of a packet of +// entities that is sent to a client. +typedef struct entity_state_s entity_state_t; + +struct entity_state_s +{ +// Fields which are filled in by routines outside of delta compression + int entityType; + // Index into cl_entities array for this entity. + int number; + float msg_time; + + // Message number last time the player/entity state was updated. + int messagenum; + + // Fields which can be transitted and reconstructed over the network stream + vec3_t origin; + vec3_t angles; + + int modelindex; + int sequence; + float frame; + int colormap; + short skin; + short solid; + int effects; + float scale; + + byte eflags; + + // Render information + int rendermode; + int renderamt; + color24 rendercolor; + int renderfx; + + int movetype; + float animtime; + float framerate; + int body; + byte controller[4]; + byte blending[4]; + vec3_t velocity; + + // Send bbox down to client for use during prediction. + vec3_t mins; + vec3_t maxs; + + int aiment; + // If owned by a player, the index of that player ( for projectiles ). + int owner; + + // Friction, for prediction. + float friction; + // Gravity multiplier + float gravity; + +// PLAYER SPECIFIC + int team; + int playerclass; + int health; + qboolean spectator; + int weaponmodel; + int gaitsequence; + // If standing on conveyor, e.g. + vec3_t basevelocity; + // Use the crouched hull, or the regular player hull. + int usehull; + // Latched buttons last time state updated. + int oldbuttons; + // -1 = in air, else pmove entity number + int onground; + int iStepLeft; + // How fast we are falling + float flFallVelocity; + + float fov; + int weaponanim; + + // Parametric movement overrides + vec3_t startpos; + vec3_t endpos; + float impacttime; + float starttime; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; +}; + +#include "pm_info.h" + +typedef struct clientdata_s +{ + vec3_t origin; + vec3_t velocity; + + int viewmodel; + vec3_t punchangle; + int flags; + int waterlevel; + int watertype; + vec3_t view_ofs; + float health; + + int bInDuck; + + int weapons; // remove? + + int flTimeStepSound; + int flDuckTime; + int flSwimTime; + int waterjumptime; + + float maxspeed; + + float fov; + int weaponanim; + + int m_iId; + int ammo_shells; + int ammo_nails; + int ammo_cells; + int ammo_rockets; + float m_flNextAttack; + + int tfstate; + + int pushmsec; + + int deadflag; + + char physinfo[ MAX_PHYSINFO_STRING ]; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; +} clientdata_t; + +#include "weaponinfo.h" + +typedef struct local_state_s +{ + entity_state_t playerstate; + clientdata_t client; + weapon_data_t weapondata[ 32 ]; +} local_state_t; + +#endif // !ENTITY_STATEH \ No newline at end of file diff --git a/MiniBase/ValveSDK/entity_types.h b/MiniBase/ValveSDK/entity_types.h new file mode 100644 index 0000000..ff783df --- /dev/null +++ b/MiniBase/ValveSDK/entity_types.h @@ -0,0 +1,26 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +// entity_types.h +#if !defined( ENTITY_TYPESH ) +#define ENTITY_TYPESH + +#define ET_NORMAL 0 +#define ET_PLAYER 1 +#define ET_TEMPENTITY 2 +#define ET_BEAM 3 +// BMODEL or SPRITE that was split across BSP nodes +#define ET_FRAGMENTED 4 + +#endif // !ENTITY_TYPESH diff --git a/MiniBase/ValveSDK/event_api.h b/MiniBase/ValveSDK/event_api.h new file mode 100644 index 0000000..722dfe2 --- /dev/null +++ b/MiniBase/ValveSDK/event_api.h @@ -0,0 +1,51 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +#if !defined ( EVENT_APIH ) +#define EVENT_APIH +#ifdef _WIN32 +#pragma once +#endif + +#define EVENT_API_VERSION 1 + +typedef struct event_api_s +{ + int version; + void ( *EV_PlaySound ) ( int ent, float *origin, int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch ); + void ( *EV_StopSound ) ( int ent, int channel, const char *sample ); + int ( *EV_FindModelIndex )( const char *pmodel ); + int ( *EV_IsLocal ) ( int playernum ); + int ( *EV_LocalPlayerDucking ) ( void ); + void ( *EV_LocalPlayerViewheight ) ( float * ); + void ( *EV_LocalPlayerBounds ) ( int hull, float *mins, float *maxs ); + int ( *EV_IndexFromTrace) ( struct pmtrace_s *pTrace ); + struct physent_s *( *EV_GetPhysent ) ( int idx ); + void ( *EV_SetUpPlayerPrediction ) ( int dopred, int bIncludeLocalClient ); + void ( *EV_PushPMStates ) ( void ); + void ( *EV_PopPMStates ) ( void ); + void ( *EV_SetSolidPlayers ) (int playernum); + void ( *EV_SetTraceHull ) ( int hull ); + void ( *EV_PlayerTrace ) ( float *start, float *end, int traceFlags, int ignore_pe, struct pmtrace_s *tr ); + void ( *EV_WeaponAnimation ) ( int sequence, int body ); + unsigned short ( *EV_PrecacheEvent ) ( int type, const char* psz ); + void ( *EV_PlaybackEvent ) ( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); + const char *( *EV_TraceTexture ) ( int ground, float *vstart, float *vend ); + void ( *EV_StopAllSounds ) ( int entnum, int entchannel ); + void ( *EV_KillEvents ) ( int entnum, const char *eventname ); +} event_api_t; + +extern event_api_t eventapi; + +#endif diff --git a/MiniBase/ValveSDK/event_args.h b/MiniBase/ValveSDK/event_args.h new file mode 100644 index 0000000..99dd49a --- /dev/null +++ b/MiniBase/ValveSDK/event_args.h @@ -0,0 +1,50 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +#if !defined( EVENT_ARGSH ) +#define EVENT_ARGSH +#ifdef _WIN32 +#pragma once +#endif + +// Event was invoked with stated origin +#define FEVENT_ORIGIN ( 1<<0 ) + +// Event was invoked with stated angles +#define FEVENT_ANGLES ( 1<<1 ) + +typedef struct event_args_s +{ + int flags; + + // Transmitted + int entindex; + + float origin[3]; + float angles[3]; + float velocity[3]; + + int ducking; + + float fparam1; + float fparam2; + + int iparam1; + int iparam2; + + int bparam1; + int bparam2; +} event_args_t; + +#endif diff --git a/MiniBase/ValveSDK/event_flags.h b/MiniBase/ValveSDK/event_flags.h new file mode 100644 index 0000000..43f804f --- /dev/null +++ b/MiniBase/ValveSDK/event_flags.h @@ -0,0 +1,47 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +#if !defined( EVENT_FLAGSH ) +#define EVENT_FLAGSH +#ifdef _WIN32 +#pragma once +#endif + +// Skip local host for event send. +#define FEV_NOTHOST (1<<0) + +// Send the event reliably. You must specify the origin and angles and use +// PLAYBACK_EVENT_FULL for this to work correctly on the server for anything +// that depends on the event origin/angles. I.e., the origin/angles are not +// taken from the invoking edict for reliable events. +#define FEV_RELIABLE (1<<1) + +// Don't restrict to PAS/PVS, send this event to _everybody_ on the server ( useful for stopping CHAN_STATIC +// sounds started by client event when client is not in PVS anymore ( hwguy in TFC e.g. ). +#define FEV_GLOBAL (1<<2) + +// If this client already has one of these events in its queue, just update the event instead of sending it as a duplicate +// +#define FEV_UPDATE (1<<3) + +// Only send to entity specified as the invoker +#define FEV_HOSTONLY (1<<4) + +// Only send if the event was created on the server. +#define FEV_SERVER (1<<5) + +// Only issue event client side ( from shared code ) +#define FEV_CLIENT (1<<6) + +#endif diff --git a/MiniBase/ValveSDK/in_buttons.h b/MiniBase/ValveSDK/in_buttons.h new file mode 100644 index 0000000..4196a2d --- /dev/null +++ b/MiniBase/ValveSDK/in_buttons.h @@ -0,0 +1,38 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +#ifndef IN_BUTTONS_H +#define IN_BUTTONS_H +#ifdef _WIN32 +#pragma once +#endif + +#define IN_ATTACK (1 << 0) +#define IN_JUMP (1 << 1) +#define IN_DUCK (1 << 2) +#define IN_FORWARD (1 << 3) +#define IN_BACK (1 << 4) +#define IN_USE (1 << 5) +#define IN_CANCEL (1 << 6) +#define IN_LEFT (1 << 7) +#define IN_RIGHT (1 << 8) +#define IN_MOVELEFT (1 << 9) +#define IN_MOVERIGHT (1 << 10) +#define IN_ATTACK2 (1 << 11) +#define IN_RUN (1 << 12) +#define IN_RELOAD (1 << 13) +#define IN_ALT1 (1 << 14) +#define IN_SCORE (1 << 15) // Used by client.dll for when scoreboard is held down + +#endif // IN_BUTTONS_H diff --git a/MiniBase/ValveSDK/keydefs.h b/MiniBase/ValveSDK/keydefs.h new file mode 100644 index 0000000..590367b --- /dev/null +++ b/MiniBase/ValveSDK/keydefs.h @@ -0,0 +1,124 @@ +// keydefs.h +#ifndef KEYDEFS_H +#define KEYDEFS_H +#ifdef _WIN32 +#pragma once +#endif + +// +// these are the key numbers that should be passed to Key_Event +// +#define K_TAB 9 +#define K_ENTER 13 +#define K_ESCAPE 27 +#define K_SPACE 32 + +// normal keys should be passed as lowercased ascii + +#define K_BACKSPACE 127 +#define K_UPARROW 128 +#define K_DOWNARROW 129 +#define K_LEFTARROW 130 +#define K_RIGHTARROW 131 + +#define K_ALT 132 +#define K_CTRL 133 +#define K_SHIFT 134 +#define K_F1 135 +#define K_F2 136 +#define K_F3 137 +#define K_F4 138 +#define K_F5 139 +#define K_F6 140 +#define K_F7 141 +#define K_F8 142 +#define K_F9 143 +#define K_F10 144 +#define K_F11 145 +#define K_F12 146 +#define K_INS 147 +#define K_DEL 148 +#define K_PGDN 149 +#define K_PGUP 150 +#define K_HOME 151 +#define K_END 152 + +#define K_KP_HOME 160 +#define K_KP_UPARROW 161 +#define K_KP_PGUP 162 +#define K_KP_LEFTARROW 163 +#define K_KP_5 164 +#define K_KP_RIGHTARROW 165 +#define K_KP_END 166 +#define K_KP_DOWNARROW 167 +#define K_KP_PGDN 168 +#define K_KP_ENTER 169 +#define K_KP_INS 170 +#define K_KP_DEL 171 +#define K_KP_SLASH 172 +#define K_KP_MINUS 173 +#define K_KP_PLUS 174 +#define K_CAPSLOCK 175 +#define K_KP_MUL 176 +#define K_WIN 177 + + +// +// joystick buttons +// +#define K_JOY1 203 +#define K_JOY2 204 +#define K_JOY3 205 +#define K_JOY4 206 + +// +// aux keys are for multi-buttoned joysticks to generate so they can use +// the normal binding process +// +#define K_AUX1 207 +#define K_AUX2 208 +#define K_AUX3 209 +#define K_AUX4 210 +#define K_AUX5 211 +#define K_AUX6 212 +#define K_AUX7 213 +#define K_AUX8 214 +#define K_AUX9 215 +#define K_AUX10 216 +#define K_AUX11 217 +#define K_AUX12 218 +#define K_AUX13 219 +#define K_AUX14 220 +#define K_AUX15 221 +#define K_AUX16 222 +#define K_AUX17 223 +#define K_AUX18 224 +#define K_AUX19 225 +#define K_AUX20 226 +#define K_AUX21 227 +#define K_AUX22 228 +#define K_AUX23 229 +#define K_AUX24 230 +#define K_AUX25 231 +#define K_AUX26 232 +#define K_AUX27 233 +#define K_AUX28 234 +#define K_AUX29 235 +#define K_AUX30 236 +#define K_AUX31 237 +#define K_AUX32 238 +#define K_MWHEELDOWN 239 +#define K_MWHEELUP 240 + +#define K_PAUSE 255 + +// +// mouse buttons generate virtual keys +// +#define K_MOUSE1 241 +#define K_MOUSE2 242 +#define K_MOUSE3 243 +#define K_MOUSE4 244 +#define K_MOUSE5 245 + +#endif // KEYDEFS_H \ No newline at end of file diff --git a/MiniBase/ValveSDK/misc/com_model.h b/MiniBase/ValveSDK/misc/com_model.h new file mode 100644 index 0000000..e237e4b --- /dev/null +++ b/MiniBase/ValveSDK/misc/com_model.h @@ -0,0 +1,539 @@ +//========= Copyright 1996-2001, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + + +// 06/25/2002 MAH +// This header file has been modified to now include the proper BSP model +// structure definitions for each of the two Quakeworld client renderers: +// software mode and GL mode. Originally, Valve only supplied it with +// the software mode definitions, which caused General Protection Fault's +// when accessing members of the structures that are different between +// the two versions. These are: 'mnode_t', 'mleaf_t', 'msurface_t' and +// 'texture_t'. To select the GL hardware rendering versions of these +// structures, define 'HARDWARE_MODE' as a preprocessor symbol, otherwise +// it will default to software mode as supplied. + + +// com_model.h +#if !defined( COM_MODEL_H ) +#define COM_MODEL_H +#if defined( _WIN32 ) +#pragma once +#endif + +#define HARDWARE_MODE + +#define STUDIO_RENDER 1 +#define STUDIO_EVENTS 2 + +#define MAX_CLIENTS 32 +#define MAX_EDICTS 900 + +#define MAX_MODEL_NAME 64 +#define MAX_MAP_HULLS 4 +#define MIPLEVELS 4 +#define NUM_AMBIENTS 4 // automatic ambient sounds +#define MAXLIGHTMAPS 4 +#define PLANE_ANYZ 5 + +#define ALIAS_Z_CLIP_PLANE 5 + +// flags in finalvert_t.flags +#define ALIAS_LEFT_CLIP 0x0001 +#define ALIAS_TOP_CLIP 0x0002 +#define ALIAS_RIGHT_CLIP 0x0004 +#define ALIAS_BOTTOM_CLIP 0x0008 +#define ALIAS_Z_CLIP 0x0010 +#define ALIAS_ONSEAM 0x0020 +#define ALIAS_XY_CLIP_MASK 0x000F + +#define ZISCALE ((float)0x8000) + +#define CACHE_SIZE 32 // used to align key data structures + +typedef enum +{ + mod_brush, + mod_sprite, + mod_alias, + mod_studio +} modtype_t; + +// must match definition in modelgen.h +#ifndef SYNCTYPE_T +#define SYNCTYPE_T + +typedef enum +{ + ST_SYNC=0, + ST_RAND +} synctype_t; + +#endif + +typedef struct +{ + float mins[3], maxs[3]; + float origin[3]; + int headnode[MAX_MAP_HULLS]; + int visleafs; // not including the solid leaf 0 + int firstface, numfaces; +} dmodel_t; + +// plane_t structure +// 06/23/2002 MAH +// This structure is the same in QW source files +// 'model.h' and 'gl_model.h' +typedef struct mplane_s +{ + vec3_t normal; // surface normal + float dist; // closest appoach to origin + byte type; // for texture axis selection and fast side tests + byte signbits; // signx + signy<<1 + signz<<1 + byte pad[2]; +} mplane_t; + +typedef struct +{ + vec3_t position; +} mvertex_t; + +// 06/23/2002 MAH +// This structure is the same in QW source files +// 'model.h' and 'gl_model.h' +typedef struct +{ + unsigned short v[2]; + unsigned int cachededgeoffset; +} medge_t; + + +#ifndef HARDWARE_MODE +// 06/23/2002 MAH +// This structure is different between hardware and software mode +// +// software mode - QW 'model.h' +typedef struct texture_s +{ + char name[16]; + unsigned width, height; + int anim_total; // total tenths in sequence ( 0 = no) + int anim_min, anim_max; // time for this frame min <=time< max + struct texture_s *anim_next; // in the animation sequence + struct texture_s *alternate_anims; // bmodels in frame 1 use these + unsigned offsets[MIPLEVELS]; // four mip maps stored + unsigned paloffset; +} texture_t; + +#else +// +// hardware mode - QW 'gl_model.h' +typedef struct texture_s +{ + char name[16]; + unsigned width, height; + int gl_texturenum; + struct msurface_s *texturechain; // for gl_texsort drawing + int anim_total; // total tenths in sequence ( 0 = no) + int anim_min, anim_max; // time for this frame min <=time< max + struct texture_s *anim_next; // in the animation sequence + struct texture_s *alternate_anims; // bmodels in frmae 1 use these + unsigned offsets[MIPLEVELS]; // four mip maps stored +} texture_t; + +#endif + +// 06/23/2002 MAH +// This structure is the same in QW source files +// 'model.h' and 'gl_model.h' +typedef struct +{ + float vecs[2][4]; // [s/t] unit vectors in world space. + // [i][3] is the s/t offset relative to the origin. + // s or t = dot(3Dpoint,vecs[i])+vecs[i][3] + float mipadjust; // ?? mipmap limits for very small surfaces + texture_t *texture; + int flags; // sky or slime, no lightmap or 256 subdivision +} mtexinfo_t; + +#ifdef HARDWARE_MODE +// 06/23/2002 MAH +// This structure is only need for hardware rendering +#define VERTEXSIZE 7 + +typedef struct glpoly_s +{ + struct glpoly_s *next; + struct glpoly_s *chain; + int numverts; + int flags; // for SURF_UNDERWATER + + // 07/24/2003 R9 - not actually four! AHA! AHAHAHAHAHAHA! hack. + float verts[4][VERTEXSIZE]; // variable sized (xyz s1t1 s2t2) +} glpoly_t; + +#endif + + +#ifndef HARDWARE_MODE +// 06/23/2002 MAH +// This structure is different between hardware and software mode +// +// Software Mode - QW 'model.h' +typedef struct mnode_s +{ +// common with leaf + int contents; // 0, to differentiate from leafs + int visframe; // node needs to be traversed if current + + short minmaxs[6]; // for bounding box culling + + + struct mnode_s *parent; + +// node specific + mplane_t *plane; + struct mnode_s *children[2]; + + unsigned short firstsurface; + unsigned short numsurfaces; +} mnode_t; + +#else +// +// hardware mode - QW 'gl_model.h' +typedef struct mnode_s +{ +// common with leaf + int contents; // 0, to differentiate from leafs + int visframe; // node needs to be traversed if current + + float minmaxs[6]; // for bounding box culling + + struct mnode_s *parent; + +// node specific + mplane_t *plane; + struct mnode_s *children[2]; + + unsigned short firstsurface; + unsigned short numsurfaces; +} mnode_t; + +#endif + + +typedef struct msurface_s msurface_t; +typedef struct decal_s decal_t; + +// JAY: Compress this as much as possible +struct decal_s +{ + decal_t *pnext; // linked list for each surface + msurface_t *psurface; // Surface id for persistence / unlinking + short dx; // Offsets into surface texture (in texture coordinates, so we don't need floats) + short dy; + short texture; // Decal texture + byte scale; // Pixel scale + byte flags; // Decal flags + + short entityIndex; // Entity this is attached to +}; + +#ifndef HARDWARE_MODE +// 06/23/2002 MAH +// This structure is different between hardware and software mode +// +// Software Mode - QW 'model.h' +typedef struct mleaf_s +{ +// common with node + int contents; // wil be a negative contents number + int visframe; // node needs to be traversed if current + + short minmaxs[6]; // for bounding box culling + + struct mnode_s *parent; + +// leaf specific + byte *compressed_vis; + struct efrag_s *efrags; + + msurface_t **firstmarksurface; + int nummarksurfaces; + int key; // BSP sequence number for leaf's contents + byte ambient_sound_level[NUM_AMBIENTS]; +} mleaf_t; +#else +// +// hardware renderer - QW 'gl_model.h' +typedef struct mleaf_s +{ +// common with node + int contents; // wil be a negative contents number + int visframe; // node needs to be traversed if current + + float minmaxs[6]; // for bounding box culling + + struct mnode_s *parent; + +// leaf specific + byte *compressed_vis; + struct efrag_s *efrags; + + msurface_t **firstmarksurface; + int nummarksurfaces; + int key; // BSP sequence number for leaf's contents + byte ambient_sound_level[NUM_AMBIENTS]; +} mleaf_t; +#endif + +#ifndef HARDWARE_MODE +// +// software renderer - QW 'model.h' +struct msurface_s +{ + int visframe; // should be drawn when node is crossed + + int dlightframe; // last frame the surface was checked by an animated light + int dlightbits; // dynamically generated. Indicates if the surface illumination + // is modified by an animated light. + + mplane_t *plane; // pointer to shared plane + int flags; // see SURF_ #defines + + int firstedge; // look up in model->surfedges[], negative numbers + int numedges; // are backwards edges + +// surface generation data +// 06/23/2002 MAH +// WARNING: this structure is not defined anywhere in the HL SDK 2.2 +// headers. See Quakeworld client software mode source for this + struct surfcache_s *cachespots[MIPLEVELS]; + + short texturemins[2]; // smallest s/t position on the surface. + short extents[2]; // ?? s/t texture size, 1..256 for all non-sky surfaces + + mtexinfo_t *texinfo; + +// lighting info + byte styles[MAXLIGHTMAPS]; // index into d_lightstylevalue[] for animated lights + // no one surface can be effected by more than 4 + // animated lights. + color24 *samples; // actual light map data for this surface + + decal_t *pdecals; +}; + +#else +// +// hardware renderer - QW 'gl_model.h' +// 06/23/2002 2230 MAH +// WARNING - the above indicates this structure was modified +// for Half-Life this structure needs VERIFICATION +// 06/23/2002 2300 MAH - the below version for hardware agrees +// with a hexadecimal data dump of these structures taken +// from a running game. +typedef struct msurface_s +{ + int visframe; // should be drawn when node is crossed + + mplane_t *plane; + int flags; + + int firstedge; // look up in model->surfedges[], negative numbers + int numedges; // are backwards edges + + short texturemins[2]; + short extents[2]; + + int light_s, light_t; // gl lightmap coordinates + + glpoly_t *polys; // multiple if warped + struct msurface_s *texturechain; + + mtexinfo_t *texinfo; + +// lighting info + int dlightframe; + int dlightbits; + + int lightmaptexturenum; + byte styles[MAXLIGHTMAPS]; + int cached_light[MAXLIGHTMAPS]; // values currently used in lightmap + qboolean cached_dlight; // true if dynamic light in cache + +// byte *samples; // [numstyles*surfsize] + color24 *samples; // note: this is the actual lightmap data for this surface + decal_t *pdecals; + +} msurface_t; +#endif + +// +// 06/23/2002 MAH +// Note: this structure is exactly the same in QW software +// and hardware renderers QW - 'bspfile.h' +typedef struct +{ + int planenum; + short children[2]; // negative numbers are contents +} dclipnode_t; + +// +// 06/23/2002 MAH +// Note: this structure is exactly the same in QW software +// and hardware renderers 'model.h' and 'gl_model.h' +typedef struct hull_s +{ + dclipnode_t *clipnodes; + mplane_t *planes; + int firstclipnode; + int lastclipnode; + vec3_t clip_mins; + vec3_t clip_maxs; +} hull_t; + +#if !defined( CACHE_USER ) && !defined( QUAKEDEF_H ) +#define CACHE_USER +typedef struct cache_user_s +{ + void *data; +} cache_user_t; +#endif + +typedef struct model_s +{ + char name[ MAX_MODEL_NAME ]; // +0x000 + qboolean needload; // +0x040 bmodels and sprites don't cache normally + + modtype_t type; // +0x044 + int numframes; // +0x048 + synctype_t synctype; // +0x04C + + int flags; // +0x050 + +// +// volume occupied by the model +// + vec3_t mins, maxs; // +0x054, +060 + float radius; // +0x06C + +// +// brush model +// + int firstmodelsurface, nummodelsurfaces; // +0x070, +0x074 + + int numsubmodels; // +0x078 + dmodel_t *submodels; // +0x07C + + int numplanes; // +0x080 + mplane_t *planes; // +0x084 + + int numleafs; // +0x088 number of visible leafs, not counting 0 + struct mleaf_s *leafs; // +0x08C + + int numvertexes; // +0x090 + mvertex_t *vertexes; // +0x094 + + int numedges; // +0x098 + medge_t *edges; // +0x09C + + int numnodes; // +0x0A0 + mnode_t *nodes; // +0x0A4 + + int numtexinfo; // +0x0A8 + mtexinfo_t *texinfo; // +0x0AC + + int numsurfaces; // +0x0B0 + msurface_t *surfaces; // +0x0B4 + + int numsurfedges; + int *surfedges; + + int numclipnodes; + dclipnode_t *clipnodes; + + int nummarksurfaces; + msurface_t **marksurfaces; + + hull_t hulls[MAX_MAP_HULLS]; + + int numtextures; + texture_t **textures; + + byte *visdata; + + color24 *lightdata; + + char *entities; + +// +// additional model data +// + cache_user_t cache; // only access through Mod_Extradata + +} model_t; + +typedef vec_t vec4_t[4]; + +typedef struct alight_s +{ + int ambientlight; // clip at 128 + int shadelight; // clip at 192 - ambientlight + vec3_t color; + float *plightvec; +} alight_t; + +typedef struct auxvert_s +{ + float fv[3]; // viewspace x, y +} auxvert_t; + +// +// ------------------ Player Model Animation Info ---------------- +// +//#include "custom.h" +#include "ValveSDK/engine/custom.h" + +#define MAX_INFO_STRING 256 +#define MAX_SCOREBOARDNAME 32 +typedef struct player_info_s +{ + // User id on server + int userid; + + // User info string + char userinfo[ MAX_INFO_STRING ]; + + // Name + char name[ MAX_SCOREBOARDNAME ]; + + // Spectator or not, unused + int spectator; + + int ping; + int packet_loss; + + // skin information + char model[MAX_QPATH]; + int topcolor; + int bottomcolor; + + // last frame rendered + int renderframe; + + // Gait frame estimation + int gaitsequence; + float gaitframe; + float gaityaw; + vec3_t prevgaitorigin; + + customization_t customdata; +} player_info_t; + +#endif // #if !defined(COM_MODEL_H) diff --git a/MiniBase/ValveSDK/net_api.h b/MiniBase/ValveSDK/net_api.h new file mode 100644 index 0000000..49c39e7 --- /dev/null +++ b/MiniBase/ValveSDK/net_api.h @@ -0,0 +1,99 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#if !defined( NET_APIH ) +#define NET_APIH +#ifdef _WIN32 +#pragma once +#endif + +#if !defined ( NETADRH ) +#include "netadr.h" +#endif + +#define NETAPI_REQUEST_SERVERLIST ( 0 ) // Doesn't need a remote address +#define NETAPI_REQUEST_PING ( 1 ) +#define NETAPI_REQUEST_RULES ( 2 ) +#define NETAPI_REQUEST_PLAYERS ( 3 ) +#define NETAPI_REQUEST_DETAILS ( 4 ) + +// Set this flag for things like broadcast requests, etc. where the engine should not +// kill the request hook after receiving the first response +#define FNETAPI_MULTIPLE_RESPONSE ( 1<<0 ) + +typedef void ( *net_api_response_func_t ) ( struct net_response_s *response ); + +#define NET_SUCCESS ( 0 ) +#define NET_ERROR_TIMEOUT ( 1<<0 ) +#define NET_ERROR_PROTO_UNSUPPORTED ( 1<<1 ) +#define NET_ERROR_UNDEFINED ( 1<<2 ) + +typedef struct net_adrlist_s +{ + struct net_adrlist_s *next; + netadr_t remote_address; +} net_adrlist_t; + +typedef struct net_response_s +{ + // NET_SUCCESS or an error code + int error; + + // Context ID + int context; + // Type + int type; + + // Server that is responding to the request + netadr_t remote_address; + + // Response RTT ping time + double ping; + // Key/Value pair string ( separated by backlash \ characters ) + // WARNING: You must copy this buffer in the callback function, because it is freed + // by the engine right after the call!!!! + // ALSO: For NETAPI_REQUEST_SERVERLIST requests, this will be a pointer to a linked list of net_adrlist_t's + void *response; +} net_response_t; + +typedef struct net_status_s +{ + // Connected to remote server? 1 == yes, 0 otherwise + int connected; + // Client's IP address + netadr_t local_address; + // Address of remote server + netadr_t remote_address; + // Packet Loss ( as a percentage ) + int packet_loss; + // Latency, in seconds ( multiply by 1000.0 to get milliseconds ) + double latency; + // Connection time, in seconds + double connection_time; + // Rate setting ( for incoming data ) + double rate; +} net_status_t; + +typedef struct net_api_s +{ + // APIs + void ( *InitNetworking )( void ); + void ( *Status ) ( struct net_status_s *status ); + void ( *SendRequest) ( int context, int request, int flags, double timeout, struct netadr_s *remote_address, net_api_response_func_t response ); + void ( *CancelRequest ) ( int context ); + void ( *CancelAllRequests ) ( void ); + char *( *AdrToString ) ( struct netadr_s *a ); + int ( *CompareAdr ) ( struct netadr_s *a, struct netadr_s *b ); + int ( *StringToAdr ) ( char *s, struct netadr_s *a ); + const char *( *ValueForKey ) ( const char *s, const char *key ); + void ( *RemoveKey ) ( char *s, const char *key ); + void ( *SetValueForKey ) (char *s, const char *key, const char *value, int maxsize ); +} net_api_t; + +extern net_api_t netapi; + +#endif // NET_APIH \ No newline at end of file diff --git a/MiniBase/ValveSDK/netadr.h b/MiniBase/ValveSDK/netadr.h new file mode 100644 index 0000000..304073c --- /dev/null +++ b/MiniBase/ValveSDK/netadr.h @@ -0,0 +1,40 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +// netadr.h +#ifndef NETADR_H +#define NETADR_H +#ifdef _WIN32 +#pragma once +#endif + +typedef enum +{ + NA_UNUSED, + NA_LOOPBACK, + NA_BROADCAST, + NA_IP, + NA_IPX, + NA_BROADCAST_IPX, +} netadrtype_t; + +typedef struct netadr_s +{ + netadrtype_t type; + unsigned char ip[4]; + unsigned char ipx[10]; + unsigned short port; +} netadr_t; + +#endif // NETADR_H diff --git a/MiniBase/ValveSDK/particledef.h b/MiniBase/ValveSDK/particledef.h new file mode 100644 index 0000000..7e4043a --- /dev/null +++ b/MiniBase/ValveSDK/particledef.h @@ -0,0 +1,57 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +#if !defined( PARTICLEDEFH ) +#define PARTICLEDEFH +#ifdef _WIN32 +#pragma once +#endif + +typedef enum { + pt_static, + pt_grav, + pt_slowgrav, + pt_fire, + pt_explode, + pt_explode2, + pt_blob, + pt_blob2, + pt_vox_slowgrav, + pt_vox_grav, + pt_clientcustom // Must have callback function specified +} ptype_t; + +// !!! if this is changed, it must be changed in d_ifacea.h too !!! +typedef struct particle_s +{ +// driver-usable fields + vec3_t org; + short color; + short packedColor; +// drivers never touch the following fields + struct particle_s *next; + vec3_t vel; + float ramp; + float die; + ptype_t type; + void (*deathfunc)( struct particle_s *particle ); + + // for pt_clientcusttom, we'll call this function each frame + void (*callback)( struct particle_s *particle, float frametime ); + + // For deathfunc, etc. + unsigned char context; +} particle_t; + +#endif diff --git a/MiniBase/ValveSDK/pm_defs.h b/MiniBase/ValveSDK/pm_defs.h new file mode 100644 index 0000000..37fa80a --- /dev/null +++ b/MiniBase/ValveSDK/pm_defs.h @@ -0,0 +1,223 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +// pm_defs.h +#if !defined( PM_DEFSH ) +#define PM_DEFSH +#pragma once + +#include "archtypes.h" // DAL +#define MAX_PHYSENTS 600 // Must have room for all entities in the world. +#define MAX_MOVEENTS 64 +#define MAX_CLIP_PLANES 5 + +#define PM_NORMAL 0x00000000 +#define PM_STUDIO_IGNORE 0x00000001 // Skip studio models +#define PM_STUDIO_BOX 0x00000002 // Use boxes for non-complex studio models (even in traceline) +#define PM_GLASS_IGNORE 0x00000004 // Ignore entities with non-normal rendermode +#define PM_WORLD_ONLY 0x00000008 // Only trace against the world + +// Values for flags parameter of PM_TraceLine +#define PM_TRACELINE_PHYSENTSONLY 0 +#define PM_TRACELINE_ANYVISIBLE 1 + + +#include "pm_info.h" + +// PM_PlayerTrace results. +#include "pmtrace.h" + +#if !defined ( USERCMD_H ) +#include "usercmd.h" +#endif + +// physent_t +typedef struct physent_s +{ + char name[32]; // Name of model, or "player" or "world". + int player; + vec3_t origin; // Model's origin in world coordinates. + struct model_s *model; // only for bsp models + struct model_s *studiomodel; // SOLID_BBOX, but studio clip intersections. + vec3_t mins, maxs; // only for non-bsp models + int info; // For client or server to use to identify (index into edicts or cl_entities) + vec3_t angles; // rotated entities need this info for hull testing to work. + + int solid; // Triggers and func_door type WATER brushes are SOLID_NOT + int skin; // BSP Contents for such things like fun_door water brushes. + int rendermode; // So we can ignore glass + + // Complex collision detection. + float frame; + int sequence; + byte controller[4]; + byte blending[2]; + + int movetype; + int takedamage; + int blooddecal; + int team; + int classnumber; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; +} physent_t; + + +typedef struct playermove_s +{ + int player_index; // So we don't try to run the PM_CheckStuck nudging too quickly. + qboolean server; // For debugging, are we running physics code on server side? + + qboolean multiplayer; // 1 == multiplayer server + float time; // realtime on host, for reckoning duck timing + float frametime; // Duration of this frame + + vec3_t forward, right, up; // Vectors for angles + // player state + vec3_t origin; // Movement origin. + vec3_t angles; // Movement view angles. + vec3_t oldangles; // Angles before movement view angles were looked at. + vec3_t velocity; // Current movement direction. + vec3_t movedir; // For waterjumping, a forced forward velocity so we can fly over lip of ledge. + vec3_t basevelocity; // Velocity of the conveyor we are standing, e.g. + + // For ducking/dead + vec3_t view_ofs; // Our eye position. + float flDuckTime; // Time we started duck + qboolean bInDuck; // In process of ducking or ducked already? + + // For walking/falling + int flTimeStepSound; // Next time we can play a step sound + int iStepLeft; + + float flFallVelocity; + vec3_t punchangle; + + float flSwimTime; + + float flNextPrimaryAttack; + + int effects; // MUZZLE FLASH, e.g. + + int flags; // FL_ONGROUND, FL_DUCKING, etc. + int usehull; // 0 = regular player hull, 1 = ducked player hull, 2 = point hull + float gravity; // Our current gravity and friction. + float friction; + int oldbuttons; // Buttons last usercmd + float waterjumptime; // Amount of time left in jumping out of water cycle. + qboolean dead; // Are we a dead player? + int deadflag; + int spectator; // Should we use spectator physics model? + int movetype; // Our movement type, NOCLIP, WALK, FLY + + int onground; + int waterlevel; + int watertype; + int oldwaterlevel; + + char sztexturename[256]; + char chtexturetype; + + float maxspeed; + float clientmaxspeed; // Player specific maxspeed + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; + // world state + // Number of entities to clip against. + int numphysent; + physent_t physents[MAX_PHYSENTS]; + // Number of momvement entities (ladders) + int nummoveent; + // just a list of ladders + physent_t moveents[MAX_MOVEENTS]; + + // All things being rendered, for tracing against things you don't actually collide with + int numvisent; + physent_t visents[ MAX_PHYSENTS ]; + + // input to run through physics. + usercmd_t cmd; + + // Trace results for objects we collided with. + int numtouch; + pmtrace_t touchindex[MAX_PHYSENTS]; + + char physinfo[ MAX_PHYSINFO_STRING ]; // Physics info string + + struct movevars_s *movevars; + vec3_t player_mins[ 4 ]; + vec3_t player_maxs[ 4 ]; + + // Common functions + const char *(*PM_Info_ValueForKey) ( const char *s, const char *key ); + void (*PM_Particle)( float *origin, int color, float life, int zpos, int zvel); + int (*PM_TestPlayerPosition) (float *pos, pmtrace_t *ptrace ); + void (*Con_NPrintf)( int idx, char *fmt, ... ); + void (*Con_DPrintf)( char *fmt, ... ); + void (*Con_Printf)( char *fmt, ... ); + double (*Sys_FloatTime)( void ); + void (*PM_StuckTouch)( int hitent, pmtrace_t *ptraceresult ); + int (*PM_PointContents) (float *p, int *truecontents /*filled in if this is non-null*/ ); + int (*PM_TruePointContents) (float *p); + int (*PM_HullPointContents) ( struct hull_s *hull, int num, float *p); + pmtrace_t (*PM_PlayerTrace) (float *start, float *end, int traceFlags, int ignore_pe ); + struct pmtrace_s *(*PM_TraceLine)( float *start, float *end, int flags, int usehulll, int ignore_pe ); + int32 (*RandomLong)( int32 lLow, int32 lHigh ); + float (*RandomFloat)( float flLow, float flHigh ); + int (*PM_GetModelType)( struct model_s *mod ); + void (*PM_GetModelBounds)( struct model_s *mod, float *mins, float *maxs ); + void *(*PM_HullForBsp)( physent_t *pe, float *offset ); + float (*PM_TraceModel)( physent_t *pEnt, float *start, float *end, trace_t *trace ); + int (*COM_FileSize)(char *filename); + byte *(*COM_LoadFile) (char *path, int usehunk, int *pLength); + void (*COM_FreeFile) ( void *buffer ); + char *(*memfgets)( byte *pMemFile, int fileSize, int *pFilePos, char *pBuffer, int bufferSize ); + + // Functions + // Run functions for this frame? + qboolean runfuncs; + void (*PM_PlaySound) ( int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch ); + const char *(*PM_TraceTexture) ( int ground, float *vstart, float *vend ); + void (*PM_PlaybackEventFull) ( int flags, int clientindex, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); + + pmtrace_t (*PM_PlayerTraceEx) (float *start, float *end, int traceFlags, int (*pfnIgnore)( physent_t *pe ) ); + int (*PM_TestPlayerPositionEx) (float *pos, pmtrace_t *ptrace, int (*pfnIgnore)( physent_t *pe ) ); + struct pmtrace_s *(*PM_TraceLineEx)( float *start, float *end, int flags, int usehulll, int (*pfnIgnore)( physent_t *pe ) ); +} playermove_t; + +#endif diff --git a/MiniBase/ValveSDK/pm_info.h b/MiniBase/ValveSDK/pm_info.h new file mode 100644 index 0000000..bc72195 --- /dev/null +++ b/MiniBase/ValveSDK/pm_info.h @@ -0,0 +1,22 @@ +/*** +* +* 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. +* +****/ +// Physics info string definition +#if !defined( PM_INFOH ) +#define PM_INFOH +#pragma once + +#define MAX_PHYSINFO_STRING 256 + +#endif // PM_INFOH \ No newline at end of file diff --git a/MiniBase/ValveSDK/pmtrace.h b/MiniBase/ValveSDK/pmtrace.h new file mode 100644 index 0000000..93e336f --- /dev/null +++ b/MiniBase/ValveSDK/pmtrace.h @@ -0,0 +1,43 @@ +/*** +* +* 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. +* +****/ +#if !defined( PMTRACEH ) +#define PMTRACEH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct +{ + vec3_t normal; + float dist; +} pmplane_t; + +typedef struct pmtrace_s pmtrace_t; + +struct pmtrace_s +{ + qboolean allsolid; // if true, plane is not valid + qboolean startsolid; // if true, the initial point was in a solid area + qboolean inopen, inwater; // End point is in empty space or in water + float fraction; // time completed, 1.0 = didn't hit anything + vec3_t endpos; // final position + pmplane_t plane; // surface normal at impact + int ent; // entity at impact + vec3_t deltavelocity; // Change in player's velocity caused by impact. + // Only run on server. + int hitgroup; +}; + +#endif \ No newline at end of file diff --git a/MiniBase/ValveSDK/progdefs.h b/MiniBase/ValveSDK/progdefs.h new file mode 100644 index 0000000..9e4a397 --- /dev/null +++ b/MiniBase/ValveSDK/progdefs.h @@ -0,0 +1,224 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +#ifndef PROGDEFS_H +#define PROGDEFS_H +#ifdef _WIN32 +#pragma once +#endif + +typedef struct +{ + float time; + float frametime; + float force_retouch; + string_t mapname; + string_t startspot; + float deathmatch; + float coop; + float teamplay; + float serverflags; + float found_secrets; + vec3_t v_forward; + vec3_t v_up; + vec3_t v_right; + float trace_allsolid; + float trace_startsolid; + float trace_fraction; + vec3_t trace_endpos; + vec3_t trace_plane_normal; + float trace_plane_dist; + edict_t *trace_ent; + float trace_inopen; + float trace_inwater; + int trace_hitgroup; + int trace_flags; + int msg_entity; + int cdAudioTrack; + int maxClients; + int maxEntities; + const char *pStringBase; + + void *pSaveData; + vec3_t vecLandmarkOffset; +} globalvars_t; + + +typedef struct entvars_s +{ + string_t classname; + string_t globalname; + + vec3_t origin; + vec3_t oldorigin; + vec3_t velocity; + vec3_t basevelocity; + vec3_t clbasevelocity; // Base velocity that was passed in to server physics so + // client can predict conveyors correctly. Server zeroes it, so we need to store here, too. + vec3_t movedir; + + vec3_t angles; // Model angles + vec3_t avelocity; // angle velocity (degrees per second) + vec3_t punchangle; // auto-decaying view angle adjustment + vec3_t v_angle; // Viewing angle (player only) + + // For parametric entities + vec3_t endpos; + vec3_t startpos; + float impacttime; + float starttime; + + int fixangle; // 0:nothing, 1:force view angles, 2:add avelocity + float idealpitch; + float pitch_speed; + float ideal_yaw; + float yaw_speed; + + int modelindex; + string_t model; + + int viewmodel; // player's viewmodel + int weaponmodel; // what other players see + + vec3_t absmin; // BB max translated to world coord + vec3_t absmax; // BB max translated to world coord + vec3_t mins; // local BB min + vec3_t maxs; // local BB max + vec3_t size; // maxs - mins + + float ltime; + float nextthink; + + int movetype; + int solid; + + int skin; + int body; // sub-model selection for studiomodels + int effects; + + float gravity; // % of "normal" gravity + float friction; // inverse elasticity of MOVETYPE_BOUNCE + + int light_level; + + int sequence; // animation sequence + int gaitsequence; // movement animation sequence for player (0 for none) + float frame; // % playback position in animation sequences (0..255) + float animtime; // world time when frame was set + float framerate; // animation playback rate (-8x to 8x) + byte controller[4]; // bone controller setting (0..255) + byte blending[2]; // blending amount between sub-sequences (0..255) + + float scale; // sprite rendering scale (0..255) + + int rendermode; + float renderamt; + vec3_t rendercolor; + int renderfx; + + float health; + float frags; + int weapons; // bit mask for available weapons + float takedamage; + + int deadflag; + vec3_t view_ofs; // eye position + + int button; + int impulse; + + edict_t *chain; // Entity pointer when linked into a linked list + edict_t *dmg_inflictor; + edict_t *enemy; + edict_t *aiment; // entity pointer when MOVETYPE_FOLLOW + edict_t *owner; + edict_t *groundentity; + + int spawnflags; + int flags; + + int colormap; // lowbyte topcolor, highbyte bottomcolor + int team; + + float max_health; + float teleport_time; + float armortype; + float armorvalue; + int waterlevel; + int watertype; + + string_t target; + string_t targetname; + string_t netname; + string_t message; + + float dmg_take; + float dmg_save; + float dmg; + float dmgtime; + + string_t noise; + string_t noise1; + string_t noise2; + string_t noise3; + + float speed; + float air_finished; + float pain_finished; + float radsuit_finished; + + edict_t *pContainingEntity; + + int playerclass; + float maxspeed; + + float fov; + int weaponanim; + + int pushmsec; + + int bInDuck; + int flTimeStepSound; + int flSwimTime; + int flDuckTime; + int iStepLeft; + float flFallVelocity; + + int gamestate; + + int oldbuttons; + + int groupinfo; + + // For mods + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; + vec3_t vuser1; + vec3_t vuser2; + vec3_t vuser3; + vec3_t vuser4; + edict_t *euser1; + edict_t *euser2; + edict_t *euser3; + edict_t *euser4; +} entvars_t; + + +#endif // PROGDEFS_H \ No newline at end of file diff --git a/MiniBase/ValveSDK/progs.h b/MiniBase/ValveSDK/progs.h new file mode 100644 index 0000000..e166183 --- /dev/null +++ b/MiniBase/ValveSDK/progs.h @@ -0,0 +1,82 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +#ifndef PROGS_H +#define PROGS_H + +#include "progdefs.h" + +// 16 simultaneous events, max +#define MAX_EVENT_QUEUE 64 + +#define DEFAULT_EVENT_RESENDS 1 + +#include "event_flags.h" + +typedef struct event_info_s event_info_t; + +#include "event_args.h" + +struct event_info_s +{ + unsigned short index; // 0 implies not in use + + short packet_index; // Use data from state info for entity in delta_packet . -1 implies separate info based on event + // parameter signature + short entity_index; // The edict this event is associated with + + float fire_time; // if non-zero, the time when the event should be fired ( fixed up on the client ) + + event_args_t args; + +// CLIENT ONLY + int flags; // Reliable or not, etc. + +}; + +typedef struct event_state_s event_state_t; + +struct event_state_s +{ + struct event_info_s ei[ MAX_EVENT_QUEUE ]; +}; + +#if !defined( ENTITY_STATEH ) +#include "entity_state.h" +#endif + +#if !defined( EDICT_H ) +#include "edict.h" +#endif + +#define STRUCT_FROM_LINK(l,t,m) ((t *)((byte *)l - (int)&(((t *)0)->m))) +#define EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,edict_t,area) + +//============================================================================ + +extern char *pr_strings; +extern globalvars_t gGlobalVariables; + +//============================================================================ + +edict_t *ED_Alloc (void); +void ED_Free (edict_t *ed); +void ED_LoadFromFile (char *data); + +edict_t *EDICT_NUM(int n); +int NUM_FOR_EDICT(const edict_t *e); + +#define PROG_TO_EDICT(e) ((edict_t *)((byte *)sv.edicts + e)) + +#endif // PROGS_H \ No newline at end of file diff --git a/MiniBase/ValveSDK/r_efx.h b/MiniBase/ValveSDK/r_efx.h new file mode 100644 index 0000000..e57a70c --- /dev/null +++ b/MiniBase/ValveSDK/r_efx.h @@ -0,0 +1,197 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +#if !defined ( R_EFXH ) +#define R_EFXH +#ifdef _WIN32 +#pragma once +#endif + +// particle_t +#if !defined( PARTICLEDEFH ) +#include "particledef.h" +#endif + +// BEAM +#if !defined( BEAMDEFH ) +#include "beamdef.h" +#endif + +// dlight_t +#if !defined ( DLIGHTH ) +#include "dlight.h" +#endif + +// cl_entity_t +#if !defined( CL_ENTITYH ) +#include "cl_entity.h" +#endif + +/* +// FOR REFERENCE, These are the built-in tracer colors. Note, color 4 is the one +// that uses the tracerred/tracergreen/tracerblue and traceralpha cvar settings +color24 gTracerColors[] = +{ + { 255, 255, 255 }, // White + { 255, 0, 0 }, // Red + { 0, 255, 0 }, // Green + { 0, 0, 255 }, // Blue + { 0, 0, 0 }, // Tracer default, filled in from cvars, etc. + { 255, 167, 17 }, // Yellow-orange sparks + { 255, 130, 90 }, // Yellowish streaks (garg) + { 55, 60, 144 }, // Blue egon streak + { 255, 130, 90 }, // More Yellowish streaks (garg) + { 255, 140, 90 }, // More Yellowish streaks (garg) + { 200, 130, 90 }, // More red streaks (garg) + { 255, 120, 70 }, // Darker red streaks (garg) +}; +*/ + +// Temporary entity array +#define TENTPRIORITY_LOW 0 +#define TENTPRIORITY_HIGH 1 + +// TEMPENTITY flags +#define FTENT_NONE 0x00000000 +#define FTENT_SINEWAVE 0x00000001 +#define FTENT_GRAVITY 0x00000002 +#define FTENT_ROTATE 0x00000004 +#define FTENT_SLOWGRAVITY 0x00000008 +#define FTENT_SMOKETRAIL 0x00000010 +#define FTENT_COLLIDEWORLD 0x00000020 +#define FTENT_FLICKER 0x00000040 +#define FTENT_FADEOUT 0x00000080 +#define FTENT_SPRANIMATE 0x00000100 +#define FTENT_HITSOUND 0x00000200 +#define FTENT_SPIRAL 0x00000400 +#define FTENT_SPRCYCLE 0x00000800 +#define FTENT_COLLIDEALL 0x00001000 // will collide with world and slideboxes +#define FTENT_PERSIST 0x00002000 // tent is not removed when unable to draw +#define FTENT_COLLIDEKILL 0x00004000 // tent is removed upon collision with anything +#define FTENT_PLYRATTACHMENT 0x00008000 // tent is attached to a player (owner) +#define FTENT_SPRANIMATELOOP 0x00010000 // animating sprite doesn't die when last frame is displayed +#define FTENT_SPARKSHOWER 0x00020000 +#define FTENT_NOMODEL 0x00040000 // Doesn't have a model, never try to draw ( it just triggers other things ) +#define FTENT_CLIENTCUSTOM 0x00080000 // Must specify callback. Callback function is responsible for killing tempent and updating fields ( unless other flags specify how to do things ) + +typedef struct tempent_s +{ + int flags; + float die; + float frameMax; + float x; + float y; + float z; + float fadeSpeed; + float bounceFactor; + int hitSound; + void ( *hitcallback ) ( struct tempent_s *ent, struct pmtrace_s *ptr ); + void ( *callback ) ( struct tempent_s *ent, float frametime, float currenttime ); + struct tempent_s *next; + int priority; + short clientIndex; // if attached, this is the index of the client to stick to + // if COLLIDEALL, this is the index of the client to ignore + // TENTS with FTENT_PLYRATTACHMENT MUST set the clientindex! + + vec3_t tentOffset; // if attached, client origin + tentOffset = tent origin. + cl_entity_t entity; + + // baseline.origin - velocity + // baseline.renderamt - starting fadeout intensity + // baseline.angles - angle velocity +} TEMPENTITY; + +typedef struct efx_api_s efx_api_t; + +struct efx_api_s +{ + particle_t *( *R_AllocParticle ) ( void ( *callback ) ( struct particle_s *particle, float frametime ) ); + void ( *R_BlobExplosion ) ( float * org ); + void ( *R_Blood ) ( float * org, float * dir, int pcolor, int speed ); + void ( *R_BloodSprite ) ( float * org, int colorindex, int modelIndex, int modelIndex2, float size ); + void ( *R_BloodStream ) ( float * org, float * dir, int pcolor, int speed ); + void ( *R_BreakModel ) ( float *pos, float *size, float *dir, float random, float life, int count, int modelIndex, char flags ); + void ( *R_Bubbles ) ( float * mins, float * maxs, float height, int modelIndex, int count, float speed ); + void ( *R_BubbleTrail ) ( float * start, float * end, float height, int modelIndex, int count, float speed ); + void ( *R_BulletImpactParticles ) ( float * pos ); + void ( *R_EntityParticles ) ( struct cl_entity_s *ent ); + void ( *R_Explosion ) ( float *pos, int model, float scale, float framerate, int flags ); + void ( *R_FizzEffect ) ( struct cl_entity_s *pent, int modelIndex, int density ); + void ( *R_FireField ) ( float * org, int radius, int modelIndex, int count, int flags, float life ); + void ( *R_FlickerParticles ) ( float * org ); + void ( *R_FunnelSprite ) ( float *org, int modelIndex, int reverse ); + void ( *R_Implosion ) ( float * end, float radius, int count, float life ); + void ( *R_LargeFunnel ) ( float * org, int reverse ); + void ( *R_LavaSplash ) ( float * org ); + void ( *R_MultiGunshot ) ( float * org, float * dir, float * noise, int count, int decalCount, int *decalIndices ); + void ( *R_MuzzleFlash ) ( float *pos1, int type ); + void ( *R_ParticleBox ) ( float *mins, float *maxs, unsigned char r, unsigned char g, unsigned char b, float life ); + void ( *R_ParticleBurst ) ( float * pos, int size, int color, float life ); + void ( *R_ParticleExplosion ) ( float * org ); + void ( *R_ParticleExplosion2 ) ( float * org, int colorStart, int colorLength ); + void ( *R_ParticleLine ) ( float * start, float *end, unsigned char r, unsigned char g, unsigned char b, float life ); + void ( *R_PlayerSprites ) ( int client, int modelIndex, int count, int size ); + void ( *R_Projectile ) ( float * origin, float * velocity, int modelIndex, int life, int owner, void (*hitcallback)( struct tempent_s *ent, struct pmtrace_s *ptr ) ); + void ( *R_RicochetSound ) ( float * pos ); + void ( *R_RicochetSprite ) ( float *pos, struct model_s *pmodel, float duration, float scale ); + void ( *R_RocketFlare ) ( float *pos ); + void ( *R_RocketTrail ) ( float * start, float * end, int type ); + void ( *R_RunParticleEffect ) ( float * org, float * dir, int color, int count ); + void ( *R_ShowLine ) ( float * start, float * end ); + void ( *R_SparkEffect ) ( float *pos, int count, int velocityMin, int velocityMax ); + void ( *R_SparkShower ) ( float *pos ); + void ( *R_SparkStreaks ) ( float * pos, int count, int velocityMin, int velocityMax ); + void ( *R_Spray ) ( float * pos, float * dir, int modelIndex, int count, int speed, int spread, int rendermode ); + void ( *R_Sprite_Explode ) ( TEMPENTITY *pTemp, float scale, int flags ); + void ( *R_Sprite_Smoke ) ( TEMPENTITY *pTemp, float scale ); + void ( *R_Sprite_Spray ) ( float * pos, float * dir, int modelIndex, int count, int speed, int iRand ); + void ( *R_Sprite_Trail ) ( int type, float * start, float * end, int modelIndex, int count, float life, float size, float amplitude, int renderamt, float speed ); + void ( *R_Sprite_WallPuff ) ( TEMPENTITY *pTemp, float scale ); + void ( *R_StreakSplash ) ( float * pos, float * dir, int color, int count, float speed, int velocityMin, int velocityMax ); + void ( *R_TracerEffect ) ( float * start, float * end ); + void ( *R_UserTracerParticle ) ( float * org, float * vel, float life, int colorIndex, float length, unsigned char deathcontext, void ( *deathfunc)( struct particle_s *particle ) ); + particle_t *( *R_TracerParticles ) ( float * org, float * vel, float life ); + void ( *R_TeleportSplash ) ( float * org ); + void ( *R_TempSphereModel ) ( float *pos, float speed, float life, int count, int modelIndex ); + TEMPENTITY *( *R_TempModel ) ( float *pos, float *dir, float *angles, float life, int modelIndex, int soundtype ); + TEMPENTITY *( *R_DefaultSprite ) ( float *pos, int spriteIndex, float framerate ); + TEMPENTITY *( *R_TempSprite ) ( float *pos, float *dir, float scale, int modelIndex, int rendermode, int renderfx, float a, float life, int flags ); + int ( *Draw_DecalIndex ) ( int id ); + int ( *Draw_DecalIndexFromName ) ( char *name ); + void ( *R_DecalShoot ) ( int textureIndex, int entity, int modelIndex, float * position, int flags ); + void ( *R_AttachTentToPlayer ) ( int client, int modelIndex, float zoffset, float life ); + void ( *R_KillAttachedTents ) ( int client ); + BEAM *( *R_BeamCirclePoints ) ( int type, float * start, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamEntPoint ) ( int startEnt, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamEnts ) ( int startEnt, int endEnt, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamFollow ) ( int startEnt, int modelIndex, float life, float width, float r, float g, float b, float brightness ); + void ( *R_BeamKill ) ( int deadEntity ); + BEAM *( *R_BeamLightning ) ( float * start, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed ); + BEAM *( *R_BeamPoints ) ( float * start, float * end, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + BEAM *( *R_BeamRing ) ( int startEnt, int endEnt, int modelIndex, float life, float width, float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b ); + dlight_t *( *CL_AllocDlight ) ( int key ); + dlight_t *( *CL_AllocElight ) ( int key ); + TEMPENTITY *( *CL_TempEntAlloc ) ( float * org, struct model_s *model ); + TEMPENTITY *( *CL_TempEntAllocNoModel ) ( float * org ); + TEMPENTITY *( *CL_TempEntAllocHigh ) ( float * org, struct model_s *model ); + TEMPENTITY *( *CL_TentEntAllocCustom ) ( float *origin, struct model_s *model, int high, void ( *callback ) ( struct tempent_s *ent, float frametime, float currenttime ) ); + void ( *R_GetPackedColor ) ( short *packed, short color ); + short ( *R_LookupColor ) ( unsigned char r, unsigned char g, unsigned char b ); + void ( *R_DecalRemoveAll ) ( int textureIndex ); //textureIndex points to the decal index in the array, not the actual texture index. + void ( *R_FireCustomDecal ) ( int textureIndex, int entity, int modelIndex, float * position, int flags, float scale ); +}; + +extern efx_api_t efx; + +#endif diff --git a/MiniBase/ValveSDK/r_studioint.h b/MiniBase/ValveSDK/r_studioint.h new file mode 100644 index 0000000..3570993 --- /dev/null +++ b/MiniBase/ValveSDK/r_studioint.h @@ -0,0 +1,144 @@ +#if !defined( R_STUDIOINT_H ) +#define R_STUDIOINT_H +#if defined( _WIN32 ) +#pragma once +#endif + +#define STUDIO_INTERFACE_VERSION 1 + +typedef struct engine_studio_api_s +{ + // Allocate number*size bytes and zero it + void *( *Mem_Calloc ) ( int number, size_t size ); + // Check to see if pointer is in the cache + void *( *Cache_Check ) ( struct cache_user_s *c ); + // Load file into cache ( can be swapped out on demand ) + void ( *LoadCacheFile ) ( char *path, struct cache_user_s *cu ); + // Retrieve model pointer for the named model + struct model_s *( *Mod_ForName ) ( const char *name, int crash_if_missing ); + // Retrieve pointer to studio model data block from a model + void *( *Mod_Extradata ) ( struct model_s *mod ); + // Retrieve indexed model from client side model precache list + struct model_s *( *GetModelByIndex ) ( int index ); + // Get entity that is set for rendering + struct cl_entity_s * ( *GetCurrentEntity ) ( void ); + // Get referenced player_info_t + struct player_info_s *( *PlayerInfo ) ( int index ); + // Get most recently received player state data from network system + struct entity_state_s *( *GetPlayerState ) ( int index ); + // Get viewentity + struct cl_entity_s * ( *GetViewEntity ) ( void ); + // Get current frame count, and last two timestampes on client + void ( *GetTimes ) ( int *framecount, double *current, double *old ); + // Get a pointer to a cvar by name + struct cvar_s *( *GetCvar ) ( const char *name ); + // Get current render origin and view vectors ( up, right and vpn ) + void ( *GetViewInfo ) ( float *origin, float *upv, float *rightv, float *vpnv ); + // Get sprite model used for applying chrome effect + struct model_s *( *GetChromeSprite ) ( void ); + // Get model counters so we can incement instrumentation + void ( *GetModelCounters ) ( int **s, int **a ); + // Get software scaling coefficients + void ( *GetAliasScale ) ( float *x, float *y ); + + // Get bone, light, alias, and rotation matrices + float ****( *StudioGetBoneTransform ) ( void ); + float ****( *StudioGetLightTransform )( void ); + float ***( *StudioGetAliasTransform ) ( void ); + float ***( *StudioGetRotationMatrix ) ( void ); + + // Set up body part, and get submodel pointers + void ( *StudioSetupModel ) ( int bodypart, void **ppbodypart, void **ppsubmodel ); + // Check if entity's bbox is in the view frustum + int ( *StudioCheckBBox ) ( void ); + // Apply lighting effects to model + void ( *StudioDynamicLight ) ( struct cl_entity_s *ent, struct alight_s *plight ); + void ( *StudioEntityLight ) ( struct alight_s *plight ); + void ( *StudioSetupLighting ) ( struct alight_s *plighting ); + + // Draw mesh vertices + void ( *StudioDrawPoints ) ( void ); + + // Draw hulls around bones + void ( *StudioDrawHulls ) ( void ); + // Draw bbox around studio models + void ( *StudioDrawAbsBBox ) ( void ); + // Draws bones + void ( *StudioDrawBones ) ( void ); + // Loads in appropriate texture for model + void ( *StudioSetupSkin ) ( void *ptexturehdr, int index ); + // Sets up for remapped colors + void ( *StudioSetRemapColors ) ( int top, int bottom ); + // Set's player model and returns model pointer + struct model_s *( *SetupPlayerModel ) ( int index ); + // Fires any events embedded in animation + void ( *StudioClientEvents ) ( void ); + // Retrieve/set forced render effects flags + int ( *GetForceFaceFlags ) ( void ); + void ( *SetForceFaceFlags ) ( int flags ); + // Tell engine the value of the studio model header + void ( *StudioSetHeader ) ( void *header ); + // Tell engine which model_t * is being renderered + void ( *SetRenderModel ) ( struct model_s *model ); + + // Final state setup and restore for rendering + void ( *SetupRenderer ) ( int rendermode ); + void ( *RestoreRenderer ) ( void ); + + // Set render origin for applying chrome effect + void ( *SetChromeOrigin ) ( void ); + + // True if using D3D/OpenGL + int ( *IsHardware ) ( void ); + + // Only called by hardware interface + void ( *GL_StudioDrawShadow ) ( void ); + void ( *GL_SetRenderMode ) ( int mode ); + + void ( *StudioSetRenderamt ) (int iRenderamt); //!!!CZERO added for rendering glass on viewmodels + void ( *StudioSetCullState ) ( int iCull ); + void ( *StudioRenderShadow ) ( int iSprite, float *p1, float *p2, float *p3, float *p4 ); +} engine_studio_api_t; + +typedef struct server_studio_api_s +{ + // Allocate number*size bytes and zero it + void *( *Mem_Calloc ) ( int number, size_t size ); + // Check to see if pointer is in the cache + void *( *Cache_Check ) ( struct cache_user_s *c ); + // Load file into cache ( can be swapped out on demand ) + void ( *LoadCacheFile ) ( char *path, struct cache_user_s *cu ); + // Retrieve pointer to studio model data block from a model + void *( *Mod_Extradata ) ( struct model_s *mod ); +} server_studio_api_t; + + +// client blending +typedef struct r_studio_interface_s +{ + int version; + int ( *StudioDrawModel ) ( int flags ); + int ( *StudioDrawPlayer ) ( int flags, struct entity_state_s *pplayer ); +} r_studio_interface_t; + +extern r_studio_interface_t *pStudioAPI; + +// server blending +#define SV_BLENDING_INTERFACE_VERSION 1 + +typedef struct sv_blending_interface_s +{ + int version; + + void ( *SV_StudioSetupBones ) ( struct model_s *pModel, + float frame, + int sequence, + const vec3_t angles, + const vec3_t origin, + const byte *pcontroller, + const byte *pblending, + int iBone, + const edict_t *pEdict ); +} sv_blending_interface_t; + +#endif // R_STUDIOINT_H diff --git a/MiniBase/ValveSDK/ref_params.h b/MiniBase/ValveSDK/ref_params.h new file mode 100644 index 0000000..90eb03f --- /dev/null +++ b/MiniBase/ValveSDK/ref_params.h @@ -0,0 +1,75 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +#if !defined( REF_PARAMSH ) +#define REF_PARAMSH + +typedef struct ref_params_s +{ + // Output + float vieworg[3]; + float viewangles[3]; + + float forward[3]; + float right[3]; + float up[3]; + + // Client frametime; + float frametime; + // Client time + float time; + + // Misc + int intermission; + int paused; + int spectator; + int onground; + int waterlevel; + + float simvel[3]; + float simorg[3]; + + float viewheight[3]; + float idealpitch; + + float cl_viewangles[3]; + + int health; + float crosshairangle[3]; + float viewsize; + + float punchangle[3]; + int maxclients; + int viewentity; + int playernum; + int max_entities; + int demoplayback; + int hardware; + + int smoothing; + + // Last issued usercmd + struct usercmd_s *cmd; + + // Movevars + struct movevars_s *movevars; + + int viewport[4]; // the viewport coordinates x ,y , width, height + + int nextView; // the renderer calls ClientDLL_CalcRefdef() and Renderview + // so long in cycles until this value is 0 (multiple views) + int onlyClientDraw; // if !=0 nothing is drawn by the engine except clientDraw functions +} ref_params_t; + +#endif // !REF_PARAMSH diff --git a/MiniBase/ValveSDK/screenfade.h b/MiniBase/ValveSDK/screenfade.h new file mode 100644 index 0000000..62c0d25 --- /dev/null +++ b/MiniBase/ValveSDK/screenfade.h @@ -0,0 +1,24 @@ +//========= Copyright 1996-2002, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#if !defined( SCREENFADEH ) +#define SCREENFADEH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct screenfade_s +{ + float fadeSpeed; // How fast to fade (tics / second) (+ fade in, - fade out) + float fadeEnd; // When the fading hits maximum + float fadeTotalEnd; // Total End Time of the fade (used for FFADE_OUT) + float fadeReset; // When to reset to not fading (for fadeout and hold) + byte fader, fadeg, fadeb, fadealpha; // Fade color + int fadeFlags; // Fading flags +} screenfade_t; + +#endif // !SCREENFADEH diff --git a/MiniBase/ValveSDK/steamtypes.h b/MiniBase/ValveSDK/steamtypes.h new file mode 100644 index 0000000..1606616 --- /dev/null +++ b/MiniBase/ValveSDK/steamtypes.h @@ -0,0 +1,177 @@ +//========= Copyright � 1996-2008, Valve LLC, All rights reserved. ============ +// +// Purpose: +// +//============================================================================= + +#ifndef STEAMTYPES_H +#define STEAMTYPES_H +#ifdef _WIN32 +#pragma once +#endif + +// Steam-specific types. Defined here so this header file can be included in other code bases. +#if defined( __GNUC__ ) && !defined(POSIX) + #if __GNUC__ < 4 + #error "Steamworks requires GCC 4.X (4.2 or 4.4 have been tested)" + #endif + #define POSIX 1 +#endif + +#if defined(__x86_64__) || defined(_WIN64) +#define X64BITS +#endif + +// Make sure VALVE_BIG_ENDIAN gets set on PS3, may already be set previously in Valve internal code. +#if !defined(VALVE_BIG_ENDIAN) && defined(_PS3) +#define VALVE_BIG_ENDIAN +#endif + +typedef unsigned char uint8; +typedef signed char int8; + +#if defined( _WIN32 ) + +typedef __int16 int16; +typedef unsigned __int16 uint16; +typedef __int32 int32; +typedef unsigned __int32 uint32; +typedef __int64 int64; +typedef unsigned __int64 uint64; + +#ifdef X64BITS +typedef __int64 intp; // intp is an integer that can accomodate a pointer +typedef unsigned __int64 uintp; // (ie, sizeof(intp) >= sizeof(int) && sizeof(intp) >= sizeof(void *) +#else +typedef __int32 intp; +typedef unsigned __int32 uintp; +#endif + +#else // _WIN32 + +typedef short int16; +typedef unsigned short uint16; +typedef int int32; +typedef unsigned int uint32; +typedef long long int64; +typedef unsigned long long uint64; +#ifdef X64BITS +typedef long long intp; +typedef unsigned long long uintp; +#else +typedef int intp; +typedef unsigned int uintp; +#endif + +#endif // else _WIN32 + +#ifdef __cplusplus +const int k_cubSaltSize = 8; +#else +#define k_cubSaltSize 8 +#endif + +typedef uint8 Salt_t[ k_cubSaltSize ]; + +//----------------------------------------------------------------------------- +// GID (GlobalID) stuff +// This is a globally unique identifier. It's guaranteed to be unique across all +// racks and servers for as long as a given universe persists. +//----------------------------------------------------------------------------- +// NOTE: for GID parsing/rendering and other utils, see gid.h +typedef uint64 GID_t; + +#ifdef __cplusplus +const GID_t k_GIDNil = 0xfffffffffffffffful; +#else +#define k_GIDNil 0xffffffffffffffffull; +#endif + +// For convenience, we define a number of types that are just new names for GIDs +typedef GID_t JobID_t; // Each Job has a unique ID +typedef GID_t TxnID_t; // Each financial transaction has a unique ID + +#ifdef __cplusplus +const GID_t k_TxnIDNil = k_GIDNil; +const GID_t k_TxnIDUnknown = 0; +#else +#define k_TxnIDNil k_GIDNil; +#define k_TxnIDUnknown 0; +#endif + +// this is baked into client messages and interfaces as an int, +// make sure we never break this. +typedef uint32 PackageId_t; +#ifdef __cplusplus +const PackageId_t k_uPackageIdFreeSub = 0x0; +const PackageId_t k_uPackageIdInvalid = 0xFFFFFFFF; +#else +#define k_uPackageIdFreeSub 0x0; +#define k_uPackageIdInvalid 0xFFFFFFFF; +#endif + +// this is baked into client messages and interfaces as an int, +// make sure we never break this. +typedef uint32 AppId_t; +#ifdef __cplusplus +const AppId_t k_uAppIdInvalid = 0x0; +#else +#define k_uAppIdInvalid 0x0; +#endif + +typedef uint64 AssetClassId_t; +#ifdef __cplusplus +const AssetClassId_t k_ulAssetClassIdInvalid = 0x0; +#else +#define k_ulAssetClassIdInvalid 0x0; +#endif + +typedef uint32 PhysicalItemId_t; +#ifdef __cplusplus +const PhysicalItemId_t k_uPhysicalItemIdInvalid = 0x0; +#else +#define k_uPhysicalItemIdInvalid 0x0; +#endif + + +// this is baked into client messages and interfaces as an int, +// make sure we never break this. AppIds and DepotIDs also presently +// share the same namespace, but since we'd like to change that in the future +// I've defined it seperately here. +typedef uint32 DepotId_t; +#ifdef __cplusplus +const DepotId_t k_uDepotIdInvalid = 0x0; +#else +#define k_uDepotIdInvalid 0x0; +#endif + +// RTime32 +// We use this 32 bit time representing real world time. +// It offers 1 second resolution beginning on January 1, 1970 (Unix time) +typedef uint32 RTime32; + +typedef uint32 CellID_t; +#ifdef __cplusplus +const CellID_t k_uCellIDInvalid = 0xFFFFFFFF; +#else +#define k_uCellIDInvalid 0x0; +#endif + +// handle to a Steam API call +typedef uint64 SteamAPICall_t; +#ifdef __cplusplus +const SteamAPICall_t k_uAPICallInvalid = 0x0; +#else +#define k_uAPICallInvalid 0x0; +#endif + +typedef uint32 AccountID_t; + +typedef uint32 PartnerId_t; +#ifdef __cplusplus +const PartnerId_t k_uPartnerIdInvalid = 0; +#else +#define k_uPartnerIdInvalid 0x0; +#endif + +#endif // STEAMTYPES_H diff --git a/MiniBase/ValveSDK/studio.h b/MiniBase/ValveSDK/studio.h new file mode 100644 index 0000000..c8a168b --- /dev/null +++ b/MiniBase/ValveSDK/studio.h @@ -0,0 +1,368 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ + + + + +#ifndef _STUDIO_H_ +#define _STUDIO_H_ + +/* +============================================================================== + +STUDIO MODELS + +Studio models are position independent, so the cache manager can move them. +============================================================================== +*/ + + +#define MAXSTUDIOTRIANGLES 20000 // TODO: tune this +#define MAXSTUDIOVERTS 2048 // TODO: tune this +#define MAXSTUDIOSEQUENCES 2048 // total animation sequences -- KSH incremented +#define MAXSTUDIOSKINS 100 // total textures +#define MAXSTUDIOSRCBONES 512 // bones allowed at source movement +#define MAXSTUDIOBONES 128 // total bones actually used +#define MAXSTUDIOMODELS 32 // sub-models per model +#define MAXSTUDIOBODYPARTS 32 +#define MAXSTUDIOGROUPS 16 +#define MAXSTUDIOANIMATIONS 2048 +#define MAXSTUDIOMESHES 256 +#define MAXSTUDIOEVENTS 1024 +#define MAXSTUDIOPIVOTS 256 +#define MAXSTUDIOCONTROLLERS 8 + +typedef struct +{ + int id; + int version; + + char name[64]; + int length; + + vec3_t eyeposition; // ideal eye position + vec3_t min; // ideal movement hull size + vec3_t max; + + vec3_t bbmin; // clipping bounding box + vec3_t bbmax; + + int flags; + + int numbones; // bones + int boneindex; + + int numbonecontrollers; // bone controllers + int bonecontrollerindex; + + int numhitboxes; // complex bounding boxes + int hitboxindex; + + int numseq; // animation sequences + int seqindex; + + int numseqgroups; // demand loaded sequences + int seqgroupindex; + + int numtextures; // raw textures + int textureindex; + int texturedataindex; + + int numskinref; // replaceable textures + int numskinfamilies; + int skinindex; + + int numbodyparts; + int bodypartindex; + + int numattachments; // queryable attachable points + int attachmentindex; + + int soundtable; + int soundindex; + int soundgroups; + int soundgroupindex; + + int numtransitions; // animation node to animation node transition graph + int transitionindex; +} studiohdr_t; + +// header for demand loaded sequence group data +typedef struct +{ + int id; + int version; + + char name[64]; + int length; +} studioseqhdr_t; + +// bones +typedef struct +{ + char name[32]; // bone name for symbolic links + int parent; // parent bone + int flags; // ?? + int bonecontroller[6]; // bone controller index, -1 == none + float value[6]; // default DoF values + float scale[6]; // scale for delta DoF values +} mstudiobone_t; + + +// bone controllers +typedef struct +{ + int bone; // -1 == 0 + int type; // X, Y, Z, XR, YR, ZR, M + float start; + float end; + int rest; // byte index value at rest + int index; // 0-3 user set controller, 4 mouth +} mstudiobonecontroller_t; + +// intersection boxes +typedef struct +{ + int bone; + int group; // intersection group + vec3_t bbmin; // bounding box + vec3_t bbmax; +} mstudiobbox_t; + +#if !defined( CACHE_USER ) && !defined( QUAKEDEF_H ) +#define CACHE_USER +typedef struct cache_user_s +{ + void *data; +} cache_user_t; +#endif + +// +// demand loaded sequence groups +// +typedef struct +{ + char label[32]; // textual name + char name[64]; // file name + int32 unused1; // was "cache" - index pointer + int unused2; // was "data" - hack for group 0 +} mstudioseqgroup_t; + +// sequence descriptions +typedef struct +{ + char label[32]; // sequence label + + float fps; // frames per second + int flags; // looping/non-looping flags + + int activity; + int actweight; + + int numevents; + int eventindex; + + int numframes; // number of frames per sequence + + int numpivots; // number of foot pivots + int pivotindex; + + int motiontype; + int motionbone; + vec3_t linearmovement; + int automoveposindex; + int automoveangleindex; + + vec3_t bbmin; // per sequence bounding box + vec3_t bbmax; + + int numblends; + int animindex; // mstudioanim_t pointer relative to start of sequence group data + // [blend][bone][X, Y, Z, XR, YR, ZR] + + int blendtype[2]; // X, Y, Z, XR, YR, ZR + float blendstart[2]; // starting value + float blendend[2]; // ending value + int blendparent; + + int seqgroup; // sequence group for demand loading + + int entrynode; // transition node at entry + int exitnode; // transition node at exit + int nodeflags; // transition rules + + int nextseq; // auto advancing sequences +} mstudioseqdesc_t; + +// events +#include "studio_event.h" +/* +typedef struct +{ + int frame; + int event; + int type; + char options[64]; +} mstudioevent_t; +*/ + +// pivots +typedef struct +{ + vec3_t org; // pivot point + int start; + int end; +} mstudiopivot_t; + +// attachment +typedef struct +{ + char name[32]; + int type; + int bone; + vec3_t org; // attachment point + vec3_t vectors[3]; +} mstudioattachment_t; + +typedef struct +{ + unsigned short offset[6]; +} mstudioanim_t; + +// animation frames +typedef union +{ + struct { + byte valid; + byte total; + } num; + short value; +} mstudioanimvalue_t; + + + +// body part index +typedef struct +{ + char name[64]; + int nummodels; + int base; + int modelindex; // index into models array +} mstudiobodyparts_t; + + + +// skin info +typedef struct +{ + char name[64]; + int flags; + int width; + int height; + int index; +} mstudiotexture_t; + + +// skin families +// short index[skinfamilies][skinref] + +// studio models +typedef struct +{ + char name[64]; + + int type; + + float boundingradius; + + int nummesh; + int meshindex; + + int numverts; // number of unique vertices + int vertinfoindex; // vertex bone info + int vertindex; // vertex vec3_t + int numnorms; // number of unique surface normals + int norminfoindex; // normal bone info + int normindex; // normal vec3_t + + int numgroups; // deformation groups + int groupindex; +} mstudiomodel_t; + + +// vec3_t boundingbox[model][bone][2]; // complex intersection info + + +// meshes +typedef struct +{ + int numtris; + int triindex; + int skinref; + int numnorms; // per mesh normals + int normindex; // normal vec3_t +} mstudiomesh_t; + +// triangles +#if 0 +typedef struct +{ + short vertindex; // index into vertex array + short normindex; // index into normal array + short s,t; // s,t position on skin +} mstudiotrivert_t; +#endif + +// lighting options +#define STUDIO_NF_FLATSHADE 0x0001 +#define STUDIO_NF_CHROME 0x0002 +#define STUDIO_NF_FULLBRIGHT 0x0004 +#define STUDIO_NF_NOMIPS 0x0008 +#define STUDIO_NF_ALPHA 0x0010 +#define STUDIO_NF_ADDITIVE 0x0020 +#define STUDIO_NF_MASKED 0x0040 + +// motion flags +#define STUDIO_X 0x0001 +#define STUDIO_Y 0x0002 +#define STUDIO_Z 0x0004 +#define STUDIO_XR 0x0008 +#define STUDIO_YR 0x0010 +#define STUDIO_ZR 0x0020 +#define STUDIO_LX 0x0040 +#define STUDIO_LY 0x0080 +#define STUDIO_LZ 0x0100 +#define STUDIO_AX 0x0200 +#define STUDIO_AY 0x0400 +#define STUDIO_AZ 0x0800 +#define STUDIO_AXR 0x1000 +#define STUDIO_AYR 0x2000 +#define STUDIO_AZR 0x4000 +#define STUDIO_TYPES 0x7FFF +#define STUDIO_RLOOP 0x8000 // controller that wraps shortest distance + +// sequence flags +#define STUDIO_LOOPING 0x0001 + +// bone flags +#define STUDIO_HAS_NORMALS 0x0001 +#define STUDIO_HAS_VERTICES 0x0002 +#define STUDIO_HAS_BBOX 0x0004 +#define STUDIO_HAS_CHROME 0x0008 // if any of the textures have chrome on them + +#define RAD_TO_STUDIO (32768.0/M_PI) +#define STUDIO_TO_RAD (M_PI/32768.0) + +#endif diff --git a/MiniBase/ValveSDK/studio_event.h b/MiniBase/ValveSDK/studio_event.h new file mode 100644 index 0000000..c79c210 --- /dev/null +++ b/MiniBase/ValveSDK/studio_event.h @@ -0,0 +1,29 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +#if !defined( STUDIO_EVENTH ) +#define STUDIO_EVENTH +#ifdef _WIN32 +#pragma once +#endif + +typedef struct mstudioevent_s +{ + int frame; + int event; + int type; + char options[64]; +} mstudioevent_t; + +#endif // STUDIO_EVENTH diff --git a/MiniBase/ValveSDK/tier1/UtlMemory.h b/MiniBase/ValveSDK/tier1/UtlMemory.h new file mode 100644 index 0000000..10766ed --- /dev/null +++ b/MiniBase/ValveSDK/tier1/UtlMemory.h @@ -0,0 +1,388 @@ +//=========== (C) Copyright 1999 Valve, L.L.C. All rights reserved. =========== +// +// The copyright to the contents herein is the property of Valve, L.L.C. +// The contents may be used and/or copied only with the written permission of +// Valve, L.L.C., or in accordance with the terms and conditions stipulated in +// the agreement/contract under which the contents have been supplied. +// +// $Header: $ +// $NoKeywords: $ +// +// A growable memory class. +//============================================================================= + +#ifndef UTLMEMORY_H +#define UTLMEMORY_H + +#ifdef _WIN32 +#pragma once +#endif + +#include +#include +#include +#include +#include + +#pragma warning (disable:4100) +#pragma warning (disable:4514) + +//----------------------------------------------------------------------------- +// Methods to invoke the constructor, copy constructor, and destructor +//----------------------------------------------------------------------------- + +template +inline void Construct( T* pMemory ) +{ + ::new( pMemory ) T; +} + +template +inline void CopyConstruct( T* pMemory, T const& src ) +{ + ::new( pMemory ) T(src); +} + +template +inline void Destruct( T* pMemory ) +{ + pMemory->~T(); + +#ifdef _DEBUG + memset( pMemory, 0xDD, sizeof(T) ); +#endif +} + + + + + + + + + + + + + + + + + + +//----------------------------------------------------------------------------- +// The CUtlMemory class: +// A growable memory class which doubles in size by default. +//----------------------------------------------------------------------------- +template< class T > +class CUtlMemory +{ +public: + // constructor, destructor + CUtlMemory( int nGrowSize = 0, int nInitSize = 0 ); + CUtlMemory( T* pMemory, int numElements ); + CUtlMemory( const T* pMemory, int numElements ); + ~CUtlMemory(); + + // element access + T& operator[]( int i ); + T const& operator[]( int i ) const; + T& Element( int i ); + T const& Element( int i ) const; + + // Can we use this index? + bool IsIdxValid( int i ) const; + + // Gets the base address (can change when adding elements!) + T* Base(); + T const* Base() const; + + // Attaches the buffer to external memory.... + void SetExternalBuffer( T* pMemory, int numElements ); + + // Size + int NumAllocated() const; + int Count() const; + + // Grows the memory, so that at least allocated + num elements are allocated + void Grow( int num = 1 ); + + // Makes sure we've got at least this much memory + void EnsureCapacity( int num ); + + // Memory deallocation + void Purge(); + + // is the memory externally allocated? + bool IsExternallyAllocated() const; + + // is the memory read only? + bool IsReadOnly() const; + + // Set the size by which the memory grows + void SetGrowSize( int size ); + +private: + enum + { + EXTERNAL_BUFFER_MARKER = -1, + EXTERNAL_CONST_BUFFER_MARKER = 2, + }; + + T* m_pMemory; + int m_nAllocationCount; + int m_nGrowSize; +}; + + +//----------------------------------------------------------------------------- +// constructor, destructor +//----------------------------------------------------------------------------- +template< class T > +CUtlMemory::CUtlMemory( int nGrowSize, int nInitAllocationCount ) : m_pMemory(0), + m_nAllocationCount( nInitAllocationCount ), m_nGrowSize( nGrowSize ) +{ + assert( (nGrowSize >= 0) && (nGrowSize != EXTERNAL_BUFFER_MARKER) ); + if (m_nAllocationCount) + { + m_pMemory = (T*)malloc( m_nAllocationCount * sizeof(T) ); + } +} + +template< class T > +CUtlMemory::CUtlMemory( T* pMemory, int numElements ) : m_pMemory(pMemory), + m_nAllocationCount( numElements ) +{ + // Special marker indicating externally supplied memory + m_nGrowSize = EXTERNAL_BUFFER_MARKER; +} + +template< class T > +CUtlMemory::CUtlMemory( const T* pMemory, int numElements ) : m_pMemory( (T*)pMemory ), + m_nAllocationCount( numElements ) +{ + // Special marker indicating externally supplied modifyable memory + m_nGrowSize = EXTERNAL_CONST_BUFFER_MARKER; +} + +template< class T > +CUtlMemory::~CUtlMemory() +{ + Purge(); +} + + +//----------------------------------------------------------------------------- +// Attaches the buffer to external memory.... +//----------------------------------------------------------------------------- +template< class T > +void CUtlMemory::SetExternalBuffer( T* pMemory, int numElements ) +{ + // Blow away any existing allocated memory + Purge(); + + m_pMemory = pMemory; + m_nAllocationCount = numElements; + + // Indicate that we don't own the memory + m_nGrowSize = EXTERNAL_BUFFER_MARKER; +} + + +//----------------------------------------------------------------------------- +// element access +//----------------------------------------------------------------------------- +template< class T > +inline T& CUtlMemory::operator[]( int i ) +{ + assert( IsIdxValid(i) ); + return m_pMemory[i]; +} + +template< class T > +inline T const& CUtlMemory::operator[]( int i ) const +{ + assert( IsIdxValid(i) ); + return m_pMemory[i]; +} + +template< class T > +inline T& CUtlMemory::Element( int i ) +{ + assert( IsIdxValid(i) ); + return m_pMemory[i]; +} + +template< class T > +inline T const& CUtlMemory::Element( int i ) const +{ + assert( IsIdxValid(i) ); + return m_pMemory[i]; +} + + +//----------------------------------------------------------------------------- +// is the memory externally allocated? +//----------------------------------------------------------------------------- +template< class T > +bool CUtlMemory::IsExternallyAllocated() const +{ + return m_nGrowSize == EXTERNAL_BUFFER_MARKER; +} + +//----------------------------------------------------------------------------- +// is the memory read only? +//----------------------------------------------------------------------------- +template< class T > +bool CUtlMemory::IsReadOnly() const +{ + return (m_nGrowSize == EXTERNAL_CONST_BUFFER_MARKER); +} + +template< class T > +void CUtlMemory::SetGrowSize( int nSize ) +{ + assert( (nSize >= 0) && (nSize != EXTERNAL_BUFFER_MARKER) ); + m_nGrowSize = nSize; +} + + +//----------------------------------------------------------------------------- +// Gets the base address (can change when adding elements!) +//----------------------------------------------------------------------------- +template< class T > +inline T* CUtlMemory::Base() +{ + return m_pMemory; +} + +template< class T > +inline T const* CUtlMemory::Base() const +{ + return m_pMemory; +} + + +//----------------------------------------------------------------------------- +// Size +//----------------------------------------------------------------------------- +template< class T > +inline int CUtlMemory::NumAllocated() const +{ + return m_nAllocationCount; +} + +template< class T > +inline int CUtlMemory::Count() const +{ + return m_nAllocationCount; +} + + +//----------------------------------------------------------------------------- +// Is element index valid? +//----------------------------------------------------------------------------- +template< class T > +inline bool CUtlMemory::IsIdxValid( int i ) const +{ + return (i >= 0) && (i < m_nAllocationCount); +} + + +//----------------------------------------------------------------------------- +// Grows the memory +//----------------------------------------------------------------------------- +template< class T > +void CUtlMemory::Grow( int num ) +{ + assert( num > 0 ); + + if (IsExternallyAllocated()) + { + // Can't grow a buffer whose memory was externally allocated + assert(0); + return; + } + + // Make sure we have at least numallocated + num allocations. + // Use the grow rules specified for this memory (in m_nGrowSize) + int nAllocationRequested = m_nAllocationCount + num; + while (m_nAllocationCount < nAllocationRequested) + { + if ( m_nAllocationCount != 0 ) + { + if (m_nGrowSize) + { + m_nAllocationCount += m_nGrowSize; + } + else + { + m_nAllocationCount += m_nAllocationCount; + } + } + else + { + // Compute an allocation which is at least as big as a cache line... + m_nAllocationCount = (31 + sizeof(T)) / sizeof(T); + assert(m_nAllocationCount != 0); + } + } + + if (m_pMemory) + { + m_pMemory = (T*)realloc( m_pMemory, m_nAllocationCount * sizeof(T) ); + } + else + { + m_pMemory = (T*)malloc( m_nAllocationCount * sizeof(T) ); + } +} + + +//----------------------------------------------------------------------------- +// Makes sure we've got at least this much memory +//----------------------------------------------------------------------------- +template< class T > +inline void CUtlMemory::EnsureCapacity( int num ) +{ + if (m_nAllocationCount >= num) + return; + + if (IsExternallyAllocated()) + { + // Can't grow a buffer whose memory was externally allocated + assert(0); + return; + } + + m_nAllocationCount = num; + if (m_pMemory) + { + m_pMemory = (T*)realloc( m_pMemory, m_nAllocationCount * sizeof(T) ); + } + else + { + m_pMemory = (T*)alloc( m_nAllocationCount * sizeof(T) ); + } +} + + +//----------------------------------------------------------------------------- +// Memory deallocation +//----------------------------------------------------------------------------- +template< class T > +void CUtlMemory::Purge() +{ + if (!IsExternallyAllocated()) + { + if (m_pMemory) + { + free( (void*)m_pMemory ); + m_pMemory = 0; + } + m_nAllocationCount = 0; + } +} + + +#endif // UTLSTORAGE_H diff --git a/MiniBase/ValveSDK/tier1/UtlVector.h b/MiniBase/ValveSDK/tier1/UtlVector.h new file mode 100644 index 0000000..03cb527 --- /dev/null +++ b/MiniBase/ValveSDK/tier1/UtlVector.h @@ -0,0 +1,603 @@ +//=========== (C) Copyright 1999 Valve, L.L.C. All rights reserved. =========== +// +// The copyright to the contents herein is the property of Valve, L.L.C. +// The contents may be used and/or copied only with the written permission of +// Valve, L.L.C., or in accordance with the terms and conditions stipulated in +// the agreement/contract under which the contents have been supplied. +// +// $Header: $ +// $NoKeywords: $ +// +// A growable array class that maintains a free list and keeps elements +// in the same location +//============================================================================= + +#ifndef UTLVECTOR_H +#define UTLVECTOR_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "utlmemory.h" + +//----------------------------------------------------------------------------- +// The CUtlVector class: +// A growable array class which doubles in size by default. +// It will always keep all elements consecutive in memory, and may move the +// elements around in memory (via a realloc) when elements are inserted or +// removed. Clients should therefore refer to the elements of the vector +// by index (they should *never* maintain pointers to elements in the vector). +//----------------------------------------------------------------------------- + +template< class T > +class CUtlVector +{ +public: + typedef T ElemType_t; + + // constructor, destructor + CUtlVector( int growSize = 0, int initSize = 0 ); + CUtlVector( T* pMemory, int numElements ); + ~CUtlVector(); + + // Copy the array. + CUtlVector& operator=( const CUtlVector &other ); + + // element access + T& operator[]( int i ); + T const& operator[]( int i ) const; + T& Element( int i ); + T const& Element( int i ) const; + + // Gets the base address (can change when adding elements!) + T* Base(); + T const* Base() const; + + // Returns the number of elements in the vector + // SIZE IS DEPRECATED! + int Count() const; + int Size() const; // don't use me! + + // Is element index valid? + bool IsValidIndex( int i ) const; + static int InvalidIndex( void ); + + // Adds an element, uses default constructor + int AddToHead(); + int AddToTail(); + int InsertBefore( int elem ); + int InsertAfter( int elem ); + + // Adds an element, uses copy constructor + int AddToHead( T const& src ); + int AddToTail( T const& src ); + int InsertBefore( int elem, T const& src ); + int InsertAfter( int elem, T const& src ); + + // Adds multiple elements, uses default constructor + int AddMultipleToHead( int num ); + int AddMultipleToTail( int num, const T *pToCopy=NULL ); + int InsertMultipleBefore( int elem, int num, const T *pToCopy=NULL ); // If pToCopy is set, then it's an array of length 'num' and + int InsertMultipleAfter( int elem, int num ); + + // Calls RemoveAll() then AddMultipleToTail. + void SetSize( int size ); + void SetCount( int count ); + + // Calls SetSize and copies each element. + void CopyArray( T const *pArray, int size ); + + // Add the specified array to the tail. + int AddVectorToTail( CUtlVector const &src ); + + // Finds an element (element needs operator== defined) + int Find( T const& src ) const; + + bool HasElement( T const& src ); + + // Makes sure we have enough memory allocated to store a requested # of elements + void EnsureCapacity( int num ); + + // Makes sure we have at least this many elements + void EnsureCount( int num ); + + // Element removal + void FastRemove( int elem ); // doesn't preserve order + void Remove( int elem ); // preserves order, shifts elements + void FindAndRemove( T const& src ); // removes first occurrence of src, preserves order, shifts elements + void RemoveMultiple( int elem, int num ); // preserves order, shifts elements + void RemoveAll(); // doesn't deallocate memory + + // Memory deallocation + void Purge(); + + // Purges the list and calls delete on each element in it. + void PurgeAndDeleteElements(); + + // Set the size by which it grows when it needs to allocate more memory. + void SetGrowSize( int size ); + +protected: + // Can't copy this unless we explicitly do it! + CUtlVector( CUtlVector const& vec ) { assert(0); + } + + // Grows the vector + void GrowVector( int num = 1 ); + + // Shifts elements.... + void ShiftElementsRight( int elem, int num = 1 ); + void ShiftElementsLeft( int elem, int num = 1 ); + + // For easier access to the elements through the debugger + void ResetDbgInfo(); + + CUtlMemory m_Memory; + int m_Size; + + // For easier access to the elements through the debugger + // it's in release builds so this can be used in libraries correctly + T *m_pElements; +}; + + +//----------------------------------------------------------------------------- +// For easier access to the elements through the debugger +//----------------------------------------------------------------------------- + +template< class T > +inline void CUtlVector::ResetDbgInfo() +{ + m_pElements = m_Memory.Base(); +} + +//----------------------------------------------------------------------------- +// constructor, destructor +//----------------------------------------------------------------------------- + +template< class T > +inline CUtlVector::CUtlVector( int growSize, int initSize ) : + m_Memory(growSize, initSize), m_Size(0) +{ + ResetDbgInfo(); +} + +template< class T > +inline CUtlVector::CUtlVector( T* pMemory, int numElements ) : + m_Memory(pMemory, numElements), m_Size(0) +{ + ResetDbgInfo(); +} + +template< class T > +inline CUtlVector::~CUtlVector() +{ + Purge(); +} + +template +inline CUtlVector& CUtlVector::operator=( const CUtlVector &other ) +{ + CopyArray( other.Base(), other.Count() ); + return *this; +} + +//----------------------------------------------------------------------------- +// element access +//----------------------------------------------------------------------------- + +template< class T > +inline T& CUtlVector::operator[]( int i ) +{ + assert( IsValidIndex(i) ); + return m_Memory[i]; +} + +template< class T > +inline T const& CUtlVector::operator[]( int i ) const +{ + assert( IsValidIndex(i) ); + return m_Memory[i]; +} + +template< class T > +inline T& CUtlVector::Element( int i ) +{ + assert( IsValidIndex(i) ); + return m_Memory[i]; +} + +template< class T > +inline T const& CUtlVector::Element( int i ) const +{ + assert( IsValidIndex(i) ); + return m_Memory[i]; +} + + +//----------------------------------------------------------------------------- +// Gets the base address (can change when adding elements!) +//----------------------------------------------------------------------------- + +template< class T > +inline T* CUtlVector::Base() +{ + return m_Memory.Base(); +} + +template< class T > +inline T const* CUtlVector::Base() const +{ + return m_Memory.Base(); +} + +//----------------------------------------------------------------------------- +// Count +//----------------------------------------------------------------------------- + +template< class T > +inline int CUtlVector::Size() const +{ + return m_Size; +} + +template< class T > +inline int CUtlVector::Count() const +{ + return m_Size; +} + + +//----------------------------------------------------------------------------- +// Is element index valid? +//----------------------------------------------------------------------------- + +template< class T > +inline bool CUtlVector::IsValidIndex( int i ) const +{ + return (i >= 0) && (i < m_Size); +} + + +//----------------------------------------------------------------------------- +// Returns in invalid index +//----------------------------------------------------------------------------- +template< class T > +inline int CUtlVector::InvalidIndex( void ) +{ + return -1; +} + + +//----------------------------------------------------------------------------- +// Grows the vector +//----------------------------------------------------------------------------- +template< class T > +void CUtlVector::GrowVector( int num ) +{ + if (m_Size + num - 1 >= m_Memory.NumAllocated()) + { + m_Memory.Grow( m_Size + num - m_Memory.NumAllocated() ); + } + + m_Size += num; + ResetDbgInfo(); +} + + +//----------------------------------------------------------------------------- +// Makes sure we have enough memory allocated to store a requested # of elements +//----------------------------------------------------------------------------- +template< class T > +void CUtlVector::EnsureCapacity( int num ) +{ + m_Memory.EnsureCapacity(num); + ResetDbgInfo(); +} + + +//----------------------------------------------------------------------------- +// Makes sure we have at least this many elements +//----------------------------------------------------------------------------- +template< class T > +void CUtlVector::EnsureCount( int num ) +{ + if (Count() < num) + AddMultipleToTail( num - Count() ); +} + + +//----------------------------------------------------------------------------- +// Shifts elements +//----------------------------------------------------------------------------- +template< class T > +void CUtlVector::ShiftElementsRight( int elem, int num ) +{ + assert( IsValidIndex(elem) || ( m_Size == 0 ) || ( num == 0 )); + int numToMove = m_Size - elem - num; + if ((numToMove > 0) && (num > 0)) + memmove( &Element(elem+num), &Element(elem), numToMove * sizeof(T) ); +} + +template< class T > +void CUtlVector::ShiftElementsLeft( int elem, int num ) +{ + assert( IsValidIndex(elem) || ( m_Size == 0 ) || ( num == 0 )); + int numToMove = m_Size - elem - num; + if ((numToMove > 0) && (num > 0)) + { + memmove( &Element(elem), &Element(elem+num), numToMove * sizeof(T) ); + +#ifdef _DEBUG + memset( &Element(m_Size-num), 0xDD, num * sizeof(T) ); +#endif + } +} + +//----------------------------------------------------------------------------- +// Adds an element, uses default constructor +//----------------------------------------------------------------------------- + +template< class T > +inline int CUtlVector::AddToHead() +{ + return InsertBefore(0); +} + +template< class T > +inline int CUtlVector::AddToTail() +{ + return InsertBefore( m_Size ); +} + +template< class T > +inline int CUtlVector::InsertAfter( int elem ) +{ + return InsertBefore( elem + 1 ); +} + +template< class T > +int CUtlVector::InsertBefore( int elem ) +{ + // Can insert at the end + assert( (elem == Count()) || IsValidIndex(elem) ); + + GrowVector(); + ShiftElementsRight(elem); + Construct( &Element(elem) ); + return elem; +} + + +//----------------------------------------------------------------------------- +// Adds an element, uses copy constructor +//----------------------------------------------------------------------------- + +template< class T > +inline int CUtlVector::AddToHead( T const& src ) +{ + return InsertBefore( 0, src ); +} + +template< class T > +inline int CUtlVector::AddToTail( T const& src ) +{ + return InsertBefore( m_Size, src ); +} + +template< class T > +inline int CUtlVector::InsertAfter( int elem, T const& src ) +{ + return InsertBefore( elem + 1, src ); +} + +template< class T > +int CUtlVector::InsertBefore( int elem, T const& src ) +{ + // Can insert at the end + assert( (elem == Count()) || IsValidIndex(elem) ); + + GrowVector(); + ShiftElementsRight(elem); + CopyConstruct( &Element(elem), src ); + return elem; +} + + +//----------------------------------------------------------------------------- +// Adds multiple elements, uses default constructor +//----------------------------------------------------------------------------- + +template< class T > +inline int CUtlVector::AddMultipleToHead( int num ) +{ + return InsertMultipleBefore( 0, num ); +} + +template< class T > +inline int CUtlVector::AddMultipleToTail( int num, const T *pToCopy ) +{ + return InsertMultipleBefore( m_Size, num, pToCopy ); +} + +template< class T > +int CUtlVector::InsertMultipleAfter( int elem, int num ) +{ + return InsertMultipleBefore( elem + 1, num ); +} + + +template< class T > +void CUtlVector::SetCount( int count ) +{ + RemoveAll(); + AddMultipleToTail( count ); +} + +template< class T > +inline void CUtlVector::SetSize( int size ) +{ + SetCount( size ); +} + +template< class T > +void CUtlVector::CopyArray( T const *pArray, int size ) +{ + SetSize( size ); + for( int i=0; i < size; i++ ) + (*this)[i] = pArray[i]; +} + +template< class T > +int CUtlVector::AddVectorToTail( CUtlVector const &src ) +{ + int base = Count(); + + // Make space. + AddMultipleToTail( src.Count() ); + + // Copy the elements. + for ( int i=0; i < src.Count(); i++ ) + (*this)[base + i] = src[i]; + + return base; +} + +template< class T > +inline int CUtlVector::InsertMultipleBefore( int elem, int num, const T *pToInsert ) +{ + if( num == 0 ) + return elem; + + // Can insert at the end + assert( (elem == Count()) || IsValidIndex(elem) ); + + GrowVector(num); + ShiftElementsRight(elem, num); + + // Invoke default constructors + for (int i = 0; i < num; ++i) + Construct( &Element(elem+i) ); + + // Copy stuff in? + if ( pToInsert ) + { + for ( int i=0; i < num; i++ ) + { + Element( elem+i ) = pToInsert[i]; + } + } + + return elem; +} + +//----------------------------------------------------------------------------- +// Finds an element (element needs operator== defined) +//----------------------------------------------------------------------------- +template< class T > +int CUtlVector::Find( T const& src ) const +{ + for ( int i = 0; i < Count(); ++i ) + { + if (Element(i) == src) + return i; + } + return -1; +} + +template< class T > +bool CUtlVector::HasElement( T const& src ) +{ + return ( Find(src) >= 0 ); +} + +//----------------------------------------------------------------------------- +// Element removal +//----------------------------------------------------------------------------- + +template< class T > +void CUtlVector::FastRemove( int elem ) +{ + assert( IsValidIndex(elem) ); + + Destruct( &Element(elem) ); + if (m_Size > 0) + { + memcpy( &Element(elem), &Element(m_Size-1), sizeof(T) ); + --m_Size; + } +} + +template< class T > +void CUtlVector::Remove( int elem ) +{ + Destruct( &Element(elem) ); + ShiftElementsLeft(elem); + --m_Size; +} + +template< class T > +void CUtlVector::FindAndRemove( T const& src ) +{ + int elem = Find( src ); + if ( elem != -1 ) + { + Remove( elem ); + } +} + +template< class T > +void CUtlVector::RemoveMultiple( int elem, int num ) +{ + assert( IsValidIndex(elem) ); + assert( elem + num <= Count() ); + + for (int i = elem + num; --i >= elem; ) + Destruct(&Element(i)); + + ShiftElementsLeft(elem, num); + m_Size -= num; +} + +template< class T > +void CUtlVector::RemoveAll() +{ + for (int i = m_Size; --i >= 0; ) + Destruct(&Element(i)); + + m_Size = 0; +} + + +//----------------------------------------------------------------------------- +// Memory deallocation +//----------------------------------------------------------------------------- + +template< class T > +void CUtlVector::Purge() +{ + RemoveAll(); + m_Memory.Purge( ); + ResetDbgInfo(); +} + + +template +inline void CUtlVector::PurgeAndDeleteElements() +{ + for( int i=0; i < m_Size; i++ ) + delete Element(i); + + Purge(); +} + + +template< class T > +void CUtlVector::SetGrowSize( int size ) +{ + m_Memory.SetGrowSize( size ); +} + + +#endif // CCVECTOR_H diff --git a/MiniBase/ValveSDK/triangleapi.h b/MiniBase/ValveSDK/triangleapi.h new file mode 100644 index 0000000..127c133 --- /dev/null +++ b/MiniBase/ValveSDK/triangleapi.h @@ -0,0 +1,54 @@ +/*** +* +* 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. +* +****/ +#if !defined( TRIANGLEAPIH ) +#define TRIANGLEAPIH +#pragma once + +typedef enum +{ + TRI_FRONT = 0, + TRI_NONE = 1, +} TRICULLSTYLE; + +#define TRI_API_VERSION 1 + +#define TRI_TRIANGLES 0 +#define TRI_TRIANGLE_FAN 1 +#define TRI_QUADS 2 +#define TRI_POLYGON 3 +#define TRI_LINES 4 +#define TRI_TRIANGLE_STRIP 5 +#define TRI_QUAD_STRIP 6 + +typedef struct triangleapi_s +{ + int version; + + void ( *RenderMode )( int mode ); + void ( *Begin )( int primitiveCode ); + void ( *End ) ( void ); + + void ( *Color4f ) ( float r, float g, float b, float a ); + void ( *Color4ub ) ( unsigned char r, unsigned char g, unsigned char b, unsigned char a ); + void ( *TexCoord2f ) ( float u, float v ); + void ( *Vertex3fv ) ( float *worldPnt ); + void ( *Vertex3f ) ( float x, float y, float z ); + void ( *Brightness ) ( float brightness ); + void ( *CullFace ) ( TRICULLSTYLE style ); + int ( *SpriteTexture ) ( struct model_s *pSpriteModel, int frame ); + int ( *WorldToScreen ) ( float *world, float *screen ); // Returns 1 if it's z clipped +} triangleapi_t; + +#endif // !TRIANGLEAPIH \ No newline at end of file diff --git a/MiniBase/ValveSDK/usercmd.h b/MiniBase/ValveSDK/usercmd.h new file mode 100644 index 0000000..7cdcfe2 --- /dev/null +++ b/MiniBase/ValveSDK/usercmd.h @@ -0,0 +1,41 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +#ifndef USERCMD_H +#define USERCMD_H +#ifdef _WIN32 +#pragma once +#endif + +typedef struct usercmd_s +{ + short lerp_msec; // Interpolation time on client + byte msec; // Duration in ms of command + vec3_t viewangles; // Command view angles. + +// intended velocities + float forwardmove; // Forward velocity. + float sidemove; // Sideways velocity. + float upmove; // Upward velocity. + byte lightlevel; // Light level at spot where we are standing. + unsigned short buttons; // Attack buttons + byte impulse; // Impulse command issued. + byte weaponselect; // Current weapon id + +// Experimental player impact stuff. + int impact_index; + vec3_t impact_position; +} usercmd_t; + +#endif // USERCMD_H diff --git a/MiniBase/ValveSDK/util_vector.h b/MiniBase/ValveSDK/util_vector.h new file mode 100644 index 0000000..7a38eea --- /dev/null +++ b/MiniBase/ValveSDK/util_vector.h @@ -0,0 +1,131 @@ +/*** +* +* Copyright (c) 1999, 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. +* +****/ +// Vector.h +// A subset of the extdll.h in the project HL Entity DLL +// + +#if !defined FILE_UTIL_VECTOR_H +#define FILE_UTIL_VECTOR_H + +// Misc C-runtime library headers +#include "STDIO.H" +#include "STDLIB.H" +#include "MATH.H" + +// Header file containing definition of globalvars_t and entvars_t +typedef int func_t; // +typedef int string_t; // from engine's pr_comp.h; +typedef float vec_t; // needed before including progdefs.h + +//========================================================= +// 2DVector - used for many pathfinding and many other +// operations that are treated as planar rather than 3d. +//========================================================= +class Vector2D +{ +public: + inline Vector2D(void) { } + inline Vector2D(float X, float Y) { x = X; y = Y; } + inline Vector2D operator+(const Vector2D& v) const { return Vector2D(x+v.x, y+v.y); } + inline Vector2D operator-(const Vector2D& v) const { return Vector2D(x-v.x, y-v.y); } + inline Vector2D operator*(float fl) const { return Vector2D(x*fl, y*fl); } + inline Vector2D operator/(float fl) const { return Vector2D(x/fl, y/fl); } + + inline float Length(void) const { return (float)sqrt(x*x + y*y ); } + + inline Vector2D Normalize ( void ) const + { + Vector2D vec2; + + float flLen = Length(); + if ( flLen == 0 ) + { + return Vector2D( (float)0, (float)0 ); + } + else + { + flLen = 1 / flLen; + return Vector2D( x * flLen, y * flLen ); + } + } + + vec_t x, y; +}; + +inline float DotProduct(const Vector2D& a, const Vector2D& b) { return( a.x*b.x + a.y*b.y ); } +inline Vector2D operator*(float fl, const Vector2D& v) { return v * fl; } + +//========================================================= +// 3D Vector +//========================================================= +class Vector // same data-layout as engine's vec3_t, +{ // which is a vec_t[3] +public: + // Construction/destruction + inline Vector(void) { } + inline Vector(float X, float Y, float Z) { x = X; y = Y; z = Z; } + inline Vector(double X, double Y, double Z) { x = (float)X; y = (float)Y; z = (float)Z; } + inline Vector(int X, int Y, int Z) { x = (float)X; y = (float)Y; z = (float)Z; } + inline Vector(const Vector& v) { x = v.x; y = v.y; z = v.z; } + inline Vector(float rgfl[3]) { x = rgfl[0]; y = rgfl[1]; z = rgfl[2]; } + + // Operators + inline Vector operator-(void) const { return Vector(-x,-y,-z); } + inline int operator==(const Vector& v) const { return x==v.x && y==v.y && z==v.z; } + inline int operator!=(const Vector& v) const { return !(*this==v); } + inline Vector operator+(const Vector& v) const { return Vector(x+v.x, y+v.y, z+v.z); } + inline Vector operator-(const Vector& v) const { return Vector(x-v.x, y-v.y, z-v.z); } + inline Vector operator*(float fl) const { return Vector(x*fl, y*fl, z*fl); } + inline Vector operator/(float fl) const { return Vector(x/fl, y/fl, z/fl); } + + // Methods + inline void CopyToArray(float* rgfl) const { rgfl[0] = x, rgfl[1] = y, rgfl[2] = z; } + inline float Length(void) const { return (float)sqrt(x*x + y*y + z*z); } + operator float *() { return &x; } // Vectors will now automatically convert to float * when needed + operator const float *() const { return &x; } // Vectors will now automatically convert to float * when needed + inline Vector Normalize(void) const + { + float flLen = Length(); + if (flLen == 0) return Vector(0,0,1); // ???? + flLen = 1 / flLen; + return Vector(x * flLen, y * flLen, z * flLen); + } + + inline Vector2D Make2D ( void ) const + { + Vector2D Vec2; + + Vec2.x = x; + Vec2.y = y; + + return Vec2; + } + inline float Length2D(void) const { return (float)sqrt(x*x + y*y); } + + // Members + vec_t x, y, z; +}; +inline Vector operator*(float fl, const Vector& v) { return v * fl; } +inline float DotProduct(const Vector& a, const Vector& b) { return(a.x*b.x+a.y*b.y+a.z*b.z); } +inline Vector CrossProduct(const Vector& a, const Vector& b) { return Vector( a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x ); } + +#define vec3_t Vector + + +#define VectorAdd(a,b,c) {(c)[0]=(a)[0]+(b)[0];(c)[1]=(a)[1]+(b)[1];(c)[2]=(a)[2]+(b)[2];} +#define VectorCopy(a,b) {(b)[0]=(a)[0];(b)[1]=(a)[1];(b)[2]=(a)[2];} +#define VectorClear(a) { a[0]=0.0;a[1]=0.0;a[2]=0.0;} + +#endif diff --git a/MiniBase/ValveSDK/weaponinfo.h b/MiniBase/ValveSDK/weaponinfo.h new file mode 100644 index 0000000..b648652 --- /dev/null +++ b/MiniBase/ValveSDK/weaponinfo.h @@ -0,0 +1,52 @@ +/*** +* +* Copyright (c) 1996-2002, 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. +* +****/ +#if !defined ( WEAPONINFOH ) +#define WEAPONINFOH +#ifdef _WIN32 +#pragma once +#endif + +// Info about weapons player might have in his/her possession +typedef struct weapon_data_s +{ + int m_iId; + int m_iClip; + + float m_flNextPrimaryAttack; + float m_flNextSecondaryAttack; + float m_flTimeWeaponIdle; + + int m_fInReload; + int m_fInSpecialReload; + float m_flNextReload; + float m_flPumpTime; + float m_fReloadTime; + + float m_fAimedDamage; + float m_fNextAimBonus; + int m_fInZoom; + int m_iWeaponState; + + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; +} weapon_data_t; + +#endif diff --git a/MiniBase/ValveSDK/wrect.h b/MiniBase/ValveSDK/wrect.h new file mode 100644 index 0000000..1764057 --- /dev/null +++ b/MiniBase/ValveSDK/wrect.h @@ -0,0 +1,9 @@ +#if !defined( WRECTH ) +#define WRECTH + +typedef struct rect_s +{ + int left, right, top, bottom; +} wrect_t; + +#endif \ No newline at end of file diff --git a/MiniBase/colorconsole.cpp b/MiniBase/colorconsole.cpp new file mode 100644 index 0000000..ac54a12 --- /dev/null +++ b/MiniBase/colorconsole.cpp @@ -0,0 +1,124 @@ +#include "main.h" +#include "ValveSDK/tier1/UtlVector.h" + +#define MAX_LINES 5 +#define MAX_CHARS_PER_LINE 256 + +struct TextRange +{ + int start; + int end; + float *color; +}; + +struct SayTextLine +{ + wchar_t m_line[MAX_CHARS_PER_LINE]; + CUtlVector m_textRanges; + int m_clientIndex; + float *m_teamColor; +}; + +#define g_sayTextLine (*pg_sayTextLine) +SayTextLine g_sayTextLine[MAX_LINES + 1]; + + +void ConsolePrintColor(BYTE R, BYTE G, BYTE B, const char *fmt, ...) { + va_list va_alist; + char buf[1024]; + va_start(va_alist, fmt); + _vsnprintf(buf, sizeof(buf), fmt, va_alist); + va_end(va_alist); + TColor24 DefaultColor; PColor24 Ptr; Ptr = Console_TextColor; DefaultColor = *Ptr; Ptr->R = R; Ptr->G = G; Ptr->B = B; g_Engine.Con_Printf(buf); *Ptr = DefaultColor; +} + + +void ColorChatConsolePrint(char string[512]) +{ + int rangeIndex; + TextRange *range; + int total_length = 0; + static auto pCvarColor = g_Engine.pfnGetCvarPointer("con_color"); + char *pszColor = pCvarColor->string; + + BYTE Cvar_R, Cvar_G, Cvar_B; + BYTE R, G, B; + + sscanf_s(pszColor, "%hhi %hhi %hhi", &Cvar_R, &Cvar_G, &Cvar_B); + //std::string str(string); + if (g_sayTextLine[0].m_textRanges.Size() != 0) + { + // Fix color ranges for UTF-8 strings + for (rangeIndex = 0; rangeIndex < g_sayTextLine[0].m_textRanges.Size(); rangeIndex++) + { + range = &g_sayTextLine[0].m_textRanges[rangeIndex]; + int start_len = range->end; + if (range->start) + range->start--; + for (char *str = (string + range->start); str < (string + range->end); str++) + { + if ((*str & 0xc0) == 0x80) + { + range->end++; + } + } + + for (int tempIndex = rangeIndex + 1; tempIndex < g_sayTextLine[0].m_textRanges.Size(); tempIndex++) + { + auto tempRange = &g_sayTextLine[0].m_textRanges[tempIndex]; + tempRange->start--; + tempRange->end--; + if (range->end != start_len) + { + tempRange->start += range->end - start_len; + tempRange->end += range->end - start_len; + } + } + range->end--; + total_length = range->end; + } + // Colorize + char ch; + for (rangeIndex = 0; rangeIndex < g_sayTextLine[0].m_textRanges.Size(); rangeIndex++) + { + range = &g_sayTextLine[0].m_textRanges[rangeIndex]; + ch = string[range->end]; + string[range->end] = 0; + #define F2B(f) ((f) >= 1.0f ? 255 : (int)((f)*256.f)) + if (range->color) + { + R = F2B(range->color[0]); + G = F2B(range->color[1]); + B = F2B(range->color[2]); + } + else + { + R = Cvar_R; G = Cvar_G; B = Cvar_B; + } + ConsolePrintColor(R, G, B, &string[range->start]); + string[range->end] = ch; + } + // Print newline char if needed + std::string check_string(&string[0], string + total_length); + if (check_string.find("\n") == string::npos) + { + g_Engine.pfnConsolePrint("\n"); + } + } +} +void SearchPrintConsole() +{ + DWORD PatternAddress = offset.FindPattern("\xFF\x15\xFF\xFF\xFF\xFF\x83\xC4\xFF\x66\x89\x1D\xFF\xFF\xFF\xFF", "xx????xx?xxx????", offset.ClBase, offset.ClEnd, 0x1); + + if (PatternAddress) + { + size_t addref = (size_t)&pg_sayTextLine; + *(size_t *)addref = *(DWORD*)(PatternAddress - 0x63); + DWORD oldProt; + VirtualProtect(LPVOID(PatternAddress - 1), 6, PAGE_EXECUTE_READWRITE, &oldProt); + *(uint8_t *)(PatternAddress - 1) = 0x90; // NOP + *(uint8_t *)PatternAddress = 0xe8; // CALL + *(intptr_t *)(PatternAddress + 1) = (uintptr_t)ColorChatConsolePrint - (PatternAddress + 5); // ADDRESS + VirtualProtect(LPVOID(PatternAddress - 1), 6, oldProt, &oldProt); + } +} \ No newline at end of file diff --git a/MiniBase/main.cpp b/MiniBase/main.cpp new file mode 100644 index 0000000..fbf290f --- /dev/null +++ b/MiniBase/main.cpp @@ -0,0 +1,162 @@ +#include "main.h" +#include +#include + +cl_clientfunc_t *g_pClient = nullptr; +cl_enginefunc_t *g_pEngine = nullptr; +engine_studio_api_t *g_pStudio = nullptr; + +cl_clientfunc_t g_Client; +cl_enginefunc_t g_Engine; +engine_studio_api_t g_Studio; +PColor24 Console_TextColor; + +char* BaseDir; +bool FirstFrame = false; + +std::vector HexToBytes(const std::string& hex) { + std::vector bytes; + + for (unsigned int i = 0; i < hex.length(); i += 2) { + std::string byteString = hex.substr(i, 2); + uint8_t byte = (uint8_t)strtol(byteString.c_str(), NULL, 16); + bytes.push_back(byte); + } + + return bytes; +} + +void HexReplaceInLibrary(std::string libraryPath, std::string hexSearch, std::string hexReplace, uint8_t wcard, uint64_t offset) { + const uint8_t wildcard = wcard; + auto search_comparator = [&wildcard](uint8_t val1, uint8_t val2) + { + return (val1 == val2 || (wildcard && val2 == wildcard)); + }; + auto replace_comparator = [&wildcard](uint8_t val, uint8_t val2) + { + if (!wildcard) + return val; + else if (val == wildcard) + { + return val2; + } + + return val; + }; + + auto libraryAddress = GetModuleHandleA(libraryPath.c_str()); + auto dosHeader = (IMAGE_DOS_HEADER *)libraryAddress; + auto peHeader = (IMAGE_NT_HEADERS *)((uintptr_t)libraryAddress + (uintptr_t)dosHeader->e_lfanew); + + std::vector searchbytes = HexToBytes(hexSearch); + std::vector replacebytes = HexToBytes(hexReplace); + + auto searchSize = hexSearch.length() / 2; + auto codeBase = (uintptr_t)libraryAddress + peHeader->OptionalHeader.BaseOfCode; + auto codeSize = peHeader->OptionalHeader.SizeOfCode; + auto codeEnd = codeBase + codeSize; + auto codeSearchEnd = codeEnd - searchSize + 1; + auto cstart = (uint8_t*)codeBase; + for (;;) + { + uint8_t* res = std::search(cstart, (uint8_t*)codeSearchEnd, searchbytes.begin(), searchbytes.end(), search_comparator); + if (res >= (uint8_t*)codeSearchEnd) + { + break; + } + DWORD oldProt; + VirtualProtect((LPVOID)res, searchbytes.size(), PAGE_EXECUTE_READWRITE, &oldProt); + std::transform(replacebytes.begin(), replacebytes.end(), res + offset, res + offset, replace_comparator); + VirtualProtect((LPVOID)res, searchbytes.size(), oldProt, &oldProt); + cstart = res + searchbytes.size(); + } +} +extern void SearchPrintConsole(); +void ModuleLoaded() +{ + offset.ConsoleColorInitalize(); + SearchPrintConsole(); + FirstFrame = true; +} + + +void ModuleEntry( ) +{ + DWORD ClientTable = NULL, EngineTable = NULL, StudioTable = NULL; + while (1) + { + if (offset.GetModuleInfo()) + { + if (!ClientTable) + { + ClientTable = offset.FindClientTable(); + if (ClientTable) + { + g_pClient = (cl_clientfunc_t*)ClientTable; + offset.CopyClient(); + } + else continue; + } + + if (!EngineTable) + { + EngineTable = offset.FindEngineTable(); + if (EngineTable) + { + g_pEngine = (cl_enginefunc_t*)EngineTable; + offset.CopyEngine(); + } + else continue; + } + + if (!StudioTable) + { + StudioTable = offset.FindStudioTable(); + if (StudioTable) + { + g_pStudio = (engine_studio_api_t*)StudioTable; + offset.CopyStudio(); + } + else continue; + } + + if (ClientTable && EngineTable && StudioTable) + { + ModuleLoaded(); + return; + } + } + std::this_thread::sleep_for(100ms); + } +} + +extern "C" __declspec( dllexport ) BOOL WINAPI RIB_Main ( LPVOID lp, LPVOID lp2, LPVOID lp3, LPVOID lp4, LPVOID lp5 ) +{ + return TRUE; +} + + +DWORD WINAPI ThreadEntry(LPVOID lpThreadParameter) +{ + std::thread(ModuleEntry).detach(); +} +HINSTANCE hDLL; +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved){ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + hDLL = hinstDLL; + //unicode patch for console + HexReplaceInLibrary("cstrike/cl_dlls/client.dll", "7ECC880A", "76CC880A", 0xCC, 0); + //1280x720<= tab avatar fixes + HexReplaceInLibrary("cstrike/cl_dlls/client.dll", "817C24CC00030000", "817C24CC01000000", 0xCC, 0); + //wad files download fix + HexReplaceInLibrary("hw.dll", "1885C07403C600008D85", "1885C07414C600008D85", 0, 0); + //GetHullBounds Fix + HexReplaceInLibrary("hw.dll", "8B4C240433C02BC87406497403497505B801000000C3", "837C240401750B8B44240CC7400800000042B001C3C3", 0, 0); + CreateThread(0, 0, ThreadEntry, 0, 0, 0); + + return TRUE; + } + return FALSE; +} \ No newline at end of file diff --git a/MiniBase/main.h b/MiniBase/main.h new file mode 100644 index 0000000..6c0e399 --- /dev/null +++ b/MiniBase/main.h @@ -0,0 +1,61 @@ +#pragma once +#pragma warning(disable:4996) +#pragma warning(disable:4305) +#pragma warning(disable:4309) +#pragma warning(disable:4018) +#pragma warning(disable:4101) +#pragma warning(disable:4244) +#pragma warning(disable:4800) +#pragma warning(disable:4244) +#pragma warning(disable:4995) +#include +#include +#include +#include + +using namespace std; + +#include "ValveSDK/engine/wrect.h" +#include "ValveSDK/engine/cl_dll.h" +#include "ValveSDK/engine/r_studioint.h" +#include "ValveSDK/engine/cl_entity.h" +#include "ValveSDK/misc/com_model.h" +#include "ValveSDK/engine/triangleapi.h" +#include "ValveSDK/engine/pmtrace.h" +#include "ValveSDK/engine/pm_defs.h" +#include "ValveSDK/engine/pm_info.h" +#include "ValveSDK/common/ref_params.h" +#include "ValveSDK/common/studio_event.h" +#include "ValveSDK/common/net_api.h" +#include "ValveSDK/common/r_efx.h" +#include "ValveSDK/engine/cvardef.h" +#include "ValveSDK/engine/util_vector.h" +#include "ValveSDK/engine/studio.h" +#include "ValveSDK/engine/event_args.h" +#include "ValveSDK/engine/event_flags.h" +#include "ValveSDK/common/event_api.h" +#include "ValveSDK/common/screenfade.h" +#include "ValveSDK/engine/keydefs.h" +#include "ValveSDK/common/engine_launcher_api.h" +#include "ValveSDK/common/entity_types.h" + +#include "struct.h" +#include "offset.h" +#include "utils.h" + +extern cl_clientfunc_t *g_pClient; +extern cl_enginefunc_t *g_pEngine; +extern engine_studio_api_t *g_pStudio; + +extern cl_clientfunc_t g_Client; +extern cl_enginefunc_t g_Engine; +extern engine_studio_api_t g_Studio; + +extern PUserMsg pUserMsgBase; +extern PEngineMsg pEngineMsgBase; +extern PEventMsg pEventMsgBase; +extern PColor24 Console_TextColor; + +extern SCREENINFO g_Screen; + +extern char* BaseDir; \ No newline at end of file diff --git a/MiniBase/offset.cpp b/MiniBase/offset.cpp new file mode 100644 index 0000000..eb6ff51 --- /dev/null +++ b/MiniBase/offset.cpp @@ -0,0 +1,278 @@ +#include "offset.h" + +cOffset offset; + +void cOffset::GetRenderType() +{ + HwDll = (DWORD)GetModuleHandleA(HW_DLL); + SwDll = (DWORD)GetModuleHandleA(SW_DLL); + HlMod = (DWORD)GetModuleHandleA(NULL); +} + +bool cOffset::GetModuleInfo() +{ + GetRenderType(); + + if (HwDll) + HwBase = HwDll; + else if (SwDll) + HwBase = SwDll; + else + HwBase = HlMod; + + HwSize = GetModuleSize(HwBase); + HwEnd = HwBase + HwSize - 1; + + HlBase = HlMod; + HlSize = (DWORD)GetModuleSize(HlBase); + HlEnd = HlBase + HlSize - 1; + + ClBase = (DWORD)GetModuleHandleA(CLIENT_DLL); + + if (ClBase) + { + ClSize = GetModuleSize(ClBase); + ClEnd = ClBase + ClSize - 1; + } + else + { + ClBase = HwBase; + ClEnd = HwEnd; + ClSize = HwSize; + } + + VgBase = (DWORD)GetModuleHandleA(GAMEUI_DLL); + + if (VgBase) + { + VgSize = (DWORD)GetModuleSize(VgBase); + VgEnd = VgBase + VgSize - 1; + } + + return (HwBase && ClBase && HlBase && VgBase); +} + +void cOffset::Error(char* Msg) +{ + MessageBoxA(0, Msg, OFF_ERROR, MB_OK | MB_ICONERROR); +} + +DWORD cOffset::FindClientTable() +{ + BYTE ClientOffset[2] = { 0x10, 0x13 }; + + DWORD PatternAddress = FindPattern(OFF_CLIENT_PATTERN, HwBase, HwEnd, 0); + + if (PatternAddress) + { + for (byte i = 0; i < sizeof(ClientOffset); i++) + { + DWORD ClientTablePtr = *(PDWORD)(FindReference(HwBase, HwEnd, PatternAddress) + ClientOffset[i]); + + if (!FarProc((DWORD)ClientTablePtr, HwBase, HwEnd) && + !IsBadReadPtr((PVOID)ClientTablePtr, sizeof(cl_clientfunc_t))) + { + return ClientTablePtr; + } + } + } + + return 0; +} + +DWORD cOffset::FindEngineTable() +{ + DWORD PatternAddress = FindPattern(OFF_ENGINE_PATTERN, OFF_ENGINE_MASK, ClBase, ClEnd, 0x02); + + if (PatternAddress) + { + if (!FarProc((DWORD)PatternAddress, ClBase, ClEnd)) + { + return *(PDWORD)PatternAddress; + } + } + else + { + PatternAddress = FindPattern(OFF_ENGINE_PATTERN, OFF_ENGINE_MASK, HlBase, HlEnd, 0x02); + + if (PatternAddress) + { + if (!FarProc((DWORD)PatternAddress, HlBase, HlEnd)) + { + return *(PDWORD)PatternAddress; + } + } + } + + return 0; +} + +DWORD cOffset::FindStudioTable() +{ + DWORD StudioTablePtr = *(DWORD*)((DWORD)g_pClient->HUD_GetStudioModelInterface + 0x30); // old patch, dod + + if (FarProc((DWORD)StudioTablePtr, HwBase, HwEnd) && FarProc((DWORD)StudioTablePtr, HlBase, HlEnd) && + FarProc((DWORD)StudioTablePtr, ClBase, ClEnd)) + { + StudioTablePtr = *(DWORD*)((DWORD)g_pClient->HUD_GetStudioModelInterface + 0x1A); // new patch / steam + + if (FarProc((DWORD)StudioTablePtr, ClBase, ClEnd)) + return 0; + } + + return StudioTablePtr; +} + +DWORD cOffset::FindUserMsgBase() +{ + BYTE Pattern_UserMsg[9] = + { + 0x52, 0x50, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0x00 + }; + + BYTE Pattern_UserMsg2[13] = + { + 0xFF, 0xFF, 0xFF, 0x0C, + 0x56, 0x8B, 0x35, 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x00 + }; + + DWORD Address = (DWORD)g_Engine.pfnHookUserMsg; + DWORD UserMsgBase = Absolute(FindPattern((PCHAR)Pattern_UserMsg, OFF_MSG_USER_MASK1, Address, Address + 0x32, 3)); + + if (FarProc(UserMsgBase, HwBase, HwEnd)) + { + Error(OFF_USER_MSG_EROR1); + return 0; + } + + UserMsgBase = FindPattern((PCHAR)Pattern_UserMsg2, OFF_MSG_USER_MASK2, UserMsgBase, UserMsgBase + 0x32, 7); + + if (FarProc(UserMsgBase, HwBase, HwEnd)) + { + Error(OFF_USER_MSG_EROR2); + return 0; + } + + return **(PDWORD*)UserMsgBase; +} + +DWORD cOffset::FindGameConsole() +{ + DWORD PatternAddress = FindPattern(OFF_GAME_CONSOLE_P, VgBase, VgEnd, 0); + DWORD ReferenAddress = FindReference(VgBase, VgEnd, PatternAddress) + 0x21; + + if (FarProc(ReferenAddress, VgBase, VgEnd)) + { + Error(OFF_GAME_CONSOLE_R); + return 0; + } + + DWORD GameConsole = *(PDWORD)ReferenAddress; + + return GameConsole; +} + +#define equali !stricmp +void cOffset::ConsoleColorInitalize() +{ + DWORD GameConsole = FindGameConsole(); + + if (GameConsole) + { + DWORD Panel = (*(PDWORD)(GameConsole + 8) - GameConsole); + + Console_TextColor = PColor24(Panel + GameConsole + 288 + sizeof(DWORD)); + + if (*(PDWORD)(DWORD(Console_TextColor) + 8) != 0) + { + Console_TextColor = PColor24(Panel + GameConsole + 288 + (sizeof(DWORD) * 2)); + } + } +} + +void cOffset::CopyClient() +{ + native_memcpy(&g_Client, g_pClient, sizeof(cl_clientfunc_t)); +} + +void cOffset::CopyEngine() +{ + native_memcpy(&g_Engine, g_pEngine, sizeof(cl_enginefunc_t)); +} + +void cOffset::CopyStudio() +{ + native_memcpy(&g_Studio, g_pStudio, sizeof(engine_studio_api_t)); +} + +DWORD cOffset::Absolute(DWORD Address) +{ + return Address + *(PDWORD)Address + 4; +} + +DWORD cOffset::FarProc(DWORD Address, DWORD LB, DWORD HB) +{ + return ((Address < LB) || (Address > HB)); +} + +DWORD cOffset::FindReference(DWORD start, DWORD end, DWORD Address) +{ + char szPattern[] = { 0x68, 0x00, 0x00, 0x00, 0x00, 0x00 }; + *(PDWORD)&szPattern[1] = Address; + return FindPattern(szPattern, start, end, 0); +} + +DWORD cOffset::FindPattern(PCHAR pattern, PCHAR mask, DWORD start, DWORD end, DWORD offset) +{ + int patternLength = native_strlen(pattern); + bool found = false; + + for (DWORD i = start; i < end - patternLength; i++) + { + found = true; + for (int idx = 0; idx < patternLength; idx++) + { + if (mask[idx] == 'x' && pattern[idx] != *(PCHAR)(i + idx)) + { + found = false; + break; + } + } + if (found) + { + return i + offset; + } + } + + return 0; +} + +DWORD cOffset::FindPattern(PCHAR pattern, DWORD start, DWORD end, DWORD offset) +{ + int patternLength = native_strlen(pattern); + bool found = false; + + for (DWORD i = start; i < end - patternLength; i++) + { + found = true; + for (int idx = 0; idx < patternLength; idx++) + { + if (pattern[idx] != *(PCHAR)(i + idx)) + { + found = false; + break; + } + } + if (found) + { + return i + offset; + } + } + + return 0; +} + +DWORD cOffset::GetModuleSize(DWORD Address) +{ + return PIMAGE_NT_HEADERS(Address + (DWORD)PIMAGE_DOS_HEADER(Address)->e_lfanew)->OptionalHeader.SizeOfImage; +} \ No newline at end of file diff --git a/MiniBase/offset.h b/MiniBase/offset.h new file mode 100644 index 0000000..3a15fb5 --- /dev/null +++ b/MiniBase/offset.h @@ -0,0 +1,48 @@ +#pragma once + +#include "main.h" + +class cOffset +{ +public: + + DWORD HwDll , SwDll , HlMod; + + DWORD HwBase , HwSize , HwEnd; + DWORD ClBase , ClSize , ClEnd; + DWORD HlBase , HlSize , HlEnd; + DWORD VgBase , VgSize , VgEnd; + + BYTE HLType; + + void GetRenderType(); + bool GetModuleInfo(); + + void Error( char* Msg ); + + DWORD FindClientTable(); + DWORD FindEngineTable(); + DWORD FindStudioTable(); + DWORD FindUserMsgBase(); + DWORD FindGameConsole(); + DWORD FindSVCMessages(); + DWORD FindEventMsgBase(); + void ConsoleColorInitalize(); + void GetGameInfo( pGameInfo_s GameInfo ); + + void CopyClient(); + void CopyEngine(); + void CopyStudio(); + + DWORD Absolute( DWORD Address ); + + DWORD FarProc( DWORD Address , DWORD LB , DWORD HB ); + DWORD FindReference( DWORD start , DWORD end , DWORD Address ); + + DWORD FindPattern( PCHAR pattern , PCHAR mask , DWORD start , DWORD end , DWORD offset ); + DWORD FindPattern( PCHAR pattern , DWORD start , DWORD end , DWORD offset ); + + DWORD GetModuleSize( DWORD Address ); +}; + +extern cOffset offset; \ No newline at end of file diff --git a/MiniBase/struct.h b/MiniBase/struct.h new file mode 100644 index 0000000..6ec2c48 --- /dev/null +++ b/MiniBase/struct.h @@ -0,0 +1,166 @@ +#pragma once + +#include "main.h" + +typedef void(*pfnEngineMessage)(); +typedef void(*pfnEventMsgHook)(event_args_t *args); + +typedef unsigned __int16 uint16; + +typedef struct Color24 +{ + BYTE R, G, B; +} TColor24, *PColor24; + +typedef struct UserMsg +{ + int number; + int size; + char name[16]; + struct UserMsg* next; + pfnUserMsgHook pfn; +} *PUserMsg; + +typedef struct EngineMsg +{ + int number; + char* name; + pfnEngineMessage pfn; +} *PEngineMsg; +typedef struct EventMsg +{ + struct EventMsg* next; + char* name; + pfnEventMsgHook pfn; +} *PEventMsg; +typedef struct cmd_s +{ + struct cmd_s *next; + char *name; + xcommand_t function; + int flags; +} cmd_t, *pcmd_t; + +typedef struct sizebuf_s +{ + const char *buffername; + uint16 flags; + byte *data; + int maxsize; + int cursize; +} sizebuf_t; + +typedef struct GameInfo_s +{ + char* GameName; + char* GameVersion; + BYTE Protocol; + DWORD Build; +} GameInfo_t, *pGameInfo_s; + +typedef struct cl_clientfuncs_s +{ + int(*Initialize) (cl_enginefunc_t *pEnginefuncs, int iVersion); + int(*HUD_Init) (void); + int(*HUD_VidInit) (void); + void(*HUD_Redraw) (float time, int intermission); + int(*HUD_UpdateClientData) (client_data_t *pcldata, float flTime); + int(*HUD_Reset) (void); + void(*HUD_PlayerMove) (struct playermove_s *ppmove, int server); + void(*HUD_PlayerMoveInit) (struct playermove_s *ppmove); + char(*HUD_PlayerMoveTexture) (char *name); + void(*IN_ActivateMouse) (void); + void(*IN_DeactivateMouse) (void); + void(*IN_MouseEvent) (int mstate); + void(*IN_ClearStates) (void); + void(*IN_Accumulate) (void); + void(*CL_CreateMove) (float frametime, struct usercmd_s *cmd, int active); + int(*CL_IsThirdPerson) (void); + void(*CL_CameraOffset) (float *ofs); + struct kbutton_s *(*KB_Find) (const char *name); + void(*CAM_Think) (void); + void(*V_CalcRefdef) (struct ref_params_s *pparams); + int(*HUD_AddEntity) (int type, struct cl_entity_s *ent, const char *modelname); + void(*HUD_CreateEntities) (void); + void(*HUD_DrawNormalTriangles) (void); + void(*HUD_DrawTransparentTriangles) (void); + void(*HUD_StudioEvent) (const struct mstudioevent_s *event, const struct cl_entity_s *entity); + void(*HUD_PostRunCmd) (struct local_state_s *from, struct local_state_s *to, struct usercmd_s *cmd, int runfuncs, double time, unsigned int random_seed); + void(*HUD_Shutdown) (void); + void(*HUD_TxferLocalOverrides) (struct entity_state_s *state, const struct clientdata_s *client); + void(*HUD_ProcessPlayerState) (struct entity_state_s *dst, const struct entity_state_s *src); + void(*HUD_TxferPredictionData) (struct entity_state_s *ps, const struct entity_state_s *pps, struct clientdata_s *pcd, const struct clientdata_s *ppcd, struct weapon_data_s *wd, const struct weapon_data_s *pwd); + void(*Demo_ReadBuffer) (int size, unsigned char *buffer); + int(*HUD_ConnectionlessPacket) (struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size); + int(*HUD_GetHullBounds) (int hullnumber, float *mins, float *maxs); + void(*HUD_Frame) (double time); + int(*HUD_Key_Event) (int down, int keynum, const char *pszCurrentBinding); + void(*HUD_TempEntUpdate) (double frametime, double client_time, double cl_gravity, struct tempent_s **ppTempEntFree, struct tempent_s **ppTempEntActive, int(*Callback_AddVisibleEntity)(struct cl_entity_s *pEntity), void(*Callback_TempEntPlaySound)(struct tempent_s *pTemp, float damp)); + struct cl_entity_s *(*HUD_GetUserEntity) (int index); + int(*HUD_VoiceStatus) (int entindex, qboolean bTalking); + int(*HUD_DirectorMessage) (unsigned char command, unsigned int firstObject, unsigned int secondObject, unsigned int flags); + int(*HUD_GetStudioModelInterface) (int version, struct r_studio_interface_s **ppinterface, struct engine_studio_api_s *pstudio); + void(*HUD_CHATINPUTPOSITION_FUNCTION) (int *x, int *y); + int(*HUD_GETPLAYERTEAM_FUNCTION) (int iplayer); + void(*CLIENTFACTORY) (void); +} cl_clientfunc_t; + +#define SVC_BAD 0 +#define SVC_NOP 1 +#define SVC_DISCONNECT 2 +#define SVC_EVENT 3 +#define SVC_VERSION 4 +#define SVC_SETVIEW 5 +#define SVC_SOUND 6 +#define SVC_TIME 7 +#define SVC_PRINT 8 +#define SVC_STUFFTEXT 9 +#define SVC_SETANGLE 10 +#define SVC_SERVERINFO 11 +#define SVC_LIGHTSTYLE 12 +#define SVC_UPDATEUSERINFO 13 +#define SVC_DELTADESCRIPTION 14 +#define SVC_CLIENTDATA 15 +#define SVC_STOPSOUND 16 +#define SVC_PINGS 17 +#define SVC_PARTICLE 18 +#define SVC_DAMAGE 19 +#define SVC_SPAWNSTATIC 20 +#define SVC_EVENT_RELIABLE 21 +#define SVC_SPAWNBASELINE 22 +#define SVC_TEMPENTITY 23 +#define SVC_SETPAUSE 24 +#define SVC_SIGNONNUM 25 +#define SVC_CENTERPRINT 26 +#define SVC_KILLEDMONSTER 27 +#define SVC_FOUNDSECRET 28 +#define SVC_SPAWNSTATICSOUND 29 +#define SVC_INTERMISSION 30 +#define SVC_FINALE 31 +#define SVC_CDTRACK 32 +#define SVC_RESTORE 33 +#define SVC_CUTSCENE 34 +#define SVC_WEAPONANIM 35 +#define SVC_DECALNAME 36 +#define SVC_ROOMTYPE 37 +#define SVC_ADDANGLE 38 +#define SVC_NEWUSERMSG 39 +#define SVC_PACKETENTITIES 40 +#define SVC_DELTAPACKETENTITIES 41 +#define SVC_CHOKE 42 +#define SVC_RESOURCELIST 43 +#define SVC_NEWMOVEVARS 44 +#define SVC_RESOURCEREQUEST 45 +#define SVC_CUSTOMIZATION 46 +#define SVC_CROSSHAIRANGLE 47 +#define SVC_SOUNDFADE 48 +#define SVC_FILETXFERFAILED 49 +#define SVC_HLTV 50 +#define SVC_DIRECTOR 51 +#define SVC_VOICEINIT 52 +#define SVC_VOICEDATA 53 +#define SVC_SENDEXTRAINFO 54 +#define SVC_TIMESCALE 55 +#define SVC_RESOURCELOCATION 56 +#define SVC_SENDCVARVALUE 57 +#define SVC_SENDCVARVALUE2 58 \ No newline at end of file diff --git a/MiniBase/utils.cpp b/MiniBase/utils.cpp new file mode 100644 index 0000000..7d5ef9b --- /dev/null +++ b/MiniBase/utils.cpp @@ -0,0 +1,45 @@ +#include "utils.h" + +char* native_strcpy(char *dest, const char *src) +{ + return lstrcpyA(dest, src); +} + +char* native_strcat(char *dest, const char *src) +{ + return lstrcatA(dest, src); +} + +int native_strcmp(char *pStr1, char *pStr2) +{ + return lstrcmpA(pStr1, pStr2); +} + +int native_strlen(char *pStr) +{ + return lstrlenA(pStr); +} + +void native_memcpy(void * dst, const void * src, size_t count) +{ + _asm + { + mov edi, [dst] + mov esi, [src] + mov ecx, [count] + rep movsb + } +} + +void native_memset(void *szBuffer, DWORD dwLen, DWORD dwSym) +{ + _asm + { + pushad + mov edi, [szBuffer] + mov ecx, [dwLen] + mov eax, [dwSym] + rep stosb + popad + } +} \ No newline at end of file diff --git a/MiniBase/utils.h b/MiniBase/utils.h new file mode 100644 index 0000000..bd73b71 --- /dev/null +++ b/MiniBase/utils.h @@ -0,0 +1,57 @@ +#pragma once + +#include "main.h" + +#define HW_DLL "hw.dll" +#define SW_DLL "sw.dll" + +#define CLIENT_DLL "client.dll" +#define GAMEUI_DLL "GameUI.dll" + +#define ERROR_FIND "Find Cl/En/St Modules Error" +#define OFF_ERROR "Error Find" + +#define OFF_CLIENT_PATTERN "ScreenFade" + +#define OFF_ENGINE_PATTERN "\xFF\x15\xFF\xFF\xFF\xFF\x68\xFF\xFF\xFF\xFF\x89\x86\xFF\xFF\xFF\xFF\xFF\x15\xFF\xFF\xFF\xFF\x68\xFF\xFF\xFF\xFF\x89\x86\xFF\xFF\xFF\xFF\xFF\x15\xFF\xFF\xFF\xFF\x68\xFF\xFF\xFF\xFF\x89\x86\xFF\xFF\xFF\xFF\xFF\x15\xFF\xFF\xFF\xFF\x68\xFF\xFF\xFF\xFF\x89\x86\xFF\xFF\xFF\xFF\xFF\x15\xFF\xFF\xFF\xFF\x68\xFF\xFF\xFF\xFF\x89\x86\xFF\xFF\xFF\xFF\xFF\x15\xFF\xFF\xFF\xFF\x68\xFF\xFF\xFF\xFF\x89\x86\xFF\xFF\xFF\xFF\xFF\x15\xFF\xFF\xFF\xFF\x68\xFF\xFF\xFF\xFF\x89\x86\xFF\xFF\xFF\xFF\xFF\x15\xFF\xFF\xFF\xFF" +#define OFF_ENGINE_MASK "xx????x????xx????xx????x????xx????xx????x????xx????xx????x????xx????xx????x????xx????xx????x????xx????xx????x????xx????xx????" +#define OFF_EVENT_MSG_BASE "CL_HookEvent: Must provide a valid event name" +#define OFF_STUDIO_PATTERN "Couldn't get client .dll studio model rendering interface." + +#define OFF_SVC_MSG_PATTERN "\xBF\xFF\xFF\xFF\xFF\x8B\x04\xB5\xFF\xFF\xFF\xFF\x85\xC0\x74\xFF\x81\xFF\xFF\xFF\xFF\xFF\x7F\x04\x8B\x0F\xEB\x05" +#define OFF_SVC_MSG_MASK "x????xxx????xxx?xx????xxxxxx" + +#define OFF_MSG_USER_MASK1 "xxx????x" +#define OFF_MSG_USER_MASK2 "???xxxx????x" +#define OFF_EVENT_MSG_ERROR "Couldn't find EventMsgBase pointer." +#define OFF_USER_MSG_EROR1 "Couldn't find UserMsgBase #1 pointer." +#define OFF_USER_MSG_EROR2 "Couldn't find UserMsgBase #2 pointer." + +#define OFF_GAME_CONSOLE_P "GameConsole003" +#define OFF_GAME_CONSOLE_R "Couldn't find GameConsole pointer." + +#define OFF_MSG_READ_CORD "MSG_ReadCoord" +#define OFF_MSG_STR_READING "MSG_StartBitReading" +#define OFF_MSG_END_READING "MSG_EndBitReading" +#define OFF_ENGINE_MSG_BASE "EngineMsgBase" +#define OFF_SVC_MESSAGES_P "End of List" + +#define OFF_ERR_GAMEINFO "Couldn't find GameInfo pointer." + +PUserMsg UserMsgByName(char* szMsgName); +PEngineMsg EngineMsgByName(char* szMsgName); +pcmd_t CommandByName(char* szName); + +pfnUserMsgHook HookUserMsg(char *szMsgName, pfnUserMsgHook pfn); +pfnEngineMessage HookEngineMsg(char *szMsgName, pfnEngineMessage pfn); +pfnEventMsgHook HookEventMsg(char *szMsgName, pfnEventMsgHook pfn); + +PEventMsg EventMsgByName(char* szMsgName); +char* native_strcpy(char *dest, const char *src); +char* native_strcat(char *dest, const char *src); + +int native_strcmp(char *pStr1, char *pStr2); +int native_strlen(char *pStr); + +void native_memcpy(void * dst, const void * src, size_t count); +void native_memset(void *szBuffer, DWORD dwLen, DWORD dwSym); \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e0b1fce --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# CS Fixes +Various patches for cs 1.6 steam \ No newline at end of file diff --git a/Release/CS Fixes.asi b/Release/CS Fixes.asi new file mode 100644 index 0000000000000000000000000000000000000000..747f7003d14a4fc7418e52feb7b1a79a43959f0e GIT binary patch literal 284672 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

*SyV{w;T2MUL@ETZ z?jRLKq(VBXD`b?uv_h{`nDk1GjcupLSgK}3q|4G!;Pf^p#z08@lFC4z-Gp0ZjF}?o zFXMVf^#wND7sj}^d8+Sv&+9(|Tsacen%)qrSbfU9wFGn1!^QLPm-WP*q60R@D_xWb0NxWDr( zAWH{~rrzfHzDs1tleVNYsaaCW(_K4oaL5;DM?7XsB9+s*i=LdnC4O zb$^Gy>ow^XW^lT{PNN4$N&YT1U3a<%WZTtoTUTs=E+9%dV}$cm-|*}M>b7`xzAwcy z&d}NL_v@#%I8Fz1i_NO8|ET&j4)Eyz@A}1wc3$+g_t_#kqHaGX#yBfj%KJ}{cWmE# z%DZ4CRv^agKNP$GVl8%hZ_3$yGwh#>F~(kCJETghqFSm1`x4T|WmgG^AoUD@@ z@yQ>!YXD?jiP}t3C9#{DB@{vRNkY96oxt_-zMOX7)Zo5*oZ*USXnB7m8E4S6#r>J< z``@PDV)8MemLMdZS;p|Bpme{lkCC?PAgx4j&lLjrV95SK|U3 zCKDASx^}V}zYZ{!lWm0W9)tK?hws*Y&^F5e)F)# zT{d+?US)E#q=yxdDPz<%y7G}yvdwrWQVhX`SsV5}P+8)g@)2!G>35kHK6v4M2!OMFJxwh#)ZJ5P4 zD+^7DRCmYPJ5fQv_hv={fuK*hPpq36v4^k0O;HAZ;;qQv8K_eR8*%ZB@^ZSp$9-aL z7v)hX+>f`hY3MzihfkZt@C^wKOU{YbFXaEVQK1zgT0hm9a{%b>j&)DaT+vy(S>>0S zwBnG$vqj5DxH>0

|Xbxq2QZogx6UH8{fs2@N-nh}JLRe~Afx1&#pOV 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 literal 0 HcmV?d00001