Garry's Mod Wiki

Revision Difference

hammer.SendCommand#511611

<function name="SendCommand" parent="hammer" type="libraryfunc">⤶ <description>Sends command to Hammer, if Hammer is running with the current map loaded.</description>⤶ <realm>Server</realm>⤶ <args>⤶ <arg name="cmd" type="string">Command to send including arguments&#xA;&#xA;All commands are in the format &quot;command var1 var2 etc&quot;&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&#xA;All commands that pick an entity with x y z , must use the exact position including decimals. i.e. -354.4523 123.4 -1224.325452 &amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&#xA;&#xA;&amp;amp;lt;h2&amp;amp;gt;List of commands&amp;amp;lt;/h2&amp;amp;gt;&#xA;**&quot;session_begin mapName mapVersion&quot;** - Starts a hammer edit, locking the editor. mapName is the current map without path or suffix, mapVersion is the current version in the .vmf file&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&#xA;**&quot;session_end&quot;** - Ends a hammer edit, unlocking the editor.&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&#xA;**&quot;map_check_version mapName mapVersion&quot;** - This only works after session_begin, so you&#x27;d know the right version already and this only returns ok, this function is apparently useless&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&#xA;**&quot;entity_create entityClass x y z&quot;** - Creates an entity of entityClass at position x y z &amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&#xA;**&quot;entity_delete entityClass x y z&quot;** - Deletes an entity of entityClass at position x y z &amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&#xA;**&quot;entity_set_keyvalue entityClass x y z &quot;key&quot; &quot;value&quot;&quot;** - Set&#x27;s the KeyValue pair of an entity of entityClass at x y z. The Key name and Value String must be in quotes.&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&#xA;**&quot;entity_rotate_incremental entityClass x y z incX incY incZ&quot;** - Rotates an entity of entityClass at x y z by incX incY incZ&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&#xA;**&quot;node_create nodeClass nodeID x y z&quot;** - Creates an AI node of nodeClass with nodeID at x y z you should keep nodeID unique or you will have issues&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&#xA;**&quot;node_delete nodeID&quot;** - Deletes node(s) with nodeID, this will delete multiple nodes if they have the same nodeID&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&#xA;**&quot;nodelink_create startNodeID endNodeID&quot;** - Creates a link between AI nodes startNodeID and endNodeID&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&#xA;**&quot;nodelink_delete startNodeID endNodeID&quot;** - Removes a link between AI nodes startNodeID and endNodeID&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;</arg>⤶ </args>⤶ <rets>⤶ <ret name="" type="string">Returns "ok" if command succeeded otherwise returns "badcommand".&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;⤶ ⤶ **All changes only happen in hammer, there is *NO* in game representation/feedback**</ret>⤶ </rets>⤶ </function>⤶ ⤶ <example>⤶ <description>⤶ A hammer function library I wrote while testing all these functions.⤶ ⤶ Please feel free to use this library as-is or with modification.⤶ </description>⤶ <code>⤶ if ( !SERVER) then return end⤶ -- Hammer Editor Lua Library⤶ -- By Malcolm Greene Jr (Fantym420)⤶ ⤶ -- Allows easy access to the hammer editor commands from lua code⤶ -- All commands return ok if they worked and badcommand if they don't⤶ -- All changes only show up in hammer, so if you want to see stuff in game you must⤶ -- write your own ghost entites and such.⤶ ⤶ hammerLib = {}⤶ hammerLib.mapName = game.GetMap() -- Get the map name⤶ hammerLib.vBSPMapVer = game.GetMapVersion() -- This is the vbsp map version, we need the vmf map version⤶ hammerLib.mapVer = hammerLib.vBSPMapVer -- place holder value findGoodVer will find the current vmf version via trial and error⤶ ⤶ -- returns a vector string with spaces the way hammer likes it⤶ function hammerLib.vectorToString(vec)⤶ ⤶ return tostring(vec.x) .. " " .. tostring(vec.y) .. " " .. tostring(vec.z)⤶ ⤶ end⤶ ⤶ -- tries to start a session using the current version, if it fails it tries the next⤶ -- if it can't find it in 20 tries you should probably compile your map before edititng more⤶ function hammerLib.findGoodVer()⤶ ⤶ local verInc = 0⤶ local result = ""⤶ ⤶ for verInc = 0, 20 do ⤶ ⤶ hammerLib.mapVer = hammerLib.vBSPMapVer + verInc⤶ ⤶ result = hammerLib.startSession()⤶ ⤶ if result == "ok" then⤶ break⤶ end⤶ ⤶ if verInc == 20 then⤶ print("Good Version Not Found, Please Re-Compile your map!!!")⤶ end⤶ end⤶ ⤶ hammerLib.endSession()⤶ ⤶ end⤶ ⤶ -- simple wrapper for hammer.SendCommand so that I could print the debug info⤶ -- un-comment the prints to see the command strings and results in console⤶ function hammerLib.runCommand(cmd)⤶ ⤶ local result = ""⤶ --print("running " .. cmd)⤶ result = hammer.SendCommand(cmd)⤶ --print(cmd .. " result: " .. result)⤶ return result⤶ ⤶ ⤶ end⤶ ⤶ -- Always ran when starting an edit⤶ -- This locks hammer until you issue the session_end command⤶ function hammerLib.startSession()⤶ ⤶ local cmd = "session_begin " .. hammerLib.mapName .. " " .. hammerLib.mapVer⤶ ⤶ return hammerLib.runCommand(cmd)⤶ ⤶ end⤶ ⤶ -- Ends the session unlocking hammer⤶ function hammerLib.endSession()⤶ ⤶ local cmd = "session_end"⤶ ⤶ return hammer.SendCommand(cmd)⤶ ⤶ end⤶ ⤶ -- useless function, it will return ok if you give it a good name and version⤶ -- however to run it you must already have a good version because you ran session_start⤶ -- implemented here for thoroughness, if you give it no variables it will just use the stored info.⤶ function hammerLib.mapCheckVersion(mcName, mcVer)⤶ ⤶ mcName = mcName or hammerLib.mapName⤶ mcVer = mcVer or hammerLib.mapVer⤶ local cmd = "map_check_version " .. mcName .. " " .. mcVer⤶ local result = ""⤶ hammerLib.startSession()⤶ result = hammerLib.runCommand(cmd)⤶ hammerLib.endSession()⤶ ⤶ return result⤶ ⤶ end⤶ ⤶ -- this creates an entity of type entityClass at the given position⤶ -- I believe this only works with point entites seeing as there is no tie to brush command⤶ function hammerLib.entityCreate(entityClass, entityPos)⤶ ⤶ if (entityClass == nil) or (entityPos == nil) then return end⤶ local cmd = "entity_create " .. entityClass .. " " .. hammerLib.vectorToString(entityPos)⤶ local result = ""⤶ hammerLib.startSession()⤶ result = hammerLib.runCommand(cmd)⤶ hammerLib.endSession()⤶ ⤶ return result⤶ ⤶ end⤶ ⤶ -- this deletes an entity of type entityClass at entityPos⤶ -- NOTE: must be entities **EXACT** position, decimals and all or it fails⤶ function hammerLib.entityDelete(entityClass, entityPos)⤶ ⤶ if (entityClass == nil) or (entityPos == nil) then return end⤶ local cmd = "entity_delete " .. entityClass .. " " .. hammerLib.vectorToString(entityPos)⤶ local result = ""⤶ hammerLib.startSession()⤶ result = hammerLib.runCommand(cmd)⤶ hammerLib.endSession()⤶ ⤶ return result⤶ ⤶ end⤶ ⤶ -- Set's a Key/Value pair on entity of type entityClass at entityPos⤶ -- NOTE: must be entities **EXACT** position, decimals and all or it fails⤶ function hammerLib.entitySetKeyValue(entityClass, entityPos, key, value)⤶ ⤶ ⤶ if (entityClass == nil) or ⤶ (entityPos == nil) or⤶ (key == nil) or⤶ (value == nil) then return end⤶ ⤶ local cmd = "entity_set_keyvalue " .. entityClass .. " " .. hammerLib.vectorToString(entityPos) .. " \"" .. key .. "\" \"" .. value .. "\""⤶ local result = ""⤶ hammerLib.startSession()⤶ result = hammerLib.runCommand(cmd)⤶ hammerLib.endSession()⤶ ⤶ return result⤶ ⤶ end⤶ -- this will rotate an entity of type entityClass(string) at entityPos(vector) by rotationInc(vector)⤶ -- NOTE: must be entities **EXACT** position, decimals and all or it fails⤶ function hammerLib.entityRotateIncremental(entityClass, entityPos, rotationInc)⤶ ⤶ if (entityClass == nil) or (entityPos == nil) then return end⤶ local cmd = "entity_rotate_incremental " .. entityClass .. " " .. hammerLib.vectorToString(entityPos) .. " " .. hammerLib.vectorToString(rotationInc)⤶ local result = ""⤶ hammerLib.startSession()⤶ result = hammerLib.runCommand(cmd)⤶ hammerLib.endSession()⤶ ⤶ return result⤶ ⤶ end⤶ ⤶ -- This creates a node of type nodeClass with an ID of nodeID at nodePos⤶ -- keep nodeID unique, if you don't and you use node_delete, it deletes all nodes with the given id⤶ function hammerLib.nodeCreate(nodeClass, nodeID, nodePos)⤶ ⤶ if (nodeClass == nil) or (nodeID == nil) or (nodePos == nil) then return end⤶ local cmd = "node_create " .. nodeClass .. " " .. nodeID .. " " .. hammerLib.vectorToString(nodePos)⤶ local result = ""⤶ hammerLib.startSession()⤶ result = hammerLib.runCommand(cmd)⤶ hammerLib.endSession()⤶ ⤶ return result⤶ ⤶ end⤶ -- deletes node(s) with the given nodeID, however if there are more than one node with the nodeID all ⤶ -- are deleted⤶ function hammerLib.nodeDelete(nodeID)⤶ ⤶ if (nodeID == nil) then return end⤶ local cmd = "node_delete " .. nodeID⤶ local result = ""⤶ hammerLib.startSession()⤶ result = hammerLib.runCommand(cmd)⤶ hammerLib.endSession()⤶ ⤶ return result⤶ end⤶ ⤶ -- This creates a link between two nodes, not sure if there's a limit no number of links⤶ -- so far it does at least 2 per node⤶ function hammerLib.nodeLinkCreate(node1ID, node2ID)⤶ ⤶ if (node1ID == nil) or (node2ID == nil) then return end⤶ local cmd = "nodelink_create " .. node1ID .. " " .. node2ID⤶ local result = ""⤶ hammerLib.startSession()⤶ result = hammerLib.runCommand(cmd)⤶ hammerLib.endSession()⤶ ⤶ return result⤶ ⤶ end⤶ ⤶ -- This deletes a connection between two nodes⤶ function hammerLib.nodeLinkDelete(node1ID, node2ID)⤶ ⤶ if (node1ID == nil) or (node2ID == nil) then return end⤶ local cmd = "nodelink_delete " .. node1ID .. " " .. node2ID⤶ local result = ""⤶ hammerLib.startSession()⤶ result = hammerLib.runCommand(cmd)⤶ hammerLib.endSession()⤶ ⤶ return result⤶ ⤶ end⤶ ⤶ -- All loaded, run findGoodVer to store the current vmf version⤶ hammerLib.findGoodVer()⤶ </code>⤶ ⤶ </example>