All pastes #915315 Raw Edit

Someone

public text v1 · immutable
#915315 ·published 2008-02-23 18:21 UTC
rendered paste body

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