SHOW:
         |
         |
         - or go back to the newest paste.    
    | 1 | local tool=Instance.new("HopperBin", game.Players.LocalPlayer.Backpack)
 | |
| 2 | tool.Name="Knife"  | |
| 3 | ||
| 4 | wait()  | |
| 5 | script.Parent=tool  | |
| 6 | ||
| 7 | --Murderer knife action script, original code from The Mad Murderer, by loleris.  | |
| 8 | ||
| 9 | wait()  | |
| 10 | local camera = game.Workspace.CurrentCamera  | |
| 11 | local player = game.Players.LocalPlayer  | |
| 12 | local character = player.Character  | |
| 13 | local humanoid = character.Humanoid  | |
| 14 | local head = character.Head  | |
| 15 | local torso = character.Torso  | |
| 16 | local pl_mouse = player:GetMouse()  | |
| 17 | ||
| 18 | local rs = game:GetService("RunService")
 | |
| 19 | ||
| 20 | - | local stab_damage = 110  | 
| 20 | + | local stab_damage = 10  | 
| 21 | local walkspeeds = {16, 19}
 | |
| 22 | ||
| 23 | Settings = {
 | |
| 24 | Equip_time = 0.4,  | |
| 25 | Idle_speed = 5,  | |
| 26 | Attack_speed = 0.65,  | |
| 27 | }  | |
| 28 | ||
| 29 | local assetlink = "http://www.roblox.com/asset/?id="  | |
| 30 | local hit_sounds = {"153647516", "153647519", "153647522", "153647526"}
 | |
| 31 | local death_sounds = {"146594640", "146594648", "146457047"}
 | |
| 32 | function Clean(obj)  | |
| 33 | spawn(function()  | |
| 34 | wait(6)  | |
| 35 | obj:remove()  | |
| 36 | end)  | |
| 37 | end  | |
| 38 | ||
| 39 | function HIT_HANDLE(hit, dmg, pos)  | |
| 40 | if hit == nil then return end  | |
| 41 | 	local h = hit.Parent:findFirstChild("Humanoid")
 | |
| 42 | if h == nil then  | |
| 43 | 		h = hit.Parent.Parent:findFirstChild("Humanoid")
 | |
| 44 | end  | |
| 45 | if h == nil then return end  | |
| 46 | if h.Health <= 0 then return end  | |
| 47 | ||
| 48 | 	local head = h.Parent:findFirstChild("Head")
 | |
| 49 | if head == nil then return end  | |
| 50 | ||
| 51 | 	local sound_part = Instance.new("Part")
 | |
| 52 | sound_part.formFactor = "Custom"  | |
| 53 | sound_part.Size = Vector3.new(0.2, 0.2, 0.2)  | |
| 54 | sound_part.Transparency = 1  | |
| 55 | sound_part.CanCollide = false  | |
| 56 | sound_part.Anchored = true  | |
| 57 | sound_part.CFrame = head.CFrame  | |
| 58 | Clean(sound_part)  | |
| 59 | sound_part.Parent = Workspace  | |
| 60 | 	local s_hit = Instance.new("Sound")
 | |
