Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local FNPC_UPDATE_RAGDOLL = 1
- local nextName
- local tbNPCs = {}
- hook.Add("PlayerSpawnNPC","CPspawngetname",function(pl,name,wepName) nextName = name end)
- local cv = GetConVar("ai_serverragdolls")
- local function CreateRagdoll(ent,model,npc)
- local rep = ents.Create("prop_ragdoll")
- rep:SetPos(ent:GetPos())
- rep:SetAngles(ent:GetAngles())
- rep:SetModel(model || ent:GetModel())
- rep:SetSkin(ent:GetSkin())
- rep:SetMaterial(ent:GetMaterial())
- rep:SetVelocity(ent:GetVelocity())
- rep:SetOwner(ent:GetOwner())
- for i = 0,18 do rep:SetBodygroup(i,ent:GetBodygroup(i)) end
- rep:Spawn()
- rep:Activate()
- if(!cv:GetBool()) then
- rep:SetCollisionGroup(COLLISION_GROUP_DEBRIS)
- end
- for i = 0,rep:GetPhysicsObjectCount() -1 do
- local phys = ent:GetPhysicsObjectNum(i)
- local physRep = rep:GetPhysicsObjectNum(i)
- if(IsValid(phys) && IsValid(physRep)) then
- physRep:SetVelocity(phys:GetVelocity())
- physRep:AddAngleVelocity(phys:GetAngleVelocity())
- physRep:SetPos(phys:GetPos())
- physRep:SetAngles(phys:GetAngles())
- end
- end
- cleanup.ReplaceEntity(npc || ent,rep)
- undo.ReplaceEntity(npc || ent,rep)
- return rep
- end
- local function CreateReplacement(ent,model,npc)
- local rep = CreateRagdoll(ent,model,npc)
- ent:Remove()
- return rep
- end
- local function CreateModelFixHooks(npc)
- local data = tbNPCs[npc:GetNetworkedString("cname")]
- if(!data) then return end
- local idx = npc:EntIndex()
- local hk = "npcupdateragdoll" .. idx
- local t = UnPredictedCurTime()
- hook.Add("OnEntityCreated",hk,function(ent)
- local tCur = UnPredictedCurTime()
- if(tCur -t >= 0.25) then
- hook.Remove("OnEntityCreated",hk)
- return
- end
- if(SERVER) then
- if(ent:GetClass() == "prop_ragdoll" && ent:GetOwner() == npc) then
- CreateReplacement(ent,data.model,npc)
- hook.Remove("OnEntityCreated",hk)
- end
- else
- if(ent:GetClass() == "class C_ClientRagdoll" && (ent:GetPos() -npc:GetPos()):Length() <= 0.5) then
- --ent:SetModel(data.model)
- ent:Remove()
- end
- end
- end)
- end
- if(SERVER) then
- AddCSLuaFile()
- util.AddNetworkString("npc_killed_fixragdoll")
- else
- net.Receive("npc_killed_fixragdoll",function(len)
- local ent = net.ReadEntity()
- if(!ent:IsValid()) then return end
- CreateModelFixHooks(ent)
- end)
- end
- hook.Add("PlayerSpawnedNPC","CPspawnupdatemodel",function(pl,npc)
- if(!nextName) then return end
- if(tbNPCs[nextName]) then
- local data = tbNPCs[nextName]
- local model = data.model
- local min,max = npc:GetCollisionBounds()
- local hull = npc:GetHullType()
- npc:SetModel(model)
- npc:SetSolid(SOLID_BBOX)
- npc:SetHullType(hull)
- npc:SetHullSizeNormal()
- npc:SetCollisionBounds(min,max)
- npc:DropToFloor()
- npc:SetNetworkedString("cname",nextName)
- if(data.flags && bit.band(data.flags,FNPC_UPDATE_RAGDOLL) == FNPC_UPDATE_RAGDOLL) then
- local idx = npc:EntIndex()
- local hk = "npcupdateragdoll" .. idx
- hook.Add("OnNPCKilled",hk,function(ent)
- if(ent == npc) then
- hook.Remove("OnNPCKilled",hk)
- if(!cv:GetBool()) then CreateRagdoll(npc,model)
- else CreateModelFixHooks(npc) end
- net.Start("npc_killed_fixragdoll")
- net.WriteEntity(npc)
- net.Broadcast()
- end
- end)
- npc:CallOnRemove(hk,function()
- hook.Remove("OnNPCKilled",hk)
- hook.Remove("OnEntityCreated",hk)
- end)
- end
- end
- nextName = nil
- end)
- local function AddNPC(category,name,class,model,keyvalues,skin,weapons,flags)
- list.Set("NPC",name,{Name = name,Class = class,Skin = skin,Model = model,Category = category,KeyValues = keyvalues,Weapons = weapons})
- tbNPCs[name] = {
- model = model,
- flags = flags
- }
- end
- AddNPC("Metropolice pack v5","Urban Camo","npc_metropolice","models/DPFilms/Metropolice/urban_police.mdl",{["manhacks"] = 0},0,{"weapon_smg1","weapon_pistol"})
- 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