--[[ This file tells you what weapons need their swings recalculated ]] local itm = nrequire("core/inventory/item.lua") local inv = nrequire("core/inventory/inventory.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 = {} --A queue of {pac, animation_name, animation_time, mapping,item_tbl} local recordqueue = {} 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) print("Makeing a swingable out of:") PrintTable(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 local function record_animations_for(swingable, e) print("recording animations on", e) PrintTable(swingable) local einv = e.data.inventories[1] local spot = einv:FindPlaceFor(swingable) assert(spot != nil, "Could not equip the npc with that") einv:Put(spot,swingable) --Give the client time to download the pac & apply it timer.Simple(1.1,function() for k,v in pairs(swingable.attacks) do net.Start("artery_doanimation") net.WriteString(v.anim) net.WriteDouble(v.time) net.WriteString(swingable.Name) net.WriteString(swingable.pacname) net.WriteString(".") net.WriteEntity(e) net.Broadcast() end end) timer.Simple(5,function() --assert(IsValid(einv),"Npc's inventory is no longer valid!") einv:Remove(spot) end) end --Create a fake thing in front of the player, do the swing animations, and record them. concommand.Add("artery_recordanimations",function(ply,cmd,args) --Create an npc with the equipment inventory -- e = ents.Create("npc_citizen") -- e:SetPos(ply:GetEyeTrace().HitPos) -- e:Spawn() -- e.data = {inventories = {}} -- local einv = inv.CreateInventory("Equipment") -- einv.id = 1 -- einv.Owner = e -- e.data.inventories[einv.id] = einv local e = ply e:SetAngles(Angle(0,0,0)) --Add everything in swingables to a queue to be recorded for k,v in pairs(swingable) do for i,j in pairs(v.attacks) do local tn = { v.pacname, j.anim, j.time, i, v, j.waittime } recordqueue[#recordqueue + 1] = tn end end --Create timers for everything local timefromnow = 0 for k,v in ipairs(recordqueue) do timefromnow = timefromnow + 1 print("timefromnow 1 is",timefromnow) --Put the item into the inventory local tfunc = function(nowtime) local whentoremove = nowtime + 1 + v[3] + 1 timer.Simple(nowtime,function() print("timefromnow 2 is",nowtime) local einv = e.data.inventories[1] local spot = einv:FindPlaceFor(v[5]) assert(spot != nil, "Could not equip the npc with " .. v[5].Name) einv:Put(spot,v[5]) print("Placed item in inventory") --Wait 1 second to de-apply the pac and remove the item print("I will remove the item in", v[3]) timer.Simple(v[3],function() print("removeing equiped...") einv:Remove(spot) end) end) end tfunc(timefromnow) print("timefromnow 3 is",timefromnow) local tfunc2 = function(nowtime) timer.Simple(nowtime,function() print("timefromnow 4 is",nowtime) net.Start("artery_doanimation") net.WriteString(v[2]) net.WriteDouble(v[3]) net.WriteString(v[5].Name) net.WriteString(v[1]) net.WriteString(v[4]) net.WriteEntity(e) net.WriteDouble(v[6]) net.Broadcast() end) end --Wait 1 second for the pac to apply timefromnow = timefromnow + 1 tfunc2(timefromnow) timefromnow = timefromnow + 1 + v[3] + 1 --Wait for anim to be recorded, and the thing to be removed end recordqueue = {} --[[ 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) --Animation name (to return) net.WriteDouble(j.time) --Timeing of the animation net.WriteString(v.Name) --Name of the item (to return) net.WriteString(v.pacname) --Name of the pac for this item net.WriteString(i) --direction of the animation (to return) 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 .. ".txt", "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