| 61 | s_hit.Volume = 1  | |
| 62 | s_hit.SoundId = assetlink .. hit_sounds[math.random(1, #hit_sounds)]  | |
| 63 | s_hit.Parent = sound_part  | |
| 64 | 	local s_die = Instance.new("Sound")
 | |
| 65 | s_die.Volume = 1  | |
| 66 | s_die.SoundId = assetlink .. death_sounds[math.random(1, #death_sounds)]  | |
| 67 | s_die.Parent = sound_part  | |
| 68 | ||
| 69 | s_hit:play()  | |
| 70 | ||
| 71 | 	local c_tag = Instance.new("ObjectValue")
 | |
| 72 | c_tag.Name = "creator"  | |
| 73 | c_tag.Value = player  | |
| 74 | c_tag.Parent = h  | |
| 75 | h.Health=0  | |
| 76 | s_die:play()  | |
| 77 | end  | |
| 78 | ||
| 79 | function GENERATE_IGNORELIST()  | |
| 80 | 	local result = {character, camera}
 | |
| 81 | local plr = game.Players:GetPlayers()  | |
| 82 | for i = 1, #plr do  | |
| 83 | if plr[i] ~= player then  | |
| 84 | local char = plr[i].Character  | |
| 85 | if char ~= nil then  | |
| 86 | local ch = char:GetChildren()  | |
| 87 | for i = 1, #ch do  | |
| 88 | 					if ch[i]:IsA("Hat") or ch[i]:IsA("Tool") then
 | |
| 89 | result[#result + 1] = ch[i]  | |
| 90 | end  | |
| 91 | end  | |
| 92 | end  | |
| 93 | end  | |
| 94 | end  | |
| 95 | return result  | |
| 96 | end  | |
| 97 | ||
| 98 | function RayCast(pos1, pos2, dist, ign)  | |
| 99 | local ray = Ray.new(  | |
| 100 | pos1,  | |
| 101 | (pos2 - pos1).unit * math.abs(dist)  | |
| 102 | )  | |
| 103 | local hit, hpos = Workspace:FindPartOnRayWithIgnoreList(ray, ign, false)  | |
| 104 | return hit, hpos  | |
| 105 | end  | |
| 106 | ||
| 107 | local larm = character:findFirstChild("Left Arm")
 | |
| 108 | local rarm = character:findFirstChild("Right Arm")
 | |
| 109 | function Slash(del)  | |
| 110 | coroutine.resume(coroutine.create(function()  | |
| 111 | 		local hits = {}
 | |
| 112 | ||
| 113 | local start = tick()  | |
| 114 | local actv = true  | |
| 115 | ||
| 116 | local function ishitted(obj)  | |
| 117 | for i = 1, #hits do  | |
| 118 | if obj:IsDescendantOf(hits[i]) then  | |
| 119 | return true  | |
| 120 | end  | |
| 121 | end  | |
| 122 | return false  | |
| 123 | end  | |
| 124 | ||
| 125 | local function hitp(hit)  | |
| 126 | if ishitted(hit) then return end  | |
| 127 | 			local h = hit.Parent:findFirstChild("Humanoid")
 | |
| 128 | if h == nil then  | |
| 129 | 				h = hit.Parent.Parent:findFirstChild("Humanoid")
 | |
| 130 | end  | |
| 131 | if h == nil then return end  | |
| 132 | hits[#hits + 1] = h.Parent  | |
| 133 | HIT_HANDLE(hit, stab_damage)  | |
| 134 | end  | |
| 135 | ||
| 136 | 		local con = {
 | |
| 137 | larm.Touched:connect(hitp),  | |
| 138 | rarm.Touched:connect(hitp),  | |
| 139 | }  | |
| 140 | ||
| 141 | while tick() - start <= Settings.Attack_speed do wait() end  | |
| 142 | actv = false  | |
| 143 | con[1]:disconnect()  | |
| 144 | con[2]:disconnect()  | |
| 145 | end))  | |
| 146 | end  | |
| 147 | ||
| 148 | local dg_sounds = {
 | |
| 149 | 	equip = {
 | |
| 150 | "153647514"  | |
| 151 | },  | |
| 152 | 	hit = {
 | |
| 153 | "153647516",  | |
| 154 | "153647519",  | |
| 155 | "153647522",  | |
| 156 | "153647526"  | |
| 157 | },  | |
| 158 | 	swing = {
 | |
| 159 | "153647529",  | |
| 160 | "153647534",  | |
| 161 | "153647539",  | |
| 162 | "153647540"  | |
| 163 | }  | |
| 164 | }  | |
| 165 | ||
| 166 | local dg_soundobj = {}
 | |
| 167 | for k, v in pairs(dg_sounds) do  | |
| 168 | 	dg_soundobj[k] = {}
 | |
| 169 | for i = 1, #v do  | |
| 170 | 		local ns = Instance.new("Sound")
 | |
| 171 | ns.SoundId = assetlink .. v[i]  | |
| 172 | ns.Volume = 1  | |
| 173 | dg_soundobj[k][#dg_soundobj[k] + 1] = ns  | |
| 174 | end  | |
| 175 | end  | |
| 176 | ||
| 177 | function LoadSounds()  | |
| 178 | for __, v in pairs(dg_soundobj) do  | |
| 179 | for i = 1, #v do  | |
| 180 | v[i].Parent = head  | |
| 181 | end  | |
| 182 | end  | |
| 183 | end  | |
| 184 | function RemoveSounds()  | |
| 185 | for __, v in pairs(dg_soundobj) do  | |
| 186 | for i = 1, #v do  | |
| 187 | v[i].Parent = nil  | |
| 188 | end  | |
| 189 | end  | |
| 190 | end  | |
| 191 | function PlaySound(nm, dl)  | |
| 192 | if dl == nil then  | |
| 193 | dg_soundobj[nm][math.random(1, #dg_soundobj[nm])]:play()  | |
| 194 | else  | |
| 195 | coroutine.resume(coroutine.create(function()  | |
| 196 | wait(dl)  | |
| 197 | dg_soundobj[nm][math.random(1, #dg_soundobj[nm])]:play()  | |
| 198 | end))  | |
| 199 | end  | |
| 200 | end  | |
| 201 | ||
| 202 | _G.MurderKnife_AnimType = "Default"  | |
| 203 | _G.MurderKnife_AnimState = 0  | |
| 204 | ||
| 205 | function Animate(tp, st)  | |
| 206 | _G.MurderKnife_AnimType = tp  | |
| 207 | _G.MurderKnife_AnimState = st  | |
| 208 | end  | |
| 209 | ||
| 210 | tool.Selected:connect(function(mouse) --Default, Idle1, Idle2, Attack1, Attack2  | |
| 211 | humanoid.WalkSpeed = walkspeeds[2]  | |
| 212 | mouse.Icon = assetlink .. "54019936"  | |
| 213 | 	Animate("Equip", 0)
 | |
| 214 | LoadSounds()  | |
| 215 | 	PlaySound("equip", 0.1)
 | |
| 216 | ||
| 217 | local anim_equip = 1  | |
| 218 | local last_action = tick()  | |
| 219 | local idle_rand = math.random(4, 7)  | |
| 220 | local idle_perform = 0  | |
| 221 | local idle_type = 1  | |
| 222 | ||
| 223 | local attack_perform = 0  | |
| 224 | local attack_type = 1  | |
| 225 | ||
| 226 | local running = true  | |
| 227 | local last_c = tick()  | |
| 228 | ||
| 229 | local click_start = tick()  | |
| 230 | mouse.Button1Down:connect(function()  | |
| 231 | if not running or anim_equip > 0 then return end  | |
| 232 | if tick() - attack_perform <= Settings.Attack_speed then return end  | |
| 233 | attack_perform = tick()  | |
| 234 | last_action = tick()  | |
| 235 | attack_type = math.random(1, 3)  | |
| 236 | idle_perform = 0  | |
| 237 | 		PlaySound("swing", 0.15)
 | |
| 238 | Slash(0.17)  | |
| 239 | end)  | |
| 240 | ||
| 241 | local conn = rs.RenderStepped:connect(function()  | |
| 242 | if not running then return end  | |
| 243 | local delta = tick() - last_c  | |
| 244 | last_c = tick()  | |
| 245 | ||
| 246 | if anim_equip > 0 then  | |
| 247 | anim_equip = math.max(0, anim_equip - (delta / Settings.Equip_time))  | |
| 248 | 			Animate("Equip", 1 - anim_equip)
 | |
| 249 | elseif tick() - attack_perform <= Settings.Attack_speed then  | |
| 250 | 			Animate("Attack" .. attack_type, (tick() - attack_perform) / Settings.Attack_speed)
 | |
| 251 | idle_perform = 0  | |
| 252 | elseif tick() - idle_perform <= Settings.Idle_speed then  | |
| 253 | 			Animate("Idle" .. idle_type, (tick() - idle_perform) / Settings.Idle_speed)
 | |
| 254 | else  | |
| 255 | 			Animate("Default", 0)
 | |
| 256 | end  | |
| 257 | ||
| 258 | if tick() - last_action >= idle_rand then  | |
| 259 | idle_rand = math.random(12, 20)  | |
| 260 | last_action = tick()  | |
| 261 | idle_perform = tick()  | |
| 262 | idle_type = math.random(1, 2)  | |
| 263 | end  | |
| 264 | ||
| 265 | end)  | |
| 266 | tool.Deselected:connect(function() running = false conn:disconnect() end)  | |
| 267 | end)  | |
| 268 | tool.Deselected:connect(function()  | |
| 269 | RemoveSounds()  | |
| 270 | humanoid.WalkSpeed = walkspeeds[1]  | |
| 271 | end)  | |
| 272 | ||
| 273 | --Murderer knife animation module, original code from The Mad Murderer, by loleris.  | |
| 274 | ||
| 275 | local mouse = pl_mouse  | |
| 276 | ||
| 277 | local conn_type = "Snap"  | |
| 278 | ||
| 279 | local anim_head = false  | |
| 280 | ||
| 281 | weapon_properties = {
 | |
| 282 | mesh_id = "http://www.roblox.com/asset/?id=121944778",  | |
| 283 | texture_id = "http://www.roblox.com/asset/?id=121944805",  | |
| 284 | scale = Vector3.new(0.6, 0.6, 0.6),  | |
| 285 | transparency = 0,  | |
| 286 | reflectance = 0,  | |
| 287 | 	brick_color = BrickColor.new("Really black"),
 | |
| 288 | }  | |
| 289 | ||
| 290 | --How did I make all of this? Magic. Didn't even need an animation editor :)  | |
| 291 | Animations = {
 | |
| 292 | 	Default = {
 | |
| 293 | 		{{}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.873, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)}
 | |
| 294 | },  | |
| 295 | 	Equip = {
 | |
| 296 | 		{{}, 0, CFrame.new(0, 0, 0) * CFrame.Angles(-1.571, 0, 0), CFrame.new(0, 0, 0) * CFrame.Angles(-1.571, 0, 0), CFrame.new(0, -1.3, -0.5) * CFrame.Angles(-2.618, 0, 0)},
 | |
| 297 | 		{{0.8, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.524, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(0, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)},
 | |
| 298 | 		{{0.2, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.873, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)},
 | |
| 299 | },  | |
| 300 | 	Idle1 = {
 | |
| 301 | 		{{}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.873, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)},
 | |
| 302 | 		{{0.3, 2}, 0, CFrame.new(0.8, -0.301, 0.2) * CFrame.Angles(-0.35, 0, 0.872), CFrame.new(-0.201, 0, 0) * CFrame.Angles(0.523, 1.221, -0.699), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 1.221, 0)},
 | |
| 303 | 		{{0.55, 2}, 0, CFrame.new(0.2, -0.5, 0.2) * CFrame.Angles(-0.14, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(0, 1.221, -0.175), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.746, 1.221, 0.174)},
 | |
| 304 | 		{{0.15, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.873, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)},
 | |
| 305 | },  | |
| 306 | 	Idle2 = {
 | |
| 307 | 		{{}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.873, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)},
 | |
| 308 | 		{{0.3, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.524, 0, 0.872), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, -0.175, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0.523, 0)},
 | |
| 309 | 		{{0.3, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(0.349, 0, 0.523), CFrame.new(-0.201, 0, 0) * CFrame.Angles(0.174, 0.698, -0.524), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, -1.222, 0)},
 | |
| 310 | 		{{0.2, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(0.61, 0, 0.349), CFrame.new(-0.201, 0, 0) * CFrame.Angles(0.139, 0.663, -0.489), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, -1.222, 0)},
 | |
| 311 | 		{{0.2, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.873, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)}
 | |
| 312 | },  | |
| 313 | 	Attack1 = {
 | |
| 314 | 		{{}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.873, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)},
 | |
| 315 | 		{{0.25, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-1.048, 0, 0.349), CFrame.new(-0.201, 0, 0) * CFrame.Angles(0.872, 0.349, 0.087), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)},
 | |
| 316 | 		{{0.15, 2}, 0, CFrame.new(0.4, -0.101, 0.1) * CFrame.Angles(-1.571, 0, -0.35), CFrame.new(-0.301, -0.301, 0.1) * CFrame.Angles(-1.048, -0.175, -0.524), CFrame.new(0, -1.201, -0.801) * CFrame.Angles(-2.095, 0, 0)},
 | |
| 317 | 		{{0.6, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.873, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)}
 | |
| 318 | },  | |
| 319 | 	Attack2 = {
 | |
| 320 | 		{{}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.873, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)},
 | |
| 321 | 		{{0.25, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.699, 0, 0.872), CFrame.new(-0.401, 0.3, 0.1) * CFrame.Angles(1.919, 2.443, -1.222), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)},
 | |
| 322 | 		{{0.15, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-1.048, 0, -0.524), CFrame.new(-0.5, -0.201, -0.101) * CFrame.Angles(0.523, 1.396, -0.873), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)},
 | |
| 323 | 		{{0.6, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.873, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)}
 | |
| 324 | },  | |
| 325 | 	Attack3 = {
 | |
| 326 | 		{{}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.873, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)},
 | |
| 327 | 		{{0.25, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-1.397, 0, 0.174), CFrame.new(-0.401, -0.201, 0) * CFrame.Angles(1.396, 0.698, -1.571), CFrame.new(0, -1.3, -0.401) * CFrame.Angles(-2.444, 0, 0)},
 | |
| 328 | 		{{0.15, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-1.397, 0, 0.174), CFrame.new(-0.401, 0.1, 0) * CFrame.Angles(0.349, 2.094, -0.524), CFrame.new(0, -1.3, 0.1) * CFrame.Angles(-3.84, 0, 0)},
 | |
| 329 | 		{{0.6, 2}, 0, CFrame.new(0.4, -0.201, 0.2) * CFrame.Angles(-0.873, 0, 0.698), CFrame.new(-0.201, 0, 0) * CFrame.Angles(-0.175, 0.349, -0.262), CFrame.new(0, -0.95, -0.801) * CFrame.Angles(-1.571, 0, 0)} --Psst. Create a dummy, try setting position and angles of limbs and the weapon, save CFrame data to code. Easy? Yes. When making a single knife tool, it was all you needed.
 | |
| 330 | }  | |
| 331 | }  | |
| 332 | ||
| 333 | ||
| 334 | function CFrameTrans(GetCFrame1, GetCFrame2, GetNumber)  | |
| 335 | local Diff2 = GetCFrame2.p - GetCFrame1.p  | |
| 336 | GetCFrame1_s = GetCFrame1 - GetCFrame1.p  | |
| 337 | GetCFrame2 = GetCFrame2 - GetCFrame2.p  | |
| 338 | local Diff = GetCFrame1_s:inverse() * GetCFrame2  | |
| 339 | local x1, y1, z1 = Diff:toEulerAnglesXYZ()  | |
| 340 | return (GetCFrame1 + (Diff2 * GetNumber)) * CFrame.Angles(x1 * GetNumber, y1 * GetNumber, z1 * GetNumber)  | |
| 341 | end  | |
| 342 | ||
| 343 | function TransEff(x, type)  | |
| 344 | if type == 1 then  | |
| 345 | return x  | |
| 346 | elseif type == 2 then  | |
| 347 | return x*x*(3 - 2*x)  | |
| 348 | elseif type == 3 then  | |
| 349 | return math.sin(math.rad(x * 90))  | |
| 350 | elseif type == 4 then  | |
| 351 | return 1 - math.sin(math.rad((1 - x) * 90))  | |
| 352 | end  | |
| 353 | end  | |
| 354 | ||
| 355 | function num_trans(n1, n2, x)  | |
| 356 | return n1 + ((n2 - n1) * x)  | |
| 357 | end  | |
| 358 | ||
| 359 | function PlayAnimation(anim_name, tm) --return {left, right, wep, trans}
 | |
| 360 | tm = math.min(1, math.max(0, tm))  | |
| 361 | local animd = Animations[anim_name]  | |
| 362 | if #animd == 1 then  | |
| 363 | 		return {animd[1][3], animd[1][4], animd[1][5], animd[1][2]}
 | |
| 364 | else  | |
| 365 | local trans_from = 1  | |
| 366 | local trans_to = 1  | |
| 367 | local tm_left = tm  | |
| 368 | for i = 2, #animd do  | |
| 369 | tm_left = tm_left - animd[i][1][1]  | |
| 370 | if tm_left <= 0 then  | |
| 371 | trans_from = i - 1  | |
| 372 | trans_to = i  | |
| 373 | break  | |
| 374 | end  | |
| 375 | end  | |
| 376 | local trans_amm = TransEff((animd[trans_to][1][1] + tm_left) / animd[trans_to][1][1], animd[trans_to][1][2])  | |
| 377 | 		return {
 | |
| 378 | CFrameTrans(animd[trans_from][3], animd[trans_to][3], trans_amm),  | |
| 379 | CFrameTrans(animd[trans_from][4], animd[trans_to][4], trans_amm),  | |
| 380 | CFrameTrans(animd[trans_from][5], animd[trans_to][5], trans_amm),  | |
| 381 | num_trans(animd[trans_from][2], animd[trans_to][2], trans_amm)  | |
| 382 | }  | |
| 383 | end  | |
| 384 | end  | |
| 385 | ||
| 386 | rot_amplitude_head = 20  | |
| 387 | rot_amplitude_chest = 15  | |
| 388 | ||
| 389 | anim_p = {
 | |
| 390 | cam_offset = CFrame.new(0.2, -0.37, 0.91) * CFrame.Angles(math.rad(0), math.rad(0), math.rad(0)),  | |
| 391 | aim_amp = 0.5,  | |
| 392 | aim_max_change = 4,  | |
| 393 | aim_retract = 15,  | |
| 394 | aim_max_deg = 20,  | |
| 395 | }  | |
| 396 | ||
| 397 | local weapon_model = Instance.new("Part")
 | |
| 398 | weapon_model.CanCollide = false  | |
| 399 | weapon_model.Name = "WeaponObject"  | |
| 400 | weapon_model.formFactor = "Custom"  | |
| 401 | weapon_model.Size = Vector3.new(0.2, 0.2, 0.2)  | |
| 402 | weapon_model.TopSurface = 0  | |
| 403 | weapon_model.BottomSurface = 0  | |
| 404 | weapon_model.BrickColor = weapon_properties.brick_color  | |
| 405 | weapon_model.Transparency = weapon_properties.transparency  | |
| 406 | weapon_model.Reflectance = weapon_properties.reflectance  | |
| 407 | local mesh = Instance.new("SpecialMesh", weapon_model)
 | |
| 408 | mesh.Scale = weapon_properties.scale  | |
| 409 | mesh.MeshId = weapon_properties.mesh_id  | |
| 410 | mesh.TextureId = weapon_properties.texture_id  | |
| 411 | ||
| 412 | torso = character.Torso  | |
| 413 | head = character.Head  | |
| 414 | ||
| 415 | motors = {torso:findFirstChild("Left Shoulder"), torso:findFirstChild("Right Shoulder"), torso:findFirstChild("Neck")}
 | |
| 416 | welds = {nil, nil, nil}
 | |
| 417 | weapon_parts = {weapon_model:clone(), weapon_model:clone()}
 | |
| 418 | weapon_model = nil  | |
| 419 | ||
| 420 | function EndAnimation()  | |
| 421 | if motors[1] then  | |
| 422 | 		motors[1].Part1 = character:findFirstChild("Left Arm")
 | |
| 423 | end  | |
| 424 | if motors[2] then  | |
| 425 | 		motors[2].Part1 = character:findFirstChild("Right Arm")
 | |
| 426 | end  | |
| 427 | if motors[3] then  | |
| 428 | 		motors[3].Part1 = character:findFirstChild("Head")
 | |
| 429 | end  | |
| 430 | if welds[1] then  | |
| 431 | welds[1]:remove()  | |
| 432 | welds[1] = nil  | |
| 433 | end  | |
| 434 | if welds[2] then  | |
| 435 | welds[2]:remove()  | |
| 436 | welds[2] = nil  | |
| 437 | end  | |
| 438 | if welds[3] then  | |
| 439 | welds[3]:remove()  | |
| 440 | welds[3] = nil  | |
| 441 | end  | |
| 442 | weapon_parts[1].Parent = nil  | |
| 443 | if weapon_model then  | |
| 444 | weapon_model.Parent = nil  | |
| 445 | end  | |
| 446 | coroutine.resume(coroutine.create(function()  | |
| 447 | local swm = weapon_model  | |
| 448 | wait()  | |
| 449 | swm.Parent = nil  | |
| 450 | wait(0.1)  | |
| 451 | swm.Parent = nil  | |
| 452 | wait(0.5)  | |
| 453 | swm.Parent = nil  | |
| 454 | end))  | |
| 455 | end  | |
| 456 | ||
| 457 | local anim_model = Instance.new("Model")
 | |
| 458 | anim_model.Name = "WeaponAnimation"  | |
| 459 | weapon_model = anim_model  | |
| 460 | ||
| 461 | local cam_larm = Instance.new("Part")
 | |
| 462 | cam_larm.Parent = anim_model  | |
| 463 | cam_larm.BrickColor = BrickColor.new("Really black")
 | |
| 464 | cam_larm.formFactor = "Custom"  | |
| 465 | cam_larm.Size = Vector3.new(0.2, 0.2, 0.2)  | |
| 466 | cam_larm.TopSurface = 0  | |
| 467 | cam_larm.BottomSurface = 0  | |
| 468 | cam_larm.Transparency = 0.4  | |
| 469 | cam_larm.CanCollide = false  | |
| 470 | local hmesh = Instance.new("BlockMesh", cam_larm)
 | |
| 471 | hmesh.Scale = Vector3.new(5, 10, 5)  | |
| 472 | ||
| 473 | local cam_rarm = cam_larm:clone()  | |
| 474 | cam_rarm.Parent = anim_model  | |
| 475 | ||
| 476 | function StartAnimation()  | |
| 477 | 	local check = {torso:findFirstChild("LeftWeld"), torso:findFirstChild("RightWeld"), torso:findFirstChild("HeadWeld")}
 | |
| 478 | if check[1] then check[1]:remove() end  | |
| 479 | if check[2] then check[2]:remove() end  | |
| 480 | if check[3] then check[3]:remove() end  | |
| 481 | 	local check2 = {character:findFirstChild("WeaponObject"), camera:findFirstChild("WeaponAnimation")}
 | |
| 482 | if check2[1] then check2[1].Parent = nil end  | |
| 483 | if check2[2] then check2[2].Parent = nil end  | |
| 484 | if motors[1] then  | |
| 485 | motors[1].Part1 = nil  | |
| 486 | end  | |
| 487 | if motors[2] then  | |
| 488 | motors[2].Part1 = nil  | |
| 489 | end  | |
| 490 | if motors[3] then  | |
| 491 | motors[3].Part1 = nil  | |
| 492 | end  | |
| 493 | 	welds = {Instance.new(conn_type), Instance.new(conn_type), Instance.new(conn_type)}
 | |
| 494 | welds[1].Part0 = torso  | |
| 495 | welds[2].Part0 = torso  | |
| 496 | welds[3].Part0 = torso  | |
| 497 | 	welds[1].Part1 = character:findFirstChild("Left Arm")
 | |
| 498 | 	welds[2].Part1 = character:findFirstChild("Right Arm")
 | |
| 499 | 	welds[3].Part1 = character:findFirstChild("Head")
 | |
| 500 | welds[1].Name = "LeftWeld"  | |
| 501 | welds[2].Name = "RightWeld"  | |
| 502 | welds[2].Name = "HeadWeld"  | |
| 503 | welds[1].C0 = CFrame.new(-1.5, 0, 0)  | |
| 504 | welds[2].C0 = CFrame.new(1.5, 0, 0)  | |
| 505 | welds[3].C0 = CFrame.new(0, 1.5, 0)  | |
| 506 | welds[1].Parent = torso  | |
| 507 | welds[2].Parent = torso  | |
| 508 | welds[3].Parent = torso  | |
| 509 | ||
| 510 | weapon_parts[1].Parent = character  | |
| 511 | local wep_weld = Instance.new(conn_type)  | |
| 512 | 	wep_weld.Part0 = character:findFirstChild("Right Arm")
 | |
| 513 | wep_weld.Part1 = weapon_parts[1]  | |
| 514 | wep_weld.C0 = CFrame.new()  | |
| 515 | wep_weld.Parent = weapon_parts[1]  | |
| 516 | ||
| 517 | local weld1 = welds[1]  | |
| 518 | local weld2 = welds[2]  | |
| 519 | local weld3 = welds[3]  | |
| 520 | ||
| 521 | 	local cam_welds = {Instance.new(conn_type), Instance.new(conn_type), Instance.new(conn_type)}
 | |
| 522 | cam_welds[1].Part0 = torso  | |
| 523 | cam_welds[1].Part1 = cam_larm  | |
| 524 | cam_welds[1].Parent = cam_larm  | |
| 525 | cam_welds[2].Part0 = torso  | |
| 526 | cam_welds[2].Part1 = cam_rarm  | |
| 527 | cam_welds[2].Parent = cam_rarm  | |
| 528 | cam_welds[3].Part0 = cam_rarm  | |
| 529 | cam_welds[3].Part1 = weapon_parts[2]  | |
| 530 | cam_welds[3].Parent = weapon_parts[2]  | |
| 531 | weapon_parts[2].Parent = anim_model  | |
| 532 | ||
| 533 | local move_anim_speed = 3  | |
| 534 | local last_p = Vector3.new()  | |
| 535 | local move_amm = 0  | |
| 536 | coroutine.resume(coroutine.create(function()  | |
| 537 | while weld1.Parent ~= nil do  | |
| 538 | local delta = wait(1/25)  | |
| 539 | local cur_p = torso.Position  | |
| 540 | if (cur_p - last_p).magnitude >= 0.1 then  | |
| 541 | move_amm = math.min(1, move_amm + delta * move_anim_speed)  | |
| 542 | else  | |
| 543 | move_amm = math.max(0, move_amm - delta * move_anim_speed)  | |
| 544 | end  | |
| 545 | last_p = cur_p  | |
| 546 | end  | |
| 547 | end))  | |
| 548 | ||
| 549 | 	local r_serv = game:GetService("RunService")
 | |
| 550 | ||
| 551 | --EASTER EGG  | |
| 552 | function easein(x)  | |
| 553 | return math.sin(math.rad(x * 90))  | |
| 554 | end  | |
| 555 | ||
| 556 | 	local a_horse = (character:findFirstChild("HorseHead") ~= nil)
 | |
| 557 | 	local horse_displace = {0, 0}
 | |
| 558 | local horse_cf = CFrame.Angles(0.0001, 0.0001, 0)  | |
| 559 | if a_horse then  | |
| 560 | coroutine.resume(coroutine.create(function()  | |
| 561 | while weld1.Parent ~= nil do  | |
| 562 | local rndwait = (math.random(100, 1000) / 1000) * 4  | |
| 563 | wait(rndwait)  | |
| 564 | 				local oldd = {horse_displace[1], horse_displace[2]}
 | |
| 565 | 				local disp2 = {math.random(-60, 60), math.random(0, 25)}
 | |
| 566 | ||
| 567 | local ld = 0  | |
| 568 | while ld ~= 1 do  | |
| 569 | local st = tick()  | |
| 570 | r_serv.RenderStepped:wait()  | |
| 571 | ld = math.min(1, ld + ((tick() - st) * 4))  | |
| 572 | local eff = easein(ld)  | |
| 573 | ||
| 574 | local x = oldd[1] - ((oldd[1] - disp2[1]) * eff)  | |
| 575 | local y = oldd[2] - ((oldd[2] - disp2[2]) * eff)  | |
| 576 | 					horse_displace = {x, y}
 | |
| 577 | horse_cf = CFrame.Angles(math.rad(y), math.rad(x) , 0)  | |
| 578 | end  | |
| 579 | end  | |
| 580 | end))  | |
| 581 | end  | |
| 582 | ||
| 583 | --EASTER EGG  | |
| 584 | ||
| 585 | local last_va = 0  | |
| 586 | local last_va2 = 0  | |
| 587 | 	local view_velocity = {0, 0}
 | |
| 588 | ||
| 589 | coroutine.resume(coroutine.create(function()  | |
| 590 | local last_time = tick()  | |
| 591 | while weld1.Parent ~= nil do  | |
| 592 | r_serv.RenderStepped:wait() ------------------------------------------------  | |
| 593 | local delta = tick() - last_time  | |
| 594 | last_time = tick()  | |
| 595 | ||
| 596 | local breathe_amp = 2  | |
| 597 | local breathe_freq = 0.8  | |
| 598 | local breathe = math.sin(math.rad(tick() * 90 * breathe_freq)) * breathe_amp  | |
| 599 | ||
| 600 | local shake_freq = 5  | |
| 601 | 			local shake_amp = {0.05, 0.05}
 | |
| 602 | local arm_shake = CFrame.new(  | |
| 603 | math.sin(math.rad(tick() * 90 * shake_freq)) * move_amm * shake_amp[1],  | |
| 604 | 0,  | |
| 605 | math.abs(math.sin(math.rad(tick() * 90 * shake_freq)) * move_amm * shake_amp[2]))  | |
| 606 | ||
| 607 | ||
| 608 | --ANIMATION LOOP  | |
| 609 | local p_distance = (head.Position - mouse.Hit.p).magnitude  | |
| 610 | if p_distance == 0 then p_distance = 0.0001 end  | |
| 611 | local p_height = mouse.Hit.p.y - head.Position.y  | |
| 612 | local view_angle  | |
| 613 | if p_height ~= 0 then  | |
| 614 | view_angle = math.deg(math.asin(math.abs(p_height) / p_distance)) * (math.abs(p_height) / p_height)  | |
| 615 | else  | |
| 616 | view_angle = 0  | |
| 617 | end  | |
| 618 | ||
| 619 | local cam_cf = camera.CoordinateFrame  | |
| 620 | local looking_at = cam_cf * CFrame.new(0, 0, -100)  | |
| 621 | local view_angle2 = math.deg(math.atan2(cam_cf.p.x - looking_at.p.x, cam_cf.p.z - looking_at.p.z)) + 180  | |
| 622 | ||
| 623 | local v_delta1, v_delta2  | |
| 624 | local dir1 = 0  | |
| 625 | local dir2 = 0  | |
| 626 | v_delta1 = math.abs(view_angle - last_va)  | |
| 627 | if v_delta1 ~= 0 then  | |
| 628 | dir1 = (view_angle - last_va) / v_delta1  | |
| 629 | end  | |
| 630 | 			local va_check = {math.abs(view_angle2 - last_va2), 360 - math.abs(view_angle2 - last_va2)}
 | |
| 631 | if view_angle2 == last_va2 then  | |
| 632 | dir2 = 0  | |
| 633 | v_delta2 = 0  | |
| 634 | elseif va_check[1] < va_check[2] then  | |
| 635 | v_delta2 = va_check[1]  | |
| 636 | dir2 = (view_angle2 - last_va2) / va_check[1]  | |
| 637 | else  | |
| 638 | v_delta2 = va_check[2]  | |
| 639 | if last_va2 > view_angle2 then  | |
| 640 | dir2 = 1  | |
| 641 | else  | |
| 642 | dir2 = -1  | |
| 643 | end  | |
| 644 | end  | |
| 645 | last_va = view_angle  | |
| 646 | last_va2 = view_angle2  | |
| 647 | ||
| 648 | view_velocity[1] = view_velocity[1] / (1 + (delta * anim_p.aim_retract))  | |
| 649 | view_velocity[2] = view_velocity[2] / (1 + (delta * anim_p.aim_retract))  | |
| 650 | ||
| 651 | local calc1 = v_delta1 * dir1 * anim_p.aim_amp  | |
| 652 | if calc1 ~= 0 then  | |
| 653 | view_velocity[1] = view_velocity[1] + (math.min(anim_p.aim_max_change, math.abs(calc1)) * (calc1 / math.abs(calc1)))  | |
| 654 | end  | |
| 655 | local calc2 = v_delta2 * dir2 * anim_p.aim_amp  | |
| 656 | if calc2 ~= 0 then  | |
| 657 | view_velocity[2] = view_velocity[2] + (math.min(anim_p.aim_max_change, math.abs(calc2)) * (calc2 / math.abs(calc2)))  | |
| 658 | end  | |
| 659 | ||
| 660 | if view_velocity[1] ~= 0 then  | |
| 661 | view_velocity[1] = math.min(anim_p.aim_max_deg, math.abs(view_velocity[1])) * (math.abs(view_velocity[1]) / view_velocity[1])  | |
| 662 | end  | |
| 663 | if view_velocity[2] ~= 0 then  | |
| 664 | view_velocity[2] = math.min(anim_p.aim_max_deg, math.abs(view_velocity[2])) * (math.abs(view_velocity[2]) / view_velocity[2])  | |
| 665 | end  | |
| 666 | ||
| 667 | local anmtp = _G.MurderKnife_AnimType  | |
| 668 | local anmst = _G.MurderKnife_AnimState  | |
| 669 | ||
| 670 | if anmst == nil then  | |
| 671 | anmst = 0  | |
| 672 | end  | |
| 673 | ||
| 674 | if anmtp ~= nil then  | |
| 675 | if Animations[anmtp] == nil then  | |
| 676 | anmtp = "Default"  | |
| 677 | end  | |
| 678 | else  | |
| 679 | anmtp = "Default"  | |
| 680 | end  | |
| 681 | local curr_anim = PlayAnimation(anmtp, anmst) --left, right, weapon, wep trans  | |
| 682 | ||
| 683 | 			--curr_anim = {Animations.Default[1][3], Animations.Default[1][4], Animations.Default[1][5], 0}
 | |
| 684 | ||
| 685 | local chestCF = CFrame.new(0, 0.5, 0) * CFrame.Angles(math.rad(math.max(-rot_amplitude_chest, math.min(rot_amplitude_chest, view_angle)) + 90 + breathe), 0, 0)  | |
| 686 | weld1.C1 = (chestCF * curr_anim[1] * CFrame.new(0, -0.5, 0)):inverse()  | |
| 687 | weld2.C1 = (chestCF * curr_anim[2] * CFrame.new(0, -0.5, 0)):inverse()  | |
| 688 | wep_weld.C1 = (curr_anim[3]):inverse()  | |
| 689 | weapon_parts[1].Transparency = curr_anim[4]  | |
| 690 | if anim_head then  | |
| 691 | weld3.C1 = (CFrame.new(0, 0, 0) * CFrame.Angles(math.rad(math.max(-rot_amplitude_head, math.min(rot_amplitude_head, view_angle))), 0, 0) * horse_cf):inverse()  | |
| 692 | else  | |
| 693 | weld3.C1 = (CFrame.new(0, 0, 0)):inverse()  | |
| 694 | end  | |
| 695 | ||
| 696 | if (head.Position - camera.CoordinateFrame.p).magnitude < 3 then  | |
| 697 | if anim_model.Parent == nil then  | |
| 698 | anim_model.Parent = camera  | |
| 699 | end  | |
| 700 | cam_welds[1].Parent = cam_larm  | |
| 701 | cam_welds[2].Parent = cam_rarm  | |
| 702 | cam_welds[3].Parent = weapon_parts[2]  | |
| 703 | local cam_cf = camera.CoordinateFrame * CFrame.Angles(math.rad(90 + (breathe / 2) - view_velocity[1]), 0, math.rad(view_velocity[2])) * arm_shake * anim_p.cam_offset  | |
| 704 | cam_welds[1].C1 = (torso.CFrame:inverse() * cam_cf * CFrame.new(-1.5, 0, 0) * curr_anim[1] * CFrame.new(0, -0.5, 0)):inverse()  | |
| 705 | cam_welds[2].C1 = (torso.CFrame:inverse() * cam_cf * CFrame.new(1.5, 0, 0) * curr_anim[2] * CFrame.new(0, -0.5, 0)):inverse()  | |
| 706 | cam_welds[3].C1 = (curr_anim[3]):inverse()  | |
| 707 | weapon_parts[2].Transparency = curr_anim[4]  | |
| 708 | else  | |
| 709 | if anim_model.Parent ~= nil then  | |
| 710 | anim_model.Parent = nil  | |
| 711 | end  | |
| 712 | end  | |
| 713 | --ANIMATION LOOP  | |
| 714 | end  | |
| 715 | end))  | |
| 716 | end  | |
| 717 | ||
| 718 | local last_st = 0  | |
| 719 | local eq = false  | |
| 720 | tool.Selected:connect(function(mouse)  | |
| 721 | if eq then return end  | |
| 722 | eq = true  | |
| 723 | wait()  | |
| 724 | StartAnimation()  | |
| 725 | end)  | |
| 726 | ||
| 727 | tool.Deselected:connect(function()  | |
| 728 | eq = false  | |
| 729 | EndAnimation()  | |
| 730 | end)  |