Added spectate/freecam module
This commit is contained in:
parent
e437bbdc57
commit
eacaa63725
2 changed files with 205 additions and 0 deletions
123
modules/client/cl_spectate.txt
Normal file
123
modules/client/cl_spectate.txt
Normal file
|
@ -0,0 +1,123 @@
|
|||
--@name
|
||||
--@author
|
||||
--@client
|
||||
|
||||
if player() == owner() then do
|
||||
net.start("LSFT-Get-Config")
|
||||
net.writeString("LSFT-Get-Freecam-Binds")
|
||||
|
||||
net.writeTable({"spectate","speed"})
|
||||
net.writeTable({"spectate","multiplier"})
|
||||
|
||||
net.writeTable({"core","controls","forward"})
|
||||
net.writeTable({"core","controls","backward"})
|
||||
net.writeTable({"core","controls","left"})
|
||||
net.writeTable({"core","controls","right"})
|
||||
net.writeTable({"core","controls","up"})
|
||||
net.writeTable({"core","controls","down"})
|
||||
net.writeTable({"core","controls","run"})
|
||||
|
||||
net.writeTable({})
|
||||
net.send()
|
||||
|
||||
local SPEED, MULTIPLIER
|
||||
local KEY_FORWARD, KEY_BACKWARD, KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN, KEY_RUN
|
||||
|
||||
net.receive("LSFT-Get-Freecam-Binds", function()
|
||||
SPEED = unpack(net.readTable())
|
||||
MULTIPLER = unpack(net.readTable())
|
||||
|
||||
KEY_FORWARD = unpack(net.readTable())
|
||||
KEY_BACKWARD = unpack(net.readTable())
|
||||
KEY_LEFT = unpack(net.readTable())
|
||||
KEY_RIGHT = unpack(net.readTable())
|
||||
KEY_UP = unpack(net.readTable())
|
||||
KEY_DOWN = unpack(net.readTable())
|
||||
KEY_RUN = unpack(net.readTable())
|
||||
end)
|
||||
|
||||
function bool_to_number(input)
|
||||
return input and 1 or 0
|
||||
end
|
||||
|
||||
net.receive("LSFT-Start-Spectate", function()
|
||||
local target = nil
|
||||
xpcall(function() target = net.readEntity() end, function() target = nil end)
|
||||
|
||||
if input.canLockControls() then
|
||||
input.lockControls(true)
|
||||
else
|
||||
--printHud(Color(250,150,50), "Cannot lock controls, exiting!")
|
||||
net.start("LSFT-Stop-Spectate")
|
||||
net.send()
|
||||
return
|
||||
end
|
||||
|
||||
-- Spectate
|
||||
if target:isValid() and target:isPlayer() then
|
||||
hook.add("calcview", "freecam", function(posin, angin, fovin, znearin, zfarin)
|
||||
if not input.isControlLocked() or not target:isValid() or not target:isPlayer() then
|
||||
--printHud(Color(250,150,50), "Controls are no longer locked, exiting!")
|
||||
hook.remove("calcview", "freecam")
|
||||
|
||||
net.start("LSFT-Stop-Spectate")
|
||||
net.send()
|
||||
return
|
||||
end
|
||||
|
||||
return {
|
||||
origin = target:getEyePos(),
|
||||
angles = target:getEyeAngles(),
|
||||
fov = fovin,
|
||||
znear = znearin,
|
||||
zfar = zfarin
|
||||
}
|
||||
end)
|
||||
else
|
||||
--Freecam
|
||||
local position = eyePos()
|
||||
|
||||
timer.create("updateholo", 1, 0, function()
|
||||
net.start("LSFT-LoadHolo-Update")
|
||||
net.writeVector(position)
|
||||
net.send()
|
||||
end)
|
||||
|
||||
hook.add("calcview", "freecam", function(posin, angin, fovin, znearin, zfarin)
|
||||
if not input.isControlLocked() then
|
||||
--printHud(Color(250,150,50), "Controls are no longer locked, exiting!")
|
||||
hook.remove("calcview", "freecam")
|
||||
hook.remove("think", "updatepos")
|
||||
timer.remove("updateholo")
|
||||
|
||||
net.start("LSFT-Stop-Spectate")
|
||||
net.send()
|
||||
return
|
||||
end
|
||||
|
||||
return {
|
||||
origin = position,
|
||||
angles = eyeAngles(),
|
||||
fov = fovin,
|
||||
znear = znearin,
|
||||
zfar = zfarin
|
||||
}
|
||||
end)
|
||||
|
||||
hook.add("think", "updatepos", function()
|
||||
local elevation = eyeAngles().p
|
||||
local bearing = eyeAngles().y
|
||||
|
||||
local forward = bool_to_number(input.isKeyDown(KEY_FORWARD)) - bool_to_number(input.isKeyDown(KEY_BACKWARD))
|
||||
local left = bool_to_number(input.isKeyDown(KEY_LEFT)) - bool_to_number(input.isKeyDown(KEY_RIGHT))
|
||||
local up = bool_to_number(input.isKeyDown(KEY_UP)) - bool_to_number(input.isKeyDown(KEY_DOWN))
|
||||
|
||||
local thing = Vector(forward, left, 0)
|
||||
thing:rotate(Angle(elevation, bearing, 0))
|
||||
|
||||
position = position + thing * SPEED * (input.isKeyDown(KEY_RUN) and MULTIPLER or 1) * (timer.frametime()/(1/(200/3)))
|
||||
position = position + up * Vector(0,0,SPEED) * (input.isKeyDown(KEY_RUN) and MULTIPLER or 1) * (timer.frametime()/(1/(200/3)))
|
||||
end)
|
||||
end
|
||||
end)
|
||||
end end
|
82
modules/server/sv_spectate.txt
Normal file
82
modules/server/sv_spectate.txt
Normal file
|
@ -0,0 +1,82 @@
|
|||
--@name
|
||||
--@author
|
||||
--@server
|
||||
|
||||
--[[
|
||||
TODO: Draw viewmodel (not possible :c)
|
||||
TODO: Custom HUD (health, armor, etc)
|
||||
--]]
|
||||
|
||||
do
|
||||
function spectate(args)
|
||||
local loadHolo = nil
|
||||
|
||||
net.start("LSFT-Start-Spectate")
|
||||
|
||||
net.receive("LSFT-Stop-Spectate", function()
|
||||
core:log(log.INFO, "Stopped spectating.")
|
||||
owner():setViewEntity()
|
||||
if loadHolo ~= nil then
|
||||
loadHolo:remove()
|
||||
end
|
||||
end)
|
||||
|
||||
if args[1] == nil then
|
||||
if not holograms.canSpawn() then
|
||||
core:log(log.ERROR, "Cannot spawn hologram for freecam!")
|
||||
end
|
||||
loadHolo = holograms.create(chip():getPos(), Angle(0,0,0), "models/hunter/blocks/cube025x025x025.mdl")
|
||||
loadHolo:setColor(Color(255,255,255,0))
|
||||
owner():setViewEntity(loadHolo)
|
||||
|
||||
net.receive("LSFT-LoadHolo-Update", function()
|
||||
loadHolo:setPos(net.readVector())
|
||||
end)
|
||||
|
||||
core:log(log.INFO, "Started spectating.")
|
||||
|
||||
net.send()
|
||||
return
|
||||
end
|
||||
|
||||
local targets = find.playersByName(args[1])
|
||||
|
||||
if #targets == 0 or targets == nil then
|
||||
core:log(log.ERROR, "No targets found!")
|
||||
return
|
||||
elseif #targets > 1 then
|
||||
local list = ""
|
||||
for i, v in pairs(target) do
|
||||
list = list..v..", "
|
||||
end
|
||||
|
||||
list:sub(1, -2)
|
||||
core:log(log.ERROR, "Muliple targets found! ("..list..")")
|
||||
return
|
||||
end
|
||||
|
||||
if targets[1]:isPlayer() then
|
||||
core:log(log.INFO, "Started spectating \""..targets[1]:getName().."\".")
|
||||
net.writeEntity(targets[1])
|
||||
net.send()
|
||||
owner():setViewEntity(targets[1])
|
||||
end
|
||||
end
|
||||
|
||||
core.modules.spectate = {
|
||||
version = 1,
|
||||
desc = "Spectate players or freecam.",
|
||||
commands = {
|
||||
spectate = {
|
||||
func = spectate,
|
||||
usage = "spectate [ply]",
|
||||
desc = "Spectate a player in first person by specifying a player, or leave arguments empty for freecam.",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
core.defaultconfig.spectate = {
|
||||
speed = 8,
|
||||
multiplier = 4
|
||||
}
|
||||
end
|
Loading…
Reference in a new issue