mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
Upload
This commit is contained in:
241
lua/weapons/gmod_tool/stools/prop_npc_crate.lua
Normal file
241
lua/weapons/gmod_tool/stools/prop_npc_crate.lua
Normal file
@@ -0,0 +1,241 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
// STool by Nekres ( 4ndy )
|
||||
TOOL.Category = "Half-Life 2"
|
||||
TOOL.Name = "#tool.prop_npc_crate"
|
||||
TOOL.Command = nil
|
||||
TOOL.ConfigName = ""
|
||||
|
||||
TOOL.Models = {}
|
||||
TOOL.Models["models/props_junk/wood_crate001a.mdl"] = 0
|
||||
TOOL.Models["models/props_junk/wood_crate001a_damaged.mdl"] = 1
|
||||
TOOL.Models["models/props_junk/wood_crate002a.mdl"] = 2
|
||||
TOOL.Models["models/items/item_item_crate.mdl"] = 3
|
||||
TOOL.Models["models/items/item_beacon_crate.mdl"] = 4
|
||||
TOOL.Models["models/props_junk/cardboard_box001a.mdl"] = 5
|
||||
TOOL.Models["models/props_junk/cardboard_box001b.mdl"] = 6
|
||||
TOOL.Models["models/props_junk/cardboard_box002a.mdl"] = 7
|
||||
TOOL.Models["models/props_junk/cardboard_box002b.mdl"] = 8
|
||||
TOOL.Models["models/props_junk/cardboard_box003a.mdl"] = 9
|
||||
TOOL.Models["models/props_junk/cardboard_box003b.mdl"] = 10
|
||||
TOOL.Models["models/props_junk/cardboard_box004a.mdl"] = 11
|
||||
|
||||
TOOL.ClientConVar["model"] = "models/props_junk/wood_crate001a.mdl"
|
||||
TOOL.ClientConVar["npc"] = "npc_headcrab_poison"
|
||||
TOOL.ClientConVar["health"] = "25"
|
||||
|
||||
cleanup.Register("prop_npc_crate")
|
||||
|
||||
if (CLIENT) then
|
||||
language.Add("tool.prop_npc_crate", "NPC Crate")
|
||||
language.Add("tool.prop_npc_crate.name", "NPC Crate Tool")
|
||||
language.Add("tool.prop_npc_crate.desc", "Spawn crates with an NPC in them")
|
||||
language.Add("tool.prop_npc_crate.0", "Left click to spawn an custom adjusted NPC Crate. Right to pack an existing NPC in a custom crate.")
|
||||
|
||||
language.Add("tool.prop_npc_crate.model", "Crate Model")
|
||||
language.Add("tool.prop_npc_crate.npc", "Crate NPC")
|
||||
language.Add("tool.prop_npc_crate.health", "Crate Health")
|
||||
language.Add("tool.prop_npc_crate.health.help", "Amount of damage the npc crate can take before it will break.")
|
||||
|
||||
language.Add("Cleanup_prop_npc_crate", "NPC Crates")
|
||||
language.Add("Cleaned_prop_npc_crate", "Cleaned up all NPC Crates")
|
||||
language.Add("SBoxLimit_prop_npc_crate", "You've hit the NPC Crates limit!")
|
||||
language.Add("Undone_prop_npc_crate", "NPC Crate undone")
|
||||
|
||||
language.Add("prop_npc_crate", "NPC Crate")
|
||||
|
||||
language.Add("#combine_mine", "Combine Mine")
|
||||
language.Add("combine_mine", "Combine Mine")
|
||||
language.Add("#npc_fastzombie_torso", "Fast Zombie Torso")
|
||||
language.Add("#grenade_helicopter", "Helicopter Grenade")
|
||||
language.Add("grenade_helicopter", "Helicopter Grenade")
|
||||
end
|
||||
|
||||
if (SERVER) then
|
||||
CreateConVar("sbox_maxprop_npc_crates", 10)
|
||||
|
||||
function MakeNpcCrate(ply, pos, ang, model, health, npc, npcTbl)
|
||||
if (!ply:CheckLimit("prop_npc_crates")) then return false end
|
||||
|
||||
local prop_npc_crate = ents.Create("prop_npc_crate")
|
||||
if (!prop_npc_crate:IsValid()) then return false end
|
||||
|
||||
prop_npc_crate:Initialize(model, math.Clamp(health, 1, 100), npc)
|
||||
|
||||
prop_npc_crate:SetPos(Vector(pos.x, pos.y, pos.z - prop_npc_crate:OBBMins().z))
|
||||
prop_npc_crate:SetAngles(ang)
|
||||
|
||||
prop_npc_crate:Spawn()
|
||||
prop_npc_crate:Activate()
|
||||
|
||||
table.Merge(prop_npc_crate:GetTable(), {
|
||||
ply = ply,
|
||||
model = model,
|
||||
health = health,
|
||||
npc = npc,
|
||||
npcTbl = npcTbl,
|
||||
})
|
||||
|
||||
ply:AddCount("prop_npc_crates", prop_npc_crate)
|
||||
|
||||
DoPropSpawnedEffect(prop_npc_crate)
|
||||
|
||||
return prop_npc_crate
|
||||
end
|
||||
|
||||
duplicator.RegisterEntityClass("prop_npc_crate", MakeNpcCrate, "pos", "ang", "model", "health", "npc", "npcTbl")
|
||||
end
|
||||
|
||||
function TOOL:LeftClick(trace)
|
||||
if (trace.HitSky or !trace.HitPos or IsValid(trace.Entity) and (trace.Entity:IsPlayer() or trace.Entity:IsNPC())) then return false end
|
||||
if (CLIENT) then return true end
|
||||
|
||||
local Tbl = { }
|
||||
Tbl["wep"] = ""
|
||||
Tbl["citType"] = ""
|
||||
Tbl["citMed"] = 0
|
||||
Tbl["skin"] = nil
|
||||
Tbl["model"] = nil
|
||||
|
||||
local ply = self:GetOwner()
|
||||
|
||||
// Update existing NPC Crate
|
||||
if (trace.Entity:GetClass() == "prop_npc_crate") then
|
||||
trace.Entity:Initialize(self:GetClientInfo("model"), self:GetClientNumber("health"), self:GetClientInfo("npc"))
|
||||
table.Merge(trace.Entity:GetTable(), {
|
||||
ply = ply,
|
||||
model = self:GetClientInfo("model"),
|
||||
health = self:GetClientNumber("health"),
|
||||
npc = self:GetClientInfo("npc"),
|
||||
npcTbl = Tbl,
|
||||
})
|
||||
return true
|
||||
end
|
||||
|
||||
// Create a new NPC Crate
|
||||
local ang = trace.HitNormal:Angle()
|
||||
ang.pitch = ang.pitch - 270
|
||||
|
||||
local prop_npc_crate = MakeNpcCrate(ply, trace.HitPos, ang, self:GetClientInfo("model"), self:GetClientNumber("health"), self:GetClientInfo("npc"), Tbl)
|
||||
|
||||
undo.Create("prop_npc_crate")
|
||||
undo.AddEntity(prop_npc_crate)
|
||||
undo.SetPlayer(ply)
|
||||
undo.Finish()
|
||||
|
||||
ply:AddCleanup("prop_npc_crate", prop_npc_crate)
|
||||
|
||||
return true
|
||||
end
|
||||
function TOOL:RightClick(trace)
|
||||
if (trace.HitSky or !trace.HitPos or IsValid(trace.Entity) and (trace.Entity:IsPlayer())) then return false end
|
||||
if (!trace.Entity:IsNPC()) then return false end
|
||||
if (CLIENT) then return true end
|
||||
|
||||
local npc = trace.Entity
|
||||
local ply = self:GetOwner()
|
||||
local ang = trace.HitNormal:Angle()
|
||||
|
||||
local npcTbl = {}
|
||||
|
||||
local wep = ""
|
||||
local possibleWep = ents.FindInSphere(npc:GetPos(),0.01)
|
||||
for k, v in pairs(possibleWep) do
|
||||
if string.find(v:GetClass(),"weapon_") == 1 then
|
||||
wep = v:GetClass()
|
||||
end
|
||||
end
|
||||
local citType = ""
|
||||
local citMed = 0
|
||||
if (npc:GetClass() == "npc_citizen") then
|
||||
citType = string.sub(npc:GetModel(),21,21)
|
||||
if (string.sub(npc:GetModel(),22,22) == "m") then citMed = 1 end
|
||||
end
|
||||
|
||||
npcTbl["wep"] = wep
|
||||
npcTbl["citType"] = citType
|
||||
npcTbl["citMed"] = citMed
|
||||
npcTbl["skin"] = npc:GetSkin()
|
||||
npcTbl["model"] = npc:GetModel()
|
||||
|
||||
local prop_npc_crate = MakeNpcCrate(ply, npc:GetPos(), Angle(0, ang.y, 0), self:GetClientInfo("model"), self:GetClientNumber("health"), npc:GetClass(), npcTbl)
|
||||
npc:Remove()
|
||||
|
||||
undo.Create("prop_npc_crate")
|
||||
undo.AddEntity(prop_npc_crate)
|
||||
undo.SetPlayer(ply)
|
||||
undo.Finish()
|
||||
|
||||
ply:AddCleanup("prop_npc_crate", prop_npc_crate)
|
||||
return true
|
||||
end
|
||||
function TOOL:UpdateGhostNpcCrate(ent,player)
|
||||
if (!ent or !ent:IsValid()) then return end
|
||||
|
||||
local tr = util.GetPlayerTrace(player, player:GetAimVector())
|
||||
local trace = util.TraceLine(tr)
|
||||
|
||||
if (!trace.Hit) then return end
|
||||
|
||||
if (trace.Entity && (trace.Entity:GetClass() == "prop_npc_crate" || trace.Entity:IsPlayer()) || trace.Entity:IsNPC()) then
|
||||
ent:SetNoDraw(true)
|
||||
return
|
||||
end
|
||||
|
||||
local Ang = trace.HitNormal:Angle()
|
||||
Ang.pitch = Ang.pitch - 270
|
||||
|
||||
local min = ent:OBBMins()
|
||||
ent:SetPos(trace.HitPos - trace.HitNormal * min.z)
|
||||
|
||||
ent:SetAngles(Ang)
|
||||
ent:SetNoDraw(false)
|
||||
end
|
||||
|
||||
function TOOL:Think()
|
||||
if (!self.GhostEntity || !self.GhostEntity:IsValid() || self.GhostEntity:GetModel() != self:GetClientInfo("model")) then
|
||||
self:MakeGhostEntity(self:GetClientInfo("model"), Vector(0, 0, 0), Angle(0, 0, 0))
|
||||
end
|
||||
|
||||
self:UpdateGhostNpcCrate(self.GhostEntity, self:GetOwner())
|
||||
end
|
||||
function TOOL.BuildCPanel(panel)
|
||||
panel:AddControl("PropSelect", {Label = "#tool.prop_npc_crate.model", Height = 3, ConVar = "prop_npc_crate_model", Models = list.Get("NpcCrateModels")})
|
||||
panel:AddControl("ListBox", {Label = "#tool.prop_npc_crate.npc", Height = 237, Options = list.Get("NpcCrateNpcs")})
|
||||
panel:AddControl("Slider", {Label = "#tool.prop_npc_crate.health", Type = "Integer", Min = 1, Max = 100, Command = "prop_npc_crate_health", Help = true})
|
||||
end
|
||||
|
||||
list.Set("NpcCrateModels", "models/props_junk/wood_crate001a.mdl", {})
|
||||
list.Set("NpcCrateModels", "models/props_junk/wood_crate001a_damaged.mdl", {})
|
||||
list.Set("NpcCrateModels", "models/props_junk/wood_crate002a.mdl", {})
|
||||
list.Set("NpcCrateModels", "models/items/item_item_crate.mdl", {})
|
||||
list.Set("NpcCrateModels", "models/items/item_beacon_crate.mdl", {})
|
||||
list.Set("NpcCrateModels", "models/props_junk/cardboard_box001a.mdl", {})
|
||||
list.Set("NpcCrateModels", "models/props_junk/cardboard_box001b.mdl", {})
|
||||
list.Set("NpcCrateModels", "models/props_junk/cardboard_box002a.mdl", {})
|
||||
list.Set("NpcCrateModels", "models/props_junk/cardboard_box002b.mdl", {})
|
||||
list.Set("NpcCrateModels", "models/props_junk/cardboard_box003a.mdl", {})
|
||||
list.Set("NpcCrateModels", "models/props_junk/cardboard_box003b.mdl", {})
|
||||
list.Set("NpcCrateModels", "models/props_junk/cardboard_box004a.mdl", {})
|
||||
|
||||
list.Set("NpcCrateNpcs", "#npc_headcrab", {prop_npc_crate_npc = "npc_headcrab"})
|
||||
list.Set("NpcCrateNpcs", "#npc_headcrab_fast", {prop_npc_crate_npc = "npc_headcrab_fast"})
|
||||
list.Set("NpcCrateNpcs", "#npc_headcrab_poison", {prop_npc_crate_npc = "npc_headcrab_black"})
|
||||
list.Set("NpcCrateNpcs", "#npc_zombie", {prop_npc_crate_npc = "npc_zombie"})
|
||||
list.Set("NpcCrateNpcs", "#npc_zombie_torso", {prop_npc_crate_npc = "npc_zombie_torso"})
|
||||
list.Set("NpcCrateNpcs", "#npc_fastzombie", {prop_npc_crate_npc = "npc_fastzombie"})
|
||||
list.Set("NpcCrateNpcs", "#npc_fastzombie_torso", {prop_npc_crate_npc = "npc_fastzombie_torso"})
|
||||
list.Set("NpcCrateNpcs", "#npc_poisonzombie", {prop_npc_crate_npc = "npc_poisonzombie"})
|
||||
list.Set("NpcCrateNpcs", "#npc_manhack", {prop_npc_crate_npc = "npc_manhack"})
|
||||
list.Set("NpcCrateNpcs", "#npc_crow", {prop_npc_crate_npc = "npc_crow"})
|
||||
list.Set("NpcCrateNpcs", "#combine_mine", {prop_npc_crate_npc = "combine_mine"})
|
||||
list.Set("NpcCrateNpcs", "#npc_rollermine", {prop_npc_crate_npc = "npc_rollermine"})
|
||||
list.Set("NpcCrateNpcs", "#grenade_helicopter", {prop_npc_crate_npc = "grenade_helicopter"})
|
||||
Reference in New Issue
Block a user