mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
242 lines
6.4 KiB
Lua
242 lines
6.4 KiB
Lua
|
|
--[[
|
||
|
|
| This file was obtained through the combined efforts
|
||
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
||
|
|
|
|
||
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
||
|
|
|
|
||
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||
|
|
--]]
|
||
|
|
|
||
|
|
|
||
|
|
local PLUGIN = PLUGIN
|
||
|
|
|
||
|
|
PLUGIN.name = "Waypoints"
|
||
|
|
PLUGIN.author = "Gr4ss"
|
||
|
|
PLUGIN.description = "Gives the ability to allow some factions to see/add/remove/update waypoints."
|
||
|
|
PLUGIN.license = [[
|
||
|
|
(c) 2016 by Gr4Ss (greengr4ss@gmail.com)
|
||
|
|
This plugin is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.
|
||
|
|
To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/
|
||
|
|
]]
|
||
|
|
PLUGIN.readme = [[
|
||
|
|
A small plugin that allow some factions to use waypoints. To just list the features:
|
||
|
|
- Players can still remove/update their own waypoints without their faction having Remove/Update permissions.
|
||
|
|
- Makes it easy to add waypoints script-wise with a global library function (in case you for example want to create a waypoint where a player died).
|
||
|
|
- Waypoints can have some text.
|
||
|
|
- Waypoints can have different colors and can be made to last for a certain amount of time.
|
||
|
|
- Waypoint markers draw through walls and include a distance to them in meters. It is also possible to add waypoints without a distance marker.
|
||
|
|
- Waypoints will visually change a bit when a player can see the actual location.
|
||
|
|
- Players joining will see waypoints created before they joined if they should see them. Everything updates quite nicely.
|
||
|
|
- No texture download needed, waypoint is just drawn with lines and rectangles.
|
||
|
|
]]
|
||
|
|
|
||
|
|
ix.util.Include("cl_hooks.lua")
|
||
|
|
ix.util.Include("sv_hooks.lua")
|
||
|
|
ix.util.Include("sv_plugin.lua")
|
||
|
|
|
||
|
|
CAMI.RegisterPrivilege({
|
||
|
|
Name = "Helix - Waypoints",
|
||
|
|
MinAccess = "user"
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("WaypointAdd", {
|
||
|
|
description = "@cmdWaypointAdd",
|
||
|
|
privilege = "Waypoints",
|
||
|
|
arguments = {ix.type.string, ix.type.number, bit.bor(ix.type.string, ix.type.optional)},
|
||
|
|
OnRun = function(self, client, text, time, color)
|
||
|
|
if (!hook.Run("CanPlayerAddWaypoint", client)) then
|
||
|
|
return "@cannotAddWaypoints"
|
||
|
|
end
|
||
|
|
|
||
|
|
if (color) then
|
||
|
|
local colorName = string.lower(color)
|
||
|
|
color = PLUGIN:GetWaypointColor(colorName)
|
||
|
|
|
||
|
|
if (!color) then
|
||
|
|
return "@invalidWaypointColor", colorName
|
||
|
|
end
|
||
|
|
else
|
||
|
|
local faction = ix.faction.Get(client:Team())
|
||
|
|
color = faction.color or color_white
|
||
|
|
end
|
||
|
|
|
||
|
|
local position = client:GetEyeTraceNoCursor().HitPos
|
||
|
|
position:Add(Vector(0, 0, 30))
|
||
|
|
|
||
|
|
local waypoint = {
|
||
|
|
pos = position,
|
||
|
|
text = text,
|
||
|
|
color = color,
|
||
|
|
addedBy = client,
|
||
|
|
time = CurTime() + time
|
||
|
|
}
|
||
|
|
|
||
|
|
PLUGIN:AddWaypoint(waypoint)
|
||
|
|
return "@addedWaypoint"
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("WaypointAddND", {
|
||
|
|
description = "@cmdWaypointAddND",
|
||
|
|
privilege = "Waypoints",
|
||
|
|
arguments = {ix.type.string, ix.type.number, bit.bor(ix.type.string, ix.type.optional)},
|
||
|
|
OnRun = function(self, client, text, time, color)
|
||
|
|
if (!hook.Run("CanPlayerAddWaypoint", client)) then
|
||
|
|
return "@cannotAddWaypoints"
|
||
|
|
end
|
||
|
|
|
||
|
|
if (color) then
|
||
|
|
local colorName = string.lower(color)
|
||
|
|
color = PLUGIN:GetWaypointColor(colorName)
|
||
|
|
|
||
|
|
if (!color) then
|
||
|
|
return "@invalidWaypointColor", colorName
|
||
|
|
end
|
||
|
|
else
|
||
|
|
local faction = ix.faction.Get(client:Team())
|
||
|
|
color = faction.color or color_white
|
||
|
|
end
|
||
|
|
|
||
|
|
local position = client:GetEyeTraceNoCursor().HitPos
|
||
|
|
position:Add(Vector(0, 0, 30))
|
||
|
|
local waypoint = {
|
||
|
|
pos = position,
|
||
|
|
noDistance = true,
|
||
|
|
text = text,
|
||
|
|
color = color,
|
||
|
|
addedBy = client,
|
||
|
|
time = CurTime() + time
|
||
|
|
}
|
||
|
|
|
||
|
|
PLUGIN:AddWaypoint(waypoint)
|
||
|
|
return "@addedWaypoint"
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("WaypointUpdate", {
|
||
|
|
description = "@cmdWaypointUpdate",
|
||
|
|
privilege = "Waypoints",
|
||
|
|
arguments = {ix.type.string, bit.bor(ix.type.number, ix.type.optional), bit.bor(ix.type.string, ix.type.optional)},
|
||
|
|
OnRun = function(self, client, text, time, color)
|
||
|
|
local pos = client:GetEyeTraceNoCursor().HitPos
|
||
|
|
pos:Add(Vector(0, 0, 30))
|
||
|
|
|
||
|
|
local index = nil
|
||
|
|
local minDistanceSqr = nil
|
||
|
|
local onlyOwnWaypoints = hook.Run("CanPlayerUpdateWaypoints", client) != true
|
||
|
|
|
||
|
|
for k, point in pairs(PLUGIN.waypoints) do
|
||
|
|
if (onlyOwnWaypoints and point.addedBy != client) then
|
||
|
|
continue
|
||
|
|
end
|
||
|
|
|
||
|
|
if (!index) then
|
||
|
|
index = k
|
||
|
|
minDistanceSqr = point.pos:DistToSqr(pos)
|
||
|
|
else
|
||
|
|
local dist = point.pos:DistToSqr(pos)
|
||
|
|
|
||
|
|
if (dist < minDistanceSqr) then
|
||
|
|
index = k
|
||
|
|
minDistanceSqr = dist
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if (!index) then
|
||
|
|
return "@noWaypointsToUpdate"
|
||
|
|
elseif (index and minDistanceSqr > 40000) then
|
||
|
|
return "@noWaypointsNearToUpdate"
|
||
|
|
end
|
||
|
|
|
||
|
|
if (color) then
|
||
|
|
local colorName = string.lower(color)
|
||
|
|
color = PLUGIN:GetWaypointColor(colorName)
|
||
|
|
|
||
|
|
if (!color) then
|
||
|
|
return "@invalidWaypointColor", colorName
|
||
|
|
end
|
||
|
|
else
|
||
|
|
local faction = ix.faction.Get(client:Team())
|
||
|
|
color = PLUGIN.waypoints[index].color or faction.color or color_white
|
||
|
|
end
|
||
|
|
|
||
|
|
if (time) then
|
||
|
|
time = CurTime() + time
|
||
|
|
else
|
||
|
|
time = PLUGIN.waypoints[index].time
|
||
|
|
end
|
||
|
|
|
||
|
|
local waypoint = {
|
||
|
|
pos = PLUGIN.waypoints[index].pos,
|
||
|
|
noDistance = PLUGIN.waypoints[index].noDistance,
|
||
|
|
text = text,
|
||
|
|
color = color,
|
||
|
|
addedBy = PLUGIN.waypoints[index].addedBy,
|
||
|
|
time = time
|
||
|
|
}
|
||
|
|
|
||
|
|
PLUGIN:UpdateWaypoint(index, waypoint)
|
||
|
|
return "@updatedWaypoint"
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("WaypointRemove", {
|
||
|
|
description = "@cmdWaypointRemove",
|
||
|
|
privilege = "Waypoints",
|
||
|
|
OnRun = function(self, client)
|
||
|
|
local trace = client:GetEyeTraceNoCursor()
|
||
|
|
local pos = trace.HitPos
|
||
|
|
pos:Add(Vector(0, 0, 30))
|
||
|
|
|
||
|
|
local index = nil
|
||
|
|
local minDistanceSqr = nil
|
||
|
|
local onlyOwnWaypoints = hook.Run("CanPlayerRemoveWaypoints", client) != true
|
||
|
|
|
||
|
|
for k, point in pairs(PLUGIN.waypoints) do
|
||
|
|
if (onlyOwnWaypoints and point.addedBy != client) then
|
||
|
|
continue
|
||
|
|
end
|
||
|
|
|
||
|
|
if (!index) then
|
||
|
|
index = k
|
||
|
|
minDistanceSqr = point.pos:DistToSqr(pos)
|
||
|
|
else
|
||
|
|
local dist = point.pos:DistToSqr(pos)
|
||
|
|
|
||
|
|
if (dist < minDistanceSqr) then
|
||
|
|
index = k
|
||
|
|
minDistanceSqr = dist
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if (!index) then
|
||
|
|
return "@noWaypointsToRemove"
|
||
|
|
elseif (index and minDistanceSqr > 40000) then
|
||
|
|
return "@noWaypointsNearToRemove"
|
||
|
|
end
|
||
|
|
|
||
|
|
PLUGIN:UpdateWaypoint(index, nil)
|
||
|
|
return "@removedWaypoint"
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("WaypointRemoveAll", {
|
||
|
|
description = "@cmdWaypointRemoveAll",
|
||
|
|
privilege = "Waypoints",
|
||
|
|
OnRun = function(self, client)
|
||
|
|
if (!hook.Run("CanPlayerRemoveWaypoints", client)) then
|
||
|
|
return "@cannotRemoveWaypoints"
|
||
|
|
end
|
||
|
|
|
||
|
|
if (table.Count(PLUGIN.waypoints) > 0) then
|
||
|
|
PLUGIN:RemoveWaypoints()
|
||
|
|
return "@removedAllWaypoints"
|
||
|
|
else
|
||
|
|
return "@noWaypointsSet"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|