Files
wnsrc/gamemodes/ixhl2rp/plugins/waypoints/sh_plugin.lua

242 lines
6.4 KiB
Lua
Raw Normal View History

2024-08-05 18:40:29 +03:00
--[[
| 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
})