A library that contains some functions and optimizations for gmod.
If you need any function, make an issue for it, and I'll look into it.
So currently to get it working on Windows, I would have to redo most of the hooks, and It would also take a good while.
Because of this, I'm not going to make it currently. I'm gonna slowly start adding all symbols and then someday I'm going to redo most hooks.
But for now there won't be a release.
- Download the
ghostinj.dll
,holylib.vdf
andgmsv_holylib_linux.so
from the latest release. - Put the
ghostinj.dll
into the main directory wheresrcds_linux
is located. - Put the
holylib.vdf
into thegarrysmod/addons/
directory. - Put the
gmsv_holylib_linux.so
into thegarrysmod/lua/bin/
directory. - Add
-usegh
to the servers startup params.
If you use a panel like Pterodactyl or something similar, you can use the gamemode field(in most cases) like this:sandbox -usegh
If you already had a ghostinj.dll
, you can rename it to ghostinj2.dll
and it will be loaded by holylib's ghostinj.
- Download the
holylib.vdf
andgmsv_holylib_linux.so
from the latest release. - Put the
holylib.vdf
into thegarrysmod/addons/
directory. - Put the
gmsv_holylib_linux.so
into thegarrysmod/lua/bin/
directory.
- [+] Added systimer
module.
- [+] Added two new filesystem functions.
- - filesystem.Create
- - filesystem.Access
- [+] Added partial Linux 64x support.
- - bitbuf
- - concommand
- - cvars
- - holylib
- - networking
- - serverplugin
- - steamworks
- - stringtable
- - util
- - systimer
- [+] Added a compatibility system for all modules.
Modules that aren't compatible are disabled by default.
NOTE: If some of their functions work, you can still force enable them with their ConVar or with the commandline.
- [+] Added filesystem
lua library.
- [+] Added INetworkStringTable:Set/GetNumberUserData
.
- [+] Added steamworks.ForceActivate
to mimic the engine.
- [#] Fixed surffix
module not actually working
- [#] Fixed a crash in the surffix
module when noclipping thru a player.
I forgot to pass the first argument to Gmod which caused this issue.
- [#] Future improved the filesystem my reducing the usage of std::string
.
- [#] Fixed up the sourcesdk to not have all these file name differences and fixed a few things
-> (32x)keyvalues.h
| (64x)KeyValues.h
- [#] Fixed serverplugins
module not removing all detours on shutdown.
- [#] Fixed a few crashes with gameevent
module when given invalid input.
You can see all changes here:
https://github.com/RaphaelIT7/gmod-holylib/compare/Release0.3...main
- [#] Extented vprof
to also include calls from CScriptedEntity
-> SWEPs, Entity, Nextbot and probably more.
- [#] Changed print formatting
Registered module holylib (Enabled: true, Compatible: true )
Registered module gameevent (Enabled: true, Compatible: true )
[...]
- Finish 64x
- Find out why ConVars are so broken. (Serverside commands break)
- Look into filesystem handle optimization
- Fix PAS Module
- Allow one to create/copy a bf_read at any time.
- Look into NW System to possibly replace it with a better version.
- Try to fix that one complex NW2 bug. NOTE: It's related to baseline updates (Entity Creation/Deletion)
- Add a way to get all strings of a stringtable.
Modules
- holylib
- gameevent
- threadpoolfix
- precachefix
- stringtable
- - INetworkStringTable
- pvs
- surffix
- filesystem
- util
- concommand
- vprof
- sourcetv
- - HLTVClient
- bitbuf
- - bf_read
- networking
- steamworks
- systimer
Unfinished Modules
- bass
- serverplugins
- pas
Issues implemented / fixed
Some things for later
Each module has its own convar holylib_enable_[module name]
which allows you to enable/disable specific modules.
You can add -holylib_enable_[module name] 0
to the startup to disable modules on startup.
This module contains the HolyLib library.
Player ply - The Player to reconnect.
Returns true
if the player was successfully reconnected.
bool hide - true
to hide the server from the serverlist.
This module contains additional functions for the gameevent library.
With the Add/Get/RemoveClient* functions you can control the gameevents that are networked to a client which can be useful.
string name(optional) - The event to return the count of listeners for.
If name is not a string, it will return a table containing all events and their listener count:
{
["player_spawn"] = 1
}
NOTE: Can return
nil
on failure.
string name - The event to remove the Lua gameevent listener from.
Returns true
if the listener was successfully removed from the given event.
Returns a table containing all gameevents the given client is listening to.
If not given a player, it will return a table containing all players and the gameevent they're listening to.
Removes the player from listening to the given gameevent.
If the given gameevent is nil
it will remove the player from all gameevents.
Returns true
on success.
Adds the given player to listen to the given event.
Returns true
on success.
Called when the client sends the gameevent list it wants to listen to.
Return true
to stop the engine from future processing this list.
Called after the engine processed the received gameevent list.
If enabled, it will call the gameevent hooks.
My debug stuff :> It'll never be important for you.
This module modifies CThreadPool::ExecuteToPriority
to not call CThreadPool::SuspendExecution
when it doesn't have any jobs.
This is a huge speed improvement for adding searchpaths / mounting legacy addons.
NOTE: This requires the
ghostinj.dll
to be installed!
This module removes the host error when the model or generic precache stringtable overflows.
Instead it will throw a warning.
If these stringtables overflow, expect the models that failed to precache to be an error.
This module calls these hooks from (hook.Run
)
string model - The model that failed to precache.
number idx - The index the model was precache in.
string model - The model that failed to precache.
string file - The file that failed to precache.
number idx - The index the file was precache in.
string file - The file that failed to precache.
This module adds a new library called stringtable
, which will contain all functions to handle stringtables,
and it will a hook for when the stringtables are created, since they are created while Lua was already loaded.
NOTE: For now, all functions below are just a bind to their C++ versions -> INetworkStringTable
INetworkStringTable stringtable.CreateStringTable(string tablename, number maxentries, number userdatafixedsize = 0, number userdatanetworkbits = 0)
string tablename - The name for the stringtable we want to create.
number maxentries - The maximal amount of entries.
number userdatafixedsize(default 0
) - The size of the userdata.
number userdatanetworkbits(default 0
) - The networkbits to use for the userdata.
Returns nil
or a INetworkStringTable
.
Nuke all stringtables. BOOOM
string tablename - The table to search for
Returns nil
or the INetworkStringTable
number tableid - The tableid of the table to get
Returns nil
or the INetworkStringTable
Returns the number of stringtables that exist.
INetworkStringTable stringtable.CreateStringTableEx(string tablename, number maxentries, number userdatafixedsize = 0, number userdatanetworkbits = 0, bool bIsFilenames = false )
string tablename - The name for the stringtable we want to create.
number maxentries - The maximal amount of entries.
number userdatafixedsize(default 0
) - The size of the userdata.
number userdatanetworkbits(default 0
) - The networkbits to use for the userdata.
bool bIsFilenames(default false
) - If the stringtable will contain filenames.
INetworkStringTable table - The table to set it on
bool bAllowClientSideAddString - If clients should be able to modify the stringtable.
Returns whether you're allowed to create stringtables.
Returns if the stringtable is locked or not.
Sets whether you're allowed to create stringtable.
Example:
stringtable.AllowCreation(true)
stringtable.CreateStringTable("example", 8192)
stringtable.AllowCreation(false)
NOTE: Please use the
HolyLib:OnStringTableCreation
hook to add custom stringtables.
Deletes that specific stringtable.
This is a metatable that is pushed by this module. It contains the functions listed below
Returns the name of the stringtable
Returns the id of the stringtable
Returns the number of strings this stringtable has
Returns the maximum number of string this stringtable has
ToDo: I have no idea
number tick - The tick to set the stringtable to
Returns the number of strings this stringtable has
number tick - The tick to set the stringtable to
Returns whether or not the stringtable changed since that tick.
bool bIsServer - Weather or not the server is adding this value? (Idk, added it so you have more control.)
string pStr - The string to add
Returns the index of the added string.
number index - The index to get the string from
Returns the string from that index
string pStr - The string to find the index of
Returns the index of the given string.
Deletes all strings from the stringtable.
number maxEntries - The new limit for entries.
Sets the new Entry limit for that stringtable.
The new limit will work but for some stringtables, it might cause issues, where the limits are hardcoded clientside.
A list of known stringtables with hardcoded limits:
modelprecache
-> Limited byCClientState::model_precache
genericprecache
-> Limited byCClientState::generic_precache
soundprecache
-> Limited byCClientState::sound_precache
decalprecache
-> Limited byCClientState::decal_precache
networkvars
-> Limited by the internal net message used.
NOTE: If there are already more entries than the new limit, they won't be removed.
(This could cause issues, so make sure you know what you're doing.)
Deletes the given string at the given index.
Returns true
if the string was deleted.
NOTE: Currently this deletes all strings and readds all except the one at the given index. This is slow and I need to improve it later.
BUG: It doesn't readd the userdata the strings.
Returns true
if the stringtable is still valid.
Sets the UserData for the given index.
How this could be useful:
local dataTablePaths = {
"/lua/", -- The order is also important!
-- Add paths that are frequently used to the top so there the first one to be checked for a file.
-- This will improve the performance because it will reduce the number of paths it checks for a file.
"/addons/exampleaddon/lua/", -- Each legacy addon that has a lua folder has it's path.
"/workshop/lua/",
"/workshop/gamemode/",
"/gamemode/",
"/workshop/gamemodes/base/entities/",
"/gamemodes/base/entities/",
"/workshop/gamemodes/sandbox/entities/",
"/gamemodes/sandbox/entities/",
}
local client_lua_files = stringtable.FindTable("client_lua_files")
client_lua_files:SetStringUserData(0, table.concat(dataTablePaths, ";")) -- Set our new datatable paths.
-- Reducing the amount of paths will improve clientside filesystem performance
-- You can see all datapack paths by running "datapack_paths" clientside or printing it like this:
-- print(client_lua_files:GetStringUserData(0))
-- NOTE: Changes to the datatable path will only affect the lcl search path clientside.
Returns the userdata of the given index.
Sets the number as userdata for the given string.
Returns the userdata of the given index. It needs to be a int!
This module adds these enums
This value is returned if the index of a string is invalid, like if INetworkStringTable:AddString fails.
This module calls these hooks from (hook.Run
)
You can create stringtables inside this hook.
If you want to create stringtables outside this hook, use stringtable.AllowCreation
This adds a bunch of PVS related functions.
Resets the current PVS.
Checks if the given position is inside the current PVS.
Adds the given Origin to the PVS. Gmod already has this function.
Returns the number of clusters that exist.
Returns the cluster id of the given origin.
Returns whether or not the given areas are connected.
We don't validate if you pass valid areas!
Returns the area id of the given origin.
Sets the current PVS to that of the given cluster.
We don't validate if the passed cluster id is valid!
Returns whether or not the given box is inside the PVS.
Adds the given entity index to the PVS
table ents - A sequential table containing all the entities which states flags should be overridden.
bool force - Allows you to set the flags directly. It won't make sure that the value is correct!
Overrides the StateFlag for this Snapshot.
The value will be reset in the next one.
NOTE: If you use force, you should know what your doing or else it might cause a crash.
table ents - A sequential table containing all the entities which states should be set.
bool force - Allows you to set the flags directly. It won't make sure that the value is correct!
Sets the State flag for this entity.
Unlike OverrideStateFlag
, this won't be reset after the snapshot.
NOTE: If you use force, you should know what your doing or else it might cause a crash.
bool force - Allows you to get all flags instead of only the ones for networking.
Returns the state flags for this entity.
table ents - A sequential table containing all the entities that should be removed from being transmitted.
Returns true if the entity or all entities were successfully removed from being transmitted.
NOTE: Only use this function inside the
HolyLib:CheckTransmit
hook!
Removes all Entities from being transmitted.
NOTE: Only use this function inside the
HolyLib:CheckTransmit
hook!
table ents - A sequential table containing all the entities that should be transmitted.
bool always - If the entity should always be transmitted? (Verify)
Adds the given Entity to be transmitted.
NOTE: Only use this function inside the
HolyLib:CheckTransmit
hook!
Returns true
if the baseline is empty.
This should always be the case after a full update.
NOTE: Only use this function inside the
HolyLib:CheckTransmit
hook!
REMOVED: This function was removed since I can't get it to work / It would be a bit more complicated than first anticipated.
pvs.SetPreventTransmitBulk(Entity ent or table ents, Player ply or table plys or RecipientFilter filter, bool notransmit)
table ents - A sequential table containing all the entities that should be affected.
table plys - A sequential table containing all the players that it should set it for.
bool notransmit - If the entity should stop being transmitted.
Adds the given Entity to be transmitted.
The Entity won't be networked.
The Entity will always be networked.
The Entity will only be networked if it's inside the PVS.
The Entity's ShouldTransmit
function will be called, and its return value will be used.
entity ply - The player that everything is transmitted to.
table enitites - The Entities that get transmitted. Only available if holylib_pvs_postchecktransmit
is set to 2
or higher.
NOTE: This hook is only called when
holylib_pvs_postchecktransmit
is enabled!
If enabled, it will add/call the HolyLib:CheckTransmit
hook.
If set to 2
it will also pass a table containing all entitites to the hook (The second argument)
This module ports over Momentum Mod's surf fixes.
If enabled, it will enable additional checks to make sure that the player is not stuck in a ramp.
This module contains multiple optimizations for the filesystem.
If enabled, it will check if the file contains a .
after the last /
.
If so it will cause CBaseFileSystem::IsDirectory
to return false since we assume it's a file.
This will cause file.IsDir
to fail on folders with names like these test/test1.23
.
If enabled, it will cause the filesystem to use a cache for the searchpaths.
When you try to open a file with a path like GAME
which has multiple searchpaths, it will check each one until its found.
Now, the first time it searches for it, if it finds it, we add the file and the searchpath to a cache and the next time the same file is searched for, we try to use our cache search path.
This will improve file.Open
, file.Time
and file.Exists
.
The more searchpaths exist, the bigger the improvement for that path will be.
Example (I got 101 legacy addons):
lua_run local a = SysTime() for k=1, 1000 do file.Exists("garrysmod.ver", "GAME") end print(SysTime()-a)
Disabled: 1.907318733
Enabled: 0.035948700999995
You also can test it using the MOD
path. The performance of file.Exists
for any search path and MOD
should be somewhat near each other since, it checks the same amount of searchpaths while this is enabled.
lua_run local a = SysTime() for k=1, 1000 do file.Exists("garrysmod.ver", "GAME") end print(SysTime()-a)
0.033513544999998
lua_run local a = SysTime() for k=1, 1000 do file.Exists("garrysmod.ver", "MOD") end print(SysTime()-a)
0.037827891999996
- If the file doesn't exist, it will still go thru all search paths to search for it again!
- I don't know if this has any bugs, but while using this for ~1 Month on a server, I didn't find any issues.
- It will also improve the
MOD
search path since it also has multiple search paths.
If enabled, it will optimize the CBaseFileSystem::FixPath
function by caching the BASE_PATH
.
If enabled, it will check the searchcache inside CBaseFileSystem::OpenForRead
.
If enabled, it will force the pathID for specific files.
If enabled, it will try to predict the path for a file.
Example:
Your loading a model.
First you load the example.mdl
file.
Then you load the example.phy
file.
Here we can check if the example.mdl
file is in the searchcache.
If so, we try to use the searchpath of that file for the .phy
file and since all model files should be in the same folder, this will work for most cases.
If we fail to predict a path, it will end up using one additional search path.
If enabled, it will split each GAME
path into multiple search paths, depending on it's contents.
Then when you try to find a file with the GAME
search path, it will change the pathID to the content path.
Example:
File: cfg/game.cfg
Path: GAME
becomes:
File: cfg/game.cfg
Path: CONTENT_CONFIGS
This will reduce the amount of searchpaths it has to go through which improves performance.
Content paths:
materials/
->CONTENT_MATERIALS
models/
->CONTENT_MODELS
sound/
->CONTENT_SOUNDS
maps/
->CONTENT_MAPS
resource/
->CONTENT_RESOURCE
scripts/
->CONTENT_SCRIPTS
cfg/
->CONTENT_CONFIGS
gamemodes/
->LUA_GAMEMODES
lua/includes/
->LUA_INCLUDES
Does the same for lsv
to save performance.
BUG: This currently breaks workshop addons.
Lua paths:
sandbox/
->LUA_GAMEMODE_SANDBOX
effects/
->LUA_EFFECTS
entities/
->LUA_ENTITIES
weapons/
->LUA_WEAPONS
lua/derma/
->LUA_DERMA
lua/drive/
->LUA_DRIVE
lua/entities/
->LUA_LUA_ENTITIES
vgui/
->LUA_VGUI
postprocess/
->LUA_POSTPROCESS
matproxy/
->LUA_MATPROXY
autorun/
->LUA_AUTORUN
If enabled, it will fallback to the original searchpath if it failed to find something in the split path.
This is quite slow, so disabling this will improve performance to find files that doesn't exist.
If enabled, it will try to predict the path of a file, but if the file doesn't exist in the predicted path, we'll just say it doesn't exist.
Doesn't rely on holylib_filesystem_predictpath
but it also works with it together.
If enabled, it will fix up weird gamemode paths like sandbox/gamemode/sandbox/gamemode which gmod likes to use.
Currently it fixes these paths:
[Active gamemode]/gamemode/[anything]/[active gamemode]/gamemode/
-> (Example:sandbox/gamemode/spawnmenu/sandbox/gamemode/spawnmenu/
)include/include/
If enabled, it will cache the file handle and return it if needed.
NOTE: This will probably cause issues if you open the same file multiple times.
WARNING: This is a noticeable improvement, but it seems to break .bsp files :/
If enabled, it will print all filesyste suff.
Dumps the searchcache into the console.
ToDo: Allow one to dump it into a file.
Dumps the path for the given searchpath id.
The id is the one listed with each file in the dumped searchcache.
Nukes the searchcache.
This module also adds a filesystem
library which should generally be faster than gmod's functions, because gmod has some weird / slow things in them.
It also gives you full access to the filesystem and doesn't restrict you to specific directories.
(FSASYNC Enum) filesystem.AsyncRead(string fileName, string gamePath, function callBack(string fileName, string gamePath, FSASYNC status, string content), bool sync)
Reads a file async and calls the callback with the contents.
Creates a directory in the given path.
Deletes the given file.
Returns true
if the given file exists.
table(Files), table(Folders) filesystem.Find(string filePath, string gamePath, string sorting = "nameasc")
Finds and returns a table containing all files and folders in the given path.
Returns true
if the given file is a directory.
Opens the given file or returns nil
on failure.
Renames the given file and returns true
on success.
Returns the size of the given file.
Returns the unix time of the last modification of the given file / folder.
Adds the given folderPath to the gamePath searchpaths.
Removes the given searchpath and returns true
on success.
Removes all searchpaths with that gamePath
Example:
filesystem.RemoveSearchPaths("GAME")
-- Removes all GAME
searchpaths.
Removes all searchpaths.
Returns the full path for the given file or nil
on failure.
Returns the relative path for the given file.
Returns the time the given file was created.
Will return nil
if the file wasn't found.
Returns the time the given file was last accessed.
Will return nil
if the file wasn't found.
This module adds two new functions to the util
library.
Works like util.Compress but it's async and allows you to set the level and dictSize.
The defaults for level and dictSize are the same as gmod's util.Compress.
Both AsyncCompress and AsyncDecompress use the same thread.
Same as above, but uses the default values for level and dictSize.
Works like util.Decompress but it's async.
This module unblocks quit
and exit
for RunConsoleCommand
.
If enabled, it completely disables the concommand/convar blacklist.
This module adds VProf to gamemode calls and adds two convars.
If enabled, vprof results will be dumped into a file in the vprof/ folder
Sets the value of sv_stressbots
.
sv_stressbots
is a hidden convar which is very useful for performance tests with bots.
This module adds one function to the cvars
library.
Returns a sequential table with all ConVar's that exist.
This module plans to add a new sourcetv
library and a new class HLTVPlayer
will allow a SourceTV client to send net messages to the server.
Returns true
if sourcetv is active.
Returns true
if sourcetv is recording.
Returns true
if sourcetv server is the master proxy.
Returns true
if the sourcetv server is a relay.
Returns the number of sourctv clients connected.
Returns the slot of the sourcetv client/bot.
string fileName - The name for the recording.
Returns one of the RECORD_
enums.
Returns the filename of the current recording. or nil
.
Stops the active record.
Returns one of the RECORD_
enums.
If successfully stopped, it will return sourcetv.RECORD_OK
.
Returns a table that contains all HLTV clients. It will return nil
on failure.
Returns the HLTVClient at that slot or nil
on failure.
This is a metatable that is pushed by this module. It contains the functions listed below
Returns the a formated string.
Format: HLTVClient [%i][%s]
%i
-> UserID
%s
-> ClientName
Returns the name of the client.
Returns the steamid of the client.
NOTE: Currently broken / will return
STEAM_ID_PENDING
Returns the userid of the client.
Returns the slot of the client. Use this for sourcetv.GetClient
.
Reconnects the HLTV client.
Prints the given message into the client's console.
NOTE: It won't add
\n
at the end of the message, so you will need to add it yourself.
Returns true
if the client is still valid.
Sends the given code to the client to be executed.
Returns true
on success.
NOTE: This function is currently broken and will be readded when it's fixed.
The recording was started.
SourceTV is not active!
the sourcetv server is not the master!
there already is an active record!
NOTE: Should we allow multiple active record? I think I could implement it. If wanted, make a request for it.
there is no active recording to stop!
The filepath for the recording is invalid!
A file with that name already exists!
Called when a HLTVClient sends a net message to the server.
Example:
util.AddNetworkString("Example")
hook.Add("HolyLib:OnSourceTVNetMessage", "Example", function(client, bf)
local name = util.NetworkIDToString(bf:ReadShort())) -- Reads the header
print(name, bf:ReadString())
end)
---- Client
net.Start("Example")
net.WriteString("Hello World from HLTVClient");
net.SendToServer()
Called when a HLTVClient sends a command.
return true
to tell it that the command was handled in Lua.
Example:
hook.Add("HolyLib:OnSourceTVCommand", "Example", function(client, name, args, argString)
if name == "Example" then
client:ClientPrint("Hello World from HLTVServer\n")
return true
end
end)
If enabled, HLTV Clients can send net messages to the server and HolyLib:OnSourceTVNetMessage
will be called.
If enabled, HLTV Clients can send commands to the server and HolyLib:OnSourceTVCommand
will be called.
This module adds a bf_read
and later bf_write
class.
Copies the given buffer into a new one.
Useful if you want to save the data received by a client.
This class will later be used to read net messages from HLTV clients.
ToDo: Finish the documentation below and make it more detailed.
Returns the a formated string.
Format: bf_read [%i]
%i
-> size of data in bits.
Deletes the buffer internally.
Returns the number of bits left.
Returns the number of bits read.
Returns the size of the data in bits.
Returns the number of bytes left.
Returns the number of bytes read.
Returns the size of the data in bytes.
Returns the current position/bit.
NOTE: This is only available for the 32x!
Returns true
if the buffer is overflowed.
Reads and Angle.
NOTE: This is only available for the 32x!
NOTE: This is only available for the 32x!
NOTE: This is only available for the 32x!
NOTE: This is only available for the 32x!
Reads a number with the given number of bits.
NOTE: This is only available for the 32x!
Reads the given number of bits.
Reads a Vector.
Reads a normalizted Vector.
Reads a byte.
Reads the given number of bytes.
Reads a char.
Reads a float.
Reads a long.
Reads a long long.
Reads one bit.
Reads a number with the given amout of bits.
Reads a short.
Reads a string.
Read a number with the given amount of bits.
This module tries to optimize anything related to networking.
Currently, this only has one optimization which was ported from sigsegv-mvm into here.
This module adds a few functions related to steam.
Shutdowns the Steam Server.
Starts/Activates the Steam Server.
Returns true
if the Steam Server is connected.
Calls the SV_InitGameServerSteam
function to activate the steam server exactly like the engine does it.
Called when our Steam server loses connection to steams servers.
Called when our Steam server successfully connected to steams servers.
This module is just the timer library, but it doesn't use CurTime.
Adjusts the timer with the given name with the new values.
Returns true
if the timer was successfully adjusted.
Does nothing / deprecated.
Creates a timer with the given name.
Returns true
if the given timer exists.
Removes the given timer.
Returns the number of reps left for the given timer.
Returns 0
if the timer wasn't found or the reps are below 0
.
Creates a simple timer.
Returns true
if the given timer was successfully started again.
Returns true
if the given timer was successfully stopped.
Returns the time left until the given timer is executed again.
Returns 0
if the timer wasn't found.
Toggles the given timer.
Returns true
if the timer was activated/started again.
Returns true
if the given timer was successfully paused.
Unpauses the given timer.
Unlike systimer.Start this won't reset the time left until it executes again.
This module will add functions related to the bass dll.
Does someone have the bass libs for 2.4.15
? I can't find them :<
callback - function(IGMODAudioChannel channel, int errorCode, string error)
Creates a IGMODAudioChannel for the given file.
callback - function(IGMODAudioChannel channel, int errorCode, string error)
Creates a IGMODAudioChannel for the given url.
This module adds two new IServerPluginCallbacks
functions:
virtual void OnLuaInit( GarrysMod::Lua::ILuaInterface* LUA )
virtual void OnLuaShutdown( GarrysMod::Lua::ILuaInterface* LUA )
This module plans to add a few PAS related functions like table pas.FindInPAS(Vector pos or Entity ent)
.
If you got an Idea for a function to add, feel free to comment it into its issue.
Vector vec - The position to find all entities in.
Entity ent - The Entity which should be used to find all entities.
gameevent.GetListeners
-> Facepunch/garrysmod-requests#2377
stringtable.FindTable("modelprecache"):GetNumStrings()
-> Facepunch/garrysmod-requests#82
threadpoolfix
-> Facepunch/garrysmod-issues#5932
HolyLib.Reconnect(ply)
-> Facepunch/garrysmod-requests#2089
pvs.AddEntityToPVS(ent)
-> Facepunch/garrysmod-requests#245
util.AsyncCompress(data, nil, nil, callback)
-> Facepunch/garrysmod-requests#2165
It now throws a warning instead of crashing -> Facepunch/garrysmod-issues#56
HolyLib.Reconnect(ply)
-> Facepunch/garrysmod-requests#2089
concommand
module -> Facepunch/garrysmod-requests#1534
vprof
module -> Facepunch/garrysmod-requests#2374
cvars.GetAll
-> Facepunch/garrysmod-requests#341
sourcetv
module -> Facepunch/garrysmod-requests#2298
bitbuf
module(unfinished) -> Facepunch/garrysmod-requests#594
HLTV
class / sourcetv
module -> Facepunch/garrysmod-requests#2237
surffix
module -> Facepunch/garrysmod-requests#2306
filesystem.TimeCreated
& filesystem.TimeAccessed
-> Facepunch/garrysmod-requests#1633
systimer
module -> Facepunch/garrysmod-requests#1671
Facepunch/garrysmod-requests#1884
(Maybe)Facepunch/garrysmod-requests#132
Facepunch/garrysmod-requests#77
(Maybe)Facepunch/garrysmod-requests#603
Facepunch/garrysmod-requests#439
Facepunch/garrysmod-requests#140
Facepunch/garrysmod-requests#1323
(Should be possible?)Facepunch/garrysmod-requests#756
(Gonna make a seperate ConVar for it)Facepunch/garrysmod-requests#2120
Facepunch/garrysmod-requests#1472
NW uses a usermessage NetworkedVar
Write order:
- WriteLong -> Entity handle
- Char -> Type ID
- String -> Var name
- (Value) -> Var value. (Depends on what type it is)
NW2 writes it to the baseline.
Write order:
- 12 bits - Number of net messages networked.
- 1 bit - Magic bool. Idk if true, it wil call
GM:EntityNetworkedVarChanged
(Verify)
loop:
- 12 bits - var key index
- 3 bits - var type
- x bits -var value