Advertisement
Silverlan

Untitled

May 18th, 2013
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local FNPC_UPDATE_RAGDOLL = 1
  2. local nextName
  3. local tbNPCs = {}
  4. hook.Add("PlayerSpawnNPC","CPspawngetname",function(pl,name,wepName) nextName = name end)
  5.  
  6. local cv = GetConVar("ai_serverragdolls")
  7. local function CreateRagdoll(ent,model,npc)
  8.     local rep = ents.Create("prop_ragdoll")
  9.     rep:SetPos(ent:GetPos())
  10.     rep:SetAngles(ent:GetAngles())
  11.     rep:SetModel(model || ent:GetModel())
  12.     rep:SetSkin(ent:GetSkin())
  13.     rep:SetMaterial(ent:GetMaterial())
  14.     rep:SetVelocity(ent:GetVelocity())
  15.     rep:SetOwner(ent:GetOwner())
  16.     for i = 0,18 do rep:SetBodygroup(i,ent:GetBodygroup(i)) end
  17.     rep:Spawn()
  18.     rep:Activate()
  19.     if(!cv:GetBool()) then
  20.         rep:SetCollisionGroup(COLLISION_GROUP_DEBRIS)
  21.     end
  22.     for i = 0,rep:GetPhysicsObjectCount() -1 do
  23.         local phys = ent:GetPhysicsObjectNum(i)
  24.         local physRep = rep:GetPhysicsObjectNum(i)
  25.         if(IsValid(phys) && IsValid(physRep)) then
  26.             physRep:SetVelocity(phys:GetVelocity())
  27.             physRep:AddAngleVelocity(phys:GetAngleVelocity())
  28.             physRep:SetPos(phys:GetPos())
  29.             physRep:SetAngles(phys:GetAngles())
  30.         end
  31.     end
  32.     cleanup.ReplaceEntity(npc || ent,rep)
  33.     undo.ReplaceEntity(npc || ent,rep)
  34.     return rep
  35. end
  36.  
  37. local function CreateReplacement(ent,model,npc)
  38.     local rep = CreateRagdoll(ent,model,npc)
  39.     ent:Remove()
  40.     return rep
  41. end
  42.  
  43. local function CreateModelFixHooks(npc)
  44.     local data = tbNPCs[npc:GetNetworkedString("cname")]
  45.     if(!data) then return end
  46.     local idx = npc:EntIndex()
  47.     local hk = "npcupdateragdoll" .. idx
  48.     local t = UnPredictedCurTime()
  49.     hook.Add("OnEntityCreated",hk,function(ent)
  50.         local tCur = UnPredictedCurTime()
  51.         if(tCur -t >= 0.25) then
  52.             hook.Remove("OnEntityCreated",hk)
  53.             return
  54.         end
  55.         if(SERVER) then
  56.             if(ent:GetClass() == "prop_ragdoll" && ent:GetOwner() == npc) then
  57.                 CreateReplacement(ent,data.model,npc)
  58.                 hook.Remove("OnEntityCreated",hk)
  59.             end
  60.         else
  61.             if(ent:GetClass() == "class C_ClientRagdoll" && (ent:GetPos() -npc:GetPos()):Length() <= 0.5) then
  62.                 --ent:SetModel(data.model)
  63.                 ent:Remove()
  64.             end
  65.         end
  66.     end)
  67. end
  68.  
  69. if(SERVER) then
  70.     AddCSLuaFile()
  71.     util.AddNetworkString("npc_killed_fixragdoll")
  72. else
  73.     net.Receive("npc_killed_fixragdoll",function(len)
  74.         local ent = net.ReadEntity()
  75.         if(!ent:IsValid()) then return end
  76.         CreateModelFixHooks(ent)
  77.     end)
  78. end
  79.  
  80. hook.Add("PlayerSpawnedNPC","CPspawnupdatemodel",function(pl,npc)
  81.     if(!nextName) then return end
  82.     if(tbNPCs[nextName]) then
  83.         local data = tbNPCs[nextName]
  84.         local model = data.model
  85.         local min,max = npc:GetCollisionBounds()
  86.         local hull = npc:GetHullType()
  87.         npc:SetModel(model)
  88.         npc:SetSolid(SOLID_BBOX)
  89.         npc:SetHullType(hull)
  90.         npc:SetHullSizeNormal()
  91.         npc:SetCollisionBounds(min,max)
  92.         npc:DropToFloor()
  93.         npc:SetNetworkedString("cname",nextName)
  94.         if(data.flags && bit.band(data.flags,FNPC_UPDATE_RAGDOLL) == FNPC_UPDATE_RAGDOLL) then
  95.             local idx = npc:EntIndex()
  96.             local hk = "npcupdateragdoll" .. idx
  97.             hook.Add("OnNPCKilled",hk,function(ent)
  98.                 if(ent == npc) then
  99.                     hook.Remove("OnNPCKilled",hk)
  100.                     if(!cv:GetBool()) then CreateRagdoll(npc,model)
  101.                     else CreateModelFixHooks(npc) end
  102.                     net.Start("npc_killed_fixragdoll")
  103.                         net.WriteEntity(npc)
  104.                     net.Broadcast()
  105.                 end
  106.             end)
  107.             npc:CallOnRemove(hk,function()
  108.                 hook.Remove("OnNPCKilled",hk)
  109.                 hook.Remove("OnEntityCreated",hk)
  110.             end)
  111.         end
  112.     end
  113.     nextName = nil
  114. end)
  115.  
  116. local function AddNPC(category,name,class,model,keyvalues,skin,weapons,flags)
  117.     list.Set("NPC",name,{Name = name,Class = class,Skin = skin,Model = model,Category = category,KeyValues = keyvalues,Weapons = weapons})
  118.     tbNPCs[name] = {
  119.         model = model,
  120.         flags = flags
  121.     }
  122. end
  123.  
  124. AddNPC("Metropolice pack v5","Urban Camo","npc_metropolice","models/DPFilms/Metropolice/urban_police.mdl",{["manhacks"] = 0},0,{"weapon_smg1","weapon_pistol"})
  125. AddNPC("Metropolice pack v5","Zombie Police","npc_zombie","models/DPFilms/Metropolice/zombie_police.mdl",{["manhacks"] = 0},0,{"weapon_smg1","weapon_pistol"},FNPC_UPDATE_RAGDOLL)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement