zombiesurvival-evolved/gamemodes/zombiesurvival/gamemode/sv_crafts.lua

97 lines
2.8 KiB
Lua
Raw Normal View History

2014-10-02 08:49:54 +08:00
function GM:CraftItem(pl, recipe, enta, entb)
if enta._USEDINCRAFTING or entb._USEDINCRAFTING then return end
if not recipe.OnCraft or not recipe.OnCraft(pl, enta, entb) then
enta._USEDINCRAFTING = true
entb._USEDINCRAFTING = true
local result = recipe.Result
if result then
local resultclass = result[1]
if string.sub(resultclass, 1, 7) == "weapon_" then
if pl:HasWeapon(resultclass) then
local target = self:GetCraftTarget(enta, entb)
local ent = ents.Create("prop_weapon")
if ent:IsValid() then
ent:SetPos(target:GetPos())
ent:SetAngles(target:GetAngles())
ent:SetWeaponType(resultclass)
ent:Spawn()
local phys = ent:GetPhysicsObject()
if phys:IsValid() then
phys:Wake()
phys:SetVelocity(target:GetVelocity())
end
end
else
local weptab = weapons.GetStored(resultclass)
if weptab and weptab.AmmoIfHas then
pl:GiveAmmo(weptab.Primary.DefaultClip, weptab.Primary.Ammo)
else
pl:Give(resultclass)
end
end
else
local target = self:GetCraftTarget(enta, entb)
local ent = ents.Create(resultclass)
if ent:IsValid() then
ent:SetPos(target:GetPos())
ent:SetAngles(target:GetAngles())
if result[2] then
ent:SetModel(result[2])
end
ent:Spawn()
if recipe.OnCrafted then
recipe.OnCrafted(pl, recipe, enta, entb, ent)
end
ent:TemporaryBarricadeObject()
local phys = ent:GetPhysicsObject()
if phys:IsValid() then
phys:Wake()
phys:SetVelocity(target:GetVelocity())
end
end
end
end
enta:Remove()
entb:Remove()
end
pl:CenterNotify(COLOR_LIMEGREEN, translate.ClientGet(pl, "crafting_successful"), color_white, " ("..recipe.Name..")")
pl:SendLua("surface.PlaySound(\"buttons/lever"..math.random(5)..".wav\")")
PrintMessage(HUD_PRINTCONSOLE, translate.Format("x_crafted_y", pl:Name(), recipe.Name))
end
concommand.Add("_zs_craftcombine", function(sender, command, arguments)
local enta = Entity(tonumbersafe(arguments[1] or 0) or 0)
local entb = Entity(tonumbersafe(arguments[2] or 0) or 0)
local recipe = GAMEMODE:GetCraftingRecipe(enta, entb)
if recipe and gamemode.Call("CanCraft", sender, enta, entb) then
gamemode.Call("CraftItem", sender, recipe, enta, entb)
end
end)
concommand.Add("_zs_useobject", function(sender, command, arguments)
if not pl:IsValid() or not pl:Alive() or pl:Team() ~= TEAM_HUMAN then return end
local ent = Entity(tonumbersafe(arguments[1] or 0) or 0)
local action = arguments[2] or ""
if ent:IsValid() then
local func = ent["Action_"..string.upper(action)]
if func then
local eyepos = sender:EyePos()
local nearest = ent:NearestPoint(eyepos)
if eyepos:Distance(nearest) <= 64 and TrueVisibleFilters(eyepos, nearest, sender, ent) then
func(ent, sender, unpack(arguments[3]))
end
end
end
end)