aboutsummaryrefslogtreecommitdiff
path: root/gamemode/core/combat/sv_weaponswing.lua
blob: f2384976fb4f4e1565cc35f30a7ac2101da53e55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
--[[
	This file tells you what weapons need their swings recalculated
]]
local itm = nrequire("core/inventory/item.lua")
local ws = {}

--Cache swing hits, if we used one once, we'll probably use it again soon
local swingcache_size = 30
local swingcache = {} --Swing arc cache

--A table of all the items that are swingable
local swingable = {}

util.AddNetworkString("artery_notifyserverofswing")
util.AddNetworkString("artery_doanimation")

net.Receive("artery_notifyserverofswing",function()
	local weapon = net.ReadString()
	local anim = net.ReadString()
	local data = net.ReadTable()
	
	print("Got swing data for ",weapon,anim)
	PrintTable(data)
	
	--Get the data that already exists for this weapon
	local olddata = file.Read("artery/dynamic/swingdata/" .. weapon .. ".txt","DATA")
	if olddata == nil then olddata = {}
	else olddata = util.JSONToTable(util.Decompress(olddata)) end
	
	--Add our new data
	olddata[anim] = data
	
	--And save back
	file.Write("artery/dynamic/swingdata/" .. weapon .. ".txt",util.Compress(util.TableToJSON(olddata)))
end)

function ws.makeSwingable(tbl)
	assert(tbl.Name,"Tried to make a swingable weapon out of an item with no name!")
	assert(tbl.attacks,"Tried to make a swingable weapon out of an item with no attacks! See rustyaxe.lua for example")
	assert(tbl.pacname,"Tried to make a swingable weapon without a pac name! see rustyaxe.lua for example")
	swingable[tbl.Name] = tbl
end

concommand.Add("artery_recordanimations",function(ply,cmd,args)
	local animqueuetime = 0
	for k,v in pairs(swingable) do
		--equip the right item
		print("equipable inventory:")
		local eqi = ply.data.inventories[1]
		print(ply.data.inventories[1])
		local itm = eqi:Get({v.Equipable})
		if itm ~= nil then
			eqi:Remove({v.Equipable})
		end
		eqi:Put({v.Equipable},v)
		
		--queue up each attack for the player to do
		for i,j in pairs(v.attacks) do
			timer.Simple(animqueuetime,function()
				print("Doing attack:")
				print(i,":",j)
				net.Start("artery_doanimation")
				net.WriteString(j.anim)
				net.WriteDouble(j.time)
				net.WriteString(v.Name)
				net.WriteString(i)
				net.Send(ply)
			end)
			animqueuetime = animqueuetime + j.time + 1
		end
		
	end
end)



concommand.Add("artery_checkSwingable",function(ply,cmd,args)
	local nitms = 0
	local noswingdata = {}
	for k,v in pairs(swingable) do
		--Make sure we have a weapon path for everything
		if file.Exists( "artery/dynamic/swingdata/" .. k, "DATA" ) then
			MsgC(Color(0,255,0),"Found data for " .. k .. "\n")
		else
			MsgC(Color(255,0,0),"Couldn't find data for " .. k .. "\n")
			noswingdata[#noswingdata + 1] = k
		end
		nitms = nitms + 1
	end
	
	print("Scanned ",nitms,"swingable items, could not find data for:\n\t",table.concat(noswingdata,"\n\t"))
end)

concommand.Add("artery_clearswingable",function(ply,cmd,args)
	swingable = {}
end)


return ws