maxprops = -1 --The maximum number of props allowed (use -1 for unlimited) spawners = { } auth = { } auth[1] = "STEAM_ID_PENDING" --Listenserver auth[2] = "UNKNOWN" --Singleplayer auth[3] = "STEAM_0:1:15858852" --This is probably needed on dedicated servers only forbidden_models = { } forbidden_models[1] = "models/props_animated_breakable/Smokestack.mdl" --Here you can specify models that you don't want to be spawned forbidden_models[2] = "INSERT MODEL PATH HERE" forbidden_models[3] = "INSERT MODEL PATH HERE" forbidden_models[4] = "INSERT MODEL PATH HERE" forbidden_models[5] = "INSERT MODEL PATH HERE" spawnersmax = 3 --globaluse = true function checktables (userid) local free = { } for i = 1, spawnersmax do if spawners[userid].id[i] == nil then table.insert(free, i); end end return free end function cc_spawnercreate (userid, args) if spawners[userid] == nil then dotables(userid); end local free = checktables(userid) if table.getn(free) > 0 then if _file.Exists(args) then local model_allowed = true for i in forbidden_models do if args == forbidden_models[i] then model_allowed = false end end if model_allowed == true then if (_PlayerInfo(userid, "alive") == false) then return; end local vecpos = _PlayerGetShootPos( userid ); local plyang = _PlayerGetShootAng( userid ); _TraceLine(vecpos, plyang, 16384, userid); local pos = _TraceEndPos(); local slot = free[1] spawners[userid].id[ slot ] = _EntCreate("prop_placement") _EntSetPos(spawners[userid].id[ slot ], pos); _EntSpawn(spawners[userid].id[ slot ]); _EntSetName(spawners[userid].id[ slot ], "spawner" .. userid .. slot); if spawners[userid].ghosts == true then spawners[userid].id2[ slot ] = _EntCreate("prop_dynamic_override") _EntPrecacheModel( args ); _EntSetSolid(spawners[userid].id2[ slot ], 0); _EntSetMoveType(spawners[userid].id2[ slot ], 8) _EntSetCollisionGroup(spawners[userid].id2[ slot ], 0) _EntSetKeyValue(spawners[userid].id2[ slot ], "model", args) _EntSetKeyValue(spawners[userid].id2[ slot ], "targetname", "spawnerghost"); _EntSetKeyValue(spawners[userid].id2[ slot ], "rendermode", "1"); _EntSetKeyValue(spawners[userid].id2[ slot ], "renderamt", "130"); _EntSetKeyValue(spawners[userid].id2[ slot ], "spawnflags", "527"); _EntSetPos(spawners[userid].id2[ slot ], pos); _EntSpawn(spawners[userid].id2[ slot ]); _EntFire(spawners[userid].id2[ slot ], "setparent", "spawner" .. userid .. slot,0); if spawners[userid].text == true then _GModText_Start ("BrandingSmall"); _GModText_SetEntity(spawners[userid].id2[ slot ]); _GModText_SetEntityOffset( vector3( 0, 0, 20 ) ); _GModText_SetTime(9999999,0,0); _GModText_SetColor( 255, 255, 255, 255); _GModText_SetText("Spawner " .. slot); _GModText_Send(userid, slot + 50); end end spawners[userid].model[ slot ] = args _PrintMessage(userid, 2, "Spawner " .. args .. " successfully created!\n"); if spawners[userid].props ~= nil then for i in spawners[userid].props do if _EntExists(spawners[userid].props[i]) then if _EntGetName(spawners[userid].props[i]) == "spawner" .. slot .. "_prop" then _EntRemove(spawners[userid].props[i]); end end end end else _PrintMessage(userid, 2, "This model is forbidden!\n"); end else _PrintMessage(userid, 2, "File " .. args .. " does not exist!\n"); end else _PrintMessage(userid, 2, "You already have the maximum number of spawners!\n"); end end CONCOMMAND("spawner_create", cc_spawnercreate); function cc_spawnerspawn (userid, args) if spawners[userid] == nil then dotables(userid); end if (_PlayerInfo(userid, "alive") == false) then return; end if args == "" or args == nil or spawners[userid].id[tonumber(args)] == nil then for i in spawners[userid].id do local propcount = 0 local autodelprops = { } for j in spawners[userid].props do if _EntGetName(spawners[userid].props[j]) == "spawner" .. i .. "_prop" then propcount = propcount + 1 if spawners[userid].autodelete == true then table.insert(autodelprops, spawners[userid].props[j]); end end end --_Msg("Spawner " .. i .. " Propcount: " .. propcount .. "\n"); if propcount < maxprops or maxprops == -1 then spawnprop(userid, i); elseif spawners[userid].autodelete == true then for j in autodelprops do if _EntExists(autodelprops[j]) then _EntRemove(autodelprops[j]); end end spawnprop(userid, i); else _PrintMessage(userid, 2, "Maximum number of props reached for spawner number " .. i .. "\n"); end end elseif _EntExists(spawners[userid].id[tonumber(args)]) then local propcount = 0 local autodelprops = { } for i in spawners[userid].props do if _EntGetName(spawners[userid].props[i]) == "spawner" .. tonumber(args) .. "_prop" then propcount = propcount + 1 if spawners[userid].autodelete == true then table.insert(autodelprops, spawners[userid].props[i]); end end end --_Msg("Spawner " .. i .. " Propcount: " .. propcount .. "\n"); if propcount < maxprops or maxprops == -1 then spawnprop(userid, tonumber(args)); elseif spawners[userid].autodelete == true then for i in autodelprops do if _EntExists(autodelprops[i]) then _EntRemove(autodelprops[i]); end end spawnprop(userid, tonumber(args)); else _PrintMessage(userid, 2, "Maximum number of props reached for spawner number " .. tonumber(args) .. "\n"); end end end CONCOMMAND("spawner_spawn", cc_spawnerspawn); function spawnprop (userid, spawnerid) local model = spawners[userid].model[spawnerid] local prop = _EntCreate("prop_physics") _EntPrecacheModel( model ); _EntSetModel(prop, model ); _EntSetAng(prop, _EntGetAng(spawners[userid].id[spawnerid])); _EntSetAngAngle(prop, _EntGetAngAngle(spawners[userid].id[spawnerid])); _EntSetPos(prop, _EntGetPos(spawners[userid].id[spawnerid])); _EntSetOwner(prop, spawners[userid].id[spawnerid] ); _EntSetName(prop, "spawner" .. spawnerid .. "_prop"); _EntSpawn(prop); table.insert(spawners[userid].props, prop); end function cc_spawnerdelprops (userid, args) if spawners[userid] == nil then dotables(userid); end if args == "" or args == nil then if spawners[userid].props ~= nil then local count = 0 for i in spawners[userid].props do if _EntExists(spawners[userid].props[i]) then _EntRemove(spawners[userid].props[i]); count = count + 1 end end _PrintMessage(userid, 2, count .. " props deleted\n"); end spawners[userid].props = { } elseif tonumber(args) > 0 and tonumber(args) <= spawnersmax then local count = 0 for i in spawners[userid].props do if _EntGetName(spawners[userid].props[i]) == "spawner" .. tonumber(args) .. "_prop" then _EntRemove(spawners[userid].props[i]); count = count + 1 end end _PrintMessage(userid, 2, count .. " props deleted\n"); end end CONCOMMAND("spawner_delprops", cc_spawnerdelprops); function spawnerthink ( ) for i in spawners do for j in spawners[i].id do if not _EntExists(spawners[i].id[j]) then spawners[i].id[j] = nil end end for j in spawners[i].id2 do if not _EntExists(spawners[i].id2[j]) then spawners[i].id2[j] = nil _GModText_Hide(i, j + 50); end end for j in spawners[i].props do if not _EntExists(spawners[i].props[j]) then table.remove(spawners[i].props, j); end end end end AddThinkFunction(spawnerthink); function cc_spawnertoggleghost (userid, args) if spawners[userid] == nil then dotables(userid); end if spawners[userid].ghosts == true then for i in spawners[userid].id2 do if _EntExists(spawners[userid].id2[i]) then _EntRemove(spawners[userid].id2[i]); end end spawners[userid].ghosts = false _PrintMessage(userid, 2, "Ghost models are now disabled\n"); elseif spawners[userid].ghosts == false then for i = 1, spawnersmax do if spawners[userid].id[i] ~= nil and _EntExists(spawners[userid].id[i]) then spawners[userid].id2[i] = _EntCreate("prop_dynamic_override") _EntPrecacheModel( spawners[userid].model[i] ); _EntSetSolid(spawners[userid].id2[i], 0); _EntSetMoveType(spawners[userid].id2[i], 8) _EntSetCollisionGroup(spawners[userid].id2[i], 0) _EntSetKeyValue(spawners[userid].id2[i], "model", spawners[userid].model[i]) _EntSetKeyValue(spawners[userid].id2[i], "targetname", "spawnerghost"); _EntSetKeyValue(spawners[userid].id2[i], "rendermode", "1"); _EntSetKeyValue(spawners[userid].id2[i], "renderamt", "130"); _EntSetKeyValue(spawners[userid].id2[i], "spawnflags", "527"); _EntSetPos(spawners[userid].id2[i], _EntGetPos(spawners[userid].id[i])); _EntSetAng(spawners[userid].id2[i], _EntGetAng(spawners[userid].id[i])); _EntSetAngAngle(spawners[userid].id2[i], _EntGetAngAngle(spawners[userid].id[i])); _EntSpawn(spawners[userid].id2[i]); _EntFire(spawners[userid].id2[i], "setparent", "spawner" .. userid .. i,0); _GModText_Start ("BrandingSmall"); _GModText_SetEntity(spawners[userid].id2[ i ]); _GModText_SetEntityOffset( vector3( 0, 0, 20 ) ); _GModText_SetTime(9999999,0,0); _GModText_SetColor( 255, 255, 255, 255); _GModText_SetText("Spawner " .. i); _GModText_Send(userid, i + 50); end end spawners[userid].ghosts = true _PrintMessage(userid, 2, "Ghost models are now enabled\n"); end end CONCOMMAND("spawner_toggleghost", cc_spawnertoggleghost); function cc_max (userid, args) local authorized = false local steamid = _PlayerInfo(userid, "networkid"); for i in auth do if auth[i] == steamid then authorized = true end end if authorized == true then if args == "" then _PrintMessage(userid, 2, "maxprops = " .. maxprops .. "\n"); elseif tonumber(args) > 0 or tonumber(args) == -1 then _PrintMessage(userid, 2, "Props limit changed from " .. maxprops .. " to " .. args .. "\n"); maxprops = tonumber(args) end else _PrintMessage(userid, 2, "You're not allowed to use this command!"); end end CONCOMMAND("spawner_maxprops", cc_max); function cc_autodelete (userid, args) if args == "" then if spawners[userid].autodelete == true then _PrintMessage(userid, 2, "Autodelete = true\n"); elseif spawners[userid].autodelete == nil or spawners[userid].autodelete == false then _PrintMessage(userid, 2, "Autodelete = false\n"); end elseif args == "true" then if spawners[userid] == nil then dotables(userid); end spawners[userid].autodelete = true _PrintMessage(userid, 2, "Autodelete = true\n"); elseif args == "false" then if spawners[userid] == nil then dotables(userid); end spawners[userid].autodelete = false _PrintMessage(userid, 2, "Autodelete = false\n"); end end CONCOMMAND("spawner_autodelete", cc_autodelete); function cc_deletespawner (userid, args) if spawners[userid] == nil then dotables(userid); end if _EntExists(spawners[userid].id[tonumber(args)]) then _EntRemove(spawners[userid].id[tonumber(args)]) _PrintMessage(userid, 2, "Spawner ID " .. spawners[userid].id[tonumber(args)] .. " deleted\n"); spawners[userid].id[tonumber(args)] = nil if spawners[userid].props ~= nil then local count = 0 for i in spawners[userid].props do if _EntExists(spawners[userid].props[i]) then if _EntGetName(spawners[userid].props[i]) == "spawner" .. tonumber(args) .. "_prop" then _EntRemove(spawners[userid].props[i]); count = count + 1 end end end _PrintMessage(userid, 2, count .. " props deleted\n"); end end end CONCOMMAND("spawner_delspawner", cc_deletespawner); function dotables (userid) spawners[userid] = { } spawners[userid].id = { } spawners[userid].id2 = { } spawners[userid].model = { } spawners[userid].props = { } spawners[userid].ghosts = true spawners[userid].text = true spawners[userid].menuspawn = false spawners[userid].usable = true spawners[userid].globaluse = false end function spawner_toggletext (userid, args) if spawners[userid] == nil then dotables(userid); end if spawners[userid].text == false then for i in spawners[userid].id2 do _GModText_Start ("BrandingSmall"); _GModText_SetEntity(spawners[userid].id2[ i ]); _GModText_SetEntityOffset( vector3( 0, 0, 20 ) ); _GModText_SetTime(9999999,0,0); _GModText_SetColor( 255, 255, 255, 255); _GModText_SetText("Spawner " .. i); _GModText_Send(userid, i + 50); end spawners[userid].text = true _PrintMessage(userid, 2, "Spawner labels are now enabled\n"); elseif spawners[userid].text == true then for i in spawners[userid].id2 do _GModText_Hide(userid, i + 50); end spawners[userid].text = false _PrintMessage(userid, 2, "Spawner labels are now disabled\n"); end end CONCOMMAND("spawner_toggletext", spawner_toggletext); function spawner_maxspawners (userid, args) local authorized = false local steamid = _PlayerInfo(userid, "networkid"); for i in auth do if auth[i] == steamid then authorized = true end end if authorized == true then if args == "" then _PrintMessage(userid, 2, "maxspawners = " .. spawnersmax .. "\n"); elseif tonumber(args) > 0 then _PrintMessage(userid, 2, "Spawners limit changed from " .. spawnersmax .. " to " .. args .. "\n"); spawnersmax = tonumber(args) for i in spawners do for j in spawners[i].id do if _EntExists(spawners[i].id[j]) then if j > spawnersmax then _EntRemove(spawners[i].id[j]); for k in spawners[i].props do if _EntGetName(spawners[i].props[k]) == "spawner" .. j .. "_prop" then _EntRemove(spawners[i].props[k]); end end end end end end end else _PrintMessage(userid, 2, "You're not allowed to use this command!"); end end CONCOMMAND("spawner_maxspawners", spawner_maxspawners); function menuspawn (userid) if spawners[userid] == nil then dotables(userid); end spawners[userid].menuspawn = true _PrintMessage(userid, 2, "Now spawn something using the spawnmenu to create a spawner\n"); _PrintMessage(userid, 4, "Now spawn something using the spawnmenu to create a spawner\n"); end CONCOMMAND("spawner_menuspawn", menuspawn); function spawner_globaluse (userid, args) if args == "" then if spawners[userid].globaluse == true then _PrintMessage(userid, 2, "globaluse = true\n"); elseif spawners[userid].globaluse == nil or spawners[userid].globaluse == false then _PrintMessage(userid, 2, "globaluse = false\n"); end elseif args == "true" then if spawners[userid] == nil then dotables(userid); end spawners[userid].globaluse = true _PrintMessage(userid, 2, "globaluse = true\n"); elseif args == "false" then if spawners[userid] == nil then dotables(userid); end spawners[userid].globaluse = false _PrintMessage(userid, 2, "globaluse = false\n"); end end CONCOMMAND("spawner_globaluse", spawner_globaluse); function spawner_usable (userid, args) if args == "" then if spawners[userid].usable == true then _PrintMessage(userid, 2, "usable = true\n"); elseif spawners[userid].usable == nil or spawners[userid].usable == false then _PrintMessage(userid, 2, "usable = false\n"); end elseif args == "true" then if spawners[userid] == nil then dotables(userid); end spawners[userid].usable = true _PrintMessage(userid, 2, "usable = true\n"); elseif args == "false" then if spawners[userid] == nil then dotables(userid); end spawners[userid].usable = false _PrintMessage(userid, 2, "usable = false\n"); end end CONCOMMAND("spawner_usable", spawner_usable); function spawnedprop (userid,propid) if spawners[userid] == nil then dotables(userid); end if spawners[userid].menuspawn == true then cc_spawnercreate(userid, _EntGetModel(propid)); _EntRemove(propid); spawners[userid].menuspawn = false end end HookEvent("eventPlayerPropSpawned", spawnedprop); function spawneruse (userid, propid) for i in spawners do if spawners[i].usable == true then for j in spawners[i].id do if propid == spawners[i].id[j] then if spawners[i].globaluse == true then cc_spawnerspawn(i, tostring(j)); elseif userid == i then cc_spawnerspawn(i, tostring(j)); end end end end end end HookEvent("eventPlayerUseEntity", spawneruse); _Msg("Spawner.lua Successfully loaded!\n");