102 lines
2.3 KiB
Lua
102 lines
2.3 KiB
Lua
|
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
|