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

All commands are in the format "command var1 var2 etc"&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
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;lt;br&amp;gt;&amp;lt;br&amp;gt;

&amp;lt;h2&amp;gt;List of commands&amp;lt;/h2&amp;gt;
**"session_begin mapName mapVersion"** - 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;lt;br&amp;gt;&amp;lt;br&amp;gt;
**"session_end"** - Ends a hammer edit, unlocking the editor.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
**"map_check_version mapName mapVersion"** - This only works after session_begin, so you'd know the right version already and this only returns ok, this function is apparently useless&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
**"entity_create entityClass x y z"** - Creates an entity of entityClass at position x y z &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
**"entity_delete entityClass x y z"** - Deletes an entity of entityClass at position x y z &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
**"entity_set_keyvalue entityClass x y z "key" "value""** - Set's the KeyValue pair of an entity of entityClass at x y z. The Key name and Value String must be in quotes.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
**"entity_rotate_incremental entityClass x y z incX incY incZ"** - Rotates an entity of entityClass at x y z by incX incY incZ&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
**"node_create nodeClass nodeID x y z"** - Creates an AI node of nodeClass with nodeID at x y z you should keep nodeID unique or you will have issues&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
**"node_delete nodeID"** - Deletes node(s) with nodeID, this will delete multiple nodes if they have the same nodeID&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
**"nodelink_create startNodeID endNodeID"** - Creates a link between AI nodes startNodeID and endNodeID&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
**"nodelink_delete startNodeID endNodeID"** - Removes a link between AI nodes startNodeID and endNodeID&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;</arg>⤶
</args>⤶
<rets>⤶
<ret name="" type="string">Returns "ok" if command succeeded otherwise returns "badcommand".&lt;br&gt;&lt;br&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>