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");