zombiesurvival-evolved/gamemodes/zombiesurvival/gamemode/ammoexpand/server/sv_expand.lua

102 lines
2.3 KiB
Lua
Raw Normal View History

util.AddNetworkString("cusammo")
util.AddNetworkString("cusammo_removeall")
local M_Player = FindMetaTable("Player")
local E_GetTable = FindMetaTable("Entity").GetTable
local old_Player_GiveAmmo = M_Player.GiveAmmo
local old_Player_GetAmmoCount = M_Player.GetAmmoCount
local old_Player_RemoveAmmo = M_Player.RemoveAmmo
local old_Player_SetAmmo = M_Player.SetAmmo
local old_Player_RemoveAllAmmo = M_Player.RemoveAllAmmo
local old_Player_StripAmmo = M_Player.StripAmmo
local function GetIDFromNameOrID(id_or_name)
local ca = CUSTOM_AMMO[id_or_name]
if ca then
return ca.index
end
end
function M_Player:GetAmmoCount(id_or_name)
local id = GetIDFromNameOrID(id_or_name)
if id then
local ca = E_GetTable(self).ca
if ca then
return ca[id] or 0
end
return 0
end
return old_Player_GetAmmoCount(self, id_or_name)
end
function M_Player:GiveAmmo(amount, id_or_name, suppress_sound)
local id = GetIDFromNameOrID(id_or_name)
if id then
local et = E_GetTable(self)
if not et.ca then et.ca = {} end
et.ca[id] = (self.ca[id] or 0) + amount
self:UpdateCustomAmmoCount(id)
-- Just for the pickup sound to play.
if not suppress_sound then
old_Player_GiveAmmo(self, 1, "dummy")
end
else
old_Player_GiveAmmo(self, amount, id_or_name, suppress_sound)
end
end
function M_Player:RemoveAmmo(amount, id_or_name)
local id = GetIDFromNameOrID(id_or_name)
if id then
local et = E_GetTable(self)
if not et.ca then et.ca = {} end
et.ca[id] = math.max((self.ca[id] or 0) - amount, 0)
self:UpdateCustomAmmoCount(id)
else
old_Player_RemoveAmmo(self, amount, id_or_name)
end
end
function M_Player:SetAmmo(amount, id_or_name)
local id = GetIDFromNameOrID(id_or_name)
if id then
local et = E_GetTable(self)
if not et.ca then et.ca = {} end
et.ca[id] = amount
self:UpdateCustomAmmoCount(id)
else
old_Player_SetAmmo(self, amount, id_or_name)
end
end
function M_Player:RemoveAllAmmo()
self.ca = nil
old_Player_RemoveAllAmmo(self)
net.Start("cusammo_removeall")
net.Send(self)
end
-- Not sure if there's a difference between RemoveAllAmmo and StripAmmo
function M_Player:StripAmmo()
self.ca = nil
old_Player_StripAmmo(self)
net.Start("cusammo_removeall")
net.Send(self)
end
function M_Player:UpdateCustomAmmoCount(index)
net.Start("cusammo")
net.WriteUInt(index - 128, 6)
net.WriteUInt(self.ca and self.ca[index] or 0, 10)
net.Send(self)
end