-
Notifications
You must be signed in to change notification settings - Fork 0
/
sv_goto.lua
146 lines (142 loc) · 4.53 KB
/
sv_goto.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
return function(sfc3)
local commands = sfc3.commands
local command_help = sfc3.command_help
local seat_pos = Vector(0, 0, 0)
sfc3.goto_seat_pos = seat_pos
local seat = prop.createSeat(seat_pos, Angle(), 'models/hunter/plates/plate.mdl', true)
sfc3.goto_seat = seat
seat:setNoDraw(false)
seat:setSolid(false)
seat:setColor(Color(0, 0, 0, 0))
seat:setDrawShadow(false)
local goto_stacks = {}
sfc3.goto_stacks = goto_stacks
timer.create(sfc3.ID_TIMER..'_goto_stacks_gc', 10, 0, function()
for sender, stack in pairs(goto_stacks) do
if not sender:isValid() or next(stack) == nil then
goto_stacks[sender] = nil
end
end
end)
local goto_targets = {
chip = chip(),
there = function(sender)
return true, sender:getEyeTrace().HitPos
end,
seat = seat,
}
sfc3.goto_targets = goto_targets
local function goto_target_parse(parameter, sender)
local target
if string.sub(parameter, 1, 1) == '#' then
parameter = string.sub(parameter, 2)
if (
string.sub(parameter, 1, 7) == 'Vector('
and string.sub(parameter, -1, -1) == ')'
) then
local first_comma = string.find(parameter, ',', 1, true)
if first_comma ~= nil then
local second_comma = string.find(parameter, ',', first_comma+1, true)
if second_comma ~= nil then
local x = tonumber(string.sub(parameter, 8, first_comma-1))
local y = tonumber(string.sub(parameter, first_comma+1, second_comma-1))
local z = tonumber(string.sub(parameter, second_comma+1, -2))
if x == nil or y == nil or z == nil then
return false, "Malformed vector."
end
return true, Vector(x, y, z)
end
end
end
local parser = goto_targets[parameter]
if parser == nil then
local index = tonumber(parameter)
if index ~= nil then
target = entity(index)
else
return false, string.format("No such target %q.", parameter)
end
elseif type(parser) == 'function' then
local success
success, target = parser(sender)
if not success then
return success, target
end
else
target = parser
end
else
local candidates = find.playersByName(parameter, false, false)
if #candidates == 0 then
return false, string.format("No players with name matching %q.", parameter)
elseif #candidates > 1 then
return false, string.format("%d players with name matching %q.", #candidates, parameter)
end
target = candidates[1]
end
if type(target) ~= 'Vector' and not isValid(target) then
return false, "Invalid entity."
end
return true, target
end
sfc3.goto_target_parse = goto_target_parse
local function goto_cmd(sender, pos, target)
local angles = sender:getEyeAngles()
seat:setPos(pos)
seat:use()
seat:ejectDriver()
seat:setPos(seat_pos)
pcall(sender.getEyeAngles, sender, angles)
end
commands['goto'] = function(sender, commands, parameters, is_team)
if sender ~= owner() then
return false, "Not authorized."
end
if parameters == nil or parameters == '' then
return false, "Malformed parameters."
end
local success, target = goto_target_parse(parameters, sender)
if not success then
return success, target
end
local pos
if type(target) == 'Vector' then
pos, target = target
else
pos = target:getPos()
end
local stack = goto_stacks[sender]
if stack == nil then
stack = {}
goto_stacks[sender] = stack
end
table.insert(stack, sender:getPos())
if isValid(target) then
if type(target) == 'Player' then
sfc3.print(team.getColor(sender:getTeam()), sender:getName(), sfc3.output_color, " teleported to ", team.getColor(target:getTeam()), target:getName(), sfc3.output_color, ".")
else
sfc3.print(team.getColor(sender:getTeam()), sender:getName(), sfc3.output_color, " teleported to "..tostring(target)..".")
end
else
sfc3.print(team.getColor(sender:getTeam()), sender:getName(), sfc3.output_color, " teleported somewhere.")
end
return pcall(goto_cmd, sender, pos, target)
end
command_help['goto'] = "Teleport yourself to the specified target."
commands['return'] = function(sender, commands, parameters, is_team)
if sender ~= owner() then
return false, "Not authorized."
end
local stack = goto_stacks[sender]
if stack == nil then
return false, "No previous position."
end
local pos = table.remove(stack)
if next(stack) == nil then
goto_stacks[sender] = nil
end
sfc3.print(team.getColor(sender:getTeam()), sender:getName(), sfc3.output_color, " returned to their previous position.")
return pcall(goto_cmd, sender, pos)
end
command_help['return'] = "Teleport yourself back to your previous position."
end