mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
Upload
This commit is contained in:
42
lua/autorun/anylua_ctv.lua
Normal file
42
lua/autorun/anylua_ctv.lua
Normal file
@@ -0,0 +1,42 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
local DEFAULT_LERP = 0.03
|
||||
|
||||
local CTVVEHICLES = {}
|
||||
function CTV_AddCoolVehicle(mdl, data)
|
||||
CTVVEHICLES[mdl] = data
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
hook.Add("Tick", "CTV_AnimateWheels", function()
|
||||
for mdl, Wheels in pairs(CTVVEHICLES) do
|
||||
for k, ent in pairs(ents.FindByModel(mdl)) do
|
||||
for k, dat in pairs(Wheels) do
|
||||
local bl = ent:GetPos()
|
||||
if isstring(dat.BoneName) then
|
||||
bl = ent:GetBonePosition(ent:LookupBone(dat.BoneName))
|
||||
else
|
||||
bl = ent:LocalToWorld(dat.BoneName)
|
||||
end
|
||||
if not IsValid(ent) or not bl then continue end
|
||||
local trM = util.TraceLine({
|
||||
start = bl,
|
||||
endpos = bl-Vector(0,0,dat.WheelTrace),
|
||||
filter = {ent},
|
||||
})
|
||||
local pl = (trM.HitPos:Distance(bl))-dat.WheelRadius
|
||||
ent:SetPoseParameter(dat.PoseParameter_Height, Lerp(dat.lerp or DEFAULT_LERP, ent:GetPoseParameter(dat.PoseParameter_Height), pl))
|
||||
ent:SetPoseParameter(dat.PoseParameter_Spin, ent:GetPoseParameter(dat.PoseParameter_Spin_CopyFrom))
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
58
lua/autorun/arccw_autorun.lua
Normal file
58
lua/autorun/arccw_autorun.lua
Normal file
@@ -0,0 +1,58 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
-- the main object
|
||||
ArcCW = {}
|
||||
|
||||
ArcCWInstalled = true
|
||||
|
||||
ArcCW.GenerateAttEntities = true
|
||||
|
||||
for _, v in pairs(file.Find("arccw/shared/*", "LUA")) do
|
||||
include("arccw/shared/" .. v)
|
||||
AddCSLuaFile("arccw/shared/" .. v)
|
||||
end
|
||||
|
||||
for _, v in pairs(file.Find("arccw/client/*", "LUA")) do
|
||||
AddCSLuaFile("arccw/client/" .. v)
|
||||
if CLIENT then
|
||||
include("arccw/client/" .. v)
|
||||
end
|
||||
end
|
||||
|
||||
-- TODO: Remove SP check after upcoming June 2023 update
|
||||
if SERVER or game.SinglePlayer() then
|
||||
for _, v in pairs(file.Find("arccw/server/*", "LUA")) do
|
||||
include("arccw/server/" .. v)
|
||||
end
|
||||
end
|
||||
|
||||
-- if you want to override arccw functions, put your override files in the arccw/mods directory so it will be guaranteed to override the base
|
||||
|
||||
for _, v in pairs(file.Find("arccw/mods/shared/*", "LUA")) do
|
||||
include("arccw/mods/shared/" .. v)
|
||||
AddCSLuaFile("arccw/mods/shared/" .. v)
|
||||
end
|
||||
|
||||
for _, v in pairs(file.Find("arccw/mods/client/*", "LUA")) do
|
||||
AddCSLuaFile("arccw/mods/client/" .. v)
|
||||
if CLIENT then
|
||||
include("arccw/mods/client/" .. v)
|
||||
end
|
||||
end
|
||||
|
||||
-- TODO: Remove SP check after upcoming June 2023 update
|
||||
if SERVER or game.SinglePlayer() then
|
||||
for _, v in pairs(file.Find("arccw/mods/server/*", "LUA")) do
|
||||
include("arccw/mods/server/" .. v)
|
||||
end
|
||||
end
|
||||
79
lua/autorun/arccw_fml_volk_pkp.lua
Normal file
79
lua/autorun/arccw_fml_volk_pkp.lua
Normal file
@@ -0,0 +1,79 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
sound.Add({
|
||||
name = "ARCCW_FML_VOLKED_PKP.Foley1",
|
||||
channel = CHAN_ITEM,
|
||||
volume = 1.0,
|
||||
sound = "weapons/fml_pkp_volk/m249_armmovement_01.wav"
|
||||
})
|
||||
|
||||
sound.Add({
|
||||
name = "ARCCW_FML_VOLKED_PKP.Open",
|
||||
channel = CHAN_ITEM,
|
||||
volume = 1.0,
|
||||
sound = "weapons/fml_pkp_volk/wpn_g2a4_reload_empty_charge_fr49_2ch_v1_01.wav"
|
||||
})
|
||||
|
||||
sound.Add({
|
||||
name = "ARCCW_FML_VOLKED_PKP.Out",
|
||||
channel = CHAN_ITEM,
|
||||
volume = 1.0,
|
||||
sound = "weapons/fml_pkp_volk/magout.wav"
|
||||
})
|
||||
|
||||
sound.Add({
|
||||
name = "ARCCW_FML_VOLKED_PKP.Foley2",
|
||||
channel = CHAN_ITEM,
|
||||
volume = 1.0,
|
||||
sound = "weapons/fml_pkp_volk/m249_shoulder.wav"
|
||||
})
|
||||
|
||||
sound.Add({
|
||||
name = "ARCCW_FML_VOLKED_PKP.In",
|
||||
channel = CHAN_ITEM,
|
||||
volume = 1.0,
|
||||
sound = "weapons/fml_pkp_volk/magin.wav"
|
||||
})
|
||||
|
||||
sound.Add({
|
||||
name = "ARCCW_FML_VOLKED_PKP.Chain",
|
||||
channel = CHAN_ITEM,
|
||||
volume = 1.0,
|
||||
sound = "weapons/fml_pkp_volk/charge.wav"
|
||||
})
|
||||
|
||||
sound.Add({
|
||||
name = "ARCCW_FML_VOLKED_PKP.Close",
|
||||
channel = CHAN_ITEM,
|
||||
volume = 1.0,
|
||||
sound = "weapons/fml_pkp_volk/wpn_r101_emptyreload_boltback_fr51_2ch_v1_01.wav"
|
||||
})
|
||||
|
||||
sound.Add({
|
||||
name = "ARCCW_FML_VOLKED_PKP.Hit",
|
||||
channel = CHAN_ITEM,
|
||||
volume = 1.0,
|
||||
sound = "weapons/fml_pkp_volk/wpn_r101_emptyreload_boltforward_fr55_2ch_v1_01.wav"
|
||||
})
|
||||
|
||||
sound.Add({
|
||||
name = "ARCCW_FML_VOLKED_PKP.Bolt1",
|
||||
channel = CHAN_ITEM,
|
||||
volume = 1.0,
|
||||
sound = "weapons/fml_pkp_volk/bolt_back.wav"
|
||||
})
|
||||
|
||||
sound.Add({
|
||||
name = "ARCCW_FML_VOLKED_PKP.Bolt2",
|
||||
channel = CHAN_ITEM,
|
||||
volume = 1.0,
|
||||
sound = "weapons/fml_pkp_volk/bolt_forward.wav"
|
||||
})
|
||||
515
lua/autorun/base_npcs.lua
Normal file
515
lua/autorun/base_npcs.lua
Normal file
@@ -0,0 +1,515 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
-- Don't try to edit this file if you're trying to add new NPCs.
|
||||
-- Just make a new file and copy the format below.
|
||||
|
||||
local function AddNPC( t, class )
|
||||
if ( !t.Name ) then t.Name = "#" .. ( class or t.Class ) end
|
||||
|
||||
list.Set( "NPC", class or t.Class, t )
|
||||
end
|
||||
|
||||
|
||||
|
||||
local Category = "Humans + Resistance"
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_alyx",
|
||||
Category = Category,
|
||||
Weapons = { "weapon_alyxgun", "weapon_smg1", "weapon_shotgun" },
|
||||
KeyValues = { SquadName = "resistance" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_barney",
|
||||
Category = Category,
|
||||
Weapons = { "weapon_smg1", "weapon_shotgun", "weapon_ar2" },
|
||||
KeyValues = { SquadName = "resistance" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_breen",
|
||||
Category = Category
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_dog",
|
||||
Category = Category
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_eli",
|
||||
Category = Category
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_gman",
|
||||
Category = Category
|
||||
} )
|
||||
|
||||
-- Did you know that this MAN can shoot annabelle like he's been doing it his whole life?
|
||||
AddNPC( {
|
||||
Class = "npc_kleiner",
|
||||
Category = Category
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_mossman",
|
||||
Category = Category
|
||||
} )
|
||||
|
||||
-- I don't trust these Vorts, but I'll let em stay in this category until they mess up
|
||||
AddNPC( {
|
||||
Class = "npc_vortigaunt",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "resistance" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Name = "Vortigaunt Slave",
|
||||
Class = "npc_vortigaunt",
|
||||
Category = Category,
|
||||
Model = "models/vortigaunt_slave.mdl"
|
||||
}, "VortigauntSlave" )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_citizen",
|
||||
Category = Category,
|
||||
KeyValues = { citizentype = CT_DOWNTRODDEN, SquadName = "resistance" },
|
||||
Weapons = { "" } -- Tells the spawnmenu that this NPC can use weapons
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Name = "Rebel",
|
||||
Class = "npc_citizen",
|
||||
Category = Category,
|
||||
SpawnFlags = SF_CITIZEN_RANDOM_HEAD,
|
||||
KeyValues = { citizentype = CT_REBEL, SquadName = "resistance" },
|
||||
Weapons = { "weapon_pistol", "weapon_ar2", "weapon_smg1", "weapon_ar2", "weapon_shotgun" }
|
||||
}, "Rebel" )
|
||||
|
||||
AddNPC( {
|
||||
Name = "Odessa Cubbage",
|
||||
Class = "npc_citizen",
|
||||
Category = Category,
|
||||
Model = "models/odessa.mdl",
|
||||
KeyValues = { citizentype = CT_UNIQUE, SquadName = "resistance" },
|
||||
Weapons = { "" }
|
||||
}, "npc_odessa" )
|
||||
|
||||
AddNPC( {
|
||||
Name = "Rebel Medic",
|
||||
Class = "npc_citizen",
|
||||
Category = Category,
|
||||
SpawnFlags = SERVER and bit.bor( SF_NPC_DROP_HEALTHKIT, SF_CITIZEN_MEDIC ) or nil,
|
||||
KeyValues = { citizentype = CT_REBEL, SquadName = "resistance" },
|
||||
Weapons = { "weapon_pistol", "weapon_smg1", "weapon_ar2", "weapon_shotgun" }
|
||||
}, "Medic" )
|
||||
|
||||
AddNPC( {
|
||||
Name = "Refugee",
|
||||
Class = "npc_citizen",
|
||||
Category = Category,
|
||||
KeyValues = { citizentype = CT_REFUGEE, SquadName = "resistance" },
|
||||
Weapons = { "weapon_pistol", "weapon_smg1" }
|
||||
}, "Refugee" )
|
||||
|
||||
if ( IsMounted( "ep2" ) ) then
|
||||
AddNPC( {
|
||||
Name = "Uriah",
|
||||
Class = "npc_vortigaunt",
|
||||
Category = Category,
|
||||
Model = "models/vortigaunt_doctor.mdl",
|
||||
KeyValues = { SquadName = "resistance" }
|
||||
}, "VortigauntUriah" )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_magnusson",
|
||||
Category = Category
|
||||
} )
|
||||
end
|
||||
|
||||
if ( IsMounted( "lostcoast" ) ) then
|
||||
AddNPC( {
|
||||
Class = "npc_fisherman",
|
||||
Category = Category,
|
||||
Weapons = { "weapon_oldmanharpoon" }
|
||||
} ) -- Has no death sequence
|
||||
end
|
||||
|
||||
|
||||
|
||||
Category = "Zombies + Enemy Aliens"
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_zombie",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "zombies" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_zombie_torso",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "zombies" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_poisonzombie",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "poison" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_antlion",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "antlions" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_antlionguard",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "antlions" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_barnacle",
|
||||
Category = Category,
|
||||
OnCeiling = true,
|
||||
Offset = 2
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_fastzombie",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "zombies" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_headcrab",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "zombies" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_headcrab_black",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "poison" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_headcrab_fast",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "zombies" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_fastzombie_torso",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "zombies" }
|
||||
} )
|
||||
|
||||
if ( IsMounted( "episodic" ) or IsMounted( "ep2" ) ) then
|
||||
AddNPC( {
|
||||
Class = "npc_zombine",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "zombies" }
|
||||
} )
|
||||
end
|
||||
|
||||
if ( IsMounted( "ep2" ) ) then
|
||||
game.AddParticles( "particles/grub_blood.pcf" )
|
||||
game.AddParticles( "particles/antlion_gib_02.pcf" )
|
||||
game.AddParticles( "particles/antlion_worker.pcf" )
|
||||
|
||||
AddNPC( {
|
||||
Name = "Antlion Guardian",
|
||||
Class = "npc_antlionguard",
|
||||
Category = Category,
|
||||
KeyValues = { cavernbreed = 1, incavern = 1, SquadName = "antlions" },
|
||||
Material = "Models/antlion_guard/antlionGuard2"
|
||||
}, "npc_antlionguardian" )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_antlion_grub",
|
||||
Category = Category,
|
||||
NoDrop = true,
|
||||
Offset = 1
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_antlion_worker",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "antlions" }
|
||||
} )
|
||||
end
|
||||
|
||||
|
||||
|
||||
Category = "Animals"
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_monk",
|
||||
Category = Category,
|
||||
Weapons = { "weapon_annabelle" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_crow",
|
||||
Category = Category,
|
||||
NoDrop = true
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_pigeon",
|
||||
Category = Category,
|
||||
NoDrop = true
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_seagull",
|
||||
Category = Category,
|
||||
NoDrop = true
|
||||
} )
|
||||
|
||||
|
||||
|
||||
Category = "Combine"
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_metropolice",
|
||||
Category = Category,
|
||||
Weapons = { "weapon_stunstick", "weapon_pistol", "weapon_smg1" },
|
||||
SpawnFlags = SF_NPC_DROP_HEALTHKIT,
|
||||
KeyValues = { SquadName = "overwatch" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_rollermine",
|
||||
Category = Category,
|
||||
Offset = 20,
|
||||
KeyValues = { SquadName = "overwatch" },
|
||||
NoDrop = true
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_turret_floor",
|
||||
Category = Category,
|
||||
OnFloor = true,
|
||||
TotalSpawnFlags = 0,
|
||||
Rotate = Angle( 0, 180, 0 ),
|
||||
Offset = 2,
|
||||
KeyValues = { SquadName = "overwatch" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_combine_s",
|
||||
Category = Category,
|
||||
Model = "models/combine_soldier.mdl",
|
||||
Skin = 0,
|
||||
Weapons = { "weapon_smg1", "weapon_ar2" },
|
||||
KeyValues = { SquadName = "overwatch", Numgrenades = 5 }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Name = "Shotgun Soldier",
|
||||
Class = "npc_combine_s",
|
||||
Category = Category,
|
||||
Model = "models/combine_soldier.mdl",
|
||||
Skin = 1,
|
||||
Weapons = { "weapon_shotgun" },
|
||||
KeyValues = { SquadName = "overwatch", Numgrenades = 5 }
|
||||
}, "ShotgunSoldier" )
|
||||
|
||||
AddNPC( {
|
||||
Name = "Prison Guard",
|
||||
Class = "npc_combine_s",
|
||||
Category = Category,
|
||||
Model = "models/combine_soldier_prisonguard.mdl",
|
||||
Skin = 0,
|
||||
Weapons = { "weapon_smg1", "weapon_ar2" },
|
||||
KeyValues = { SquadName = "novaprospekt", Numgrenades = 5 }
|
||||
}, "CombinePrison" )
|
||||
|
||||
AddNPC( {
|
||||
Name = "Prison Shotgun Guard",
|
||||
Class = "npc_combine_s",
|
||||
Category = Category,
|
||||
Model = "models/combine_soldier_prisonguard.mdl",
|
||||
Skin = 1,
|
||||
Weapons = { "weapon_shotgun" },
|
||||
KeyValues = { SquadName = "novaprospekt", Numgrenades = 5 }
|
||||
}, "PrisonShotgunner" )
|
||||
|
||||
AddNPC( {
|
||||
Name = "Combine Elite",
|
||||
Class = "npc_combine_s",
|
||||
Category = Category,
|
||||
Model = "models/combine_super_soldier.mdl",
|
||||
Skin = 0,
|
||||
Weapons = { "weapon_ar2" },
|
||||
KeyValues = { Numgrenades = 10, SquadName = "overwatch" },
|
||||
SpawnFlags = SF_NPC_NO_PLAYER_PUSHAWAY
|
||||
}, "CombineElite" )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_cscanner",
|
||||
Category = Category,
|
||||
Offset = 20,
|
||||
KeyValues = { SquadName = "overwatch" },
|
||||
NoDrop = true
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_clawscanner",
|
||||
Category = Category,
|
||||
Offset = 20,
|
||||
KeyValues = { SquadName = "overwatch" },
|
||||
NoDrop = true
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_combinegunship",
|
||||
Category = Category,
|
||||
Offset = 300,
|
||||
KeyValues = { SquadName = "overwatch" },
|
||||
NoDrop = true
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_combinedropship",
|
||||
Category = Category,
|
||||
Offset = 300,
|
||||
KeyValues = { SquadName = "overwatch" },
|
||||
NoDrop = true
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_helicopter",
|
||||
Category = Category,
|
||||
Offset = 300,
|
||||
Health = 600,
|
||||
KeyValues = { SquadName = "overwatch" },
|
||||
NoDrop = true
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_combine_camera",
|
||||
Category = Category,
|
||||
OnCeiling = true,
|
||||
Offset = 2,
|
||||
KeyValues = { SquadName = "overwatch" },
|
||||
NoDrop = true
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_turret_ceiling",
|
||||
Category = Category,
|
||||
SpawnFlags = 32, -- SF_NPC_TURRET_AUTOACTIVATE
|
||||
OnCeiling = true,
|
||||
Offset = 0,
|
||||
KeyValues = { SquadName = "overwatch" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_strider",
|
||||
Category = Category,
|
||||
Offset = 100,
|
||||
KeyValues = { SquadName = "overwatch" }
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_stalker",
|
||||
Category = Category,
|
||||
KeyValues = { squadname = "npc_stalker_squad" },
|
||||
Offset = 10
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_manhack",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "overwatch" },
|
||||
NoDrop = true
|
||||
} )
|
||||
|
||||
if ( IsMounted( "ep2" ) ) then
|
||||
AddNPC( {
|
||||
Class = "npc_hunter",
|
||||
Category = Category,
|
||||
KeyValues = { SquadName = "overwatch" }
|
||||
} )
|
||||
end
|
||||
|
||||
|
||||
if ( IsMounted( "hl1" ) or IsMounted( "hl1mp" ) ) then
|
||||
|
||||
Category = "Half-Life: Source"
|
||||
|
||||
AddNPC( { Class = "monster_alien_grunt", Category = Category } )
|
||||
AddNPC( { Class = "monster_nihilanth", Category = Category, Offset = 1200, SpawnFlags = 262144, NoDrop = true } )
|
||||
AddNPC( { Class = "monster_tentacle", Category = Category } )
|
||||
AddNPC( { Class = "monster_alien_slave", Category = Category } )
|
||||
AddNPC( { Class = "monster_bigmomma", Category = Category } )
|
||||
AddNPC( { Class = "monster_bullchicken", Category = Category } )
|
||||
AddNPC( { Class = "monster_gargantua", Category = Category } )
|
||||
AddNPC( { Class = "monster_human_assassin", Category = Category } )
|
||||
AddNPC( { Class = "monster_babycrab", Category = Category } )
|
||||
AddNPC( { Class = "monster_human_grunt", Category = Category } )
|
||||
AddNPC( { Class = "monster_cockroach", Category = Category } )
|
||||
AddNPC( { Class = "monster_houndeye", Category = Category } )
|
||||
AddNPC( { Class = "monster_scientist", Category = Category, KeyValues = { body = "-1" } } )
|
||||
AddNPC( { Class = "monster_snark", Category = Category, Offset = 6, NoDrop = true } )
|
||||
AddNPC( { Class = "monster_zombie", Category = Category } )
|
||||
AddNPC( { Class = "monster_headcrab", Category = Category } )
|
||||
AddNPC( { Class = "monster_alien_controller", Category = Category, NoDrop = true } )
|
||||
AddNPC( { Class = "monster_barney", Category = Category } )
|
||||
|
||||
-- Hack to have it not invert angles again
|
||||
local turretOnDupe = function( npc, data ) npc:SetKeyValue( "spawnflags", bit.bor( npc.SpawnFlags, 2048 ) ) end
|
||||
local turretOnCeiling = function( npc ) npc:SetKeyValue( "orientation", 1 ) end
|
||||
AddNPC( { Class = "monster_turret", Category = Category, Offset = 0, OnCeiling = turretOnCeiling, OnFloor = true, SpawnFlags = 32, OnDuplicated = turretOnDupe } )
|
||||
AddNPC( { Class = "monster_miniturret", Category = Category, Offset = 0, OnCeiling = turretOnCeiling, OnFloor = true, SpawnFlags = 32, OnDuplicated = turretOnDupe } )
|
||||
AddNPC( { Class = "monster_sentry", Category = Category, Offset = 0, OnFloor = true, SpawnFlags = 32 } )
|
||||
|
||||
end
|
||||
|
||||
if ( IsMounted( "portal" ) ) then
|
||||
|
||||
Category = "Portal"
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_portal_turret_floor",
|
||||
Category = Category,
|
||||
OnFloor = true,
|
||||
Rotate = Angle( 0, 180, 0 ),
|
||||
Offset = 2,
|
||||
TotalSpawnFlags = 0,
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_rocket_turret",
|
||||
Category = Category,
|
||||
OnFloor = true,
|
||||
SpawnFlags = 2, --SF_ROCKET_TURRET_SPAWNMENU, makes it target NPCs
|
||||
Offset = 0,
|
||||
Rotate = Angle( 0, 180, 0 ),
|
||||
} )
|
||||
|
||||
AddNPC( {
|
||||
Class = "npc_security_camera",
|
||||
Category = Category,
|
||||
Offset = -1,
|
||||
SpawnFlags = 32, --SF_SECURITY_CAMERA_AUTOACTIVATE
|
||||
SnapToNormal = true,
|
||||
NoDrop = true
|
||||
} )
|
||||
|
||||
end
|
||||
303
lua/autorun/base_vehicles.lua
Normal file
303
lua/autorun/base_vehicles.lua
Normal file
@@ -0,0 +1,303 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
-- Don't try to edit this file if you're trying to add new vehicles
|
||||
-- Just make a new file and copy the format below.
|
||||
|
||||
local function AddVehicle( t, class )
|
||||
list.Set( "Vehicles", class, t )
|
||||
end
|
||||
|
||||
local Category = "Half-Life 2"
|
||||
|
||||
AddVehicle( {
|
||||
-- Required information
|
||||
Name = "Jeep",
|
||||
Model = "models/buggy.mdl",
|
||||
Class = "prop_vehicle_jeep_old",
|
||||
Category = Category,
|
||||
|
||||
-- Optional information
|
||||
Author = "VALVe",
|
||||
Information = "The regular old jeep",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/jeep_test.txt"
|
||||
}
|
||||
}, "Jeep" )
|
||||
|
||||
AddVehicle( {
|
||||
Name = "Airboat",
|
||||
Model = "models/airboat.mdl",
|
||||
Class = "prop_vehicle_airboat",
|
||||
Category = Category,
|
||||
|
||||
Author = "VALVe",
|
||||
Information = "Airboat from Half-Life 2",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/airboat.txt"
|
||||
}
|
||||
}, "Airboat" )
|
||||
|
||||
AddVehicle( {
|
||||
Name = "Pod",
|
||||
Model = "models/vehicles/prisoner_pod_inner.mdl",
|
||||
Class = "prop_vehicle_prisoner_pod",
|
||||
Category = Category,
|
||||
|
||||
Author = "VALVe",
|
||||
Information = "The Prisoner Pod",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/prisoner_pod.txt",
|
||||
limitview = "0"
|
||||
}
|
||||
}, "Pod" )
|
||||
|
||||
if ( IsMounted( "ep2" ) ) then
|
||||
AddVehicle( {
|
||||
Name = "Jalopy",
|
||||
Model = "models/vehicle.mdl",
|
||||
Class = "prop_vehicle_jeep",
|
||||
Category = Category,
|
||||
|
||||
Author = "VALVe",
|
||||
Information = "The muscle car from Episode 2",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/jalopy.txt"
|
||||
}
|
||||
}, "Jalopy" )
|
||||
end
|
||||
|
||||
Category = "Chairs"
|
||||
|
||||
local function HandleRollercoasterAnimation( vehicle, player )
|
||||
return player:SelectWeightedSequence( ACT_GMOD_SIT_ROLLERCOASTER )
|
||||
end
|
||||
|
||||
AddVehicle( {
|
||||
Name = "Wooden Chair",
|
||||
Model = "models/nova/chair_wood01.mdl",
|
||||
Class = "prop_vehicle_prisoner_pod",
|
||||
Category = Category,
|
||||
|
||||
Author = "VALVe",
|
||||
Information = "A Wooden Chair",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/prisoner_pod.txt",
|
||||
limitview = "0"
|
||||
},
|
||||
Members = {
|
||||
HandleAnimation = HandleRollercoasterAnimation,
|
||||
}
|
||||
}, "Chair_Wood" )
|
||||
|
||||
AddVehicle( {
|
||||
Name = "Chair",
|
||||
Model = "models/nova/chair_plastic01.mdl",
|
||||
Class = "prop_vehicle_prisoner_pod",
|
||||
Category = Category,
|
||||
|
||||
Author = "VALVe",
|
||||
Information = "A Plastic Chair",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/prisoner_pod.txt",
|
||||
limitview = "0"
|
||||
},
|
||||
Members = {
|
||||
HandleAnimation = HandleRollercoasterAnimation,
|
||||
}
|
||||
}, "Chair_Plastic" )
|
||||
|
||||
AddVehicle( {
|
||||
Name = "Jeep Seat",
|
||||
Model = "models/nova/jeep_seat.mdl",
|
||||
Class = "prop_vehicle_prisoner_pod",
|
||||
Category = Category,
|
||||
|
||||
Author = "VALVe",
|
||||
Information = "A Seat from VALVe's Jeep",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/prisoner_pod.txt",
|
||||
limitview = "0"
|
||||
},
|
||||
Members = {
|
||||
HandleAnimation = HandleRollercoasterAnimation,
|
||||
}
|
||||
}, "Seat_Jeep" )
|
||||
|
||||
AddVehicle( {
|
||||
Name = "Airboat Seat",
|
||||
Model = "models/nova/airboat_seat.mdl",
|
||||
Class = "prop_vehicle_prisoner_pod",
|
||||
Category = Category,
|
||||
|
||||
Author = "VALVe",
|
||||
Information = "A Seat from VALVe's Airboat",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/prisoner_pod.txt",
|
||||
limitview = "0"
|
||||
},
|
||||
Members = {
|
||||
HandleAnimation = HandleRollercoasterAnimation,
|
||||
}
|
||||
}, "Seat_Airboat" )
|
||||
|
||||
AddVehicle( {
|
||||
Name = "Office Chair",
|
||||
Model = "models/nova/chair_office01.mdl",
|
||||
Class = "prop_vehicle_prisoner_pod",
|
||||
Category = Category,
|
||||
|
||||
Author = "VALVe",
|
||||
Information = "A Small Office Chair",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/prisoner_pod.txt",
|
||||
limitview = "0"
|
||||
},
|
||||
Members = {
|
||||
HandleAnimation = HandleRollercoasterAnimation,
|
||||
}
|
||||
}, "Chair_Office1" )
|
||||
|
||||
AddVehicle( {
|
||||
Name = "Big Office Chair",
|
||||
Model = "models/nova/chair_office02.mdl",
|
||||
Class = "prop_vehicle_prisoner_pod",
|
||||
Category = Category,
|
||||
|
||||
Author = "VALVe",
|
||||
Information = "A Big Office Chair",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/prisoner_pod.txt",
|
||||
limitview = "0"
|
||||
},
|
||||
Members = {
|
||||
HandleAnimation = HandleRollercoasterAnimation,
|
||||
}
|
||||
}, "Chair_Office2" )
|
||||
|
||||
if ( IsMounted( "ep2" ) ) then
|
||||
AddVehicle( {
|
||||
Name = "Jalopy Seat",
|
||||
Model = "models/nova/jalopy_seat.mdl",
|
||||
Class = "prop_vehicle_prisoner_pod",
|
||||
Category = Category,
|
||||
|
||||
Author = "VALVe",
|
||||
Information = "A Seat from VALVe's Jalopy",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/prisoner_pod.txt",
|
||||
limitview = "0"
|
||||
},
|
||||
Members = {
|
||||
HandleAnimation = HandleRollercoasterAnimation,
|
||||
}
|
||||
}, "Seat_Jalopy" )
|
||||
end
|
||||
|
||||
-- PhoeniX-Storms Vehicles
|
||||
|
||||
local function HandlePHXSeatAnimation( vehicle, player )
|
||||
return player:SelectWeightedSequence( ACT_HL2MP_SIT )
|
||||
end
|
||||
|
||||
local function HandlePHXVehicleAnimation( vehicle, ply )
|
||||
return ply:SelectWeightedSequence( ACT_DRIVE_JEEP )
|
||||
end
|
||||
local function HandlePHXAirboatAnimation( vehicle, ply )
|
||||
return ply:SelectWeightedSequence( ACT_DRIVE_AIRBOAT )
|
||||
end
|
||||
|
||||
AddVehicle( {
|
||||
Name = "Car Seat",
|
||||
Model = "models/props_phx/carseat2.mdl",
|
||||
Class = "prop_vehicle_prisoner_pod",
|
||||
Category = Category,
|
||||
|
||||
Author = "PhoeniX-Storms",
|
||||
Information = "PHX Airboat Seat with Sitting Animation",
|
||||
Offset = 16,
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/prisoner_pod.txt",
|
||||
limitview = "0"
|
||||
},
|
||||
Members = {
|
||||
HandleAnimation = HandlePHXSeatAnimation,
|
||||
}
|
||||
}, "phx_seat" )
|
||||
|
||||
AddVehicle( {
|
||||
Name = "Car Seat 2",
|
||||
Model = "models/props_phx/carseat3.mdl",
|
||||
Class = "prop_vehicle_prisoner_pod",
|
||||
Category = Category,
|
||||
|
||||
Author = "PhoeniX-Storms",
|
||||
Information = "PHX Airboat Seat with Jeep animations",
|
||||
Offset = 16,
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/prisoner_pod.txt",
|
||||
limitview = "0"
|
||||
},
|
||||
Members = {
|
||||
HandleAnimation = HandlePHXVehicleAnimation,
|
||||
}
|
||||
}, "phx_seat2" )
|
||||
|
||||
AddVehicle( {
|
||||
Name = "Car Seat 3",
|
||||
Model = "models/props_phx/carseat2.mdl",
|
||||
Class = "prop_vehicle_prisoner_pod",
|
||||
Category = Category,
|
||||
|
||||
Author = "PhoeniX-Storms",
|
||||
Information = "PHX Airboat Seat with Airboat animations",
|
||||
Offset = 16,
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/prisoner_pod.txt",
|
||||
limitview = "0"
|
||||
},
|
||||
Members = {
|
||||
HandleAnimation = HandlePHXAirboatAnimation,
|
||||
}
|
||||
}, "phx_seat3" )
|
||||
|
||||
-- Not adding this, because exit animation leaves you stuck in the middle
|
||||
--[[AddVehicle( {
|
||||
Name = "FSD Overrun",
|
||||
Model = "models/props_phx/trains/fsd-overrun2.mdl",
|
||||
Class = "prop_vehicle_prisoner_pod",
|
||||
Category = Category,
|
||||
|
||||
Author = "PhoeniX-Storms",
|
||||
Information = "FSD Overrun Monorail",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/prisoner_pod.txt",
|
||||
limitview = "0"
|
||||
},
|
||||
Members = {
|
||||
HandleAnimation = HandlePHXVehicleAnimation,
|
||||
}
|
||||
}, "phx_train" )]]
|
||||
39
lua/autorun/client/advdupe2_cl_init.lua
Normal file
39
lua/autorun/client/advdupe2_cl_init.lua
Normal file
@@ -0,0 +1,39 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AdvDupe2 = {
|
||||
Version = "1.1.0",
|
||||
Revision = 51,
|
||||
InfoText = {},
|
||||
DataFolder = "advdupe2",
|
||||
FileRenameTryLimit = 256,
|
||||
ProgressBar = {}
|
||||
}
|
||||
|
||||
if(!file.Exists(AdvDupe2.DataFolder, "DATA"))then
|
||||
file.CreateDir(AdvDupe2.DataFolder)
|
||||
end
|
||||
|
||||
include( "advdupe2/file_browser.lua" )
|
||||
include( "advdupe2/sh_codec.lua" )
|
||||
include( "advdupe2/cl_file.lua" )
|
||||
include( "advdupe2/cl_ghost.lua" )
|
||||
|
||||
function AdvDupe2.Notify(msg,typ,dur)
|
||||
surface.PlaySound(typ == 1 and "buttons/button10.wav" or "ambient/water/drip1.wav")
|
||||
GAMEMODE:AddNotify(msg, typ or NOTIFY_GENERIC, dur or 5)
|
||||
//if not game.SinglePlayer() then
|
||||
print("[AdvDupe2Notify]\t"..msg)
|
||||
//end
|
||||
end
|
||||
|
||||
net.Receive("AdvDupe2Notify", function()
|
||||
AdvDupe2.Notify(net.ReadString(), net.ReadUInt(8), net.ReadFloat())
|
||||
end)
|
||||
52
lua/autorun/client/campaignents_clientfuncs_2.lua
Normal file
52
lua/autorun/client/campaignents_clientfuncs_2.lua
Normal file
@@ -0,0 +1,52 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
local _LocalPlayer = LocalPlayer
|
||||
|
||||
function saveents_CanBeUgly()
|
||||
local ply = _LocalPlayer()
|
||||
if IsValid( ply:GetActiveWeapon() ) and string.find( _LocalPlayer():GetActiveWeapon():GetClass(), "camera" ) then return false end
|
||||
return true
|
||||
|
||||
end
|
||||
|
||||
local cachedIsEditing = nil
|
||||
local nextCache = 0
|
||||
local _CurTime = CurTime
|
||||
|
||||
function saveents_IsEditing()
|
||||
if nextCache > _CurTime() then return cachedIsEditing end
|
||||
nextCache = _CurTime() + 0.01
|
||||
|
||||
local ply = _LocalPlayer()
|
||||
local moveType = ply:GetMoveType()
|
||||
if moveType ~= MOVETYPE_NOCLIP then cachedIsEditing = nil return end
|
||||
if ply:InVehicle() then cachedIsEditing = nil return end
|
||||
if not saveents_CanBeUgly() then cachedIsEditing = nil return end
|
||||
|
||||
cachedIsEditing = true
|
||||
return true
|
||||
|
||||
end
|
||||
|
||||
function saveents_DoBeamColor( self )
|
||||
if not self.GetGoalID then return end
|
||||
timer.Simple( 0, function()
|
||||
if not IsValid( self ) then return end
|
||||
local val = self:GetGoalID() * 4
|
||||
local r = ( val % 255 )
|
||||
local g = ( ( val + 85 ) % 255 )
|
||||
local b = ( ( val + 170 ) % 255 )
|
||||
|
||||
self.nextNPCGoalCheck = 0
|
||||
self.GoalLinkColor = Color( r, g, b )
|
||||
|
||||
end )
|
||||
end
|
||||
131
lua/autorun/client/demo_recording.lua
Normal file
131
lua/autorun/client/demo_recording.lua
Normal file
@@ -0,0 +1,131 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
if ( !engine.IsPlayingDemo() ) then return end
|
||||
|
||||
local VideoSettings = engine.VideoSettings()
|
||||
if ( !VideoSettings ) then return end
|
||||
|
||||
PrintTable( VideoSettings )
|
||||
|
||||
local SmoothedAng = nil
|
||||
local SmoothedFOV = nil
|
||||
local SmoothedPos = nil
|
||||
local AutoFocusPoint = nil
|
||||
|
||||
hook.Add( "Initialize", "DemoRenderInit", function()
|
||||
|
||||
if ( VideoSettings.frameblend < 2 ) then
|
||||
RunConsoleCommand( "pp_fb", "0" )
|
||||
else
|
||||
RunConsoleCommand( "pp_fb", "1" )
|
||||
RunConsoleCommand( "pp_fb_frames", VideoSettings.frameblend )
|
||||
RunConsoleCommand( "pp_fb_shutter", VideoSettings.fbshutter )
|
||||
end
|
||||
|
||||
end )
|
||||
|
||||
hook.Add( "RenderScene", "RenderForDemo", function( ViewOrigin, ViewAngles, ViewFOV )
|
||||
|
||||
if ( !engine.IsPlayingDemo() ) then return false end
|
||||
|
||||
render.Clear( 0, 0, 0, 255, true, true )
|
||||
|
||||
local FramesPerFrame = 1
|
||||
|
||||
if ( frame_blend.IsActive() ) then
|
||||
|
||||
FramesPerFrame = frame_blend.RenderableFrames()
|
||||
frame_blend.AddFrame()
|
||||
|
||||
if ( frame_blend.ShouldSkipFrame() ) then
|
||||
|
||||
frame_blend.DrawPreview()
|
||||
return true
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if ( !SmoothedAng ) then SmoothedAng = ViewAngles * 1 end
|
||||
if ( !SmoothedFOV ) then SmoothedFOV = ViewFOV end
|
||||
if ( !SmoothedPos ) then SmoothedPos = ViewOrigin * 1 end
|
||||
if ( !AutoFocusPoint ) then AutoFocusPoint = SmoothedPos * 1 end
|
||||
|
||||
if ( VideoSettings.viewsmooth > 0 ) then
|
||||
SmoothedAng = LerpAngle( ( 1 - VideoSettings.viewsmooth ) / FramesPerFrame, SmoothedAng, ViewAngles )
|
||||
SmoothedFOV = Lerp( ( 1 - VideoSettings.viewsmooth ) / FramesPerFrame, SmoothedFOV, ViewFOV )
|
||||
else
|
||||
SmoothedAng = ViewAngles * 1
|
||||
SmoothedFOV = ViewFOV
|
||||
end
|
||||
|
||||
if ( VideoSettings.possmooth > 0 ) then
|
||||
SmoothedPos = LerpVector( ( 1 - VideoSettings.possmooth ) / FramesPerFrame, SmoothedPos, ViewOrigin )
|
||||
else
|
||||
SmoothedPos = ViewOrigin * 1
|
||||
end
|
||||
|
||||
local view = {
|
||||
x = 0,
|
||||
y = 0,
|
||||
w = math.Round( VideoSettings.width ),
|
||||
h = math.Round( VideoSettings.height ),
|
||||
angles = SmoothedAng,
|
||||
origin = SmoothedPos,
|
||||
fov = SmoothedFOV,
|
||||
drawhud = false,
|
||||
drawviewmodel = true,
|
||||
dopostprocess = true,
|
||||
drawmonitors = true
|
||||
}
|
||||
|
||||
if ( VideoSettings.dofsteps && VideoSettings.dofpasses ) then
|
||||
|
||||
local trace = util.TraceHull( {
|
||||
start = view.origin,
|
||||
endpos = view.origin + ( view.angles:Forward() * 8000 ),
|
||||
mins = Vector( -2, -2, -2 ),
|
||||
maxs = Vector( 2, 2, 2 ),
|
||||
filter = { GetViewEntity() }
|
||||
} )
|
||||
|
||||
local focuspeed = math.Clamp( ( VideoSettings.doffocusspeed / FramesPerFrame ) * 0.2, 0, 1 )
|
||||
AutoFocusPoint = LerpVector( focuspeed, AutoFocusPoint, trace.HitPos )
|
||||
local UsableFocusPoint = view.origin + view.angles:Forward() * AutoFocusPoint:Distance( view.origin )
|
||||
|
||||
RenderDoF( view.origin, view.angles, UsableFocusPoint, VideoSettings.dofsize * 0.3, VideoSettings.dofsteps, VideoSettings.dofpasses, false, table.Copy( view ) )
|
||||
|
||||
else
|
||||
|
||||
render.RenderView( view )
|
||||
|
||||
end
|
||||
|
||||
-- TODO: IF RENDER HUD
|
||||
render.RenderHUD( 0, 0, view.w, view.h )
|
||||
|
||||
local ShouldRecordThisFrme = frame_blend.IsLastFrame()
|
||||
|
||||
if ( frame_blend.IsActive() ) then
|
||||
|
||||
frame_blend.BlendFrame()
|
||||
frame_blend.DrawPreview()
|
||||
|
||||
end
|
||||
|
||||
if ( ShouldRecordThisFrme ) then
|
||||
menu.RecordFrame()
|
||||
end
|
||||
|
||||
return true
|
||||
|
||||
end )
|
||||
40
lua/autorun/client/gm_demo.lua
Normal file
40
lua/autorun/client/gm_demo.lua
Normal file
@@ -0,0 +1,40 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
concommand.Add( "gm_demo", function( ply, cmd, arg )
|
||||
|
||||
if ( engine.IsRecordingDemo() ) then
|
||||
RunConsoleCommand( "stop" )
|
||||
return
|
||||
end
|
||||
|
||||
local dynamic_name = game.GetMap() .. " " .. util.DateStamp()
|
||||
|
||||
RunConsoleCommand( "record", "demos/" .. dynamic_name .. ".dem" )
|
||||
RunConsoleCommand( "record_screenshot", dynamic_name )
|
||||
|
||||
end, nil, "Start or stop recording a demo.", FCVAR_DONTRECORD )
|
||||
|
||||
local matRecording = nil
|
||||
local drawicon = CreateConVar( "gm_demo_icon", 1, FCVAR_ARCHIVE + FCVAR_DONTRECORD, "If set to 1, display a 'RECORDING' icon during gm_demo." )
|
||||
hook.Add( "HUDPaint", "DrawRecordingIcon", function()
|
||||
|
||||
if ( !engine.IsRecordingDemo() || !drawicon:GetBool() ) then return end
|
||||
|
||||
if ( !matRecording ) then
|
||||
matRecording = Material( "gmod/recording.png" )
|
||||
end
|
||||
|
||||
surface.SetDrawColor( 255, 255, 255, 255 )
|
||||
surface.SetMaterial( matRecording )
|
||||
surface.DrawTexturedRect( ScrW() - 512, 0, 512, 256 )
|
||||
|
||||
end )
|
||||
239
lua/autorun/client/lvs_vehicle_tab.lua
Normal file
239
lua/autorun/client/lvs_vehicle_tab.lua
Normal file
@@ -0,0 +1,239 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
hook.Add( "PopulateVehicles", "!!!add_lvs_to_vehicles", function( pnlContent, tree, node )
|
||||
local CategoryNameTranslate = {}
|
||||
local Categorised = {}
|
||||
local SubCategorised = {}
|
||||
|
||||
local SpawnableEntities = table.Copy( list.Get( "SpawnableEntities" ) )
|
||||
local Variants = {
|
||||
[1] = "[LVS] - ",
|
||||
[2] = "[LVS] -",
|
||||
[3] = "[LVS]- ",
|
||||
[4] = "[LVS]-",
|
||||
[5] = "[LVS] ",
|
||||
}
|
||||
|
||||
for _, v in pairs( scripted_ents.GetList() ) do
|
||||
if not v.t or not v.t.ClassName or not v.t.VehicleCategory then continue end
|
||||
|
||||
if not isstring( v.t.ClassName ) or v.t.ClassName == "" or not SpawnableEntities[ v.t.ClassName ] then continue end
|
||||
|
||||
SpawnableEntities[ v.t.ClassName ].Category = "[LVS] - "..v.t.VehicleCategory
|
||||
|
||||
if not v.t.VehicleSubCategory then continue end
|
||||
|
||||
SpawnableEntities[ v.t.ClassName ].SubCategory = v.t.VehicleSubCategory
|
||||
end
|
||||
|
||||
if SpawnableEntities then
|
||||
for k, v in pairs( SpawnableEntities ) do
|
||||
|
||||
local Category = v.Category
|
||||
|
||||
if not isstring( Category ) then continue end
|
||||
|
||||
if not Category:StartWith( "[LVS]" ) and not v.LVS then continue end
|
||||
|
||||
v.SpawnName = k
|
||||
|
||||
for _, start in pairs( Variants ) do
|
||||
if Category:StartWith( start ) then
|
||||
local NewName = string.Replace(Category, start, "")
|
||||
CategoryNameTranslate[ NewName ] = Category
|
||||
Category = NewName
|
||||
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if v.SubCategory then
|
||||
SubCategorised[ Category ] = SubCategorised[ Category ] or {}
|
||||
SubCategorised[ Category ][ v.SubCategory ] = SubCategorised[ Category ][ v.SubCategory ] or {}
|
||||
|
||||
table.insert( SubCategorised[ Category ][ v.SubCategory ], v )
|
||||
end
|
||||
|
||||
Categorised[ Category ] = Categorised[ Category ] or {}
|
||||
|
||||
table.insert( Categorised[ Category ], v )
|
||||
end
|
||||
end
|
||||
|
||||
local lvsNode = tree:AddNode( "[LVS]", "icon16/lvs.png" )
|
||||
|
||||
if Categorised["[LVS]"] then
|
||||
local v = Categorised["[LVS]"]
|
||||
|
||||
lvsNode.DoPopulate = function( self )
|
||||
if self.PropPanel then return end
|
||||
|
||||
self.PropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
self.PropPanel:SetVisible( false )
|
||||
self.PropPanel:SetTriggerSpawnlistChange( false )
|
||||
|
||||
for k, ent in SortedPairsByMemberValue( v, "PrintName" ) do
|
||||
spawnmenu.CreateContentIcon( ent.ScriptedEntityType or "entity", self.PropPanel, {
|
||||
nicename = ent.PrintName or ent.ClassName,
|
||||
spawnname = ent.SpawnName,
|
||||
material = ent.IconOverride or "entities/" .. ent.SpawnName .. ".png",
|
||||
admin = ent.AdminOnly
|
||||
} )
|
||||
end
|
||||
end
|
||||
|
||||
lvsNode.DoClick = function( self )
|
||||
self:DoPopulate()
|
||||
pnlContent:SwitchPanel( self.PropPanel )
|
||||
end
|
||||
end
|
||||
|
||||
local IconList = list.Get( "ContentCategoryIcons" )
|
||||
|
||||
for CategoryName, v in SortedPairs( Categorised ) do
|
||||
if CategoryName:StartWith( "[LVS]" ) then continue end
|
||||
|
||||
local Icon = "icon16/lvs_noicon.png"
|
||||
|
||||
if IconList and IconList[ CategoryNameTranslate[ CategoryName ] ] then
|
||||
Icon = IconList[ CategoryNameTranslate[ CategoryName ] ]
|
||||
end
|
||||
|
||||
local node = lvsNode:AddNode( CategoryName, Icon )
|
||||
|
||||
node.DoPopulate = function( self )
|
||||
if self.PropPanel then return end
|
||||
|
||||
self.PropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
self.PropPanel:SetVisible( false )
|
||||
self.PropPanel:SetTriggerSpawnlistChange( false )
|
||||
|
||||
for k, ent in SortedPairsByMemberValue( v, "PrintName" ) do
|
||||
if ent.SubCategory then
|
||||
continue
|
||||
end
|
||||
|
||||
spawnmenu.CreateContentIcon( ent.ScriptedEntityType or "entity", self.PropPanel, {
|
||||
nicename = ent.PrintName or ent.ClassName,
|
||||
spawnname = ent.SpawnName,
|
||||
material = ent.IconOverride or "entities/" .. ent.SpawnName .. ".png",
|
||||
admin = ent.AdminOnly
|
||||
} )
|
||||
end
|
||||
end
|
||||
node.DoClick = function( self )
|
||||
self:DoPopulate()
|
||||
pnlContent:SwitchPanel( self.PropPanel )
|
||||
end
|
||||
|
||||
local SubCat = SubCategorised[ CategoryName ]
|
||||
|
||||
if not SubCat then continue end
|
||||
|
||||
for SubName, data in SortedPairs( SubCat ) do
|
||||
|
||||
local SubIcon = "icon16/lvs_noicon.png"
|
||||
|
||||
if IconList then
|
||||
if IconList[ "[LVS] - "..CategoryName.." - "..SubName ] then
|
||||
SubIcon = IconList[ "[LVS] - "..CategoryName.." - "..SubName ]
|
||||
else
|
||||
if IconList[ "[LVS] - "..SubName ] then
|
||||
SubIcon = IconList[ "[LVS] - "..SubName ]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local subnode = node:AddNode( SubName, SubIcon )
|
||||
|
||||
subnode.DoPopulate = function( self )
|
||||
if self.PropPanel then return end
|
||||
|
||||
self.PropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
self.PropPanel:SetVisible( false )
|
||||
self.PropPanel:SetTriggerSpawnlistChange( false )
|
||||
|
||||
for k, ent in SortedPairsByMemberValue( data, "PrintName" ) do
|
||||
spawnmenu.CreateContentIcon( ent.ScriptedEntityType or "entity", self.PropPanel, {
|
||||
nicename = ent.PrintName or ent.ClassName,
|
||||
spawnname = ent.SpawnName,
|
||||
material = ent.IconOverride or "entities/" .. ent.SpawnName .. ".png",
|
||||
admin = ent.AdminOnly
|
||||
} )
|
||||
end
|
||||
end
|
||||
subnode.DoClick = function( self )
|
||||
self:DoPopulate()
|
||||
pnlContent:SwitchPanel( self.PropPanel )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- User Stuff
|
||||
hook.Run( "LVS.PopulateVehicles", lvsNode, pnlContent, tree )
|
||||
|
||||
-- CONTROLS
|
||||
local node = lvsNode:AddNode( "Controls", "icon16/keyboard.png" )
|
||||
node.DoClick = function( self )
|
||||
LVS:OpenMenu()
|
||||
LVS:OpenClientControls()
|
||||
end
|
||||
|
||||
-- CLIENT SETTINGS
|
||||
local node = lvsNode:AddNode( "Client Settings", "icon16/wrench.png" )
|
||||
node.DoClick = function( self )
|
||||
LVS:OpenMenu()
|
||||
LVS:OpenClientSettings()
|
||||
end
|
||||
|
||||
-- SERVER SETTINGS
|
||||
local node = lvsNode:AddNode( "Server Settings", "icon16/wrench_orange.png" )
|
||||
node.DoClick = function( self )
|
||||
if LocalPlayer():IsSuperAdmin() then
|
||||
LVS:OpenMenu()
|
||||
LVS:OpenServerMenu()
|
||||
else
|
||||
surface.PlaySound( "buttons/button11.wav" )
|
||||
end
|
||||
end
|
||||
end )
|
||||
|
||||
list.Set( "ContentCategoryIcons", "[LVS]", "icon16/lvs.png" )
|
||||
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Artillery", "icon16/lvs_artillery.png" )
|
||||
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Cars", "icon16/lvs_cars.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Cars - Armored", "icon16/lvs_armor.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Cars - Civilian", "icon16/lvs_civilian.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Cars - Military", "icon16/lvs_military.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Cars - Pack", "icon16/lvs_cars_pack.png" )
|
||||
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Helicopters", "icon16/lvs_helicopters.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Helicopters - Combine", "icon16/lvs_combine.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Helicopters - Resistance", "icon16/lvs_resistance.png" )
|
||||
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Planes", "icon16/lvs_planes.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Planes - Bombers", "icon16/lvs_bomb.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Planes - Fighters", "icon16/lvs_fighter.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Planes - Civilian", "icon16/lvs_civilian.png" )
|
||||
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Tanks", "icon16/lvs_tanks.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Tanks - Light", "icon16/lvs_light.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Tanks - Medium", "icon16/lvs_medium.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Tanks - Heavy", "icon16/lvs_heavy.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Tanks - RP", "icon16/lvs_rp.png" )
|
||||
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Star Wars", "icon16/lvs_starwars.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Star Wars - Gunships", "icon16/lvs_sw_gunship.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Star Wars - Hover Tanks", "icon16/lvs_sw_hover.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Star Wars - Walkers", "icon16/lvs_sw_walker.png" )
|
||||
list.Set( "ContentCategoryIcons", "[LVS] - Star Wars - Starfighters", "icon16/lvs_sw_starfighter.png" )
|
||||
289
lua/autorun/client/morematerials.lua
Normal file
289
lua/autorun/client/morematerials.lua
Normal file
@@ -0,0 +1,289 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
// adding materials to the material toolguns list
|
||||
|
||||
list.Add( "OverrideMaterials", "models/XQM//Deg360" )
|
||||
list.Add( "OverrideMaterials", "models/XQM//LightLinesGB" )
|
||||
list.Add( "OverrideMaterials", "models/XQM//LightLinesRed" )
|
||||
list.Add( "OverrideMaterials", "models/XQM//SquaredMat" )
|
||||
list.Add( "OverrideMaterials", "models/XQM//WoodTexture_1" )
|
||||
list.Add( "OverrideMaterials", "models/airboat/airboat_blur02" )
|
||||
list.Add( "OverrideMaterials", "models/alyx/emptool_glow" )
|
||||
list.Add( "OverrideMaterials", "models/antlion/antlion_innards" )
|
||||
list.Add( "OverrideMaterials", "models/barnacle/roots" )
|
||||
list.Add( "OverrideMaterials", "models/combine_advisor/body9" )
|
||||
list.Add( "OverrideMaterials", "models/combine_advisor/mask" )
|
||||
list.Add( "OverrideMaterials", "models/combine_scanner/scanner_eye" )
|
||||
list.Add( "OverrideMaterials", "models/debug/debugwhite" )
|
||||
list.Add( "OverrideMaterials", "models/dog/eyeglass" )
|
||||
list.Add( "OverrideMaterials", "models/effects/portalrift_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/effects/slimebubble_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/effects/splode1_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/effects/splode_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/gibs/metalgibs/metal_gibs" )
|
||||
list.Add( "OverrideMaterials", "models/gibs/woodgibs/woodgibs01" )
|
||||
list.Add( "OverrideMaterials", "models/gibs/woodgibs/woodgibs02" )
|
||||
list.Add( "OverrideMaterials", "models/gibs/woodgibs/woodgibs03" )
|
||||
list.Add( "OverrideMaterials", "models/player/player_chrome1" )
|
||||
list.Add( "OverrideMaterials", "models/props_animated_breakable/smokestack/brickwall002a" )
|
||||
list.Add( "OverrideMaterials", "models/props_building_details/courtyard_template001c_bars" )
|
||||
list.Add( "OverrideMaterials", "models/props_building_details/courtyard_template001c_bars" )
|
||||
list.Add( "OverrideMaterials", "models/props_buildings/destroyedbuilldingwall01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_buildings/plasterwall021a" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/frostedglass_01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/furniturefabric001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/furniturefabric002a" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/furnituremetal001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/gate_door02a" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/metalladder001" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/metalladder002" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/metalladder003" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/canal_bridge_railing_01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/canal_bridge_railing_01b" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/canal_bridge_railing_01c" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/canalmap_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/coastmap_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/metalcrate001d" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/metalwall005b" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/rock_riverbed01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/citadel_cable" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/citadel_cable_b" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/com_shield001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/combine_interface_disp" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/combine_monitorbay_disp" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/metal_combinebridge001" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/pipes01" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/pipes03" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/prtl_sky_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/stasisfield_beam" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/building_template010a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/building_template022j" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/composite_debris" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/concretefloor013a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/concretefloor020a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/concretewall019a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/metalwall001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterceiling008a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterwall009d" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterwall021a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterwall034a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterwall034d" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterwall039c" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterwall040c" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/tilefloor001c" )
|
||||
list.Add( "OverrideMaterials", "models/props_foliage/driftwood_01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_foliage/oak_tree01" )
|
||||
list.Add( "OverrideMaterials", "models/props_foliage/tree_deciduous_01a_trunk" )
|
||||
list.Add( "OverrideMaterials", "models/props_interiors/metalfence007a" )
|
||||
list.Add( "OverrideMaterials", "models/props_junk/plasticcrate01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_junk/plasticcrate01b" )
|
||||
list.Add( "OverrideMaterials", "models/props_junk/plasticcrate01c" )
|
||||
list.Add( "OverrideMaterials", "models/props_junk/plasticcrate01d" )
|
||||
list.Add( "OverrideMaterials", "models/props_junk/plasticcrate01e" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/Tank_Glass001" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/cornerunit_cloud" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/door_klab01" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/security_screens" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/security_screens2" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/warp_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/xencrystal_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/props_pipes/GutterMetal01a")
|
||||
list.Add( "OverrideMaterials", "models/props_pipes/destroyedpipes01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_pipes/pipemetal001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_pipes/pipeset_metal02" )
|
||||
list.Add( "OverrideMaterials", "models/props_pipes/pipesystem01a_skin1" )
|
||||
list.Add( "OverrideMaterials", "models/props_pipes/pipesystem01a_skin2" )
|
||||
list.Add( "OverrideMaterials", "models/props_vents/borealis_vent001" )
|
||||
list.Add( "OverrideMaterials", "models/props_vents/borealis_vent001b" )
|
||||
list.Add( "OverrideMaterials", "models/props_vents/borealis_vent001c" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/concretefloor010a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/concretewall064b" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/concretewall066a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/dirtwall001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/metal_tram001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/quarryobjects01" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/rockcliff02a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/rockcliff02b" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/rockcliff02c" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/rockcliff04a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/rockgranite02a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/tugboat01" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/tugboat02" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/wood_fence01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/wood_fence01a_skin2" )
|
||||
list.Add( "OverrideMaterials", "models/shadertest/predator" )
|
||||
list.Add( "OverrideMaterials", "models/weapons/v_crossbow/rebar_glow" )
|
||||
list.Add( "OverrideMaterials", "models/weapons/v_crowbar/crowbar_cyl" )
|
||||
list.Add( "OverrideMaterials", "models/weapons/v_grenade/grenade body" )
|
||||
list.Add( "OverrideMaterials", "models/weapons/v_slam/new light1" )
|
||||
list.Add( "OverrideMaterials", "models/weapons/v_slam/new light2" )
|
||||
list.Add( "OverrideMaterials", "models/weapons/v_smg1/texture5" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/BoxFull_diffuse" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/CellShadedCamo_diffuse" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/CinderBlock_Tex" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/JetBody2TailPiece_diffuse" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/PoleX1_diffuse" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/Rails/gumball_1" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/SquaredMatInverted" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/WoodPlankTexture" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/boxfull_diffuse" )
|
||||
list.Add( "OverrideMaterials", "models/dav0r/hoverball" )
|
||||
list.Add( "OverrideMaterials", "models/spawn_effect" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/Fender_chrome" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/Fender_white" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/Fender_wood" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/Future_vents" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/FuturisticTrackRamp_1-2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/OfficeWindow_1-1" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/Pro_gear_side" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/black_brushes" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/black_chrome" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/blue_steel" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/camera" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/car_tire" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/checkers_map" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/cigar" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/concrete0" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/concrete1" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/concrete2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/concrete3" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/construct/concrete_barrier00" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/construct/concrete_barrier2_00" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/construct/concrete_pipe_00" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/egg" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/gear" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/gear_top" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/grey_chrome" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/grey_steel" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/heli" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/indentTiles2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/iron_rails" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mat/mat_phx_carbonfiber" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mat/mat_phx_carbonfiber2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mat/mat_phx_metallic" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mat/mat_phx_metallic2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mat/mat_phx_plastic" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mat/mat_phx_plastic2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/metal_plate" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/metal_wheel" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/metalbox" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/metalbox2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/metalfence004a" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/middle" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mrref2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/output_jack" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/pack2/chrome" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/pack2/interior_sides" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/pack2/train_floor" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/potato" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/pro_gear_top2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/ps_grass" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/road" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/roadside" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/scrnspace" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/side" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/simplyMetallic1" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/simplyMetallic2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/smallwheel" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/spheremappy" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/t_light" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/thruster" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/tiles2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/top" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/torpedo" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/trains/track_beamside" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/trains/track_beamtop" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/trains/track_plate" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/trains/track_plateside" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/white_brushes" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/white_fps" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/window" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/wire/pcb_blue" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/wire/pcb_green" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/wire/pcb_red" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/wood_dome" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/wood_side" )
|
||||
|
||||
// Checking if CSS is mounted and adding CSS textures if it is
|
||||
|
||||
function engine.IsMounted(g)
|
||||
for k,v in pairs(engine.GetGames()) do
|
||||
if (' cstrike' ) then
|
||||
return true;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if IsMounted( 'cstrike' ) and (engine.IsMounted('cstrike')) then
|
||||
|
||||
list.Add( "OverrideMaterials", "models/cs_havana/wndb" )
|
||||
list.Add( "OverrideMaterials", "models/cs_havana/wndd" )
|
||||
list.Add( "OverrideMaterials", "models/cs_italy/light_orange" )
|
||||
list.Add( "OverrideMaterials", "models/cs_italy/plaster" )
|
||||
list.Add( "OverrideMaterials", "models/cs_italy/pwtrim2" )
|
||||
list.Add( "OverrideMaterials", "models/de_cbble/wndarch" )
|
||||
list.Add( "OverrideMaterials", "models/de_chateau/ch_arch_b1" )
|
||||
list.Add( "OverrideMaterials", "models/pi_window/plaster" )
|
||||
list.Add( "OverrideMaterials", "models/pi_window/trim128" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/dollar" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/fireescapefloor" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/metal_stairs1" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/moneywrap" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/moneywrap02" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/moneytop" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/pylon" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/boulder01" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/milceil001" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/militiarock" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/militiarockb" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/milwall006" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/rocks01" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/roofbeams01" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/roofbeams02" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/roofbeams03" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/RoofEdges" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_office/clouds" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_office/file_cabinet2" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_office/file_cabinet3" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_office/screen" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_office/snowmana" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/de_inferno_boulder_03" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/infflra" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/infflrd" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/inftowertop" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/offwndwb_break" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/roofbits" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/tileroof01" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/woodfloor008a" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_nuke/nukconcretewalla" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_nuke/nukecardboard" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_nuke/pipeset_metal" )
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
// Making sure there's no double materials in the list in case of other addons, plus sorting them
|
||||
|
||||
timer.Simple(0, function()
|
||||
local mats = list.GetForEdit("OverrideMaterials");
|
||||
local cleaner = {};
|
||||
for i, mat in pairs(mats) do
|
||||
cleaner[mat] = true;
|
||||
mats[i] = nil;
|
||||
end
|
||||
local i = 1;
|
||||
for mat in pairs(cleaner) do
|
||||
mats[i] = mat;
|
||||
i = i + 1;
|
||||
end
|
||||
table.sort(mats);
|
||||
end);
|
||||
97
lua/autorun/client/vj_menu_main_client.lua
Normal file
97
lua/autorun/client/vj_menu_main_client.lua
Normal file
@@ -0,0 +1,97 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
/*--------------------------------------------------
|
||||
=============== Client Main Menu ===============
|
||||
*** Copyright (c) 2012-2023 by DrVrej, All rights reserved. ***
|
||||
No parts of this code or any of its contents may be reproduced, copied, modified or adapted,
|
||||
without the prior written consent of the author, unless otherwise indicated for stand-alone materials.
|
||||
--------------------------------------------------*/
|
||||
if (!file.Exists("autorun/vj_base_autorun.lua","LUA")) then return end
|
||||
include('autorun/client/vj_menu_plugins.lua')
|
||||
|
||||
local function VJ_INFORMATION(Panel)
|
||||
local client = LocalPlayer() -- Local Player
|
||||
Panel:AddControl("Label", {Text = "About VJ Base:"})
|
||||
Panel:ControlHelp("VJ Base is made by DrVrej. The main purpose of this base is for the sake of simplicity. It provides many types of bases including a very advanced artificial intelligent NPC base.")
|
||||
--
|
||||
--
|
||||
Panel:AddControl("Label", {Text = "User Information:"})
|
||||
Panel:ControlHelp("Date - "..os.date("%b %d, %Y - %I:%M %p")) -- Date
|
||||
Panel:ControlHelp("Name - "..client:Nick().." ("..client:SteamID()..")") -- Name + Steam ID
|
||||
Panel:ControlHelp("Session - "..(game.SinglePlayer() and "SinglePlayer" or "Multiplayer")..", "..gmod.GetGamemode().Name.." ("..game.GetMap()..")") -- Game Session
|
||||
Panel:ControlHelp("VJ Base - "..VJBASE_VERSION..", "..#VJ.Plugins.." plugins, "..GetConVar("vj_language"):GetString()) -- VJ Base Information
|
||||
Panel:ControlHelp("System - "..(system.IsLinux() and "Linux" or (system.IsOSX() and "OSX" or "Windows")).." ("..ScrW().."x"..ScrH()..")") // system.IsWindows() -- System
|
||||
--
|
||||
--
|
||||
Panel:AddControl("Label", {Text = "Mounted Games:"})
|
||||
Panel:ControlHelp("HL1S - "..tostring(IsMounted("hl1")))
|
||||
Panel:ControlHelp("HL2 - "..tostring(IsMounted("hl2")))
|
||||
Panel:ControlHelp("HL2Ep1 - "..tostring(IsMounted("episodic")))
|
||||
Panel:ControlHelp("HL2Ep2 - "..tostring(IsMounted("ep2")))
|
||||
Panel:ControlHelp("CSS - "..tostring(IsMounted("cstrike")))
|
||||
Panel:ControlHelp("DoD - "..tostring(IsMounted("dod")))
|
||||
Panel:ControlHelp("TF2 - "..tostring(IsMounted("tf")))
|
||||
--
|
||||
--
|
||||
Panel:AddControl("Label", {Text = "Command Information:"})
|
||||
Panel:ControlHelp("SNPC Configurations - 'vj_npc_*'")
|
||||
Panel:ControlHelp("Weapons - 'vj_wep_*'")
|
||||
Panel:ControlHelp("HUD - 'vj_hud_*'")
|
||||
Panel:ControlHelp("Crosshair - 'vj_hud_ch_*'")
|
||||
--
|
||||
--
|
||||
Panel:AddControl("Label", {Text = "Credits:"})
|
||||
Panel:ControlHelp("DrVrej(Me) - Everything, from coding to fixing models and materials to sound editing")
|
||||
Panel:ControlHelp("Black Mesa Source - Original non-edited gib models, blood pool texture, and glock 17 model")
|
||||
Panel:ControlHelp("Valve - AK-47, M16A1 and MP40 models")
|
||||
Panel:ControlHelp("Orion - Helped create first version of the base (2011-2012)")
|
||||
Panel:ControlHelp("Cpt. Hazama - Suggestions + testing")
|
||||
Panel:ControlHelp("Oteek - Bloodpool textures + testing")
|
||||
Panel:ControlHelp("China-Mandem - Original K-3 Model")
|
||||
|
||||
Panel:ControlHelp("")
|
||||
Panel:ControlHelp("============================")
|
||||
|
||||
Panel:ControlHelp("Copyright (c) "..os.date("20%y").." by DrVrej, All rights reserved.")
|
||||
Panel:ControlHelp("No parts of the code may be reproduced, copied, modified or adapted, without the prior written consent of the author.")
|
||||
end
|
||||
----=================================----
|
||||
local function VJ_MAINMENU_CLIENT(Panel)
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.clsettings.label"})
|
||||
|
||||
-- Icons: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
|
||||
local vj_combo_box = vgui.Create("DComboBox")
|
||||
vj_combo_box:SetSize(100, 30)
|
||||
vj_combo_box:SetValue("#vjbase.menu.clsettings.labellang")
|
||||
vj_combo_box:AddChoice("English", "english", false, "flags16/us.png")
|
||||
vj_combo_box:AddChoice("简体中文", "schinese", false, "flags16/cn.png")
|
||||
vj_combo_box:AddChoice("ՀայերԷն *", "armenian", false, "flags16/am.png")
|
||||
vj_combo_box:AddChoice("Русский", "russian", false, "flags16/ru.png")
|
||||
vj_combo_box:AddChoice("Deutsche *", "german", false, "flags16/de.png")
|
||||
vj_combo_box:AddChoice("Français *", "french", false, "flags16/fr.png")
|
||||
vj_combo_box:AddChoice("Lietuvių", "lithuanian", false, "flags16/lt.png")
|
||||
vj_combo_box:AddChoice("Español (Latino Americano) *", "spanish_lt", false, "flags16/mx.png")
|
||||
vj_combo_box:AddChoice("Português (Brasileiro) *", "portuguese_br", false, "flags16/br.png")
|
||||
vj_combo_box.OnSelect = function(data, index, text)
|
||||
RunConsoleCommand("vj_language", vj_combo_box:GetOptionData(index))
|
||||
chat.AddText(Color(255, 215, 0), "#vjbase.menu.clsettings.notify.lang", " ", Color(30, 200, 255), text)
|
||||
timer.Simple(0.2, function() VJ_REFRESH_LANGUAGE(val) RunConsoleCommand("spawnmenu_reload") end) -- Bedke kichme espasenk minchevor command-e update ela
|
||||
end
|
||||
Panel:AddPanel(vj_combo_box)
|
||||
Panel:ControlHelp("* stands for unfinished translation!")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.clsettings.lang.auto", Command = "vj_language_auto"})
|
||||
Panel:ControlHelp("#vjbase.menu.clsettings.lang.auto.label")
|
||||
end
|
||||
----=================================----
|
||||
hook.Add("PopulateToolMenu", "VJ_ADDTOMENU_INFORMATION", function()
|
||||
spawnmenu.AddToolMenuOption("DrVrej", "Main Menu", "Information", "#vjbase.menu.info", "", "", VJ_INFORMATION, {})
|
||||
spawnmenu.AddToolMenuOption("DrVrej", "Main Menu", "Client Settings", "#vjbase.menu.clsettings", "", "", VJ_MAINMENU_CLIENT, {})
|
||||
end)
|
||||
127
lua/autorun/client/vj_menu_plugins.lua
Normal file
127
lua/autorun/client/vj_menu_plugins.lua
Normal file
@@ -0,0 +1,127 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
/*--------------------------------------------------
|
||||
=============== VJ Base Plugins ===============
|
||||
*** Copyright (c) 2012-2023 by DrVrej, All rights reserved. ***
|
||||
No parts of this code or any of its contents may be reproduced, copied, modified or adapted,
|
||||
without the prior written consent of the author, unless otherwise indicated for stand-alone materials.
|
||||
--------------------------------------------------*/
|
||||
if (!file.Exists("autorun/vj_base_autorun.lua","LUA")) then return end
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
local function VJ_PLUGINS(Panel)
|
||||
local numPlugins = #VJ.Plugins
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.plugins.label"})
|
||||
Panel:ControlHelp(language.GetPhrase("#vjbase.menu.plugins.version").." "..VJBASE_VERSION) -- Main Number / Version / Patches
|
||||
Panel:ControlHelp(language.GetPhrase("#vjbase.menu.plugins.totalplugins").." "..numPlugins)
|
||||
|
||||
local CheckList = vgui.Create("DListView")
|
||||
CheckList:SetTooltip(false)
|
||||
//CheckList:Center() -- No need since Size does it already
|
||||
CheckList:SetSize(100, 300) -- Size
|
||||
CheckList:SetMultiSelect(false)
|
||||
CheckList:AddColumn("#vjbase.menu.plugins.header1") -- Add column
|
||||
CheckList:AddColumn("#vjbase.menu.plugins.header2"):SetFixedWidth(50) -- Add column
|
||||
//Panel:SetName("Test") -- Renames the blue label
|
||||
if VJ.Plugins != nil then
|
||||
for _,v in SortedPairsByMemberValue(VJ.Plugins, "Name") do
|
||||
CheckList:AddLine(v.Name, v.Type)
|
||||
end
|
||||
else
|
||||
CheckList:AddLine("#vjbase.menu.plugins.notfound", "")
|
||||
end
|
||||
CheckList.OnRowSelected = function()
|
||||
surface.PlaySound(Sound("vj_misc/illuminati_confirmed.mp3"))
|
||||
chat.AddText(Color(255,255,0),"-=-=-=-=-=-=-=-=- ", Color(255,100,0), "VJ Base", Color(255,255,0)," -=-=-=-=-=-=-=-=-")
|
||||
chat.AddText(Color(0,255,0), language.GetPhrase("#vjbase.menu.plugins.version").." "..VJBASE_VERSION)
|
||||
chat.AddText(Color(0,255,0), language.GetPhrase("#vjbase.menu.plugins.totalplugins").." "..numPlugins)
|
||||
end
|
||||
Panel:AddItem(CheckList)
|
||||
|
||||
-- Changelog for VJ Base
|
||||
local changelog = vgui.Create("DButton")
|
||||
changelog:SetFont("TargetID")
|
||||
changelog:SetText("#vjbase.menu.plugins.changelog")
|
||||
changelog:SetSize(150, 25)
|
||||
changelog:SetColor(Color(0, 102, 0))
|
||||
changelog:SetFont("VJFont_Trebuchet24_SmallMedium")
|
||||
changelog.DoClick = function(x)
|
||||
gui.OpenURL("https://github.com/DrVrej/VJ-Base/releases")
|
||||
end
|
||||
Panel:AddPanel(changelog)
|
||||
|
||||
-- Github Wiki
|
||||
local github = vgui.Create("DButton")
|
||||
github:SetFont("TargetID")
|
||||
github:SetText("#vjbase.menu.plugins.makeaddon")
|
||||
github:SetSize(150, 25)
|
||||
github:SetColor(Color(0, 0, 102))
|
||||
github:SetFont("VJFont_Trebuchet24_SmallMedium")
|
||||
github.DoClick = function(x)
|
||||
gui.OpenURL("https://github.com/DrVrej/VJ-Base/wiki")
|
||||
end
|
||||
Panel:AddPanel(github)
|
||||
|
||||
-- Tutorial Video
|
||||
local tutorialVid = vgui.Create("DButton")
|
||||
tutorialVid:SetFont("TargetID")
|
||||
tutorialVid:SetText("#tool.vjstool.menu.tutorialvideo")
|
||||
tutorialVid:SetSize(150, 25)
|
||||
tutorialVid:SetColor(Color(0, 0, 102))
|
||||
tutorialVid:SetFont("VJFont_Trebuchet24_SmallMedium")
|
||||
tutorialVid.DoClick = function(x)
|
||||
gui.OpenURL("https://www.youtube.com/watch?v=dGoqEpFZ5_M")
|
||||
end
|
||||
Panel:AddPanel(tutorialVid)
|
||||
|
||||
-- *insert lenny face*
|
||||
if (LocalPlayer():SteamID() == "STEAM_0:0:22688298") then
|
||||
local lennyface = vgui.Create("DButton")
|
||||
lennyface:SetFont("TargetID")
|
||||
lennyface:SetText("HELLO")
|
||||
lennyface:SetSize(150, 25)
|
||||
lennyface:SetColor(Color(0, 0, 102))
|
||||
lennyface:SetFont("VJFont_Trebuchet24_SmallMedium")
|
||||
lennyface.DoClick = function(x)
|
||||
net.Start("vj_meme")
|
||||
net.SendToServer()
|
||||
end
|
||||
Panel:AddPanel(lennyface)
|
||||
end
|
||||
end
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
hook.Add("PopulateToolMenu", "VJ_ADDTOMENU_INSTALLATIONS", function()
|
||||
spawnmenu.AddToolMenuOption("DrVrej", "Main Menu", "Installed Plugins", "#vjbase.menu.plugins", "", "", VJ_PLUGINS)
|
||||
end)
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
local function doWelcomeMsg()
|
||||
print("Notice: This server is running VJ Base.")
|
||||
|
||||
local amt = #VJ.Plugins
|
||||
if amt <= 9 then
|
||||
amt = "0"..tostring(amt)
|
||||
else
|
||||
amt = tostring(amt)
|
||||
end
|
||||
local dashes = "----------------------------"
|
||||
|
||||
chat.AddText(Color(255,215,0),"|"..dashes..">", Color(0,255,255), " VJ Base ", Color(30,200,255), VJBASE_VERSION.." ", Color(255,215,0), "<"..dashes.."|")
|
||||
chat.AddText(Color(255,215,0),"|- ", Color(255,255,0),"NOTICE! ", Color(255,255,255), "To configure ", Color(0,255,255), "VJ Base ", Color(255,255,255), "click on ", Color(0,255,255), "DrVrej", Color(255,255,255)," in the spawn menu! ", Color(255,215,0),"-|")
|
||||
//chat.AddText(Color(255,215,0),"|"..dashes..">", Color(30,200,255), " "..amt, Color(0,255,255), " VJ Plugins ", Color(255,215,0), "<"..dashes.."|")
|
||||
end
|
||||
concommand.Add("vj_welcome_msg", doWelcomeMsg)
|
||||
net.Receive("vj_welcome_msg", doWelcomeMsg)
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
concommand.Add("vj_iamhere", function(ply,cmd,args)
|
||||
net.Start("vj_meme")
|
||||
net.SendToServer()
|
||||
end)
|
||||
298
lua/autorun/client/vj_menu_snpc.lua
Normal file
298
lua/autorun/client/vj_menu_snpc.lua
Normal file
@@ -0,0 +1,298 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
/*--------------------------------------------------
|
||||
=============== SNPC Menu ===============
|
||||
*** Copyright (c) 2012-2023 by DrVrej, All rights reserved. ***
|
||||
No parts of this code or any of its contents may be reproduced, copied, modified or adapted,
|
||||
without the prior written consent of the author, unless otherwise indicated for stand-alone materials.
|
||||
--------------------------------------------------*/
|
||||
if (!file.Exists("autorun/vj_base_autorun.lua","LUA")) then return end
|
||||
include('autorun/client/vj_menu_plugins.lua')
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
local function VJ_SNPC_OPTIONS(Panel) -- Options
|
||||
if !game.SinglePlayer() && !LocalPlayer():IsAdmin() then
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.general.admin.not"})
|
||||
Panel:AddControl( "Label", {Text = "#vjbase.menu.general.admin.only"})
|
||||
return
|
||||
end
|
||||
|
||||
Panel:AddControl( "Label", {Text = "#vjbase.menu.general.admin.only"})
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.general.snpc.warnfuture"})
|
||||
Panel:AddControl("Button",{Text = "#vjbase.menu.general.reset.everything", Command = "vj_npc_godmodesnpc 0\nvj_npc_playerfriendly 0\nvj_npc_zombiefriendly 0\nvj_npc_antlionfriendly 0\nvj_npc_combinefriendly 0\nvj_npc_corpsefade 0\nvj_npc_corpsefadetime 10\nvj_npc_undocorpse 0\nvj_npc_allhealth 0\nvj_npc_fadegibs 1\nvj_npc_fadegibstime 90\nvj_npc_gibcollidable 0\nvj_npc_addfrags 1\nvj_npc_dropweapon 1\nvj_npc_itemdrops 1\nvj_npc_creatureopendoor 1\nvj_npc_vjfriendly 0\nvj_npc_globalcorpselimit 32\nvj_npc_seedistance 0\nvj_npc_processtime 1\nvj_npc_usegmoddecals 0\nvj_npc_knowenemylocation 0\nvj_npc_plypickupdropwep 1\nvj_npc_difficulty 0\nvj_npc_human_canjump 1\nvj_npc_corpsecollision 0"})
|
||||
local vj_difficulty = {Options = {}, CVars = {}, Label = "#vjbase.menu.snpc.options.difficulty.header", MenuButton = "0"}
|
||||
vj_difficulty.Options["#vjbase.menu.snpc.options.difficulty.neanderthal"] = {vj_npc_difficulty = "-3"}
|
||||
vj_difficulty.Options["#vjbase.menu.snpc.options.difficulty.childs_play"] = {vj_npc_difficulty = "-2"}
|
||||
vj_difficulty.Options["#vjbase.menu.snpc.options.difficulty.easy"] = {vj_npc_difficulty = "-1"}
|
||||
vj_difficulty.Options["#vjbase.menu.snpc.options.difficulty.normal"] = {vj_npc_difficulty = "0"}
|
||||
vj_difficulty.Options["#vjbase.menu.snpc.options.difficulty.hard"] = {vj_npc_difficulty = "1"}
|
||||
vj_difficulty.Options["#vjbase.menu.snpc.options.difficulty.insane"] = {vj_npc_difficulty = "2"}
|
||||
vj_difficulty.Options["#vjbase.menu.snpc.options.difficulty.impossible"] = {vj_npc_difficulty = "3"}
|
||||
vj_difficulty.Options["#vjbase.menu.snpc.options.difficulty.nightmare"] = {vj_npc_difficulty = "4"}
|
||||
vj_difficulty.Options["#vjbase.menu.snpc.options.difficulty.hell_on_earth"] = {vj_npc_difficulty = "5"}
|
||||
vj_difficulty.Options["#vjbase.menu.snpc.options.difficulty.total_annihilation"] = {vj_npc_difficulty = "6"}
|
||||
Panel:AddControl("ComboBox", vj_difficulty)
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.options.label1"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglefriendlyantlion", Command = "vj_npc_antlionfriendly"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglefriendlycombine", Command = "vj_npc_combinefriendly"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglefriendlyplayer", Command = "vj_npc_playerfriendly"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglefriendlyzombie", Command = "vj_npc_zombiefriendly"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglefriendlyvj", Command = "vj_npc_vjfriendly"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.options.label2")
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.options.label3"})
|
||||
local vj_collision = {Options = {}, CVars = {}, Label = "#vjbase.menu.snpc.options.collision.header", MenuButton = "0"}
|
||||
vj_collision.Options["#vjbase.menu.snpc.options.collision.default"] = {vj_npc_corpsecollision = "0"}
|
||||
vj_collision.Options["#vjbase.menu.snpc.options.collision.everything"] = {vj_npc_corpsecollision = "1"}
|
||||
vj_collision.Options["#vjbase.menu.snpc.options.collision.onlyworld"] = {vj_npc_corpsecollision = "2"}
|
||||
vj_collision.Options["#vjbase.menu.snpc.options.collision.excludedebris"] = {vj_npc_corpsecollision = "3"}
|
||||
vj_collision.Options["#vjbase.menu.snpc.options.collision.excludeplynpcs"] = {vj_npc_corpsecollision = "4"}
|
||||
vj_collision.Options["#vjbase.menu.snpc.options.collision.excludeply"] = {vj_npc_corpsecollision = "5"}
|
||||
Panel:AddControl("ComboBox", vj_collision)
|
||||
Panel:AddControl("Slider",{Label = "#vjbase.menu.snpc.options.corpselimit",min = 4,max = 300,Command = "vj_npc_globalcorpselimit"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.options.label4")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.toggleundocorpses", Command = "vj_npc_undocorpse"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglecorpsefade", Command = "vj_npc_corpsefade"})
|
||||
Panel:AddControl("Slider",{Label = "#vjbase.menu.snpc.options.corpsefadetime",min = 0,max = 600,Command = "vj_npc_corpsefadetime"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.options.label5")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglegibcollision", Command = "vj_npc_gibcollidable"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglefadegibs", Command = "vj_npc_fadegibs"})
|
||||
Panel:AddControl("Slider",{Label = "#vjbase.menu.snpc.options.gibfadetime",min = 0,max = 600,Command = "vj_npc_fadegibstime"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.options.label6")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglesnpcgodmode", Command = "vj_npc_godmodesnpc"})
|
||||
//Panel:AddControl("Slider", {Label = "Health Changer",min = 0,max = 10000,Command = "vj_npc_allhealth"})
|
||||
Panel:AddControl("TextBox", {Label = "#vjbase.menu.snpc.options.health", Command = "vj_npc_allhealth", WaitForEnter = "0"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.options.defaulthealth")
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.options.label7"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.toggleknowenemylocation", Command = "vj_npc_knowenemylocation"})
|
||||
Panel:AddControl("TextBox", {Label = "#vjbase.menu.snpc.options.sightdistance", Command = "vj_npc_seedistance", WaitForEnter = "0"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.options.label8")
|
||||
Panel:AddControl("Slider",{Label = "#vjbase.menu.snpc.options.processtime",Type = "Float",min = 0.05,max = 3,Command = "vj_npc_processtime"})
|
||||
local vid = vgui.Create("DButton") -- Process Time Video
|
||||
vid:SetFont("TargetID")
|
||||
vid:SetText("#vjbase.menu.snpc.options.whatisprocesstime")
|
||||
vid:SetSize(150,25)
|
||||
//vid:SetColor(Color(76,153,255,255))
|
||||
vid.DoClick = function()
|
||||
gui.OpenURL("https://www.youtube.com/watch?v=7wKsCmGpieU")
|
||||
end
|
||||
Panel:AddPanel(vid)
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.options.label9")
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.options.label10"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglegmoddecals", Command = "vj_npc_usegmoddecals"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.options.label11")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglecreatureopendoor", Command = "vj_npc_creatureopendoor"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglehumanscanjump", Command = "vj_npc_human_canjump"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.toggleitemdrops", Command = "vj_npc_itemdrops"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.togglehumansdropweapon", Command = "vj_npc_dropweapon"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.toggleplydroppedweapons", Command = "vj_npc_plypickupdropwep"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.options.toggleaddfrags", Command = "vj_npc_addfrags"})
|
||||
end
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
local function VJ_SNPC_SETTINGS(Panel) -- Settings
|
||||
if !game.SinglePlayer() && !LocalPlayer():IsAdmin() then
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.general.admin.not"})
|
||||
Panel:AddControl( "Label", {Text = "#vjbase.menu.general.admin.only"})
|
||||
return
|
||||
end
|
||||
|
||||
Panel:AddControl( "Label", {Text = "#vjbase.menu.general.admin.only"})
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.general.snpc.warnfuture"})
|
||||
Panel:AddControl("Button",{Text = "#vjbase.menu.general.reset.everything", Command = "vj_npc_nocorpses 0\nvj_npc_nobleed 0\nvj_npc_nomelee 0\nvj_npc_norange 0\nvj_npc_noleap 0\nvj_npc_noflinching 0\nvj_npc_noallies 0\nvj_npc_noweapon 0\nvj_npc_nowandering 0\nvj_npc_nogib 0\nvj_npc_nodeathanimation 0\nvj_npc_nodangerdetection 0\nvj_npc_animal_runontouch 0\nvj_npc_animal_runonhit 0\nvj_npc_slowplayer 0\nvj_npc_bleedenemyonmelee 0\nvj_npc_noproppush 0\nvj_npc_nopropattack 0\nvj_npc_novfx_gibdeath 0\nvj_npc_noidleparticle 0\nvj_npc_noreload 0\nvj_npc_nobecomeenemytoply 0\nvj_npc_nofollowplayer 0\nvj_npc_nothrowgrenade 0\nvj_npc_nobloodpool 0\nvj_npc_nochasingenemy 0\nvj_npc_nosnpcchat 0\nvj_npc_nomedics 0\nvj_npc_nomeleedmgdsp 0\nvj_npc_nocallhelp 0\nvj_npc_noeating 0"})
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.settings.label1"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglewandering", Command = "vj_npc_nowandering"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglechasingenemy", Command = "vj_npc_nochasingenemy"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.settings.label2")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglemedics", Command = "vj_npc_nomedics"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglefollowplayer", Command = "vj_npc_nofollowplayer"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.settings.label3")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.toggleallies", Command = "vj_npc_noallies"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglebecomeenemytoply", Command = "vj_npc_nobecomeenemytoply"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglecallhelp", Command = "vj_npc_nocallhelp"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.toggleproppush", Command = "vj_npc_noproppush"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglepropattack", Command = "vj_npc_nopropattack"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.toggledangersight", Command = "vj_npc_nodangerdetection"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglereloading", Command = "vj_npc_noreload"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.toggleeating", Command = "vj_npc_noeating"})
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.settings.label4"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglemelee", Command = "vj_npc_nomelee"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglerange", Command = "vj_npc_norange"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.toggleleap", Command = "vj_npc_noleap"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglethrownade", Command = "vj_npc_nothrowgrenade"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.toggleweapons", Command = "vj_npc_noweapon"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.settings.label5")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglemeleedsp", Command = "vj_npc_nomeleedmgdsp"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.toggleslowplayer", Command = "vj_npc_slowplayer"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglebleedonmelee", Command = "vj_npc_bleedenemyonmelee"})
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.settings.label6"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.toggleidleparticles", Command = "vj_npc_noidleparticle"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.settings.label7")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglesnpcchat", Command = "vj_npc_nosnpcchat"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.settings.label8")
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.settings.label9"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.toggleflinching", Command = "vj_npc_noflinching"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglebleeding", Command = "vj_npc_nobleed"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.settings.label10")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglebloodpool", Command = "vj_npc_nobloodpool"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglegib", Command = "vj_npc_nogib"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.settings.label11")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglegibdeathvfx", Command = "vj_npc_novfx_gibdeath"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.toggledeathanim", Command = "vj_npc_nodeathanimation"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglecorpses", Command = "vj_npc_nocorpses"})
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.settings.label12"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglerunontouch", Command = "vj_npc_animal_runontouch"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.settings.togglerunonhit", Command = "vj_npc_animal_runonhit"})
|
||||
end
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
local function VJ_SNPC_SOUNDSETTINGS(Panel) -- Sound Settings
|
||||
if !game.SinglePlayer() && !LocalPlayer():IsAdmin() then
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.general.admin.not"})
|
||||
Panel:AddControl( "Label", {Text = "#vjbase.menu.general.admin.only"})
|
||||
return
|
||||
end
|
||||
|
||||
Panel:AddControl( "Label", {Text = "#vjbase.menu.general.admin.only"})
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.general.snpc.warnfuture"})
|
||||
Panel:AddControl("Button",{Text = "#vjbase.menu.general.reset.everything", Command = "vj_npc_sd_nosounds 0\n vj_npc_sd_idle 0\n vj_npc_sd_alert 0\n vj_npc_sd_pain 0\n vj_npc_sd_death 0\n vj_npc_sd_footstep 0\n vj_npc_sd_soundtrack 0\n vj_npc_sd_meleeattack 0\n vj_npc_sd_meleeattackmiss 0\n vj_npc_sd_rangeattack 0\n vj_npc_sd_leapattack 0\n vj_npc_sd_ondangersight 0\n vj_npc_sd_onplayersight 0\n vj_npc_sd_damagebyplayer 0\n vj_npc_sd_slowplayer 0\n vj_npc_sd_gibbing 0\n vj_npc_sd_breath 0\n vj_npc_sd_followplayer 0\n vj_npc_sd_becomenemytoply 0\n vj_npc_sd_medic 0\n vj_npc_sd_reload 0\n vj_npc_sd_grenadeattack 0\n vj_npc_sd_suppressing 0\n vj_npc_sd_callforhelp 0\n vj_npc_sd_onreceiveorder 0"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.toggleallsounds", Command = "vj_npc_sd_nosounds"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglesoundtrack", Command = "vj_npc_sd_soundtrack"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.toggleidle", Command = "vj_npc_sd_idle"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglebreathing", Command = "vj_npc_sd_breath"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglefootsteps", Command = "vj_npc_sd_footstep"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.toggleattacksounds", Command = "vj_npc_sd_meleeattack"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglemeleemiss", Command = "vj_npc_sd_meleeattackmiss"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglerangeattack", Command = "vj_npc_sd_rangeattack"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglealert", Command = "vj_npc_sd_alert"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglepain", Command = "vj_npc_sd_pain"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.toggledeath", Command = "vj_npc_sd_death"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglegibbing", Command = "vj_npc_sd_gibbing"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.sdsettings.label1")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglemedic", Command = "vj_npc_sd_medic"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglefollowing", Command = "vj_npc_sd_followplayer"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglecallhelp", Command = "vj_npc_sd_callforhelp"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglereceiveorder", Command = "vj_npc_sd_onreceiveorder"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglebecomeenemy", Command = "vj_npc_sd_becomenemytoply"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.toggleplayersight", Command = "vj_npc_sd_onplayersight"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.sdsettings.label2")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.toggledmgbyplayer", Command = "vj_npc_sd_damagebyplayer"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.sdsettings.label3")
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.general.snpc.creaturesettings"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.toggleleap", Command = "vj_npc_sd_leapattack"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.toggleslowedplayer", Command = "vj_npc_sd_slowplayer"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.sdsettings.label4")
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.general.snpc.humansettings"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglegrenade", Command = "vj_npc_sd_grenadeattack"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.toggledangersight", Command = "vj_npc_sd_ondangersight"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglesuppressing", Command = "vj_npc_sd_suppressing"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.sdsettings.togglereload", Command = "vj_npc_sd_reload"})
|
||||
end
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
local function VJ_SNPC_DEVSETTINGS(Panel) -- Developer Settings
|
||||
if !game.SinglePlayer() && !LocalPlayer():IsAdmin() then
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.general.admin.not"})
|
||||
Panel:AddControl( "Label", {Text = "#vjbase.menu.general.admin.only"})
|
||||
return
|
||||
end
|
||||
|
||||
Panel:AddControl( "Label", {Text = "#vjbase.menu.general.admin.only"})
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.devsettings.label1"})
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.devsettings.label2"})
|
||||
Panel:AddControl("Button",{Text = "#vjbase.menu.general.reset.everything", Command = "vj_npc_dev_printwepinfo 0\n vj_npc_printdied 0\n vj_npc_printondamage 0\n vj_npc_printontouch 0\n vj_npc_printstoppedattacks 0\n vj_npc_printtakingcover 0\n vj_npc_printresetenemy 0\n vj_npc_printlastseenenemy 0\n vj_npc_usedevcommands 0\n vj_npc_printcurenemy 0"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.devsettings.toggledev", Command = "vj_npc_usedevcommands"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.devsettings.label3")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.devsettings.printcurenemy", Command = "vj_npc_printcurenemy"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.devsettings.printlastseenenemy", Command = "vj_npc_printlastseenenemy"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.devsettings.printonreset", Command = "vj_npc_printresetenemy"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.devsettings.printonstopattack", Command = "vj_npc_printstoppedattacks"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.devsettings.printtakingcover", Command = "vj_npc_printtakingcover"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.devsettings.printondamage", Command = "vj_npc_printondamage"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.devsettings.printondeath", Command = "vj_npc_printdied"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.devsettings.printtouch", Command = "vj_npc_printontouch"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.devsettings.printweaponinfo", Command = "vj_npc_dev_printwepinfo"})
|
||||
Panel:AddControl("Button", {Label = "#vjbase.menu.snpc.devsettings.cachedmodels", Command = "listmodels"})
|
||||
local npcCount = vgui.Create("DButton")
|
||||
npcCount:SetText("#vjbase.menu.snpc.devsettings.numofnpcs")
|
||||
npcCount.DoClick = function(x)
|
||||
local i = 0
|
||||
for _, v in ipairs(ents.GetAll()) do
|
||||
if v:IsNPC() then
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
LocalPlayer():ChatPrint("Number of NPCs: "..i)
|
||||
end
|
||||
Panel:AddPanel(npcCount)
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.devsettings.label4"})
|
||||
Panel:AddControl("Button", {Label = "#vjbase.menu.snpc.devsettings.reloadsounds", Command = "snd_restart"})
|
||||
Panel:AddControl("Button", {Label = "#vjbase.menu.snpc.devsettings.reloadmaterials", Command = "mat_reloadallmaterials"})
|
||||
Panel:AddControl("Button", {Label = "#vjbase.menu.snpc.devsettings.reloadtextures", Command = "mat_reloadtextures"})
|
||||
Panel:AddControl("Button", {Label = "#vjbase.menu.snpc.devsettings.reloadmodels", Command = "r_flushlod"})
|
||||
Panel:AddControl("Button", {Label = "#vjbase.menu.snpc.devsettings.reloadspawnmenu", Command = "spawnmenu_reload"})
|
||||
end
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
local function VJ_SNPC_CONTROLLERSETTINGS(Panel) -- NPC Controller Settings
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.consettings.label1"})
|
||||
Panel:AddControl("Button",{Text = "#vjbase.menu.general.reset.everything", Command = "vj_npc_cont_hud 1\n vj_npc_cont_zoomdist 5\n vj_npc_cont_devents 0\n vj_npc_cont_cam_speed 6\n vj_npc_cont_cam_zoomspeed 10\n vj_npc_cont_diewithnpc 0"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.consettings.displayhud", Command = "vj_npc_cont_hud"})
|
||||
Panel:AddControl("Slider", {Label = "#vjbase.menu.snpc.consettings.camzoomdistance", min = 5, max = 300, Command = "vj_npc_cont_zoomdist"})
|
||||
Panel:AddControl("Slider", {Label = "#vjbase.menu.snpc.consettings.camzoomspeed", min = 1, max = 200, Command = "vj_npc_cont_cam_zoomspeed"})
|
||||
Panel:AddControl("Slider", {Label = "#vjbase.menu.snpc.consettings.camspeed", min = 1, max = 180, Command = "vj_npc_cont_cam_speed"})
|
||||
Panel:ControlHelp("#vjbase.menu.snpc.consettings.label2")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.consettings.diewithnpc", Command = "vj_npc_cont_diewithnpc"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.snpc.consettings.displaydev", Command = "vj_npc_cont_devents"})
|
||||
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.snpc.consettings.label3"})
|
||||
|
||||
local ControlList = vgui.Create("DListView")
|
||||
ControlList:SetTooltip(false)
|
||||
ControlList:SetSize(100, 320)
|
||||
ControlList:SetMultiSelect(false)
|
||||
ControlList:AddColumn("#vjbase.menu.snpc.consettings.bind.header1") -- Add column
|
||||
ControlList:AddColumn("#vjbase.menu.snpc.consettings.bind.header2") -- Add column
|
||||
ControlList:AddLine("W A S D", "#vjbase.menu.snpc.consettings.bind.movement")
|
||||
ControlList:AddLine("END", "#vjbase.menu.snpc.consettings.bind.exitcontrol")
|
||||
ControlList:AddLine("FIRE1", "#vjbase.menu.snpc.consettings.bind.meleeattack")
|
||||
ControlList:AddLine("FIRE2", "#vjbase.menu.snpc.consettings.bind.rangeattack")
|
||||
ControlList:AddLine("JUMP", "#vjbase.menu.snpc.consettings.bind.leaporgrenade")
|
||||
ControlList:AddLine("RELOAD", "#vjbase.menu.snpc.consettings.bind.reloadweapon")
|
||||
ControlList:AddLine("T", "#vjbase.menu.snpc.consettings.bind.togglebullseye")
|
||||
ControlList:AddLine("H", "#vjbase.menu.snpc.consettings.bind.cameramode")
|
||||
ControlList:AddLine("J", "#vjbase.menu.snpc.consettings.bind.movementjump")
|
||||
ControlList:AddLine("MOUSE WHEEL", "#vjbase.menu.snpc.consettings.bind.camerazoom")
|
||||
ControlList:AddLine("UP ARROW", "#vjbase.menu.snpc.consettings.bind.cameraforward")
|
||||
ControlList:AddLine("UP ARROW + RUN", "#vjbase.menu.snpc.consettings.bind.cameraup")
|
||||
ControlList:AddLine("DOWN ARROW", "#vjbase.menu.snpc.consettings.bind.camerabackward")
|
||||
ControlList:AddLine("DOWN ARROW + RUN", "#vjbase.menu.snpc.consettings.bind.cameradown")
|
||||
ControlList:AddLine("LEFT ARROW", "#vjbase.menu.snpc.consettings.bind.cameraleft")
|
||||
ControlList:AddLine("RIGHT ARROW", "#vjbase.menu.snpc.consettings.bind.cameraright")
|
||||
ControlList:AddLine("BACKSPACE", "#vjbase.menu.snpc.consettings.bind.resetzoom")
|
||||
ControlList.OnRowSelected = function(panel, rowIndex, row)
|
||||
chat.AddText(Color(0,255,0), language.GetPhrase("#vjbase.menu.snpc.consettings.bind.clickmsg1").." ", Color(255,255,0), row:GetValue(1), Color(0,255,0), " | "..language.GetPhrase("#vjbase.menu.snpc.consettings.bind.clickmsg2").." ", Color(255,255,0), row:GetValue(2))
|
||||
end
|
||||
Panel:AddItem(ControlList)
|
||||
end
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
hook.Add("PopulateToolMenu", "VJ_ADDTOMENU_SNPC", function()
|
||||
spawnmenu.AddToolMenuOption("DrVrej", "SNPCs", "SNPC Options", "#vjbase.menu.snpc.options", "", "", VJ_SNPC_OPTIONS, {})
|
||||
spawnmenu.AddToolMenuOption("DrVrej", "SNPCs", "SNPC Settings", "#vjbase.menu.snpc.settings", "", "", VJ_SNPC_SETTINGS, {})
|
||||
spawnmenu.AddToolMenuOption("DrVrej", "SNPCs", "SNPC Sound Settings", "#vjbase.menu.snpc.sdsettings", "", "", VJ_SNPC_SOUNDSETTINGS, {})
|
||||
spawnmenu.AddToolMenuOption("DrVrej", "SNPCs", "SNPC Developer Settings", "#vjbase.menu.snpc.devsettings", "", "", VJ_SNPC_DEVSETTINGS, {})
|
||||
spawnmenu.AddToolMenuOption("DrVrej", "SNPCs", "NPC Controller Settings", "#vjbase.menu.snpc.consettings", "", "", VJ_SNPC_CONTROLLERSETTINGS, {})
|
||||
end)
|
||||
31
lua/autorun/client/vj_menu_weapon.lua
Normal file
31
lua/autorun/client/vj_menu_weapon.lua
Normal file
@@ -0,0 +1,31 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
/*--------------------------------------------------
|
||||
=============== Weapon Menu ===============
|
||||
*** Copyright (c) 2012-2023 by DrVrej, All rights reserved. ***
|
||||
No parts of this code or any of its contents may be reproduced, copied, modified or adapted,
|
||||
without the prior written consent of the author, unless otherwise indicated for stand-alone materials.
|
||||
--------------------------------------------------*/
|
||||
if (!file.Exists("autorun/vj_base_autorun.lua","LUA")) then return end
|
||||
include('autorun/client/vj_menu_plugins.lua')
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
local function VJ_WEAPON_CLIENTSETTINGS(Panel) -- Client Settings
|
||||
Panel:AddControl("Label", {Text = "#vjbase.menu.clweapon.notice"})
|
||||
Panel:AddControl("Button",{Text = "#vjbase.menu.general.reset.everything", Command = "vj_wep_nomuszzleflash 0\n vj_wep_nobulletshells 0\n vj_wep_nomuszzleflash_dynamiclight 0"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.clweapon.togglemuzzle", Command = "vj_wep_nomuszzleflash"})
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.clweapon.togglemuzzlelight", Command = "vj_wep_nomuszzleflash_dynamiclight"})
|
||||
Panel:ControlHelp("#vjbase.menu.clweapon.togglemuzzle.label")
|
||||
Panel:AddControl("Checkbox", {Label = "#vjbase.menu.clweapon.togglemuzzlebulletshells", Command = "vj_wep_nobulletshells"})
|
||||
end
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
hook.Add("PopulateToolMenu", "VJ_ADDTOMENU_WEAPON", function()
|
||||
spawnmenu.AddToolMenuOption("DrVrej", "Weapons", "Weapon Client Settings", "#vjbase.menu.clweapon", "", "", VJ_WEAPON_CLIENTSETTINGS, {})
|
||||
end)
|
||||
26
lua/autorun/ctv_hla_prisoner_transporter.lua
Normal file
26
lua/autorun/ctv_hla_prisoner_transporter.lua
Normal file
@@ -0,0 +1,26 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
local V = {
|
||||
-- Required information
|
||||
Name = "Combine Prisoner Transporter",
|
||||
Model = "models/ctvehicles/hla/prisoner_transport.mdl",
|
||||
Class = "prop_vehicle_jeep",
|
||||
Category = "CTVehicles",
|
||||
|
||||
-- Optional information
|
||||
Author = "CTV",
|
||||
Information = "HLA",
|
||||
|
||||
KeyValues = {
|
||||
vehiclescript = "scripts/vehicles/ctvehicles/ctv_hla_prisoner_transport.txt"
|
||||
}
|
||||
}
|
||||
list.Set( "Vehicles", "ctv_hla_prisoner_transport", V )
|
||||
463
lua/autorun/default_sfx_presets_d2k.lua
Normal file
463
lua/autorun/default_sfx_presets_d2k.lua
Normal file
@@ -0,0 +1,463 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
if CLIENT then
|
||||
|
||||
|
||||
//GLOW
|
||||
|
||||
presets.Add( "glow", "Campfire", {
|
||||
|
||||
glow_color_r = "255",
|
||||
glow_color_g = "187",
|
||||
glow_color_b = "142",
|
||||
glow_verticalsize = "32",
|
||||
glow_horizontalsize = "32",
|
||||
glow_mindist = "0",
|
||||
glow_maxdist = "64",
|
||||
glow_outermaxdist = "16384",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "glow", "Close-up Bloom", {
|
||||
|
||||
glow_color_r = "120",
|
||||
glow_color_g = "120",
|
||||
glow_color_b = "120",
|
||||
glow_verticalsize = "32",
|
||||
glow_horizontalsize = "32",
|
||||
glow_mindist = "4",
|
||||
glow_maxdist = "64",
|
||||
glow_outermaxdist = "512",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "glow", "Distant Glow", {
|
||||
|
||||
glow_color_r = "210",
|
||||
glow_color_g = "210",
|
||||
glow_color_b = "210",
|
||||
glow_verticalsize = "16",
|
||||
glow_horizontalsize = "16",
|
||||
glow_mindist = "64",
|
||||
glow_maxdist = "1024",
|
||||
glow_outermaxdist = "8192",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "glow", "GMod Lamp", {
|
||||
|
||||
glow_color_r = "255",
|
||||
glow_color_g = "255",
|
||||
glow_color_b = "255",
|
||||
glow_verticalsize = "16",
|
||||
glow_horizontalsize = "16",
|
||||
glow_mindist = "0",
|
||||
glow_maxdist = "32",
|
||||
glow_outermaxdist = "16384",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "glow", "Mild Outline", {
|
||||
|
||||
glow_color_r = "152",
|
||||
glow_color_g = "152",
|
||||
glow_color_b = "152",
|
||||
glow_verticalsize = "8",
|
||||
glow_horizontalsize = "8",
|
||||
glow_mindist = "128",
|
||||
glow_maxdist = "2048",
|
||||
glow_outermaxdist = "16384",
|
||||
|
||||
} )
|
||||
|
||||
//SMOKE
|
||||
|
||||
presets.Add( "smoke", "Cigarette", {
|
||||
|
||||
smoke_color_r = "162",
|
||||
smoke_color_g = "162",
|
||||
smoke_color_b = "162",
|
||||
smoke_color_a = "100",
|
||||
smoke_material = "particle/smokesprites_0001.vmt",
|
||||
smoke_spreadbase = "0",
|
||||
smoke_spreadspeed = "0",
|
||||
smoke_speed = "8",
|
||||
smoke_startsize = "0",
|
||||
smoke_endsize = "1",
|
||||
smoke_roll = "32",
|
||||
smoke_numparticles = "32",
|
||||
smoke_jetlength = "21",
|
||||
smoke_twist = "12",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "smoke", "Dark Cloud", {
|
||||
|
||||
smoke_color_r = "62",
|
||||
smoke_color_g = "62",
|
||||
smoke_color_b = "62",
|
||||
smoke_color_a = "100",
|
||||
smoke_material = "particle/smokesprites_0001.vmt",
|
||||
smoke_spreadbase = "128",
|
||||
smoke_spreadspeed = "1024",
|
||||
smoke_speed = "512",
|
||||
smoke_startsize = "128",
|
||||
smoke_endsize = "512",
|
||||
smoke_roll = "128",
|
||||
smoke_numparticles = "64",
|
||||
smoke_jetlength = "2048",
|
||||
smoke_twist = "128",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "smoke", "Eye of the Tornado", {
|
||||
|
||||
smoke_color_r = "255",
|
||||
smoke_color_g = "255",
|
||||
smoke_color_b = "255",
|
||||
smoke_color_a = "255",
|
||||
smoke_material = "particle/particle_smokegrenade.vmt",
|
||||
smoke_spreadbase = "1024",
|
||||
smoke_spreadspeed = "1024",
|
||||
smoke_speed = "512",
|
||||
smoke_startsize = "512",
|
||||
smoke_endsize = "1024",
|
||||
smoke_roll = "64",
|
||||
smoke_numparticles = "64",
|
||||
smoke_jetlength = "2048",
|
||||
smoke_twist = "128",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "smoke", "Landing Zone", {
|
||||
|
||||
smoke_color_r = "172",
|
||||
smoke_color_g = "172",
|
||||
smoke_color_b = "172",
|
||||
smoke_color_a = "255",
|
||||
smoke_material = "particle/particle_smokegrenade.vmt",
|
||||
smoke_spreadbase = "16",
|
||||
smoke_spreadspeed = "2048",
|
||||
smoke_speed = "256",
|
||||
smoke_startsize = "16",
|
||||
smoke_endsize = "512",
|
||||
smoke_roll = "16",
|
||||
smoke_numparticles = "32",
|
||||
smoke_jetlength = "128",
|
||||
smoke_twist = "32",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "smoke", "Poison Gas", {
|
||||
|
||||
smoke_color_r = "255",
|
||||
smoke_color_g = "210",
|
||||
smoke_color_b = "12",
|
||||
smoke_color_a = "255",
|
||||
smoke_material = "particle/smokesprites_0001.vmt",
|
||||
smoke_spreadbase = "64",
|
||||
smoke_spreadspeed = "64",
|
||||
smoke_speed = "128",
|
||||
smoke_startsize = "32",
|
||||
smoke_endsize = "256",
|
||||
smoke_roll = "32",
|
||||
smoke_numparticles = "16",
|
||||
smoke_jetlength = "256",
|
||||
smoke_twist = "32",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "smoke", "Smoke Cloud", {
|
||||
|
||||
smoke_color_r = "120",
|
||||
smoke_color_g = "120",
|
||||
smoke_color_b = "120",
|
||||
smoke_color_a = "62",
|
||||
smoke_material = "particle/particle_smokegrenade.vmt",
|
||||
smoke_spreadbase = "64",
|
||||
smoke_spreadspeed = "128",
|
||||
smoke_speed = "8",
|
||||
smoke_startsize = "256",
|
||||
smoke_endsize = "32",
|
||||
smoke_roll = "16",
|
||||
smoke_numparticles = "32",
|
||||
smoke_jetlength = "64",
|
||||
smoke_twist = "2",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "smoke", "Smokestack", {
|
||||
|
||||
smoke_color_r = "62",
|
||||
smoke_color_g = "62",
|
||||
smoke_color_b = "62",
|
||||
smoke_color_a = "100",
|
||||
smoke_material = "particle/smokesprites_0001.vmt",
|
||||
smoke_spreadbase = "32",
|
||||
smoke_spreadspeed = "16",
|
||||
smoke_speed = "64",
|
||||
smoke_startsize = "32",
|
||||
smoke_endsize = "256",
|
||||
smoke_roll = "16",
|
||||
smoke_numparticles = "12",
|
||||
smoke_jetlength = "1024",
|
||||
smoke_twist = "12",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "smoke", "Desert Dust", {
|
||||
|
||||
smoke_color_r = "210",
|
||||
smoke_color_g = "182",
|
||||
smoke_color_b = "128",
|
||||
smoke_color_a = "92",
|
||||
smoke_material = "particle/particle_smokegrenade.vmt",
|
||||
smoke_spreadbase = "128",
|
||||
smoke_spreadspeed = "192",
|
||||
smoke_speed = "18",
|
||||
smoke_startsize = "128",
|
||||
smoke_endsize = "320",
|
||||
smoke_roll = "10",
|
||||
smoke_numparticles = "32",
|
||||
smoke_jetlength = "172",
|
||||
smoke_twist = "18",
|
||||
|
||||
} )
|
||||
|
||||
//SMOKE TRAIL
|
||||
|
||||
presets.Add( "smoke_trail", "Rocket Exhaust", {
|
||||
|
||||
smoke_trail_color_r = "255",
|
||||
smoke_trail_color_g = "255",
|
||||
smoke_trail_color_b = "255",
|
||||
smoke_trail_color_a = "210",
|
||||
smoke_trail_spawnradius = "32",
|
||||
smoke_trail_lifetime = "8",
|
||||
smoke_trail_startsize = "64",
|
||||
smoke_trail_endsize = "128",
|
||||
smoke_trail_minspeed = "16",
|
||||
smoke_trail_maxspeed = "32",
|
||||
smoke_trail_mindirectedspeed = "128",
|
||||
smoke_trail_maxdirectedspeed = "256",
|
||||
smoke_trail_spawnrate = "128",
|
||||
|
||||
} )
|
||||
|
||||
//SPARKS
|
||||
|
||||
presets.Add( "sparks", "Cartoon", {
|
||||
|
||||
sparks_maxdelay = "1",
|
||||
sparks_magnitude = "1",
|
||||
sparks_traillength = "6",
|
||||
sparks_glow = "1",
|
||||
sparks_makesound = "1",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "sparks", "Weld", {
|
||||
|
||||
sparks_maxdelay = "0.05",
|
||||
sparks_magnitude = "0.5",
|
||||
sparks_traillength = "0.5",
|
||||
sparks_glow = "0",
|
||||
sparks_makesound = "0",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "sparks", "Fireworks", {
|
||||
|
||||
sparks_maxdelay = "0.1",
|
||||
sparks_magnitude = "8",
|
||||
sparks_traillength = "3.2",
|
||||
sparks_glow = "0",
|
||||
sparks_makesound = "0",
|
||||
|
||||
} )
|
||||
|
||||
//STEAM
|
||||
|
||||
presets.Add( "steam", "Dust Kick-up", {
|
||||
|
||||
steam_color_r = "255",
|
||||
steam_color_g = "255",
|
||||
steam_color_b = "255",
|
||||
steam_color_a = "255",
|
||||
steam_jetlength = "256",
|
||||
steam_spreadspeed = "32",
|
||||
steam_speed = "256",
|
||||
steam_startsize = "16",
|
||||
steam_endsize = "64",
|
||||
steam_rate = "32",
|
||||
steam_rollspeed = "8",
|
||||
steam_emissive = "0",
|
||||
steam_heatwave = "0",
|
||||
steam_makesound = "0",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "steam", "Jet Turbine", {
|
||||
|
||||
steam_color_r = "81",
|
||||
steam_color_g = "81",
|
||||
steam_color_b = "81",
|
||||
steam_color_a = "255",
|
||||
steam_jetlength = "128",
|
||||
steam_spreadspeed = "100",
|
||||
steam_speed = "472",
|
||||
steam_startsize = "32",
|
||||
steam_endsize = "192",
|
||||
steam_rate = "32",
|
||||
steam_rollspeed = "4",
|
||||
steam_emissive = "1",
|
||||
steam_heatwave = "0",
|
||||
steam_makesound = "0",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "steam", "Smoke Machine", {
|
||||
|
||||
steam_color_r = "255",
|
||||
steam_color_g = "255",
|
||||
steam_color_b = "255",
|
||||
steam_color_a = "255",
|
||||
steam_jetlength = "256",
|
||||
steam_spreadspeed = "32",
|
||||
steam_speed = "120",
|
||||
steam_startsize = "32",
|
||||
steam_endsize = "82",
|
||||
steam_rate = "24",
|
||||
steam_rollspeed = "2",
|
||||
steam_emissive = "1",
|
||||
steam_heatwave = "0",
|
||||
steam_makesound = "0",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "steam", "Vapour Jet (Small)", {
|
||||
|
||||
steam_color_r = "255",
|
||||
steam_color_g = "255",
|
||||
steam_color_b = "255",
|
||||
steam_color_a = "255",
|
||||
steam_jetlength = "64",
|
||||
steam_spreadspeed = "12",
|
||||
steam_speed = "150",
|
||||
steam_startsize = "6",
|
||||
steam_endsize = "16",
|
||||
steam_rate = "64",
|
||||
steam_rollspeed = "12",
|
||||
steam_emissive = "1",
|
||||
steam_heatwave = "0",
|
||||
steam_makesound = "1",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "steam", "Vapour Jet (Medium)", {
|
||||
|
||||
steam_color_r = "255",
|
||||
steam_color_g = "255",
|
||||
steam_color_b = "255",
|
||||
steam_color_a = "255",
|
||||
steam_jetlength = "128",
|
||||
steam_spreadspeed = "21",
|
||||
steam_speed = "140",
|
||||
steam_startsize = "12",
|
||||
steam_endsize = "42",
|
||||
steam_rate = "32",
|
||||
steam_rollspeed = "10",
|
||||
steam_emissive = "1",
|
||||
steam_heatwave = "0",
|
||||
steam_makesound = "1",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "steam", "Vapour Jet (Big)", {
|
||||
|
||||
steam_color_r = "255",
|
||||
steam_color_g = "255",
|
||||
steam_color_b = "255",
|
||||
steam_color_a = "255",
|
||||
steam_jetlength = "256",
|
||||
steam_spreadspeed = "21",
|
||||
steam_speed = "160",
|
||||
steam_startsize = "16",
|
||||
steam_endsize = "52",
|
||||
steam_rate = "32",
|
||||
steam_rollspeed = "8",
|
||||
steam_emissive = "1",
|
||||
steam_heatwave = "0",
|
||||
steam_makesound = "1",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "steam", "Mist", {
|
||||
|
||||
steam_color_r = "255",
|
||||
steam_color_g = "255",
|
||||
steam_color_b = "255",
|
||||
steam_color_a = "42",
|
||||
steam_jetlength = "256",
|
||||
steam_spreadspeed = "128",
|
||||
steam_speed = "82",
|
||||
steam_startsize = "64",
|
||||
steam_endsize = "92",
|
||||
steam_rate = "16",
|
||||
steam_rollspeed = "2",
|
||||
steam_emissive = "1",
|
||||
steam_heatwave = "0",
|
||||
steam_makesound = "0",
|
||||
|
||||
} )
|
||||
|
||||
//TESLA
|
||||
|
||||
presets.Add( "tesla", "Disco", {
|
||||
|
||||
tesla_dischargeradius = "1024",
|
||||
tesla_dischargeinterval = "0.5",
|
||||
tesla_beamcount = "12",
|
||||
tesla_beamthickness = "10",
|
||||
tesla_beamlifetime = "2.1",
|
||||
tesla_sound = "0",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "tesla", "Local Spark", {
|
||||
|
||||
tesla_dischargeradius = "128",
|
||||
tesla_dischargeinterval = "1.12",
|
||||
tesla_beamcount = "12",
|
||||
tesla_beamthickness = "6",
|
||||
tesla_beamlifetime = "0.12",
|
||||
tesla_sound = "1",
|
||||
|
||||
} )
|
||||
|
||||
presets.Add( "tesla", "Single Powerful Discharge", {
|
||||
|
||||
tesla_dischargeradius = "2048",
|
||||
tesla_dischargeinterval = "2.1",
|
||||
tesla_beamcount = "2",
|
||||
tesla_beamthickness = "16",
|
||||
tesla_beamlifetime = "0.12",
|
||||
tesla_sound = "0",
|
||||
|
||||
} )
|
||||
|
||||
|
||||
end
|
||||
|
||||
//Make sure all clients download default presets
|
||||
if SERVER then
|
||||
AddCSLuaFile("autorun/default_sfx_presets_d2k.lua")
|
||||
end
|
||||
68
lua/autorun/dem_init.lua
Normal file
68
lua/autorun/dem_init.lua
Normal file
@@ -0,0 +1,68 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
if CLIENT then
|
||||
local math_Clamp = math.Clamp
|
||||
local render_GetLightColor = render.GetLightColor
|
||||
local default0 = Vector(0,0,0)
|
||||
local defaultTint = Vector()
|
||||
|
||||
matproxy.Add({
|
||||
name = "DynamicEnvMap",
|
||||
init = function(self,mat,values)
|
||||
self.Result = values.resultvar
|
||||
|
||||
self.TintScale = mat:GetVector("$DEM_TintScale") or defaultTint
|
||||
self.Multiplier = mat:GetFloat("$DEM_Multiplier") or 1
|
||||
self.ClampMin = mat:GetVector("$DEM_ClampMin") or default0
|
||||
self.ClampMax = mat:GetVector("$DEM_ClampMax")
|
||||
self.Color = (mat:GetVector("$DEM_Color") or mat:GetVector("$color")) or defaultTint
|
||||
end,
|
||||
bind = function(self,mat,ent)
|
||||
if (!IsValid(ent)) then return end
|
||||
|
||||
local finalResult = defaultTint
|
||||
local mult = self.Multiplier
|
||||
local clampMin = self.ClampMin
|
||||
local clampMax = self.ClampMax
|
||||
local tint = self.TintScale *self.Color
|
||||
local luminance = render_GetLightColor(ent:GetPos() +ent:OBBCenter()) *mult
|
||||
finalResult = (tint *luminance) *mult
|
||||
if clampMax then
|
||||
finalResult.x = math_Clamp(finalResult.x,clampMin.x,clampMax.x)
|
||||
finalResult.y = math_Clamp(finalResult.y,clampMin.y,clampMax.y)
|
||||
finalResult.z = math_Clamp(finalResult.z,clampMin.z,clampMax.z)
|
||||
end
|
||||
|
||||
-- print(tint,self.Color,finalResult)
|
||||
mat:SetVector(self.Result,finalResult)
|
||||
end
|
||||
})
|
||||
|
||||
print("DynamicEnvMap proxy successfully loaded!")
|
||||
end
|
||||
|
||||
/*
|
||||
Add this to your VMT to initialize the proxy:
|
||||
|
||||
"$DEM_TintScale" "[1 1 1]" // Color scaling essentially, if you want default envmap tint, leave this as is
|
||||
"$DEM_Multiplier" "1" // Multiplies the output, should change this based on other $envmap settings that alter the strength/color
|
||||
"$DEM_ClampMin" "[0 0 0]" // Optional, clamps the output to a minimum value
|
||||
"$DEM_ClampMax" "[1 1 1]" // Optional, clamps the output to a maximum value
|
||||
"$DEM_Color" "[1 1 1]" // Optional, changes the envmaptint, otherwise it will use $color (or white) by default
|
||||
|
||||
"Proxies"
|
||||
{
|
||||
"DynamicEnvMap"
|
||||
{
|
||||
resultVar "$envmaptint"
|
||||
}
|
||||
}
|
||||
*/
|
||||
157
lua/autorun/developer_functions.lua
Normal file
157
lua/autorun/developer_functions.lua
Normal file
@@ -0,0 +1,157 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
local function FindInTable( tab, find, parents, depth )
|
||||
|
||||
depth = depth or 0
|
||||
parents = parents or ""
|
||||
|
||||
if ( !istable( tab ) ) then return end
|
||||
if ( depth > 3 ) then return end
|
||||
depth = depth + 1
|
||||
|
||||
for k, v in pairs ( tab ) do
|
||||
|
||||
if ( isstring( k ) ) then
|
||||
|
||||
if ( k and k:lower():find( find:lower() ) ) then
|
||||
|
||||
Msg( "\t", parents, k, " - (", type( v ), " - ", v, ")\n" )
|
||||
|
||||
end
|
||||
|
||||
-- Recurse
|
||||
if ( istable( v ) and
|
||||
k != "_R" and
|
||||
k != "_E" and
|
||||
k != "_G" and
|
||||
k != "_M" and
|
||||
k != "_LOADED" and
|
||||
k != "__index" ) then
|
||||
|
||||
local NewParents = parents .. k .. "."
|
||||
FindInTable( v, find, NewParents, depth )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local function FindInHooks( base, name )
|
||||
|
||||
for b, t in pairs( hook.GetTable() ) do
|
||||
|
||||
local head = true
|
||||
|
||||
if ( istable( t ) and b:lower():find( base:lower() ) ) then
|
||||
|
||||
for n, f in pairs( t ) do
|
||||
|
||||
if ( !name or tostring( n ):lower():find( tostring( name ):lower() ) ) then
|
||||
|
||||
if ( head ) then Msg( "\n\t", b, " hooks:\n" ) head = false end
|
||||
|
||||
Msg( "\t\t", tostring( n ), " - (", tostring( f ), ")\n" )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local function UTIL_IsCommandIssuedByServerAdmin( ply )
|
||||
if ( game.SinglePlayer() ) then return true end -- Singleplayer
|
||||
if ( !IsValid( ply ) ) then return SERVER end -- Dedicated server console
|
||||
|
||||
return ply:IsListenServerHost() -- Only if we are a listen server host
|
||||
end
|
||||
|
||||
--[[---------------------------------------------------------
|
||||
Name: Find
|
||||
-----------------------------------------------------------]]
|
||||
local function Find( ply, command, arguments )
|
||||
|
||||
if ( !UTIL_IsCommandIssuedByServerAdmin( ply ) ) then return end
|
||||
|
||||
if ( !arguments[1] ) then
|
||||
|
||||
if ( command:StartsWith( "lua_findhooks" ) ) then
|
||||
MsgN( "Usage: lua_findhooks <event name> [hook identifier]" )
|
||||
return
|
||||
end
|
||||
|
||||
MsgN( "Usage: lua_find <text>" )
|
||||
return
|
||||
end
|
||||
|
||||
if ( command:StartsWith( "lua_findhooks" ) ) then
|
||||
|
||||
Msg( "Finding '", arguments[1], "' hooks ",
|
||||
( arguments[2] and "with name '" .. arguments[2] .. "' " or "" ),
|
||||
( SERVER and "SERVERSIDE" or "CLIENTSIDE" ), ":\n\n"
|
||||
)
|
||||
FindInHooks( arguments[1], arguments[2] )
|
||||
|
||||
else
|
||||
|
||||
Msg( "Finding '", arguments[1], "' ", ( SERVER and "SERVERSIDE" or "CLIENTSIDE" ), ":\n\n" )
|
||||
FindInTable( _G, arguments[1] )
|
||||
--FindInTable( debug.getregistry(), arguments[1] )
|
||||
|
||||
end
|
||||
|
||||
Msg( "\n\n" )
|
||||
|
||||
if ( SERVER and IsValid( ply ) and ply:IsPlayer() and ply:IsListenServerHost() ) then
|
||||
RunConsoleCommand( command .. "_cl", arguments[1], arguments[2] )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if ( SERVER ) then
|
||||
concommand.Add( "lua_find", Find, nil, "Find any variable by name on the server.", FCVAR_DONTRECORD )
|
||||
concommand.Add( "lua_findhooks", Find, nil, "Find hooks by event name and hook identifier on the server.", FCVAR_DONTRECORD )
|
||||
else
|
||||
concommand.Add( "lua_find_cl", Find, nil, "Find any variable by name on the client.", FCVAR_DONTRECORD )
|
||||
concommand.Add( "lua_findhooks_cl", Find, nil, "Find hooks by event name and hook identifier on the client.", FCVAR_DONTRECORD )
|
||||
end
|
||||
|
||||
if ( SERVER ) then
|
||||
|
||||
--[[---------------------------------------------------------
|
||||
What am I looking at?
|
||||
-----------------------------------------------------------]]
|
||||
concommand.Add( "trace", function( ply )
|
||||
if ( !IsValid( ply ) || ( !game.SinglePlayer() && !ply:IsListenServerHost() ) ) then return end
|
||||
|
||||
local tr = util.TraceLine( {
|
||||
start = ply:EyePos(),
|
||||
endpos = ply:EyePos() + ply:GetAimVector() * 30000,
|
||||
filter = ply,
|
||||
//mask = MASK_OPAQUE_AND_NPCS,
|
||||
} )
|
||||
|
||||
PrintTable( tr )
|
||||
print( "Dist: ", ( tr.HitPos - tr.StartPos ):Length() )
|
||||
if ( IsValid( tr.Entity ) ) then print( "Model: " .. tr.Entity:GetModel() ) end
|
||||
|
||||
-- Print out the clientside class name
|
||||
ply:SendLua( [[print(Entity(]] .. ply:EntIndex() .. [[):GetEyeTrace().Entity)]] )
|
||||
end )
|
||||
|
||||
end
|
||||
28
lua/autorun/eft_shared.lua
Normal file
28
lua/autorun/eft_shared.lua
Normal file
@@ -0,0 +1,28 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
-- Ammo types
|
||||
|
||||
local ammotable = {}
|
||||
ammotable["556_M855"] = "556x45mm M855"
|
||||
ammotable["556_M995"] = "556x45mm M995"
|
||||
ammotable["556_HP"] = "556x45mm HP"
|
||||
|
||||
for v, k in pairs(ammotable) do
|
||||
game.AddAmmoType({
|
||||
name = v,
|
||||
dmgtype = DMG_BULLET,
|
||||
tracer = TRACER_LINE_AND_WHIZ
|
||||
})
|
||||
if CLIENT then
|
||||
language.Add( v .. "_ammo", k )
|
||||
end
|
||||
end
|
||||
12
lua/autorun/eprotect_loader.lua
Normal file
12
lua/autorun/eprotect_loader.lua
Normal file
@@ -0,0 +1,12 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
if slib and slib.loadFolder then slib.loadFolder("e_protect/", true, {{"e_protect/", "sh_config.lua"}}) end
|
||||
hook.Add("slib:loadedUtils", "eP:Initialize", function() slib.loadFolder("e_protect/", true, {{"e_protect/", "sh_config.lua"}}) end)
|
||||
148
lua/autorun/game_hl2.lua
Normal file
148
lua/autorun/game_hl2.lua
Normal file
@@ -0,0 +1,148 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
local Category = ""
|
||||
|
||||
local function ADD_ITEM( name, class, offset, extras, classOverride )
|
||||
|
||||
local base = { PrintName = name, ClassName = class, Category = Category, NormalOffset = offset or 32, DropToFloor = true, Author = "VALVe" }
|
||||
list.Set( "SpawnableEntities", classOverride or class, table.Merge( base, extras or {} ) )
|
||||
duplicator.Allow( class )
|
||||
|
||||
end
|
||||
|
||||
local function ADD_WEAPON( name, class )
|
||||
|
||||
list.Set( "Weapon", class, { ClassName = class, PrintName = name, Category = Category, Author = "VALVe", Spawnable = true } )
|
||||
duplicator.Allow( class )
|
||||
|
||||
end
|
||||
|
||||
Category = "Half-Life 2"
|
||||
|
||||
-- Ammo
|
||||
ADD_ITEM( "AR2 Ammo", "item_ammo_ar2", -8 )
|
||||
ADD_ITEM( "AR2 Ammo (Large)", "item_ammo_ar2_large", -8 )
|
||||
|
||||
ADD_ITEM( "Pistol Ammo", "item_ammo_pistol", -4 )
|
||||
ADD_ITEM( "Pistol Ammo (Large)", "item_ammo_pistol_large", -4 )
|
||||
|
||||
ADD_ITEM( "357 Ammo", "item_ammo_357", -4 )
|
||||
ADD_ITEM( "357 Ammo (Large)", "item_ammo_357_large", -4 )
|
||||
|
||||
ADD_ITEM( "SMG Ammo", "item_ammo_smg1", -2 )
|
||||
ADD_ITEM( "SMG Ammo (Large)", "item_ammo_smg1_large", -2 )
|
||||
|
||||
ADD_ITEM( "SMG Grenade", "item_ammo_smg1_grenade", -10 )
|
||||
ADD_ITEM( "Crossbow Bolts", "item_ammo_crossbow", -10 )
|
||||
ADD_ITEM( "Shotgun Ammo", "item_box_buckshot", -10 )
|
||||
ADD_ITEM( "AR2 Orb", "item_ammo_ar2_altfire", -2 )
|
||||
ADD_ITEM( "RPG Rocket", "item_rpg_round", -10 )
|
||||
|
||||
-- Dynamic materials; gives player what he needs most (health, shotgun ammo, suit energy, etc)
|
||||
-- ADD_ITEM( "Dynamic Supplies", "item_dynamic_resupply" )
|
||||
|
||||
-- Items
|
||||
ADD_ITEM( "Suit Battery", "item_battery", -4 )
|
||||
ADD_ITEM( "Health Kit", "item_healthkit", -8 )
|
||||
ADD_ITEM( "Health Vial", "item_healthvial", -4 )
|
||||
ADD_ITEM( "Suit Charger", "item_suitcharger" )
|
||||
ADD_ITEM( "Health Charger", "item_healthcharger" )
|
||||
ADD_ITEM( "HEV Suit", "item_suit", 0 )
|
||||
|
||||
ADD_ITEM( "Thumper", "prop_thumper" )
|
||||
ADD_ITEM( "Combine Mine", "combine_mine", -8 )
|
||||
ADD_ITEM( "Zombine Grenade", "npc_grenade_frag", -8 )
|
||||
ADD_ITEM( "Helicopter Grenade", "grenade_helicopter", 4 )
|
||||
|
||||
if ( IsMounted( "ep2" ) ) then
|
||||
game.AddParticles( "particles/striderbuster.pcf" )
|
||||
ADD_ITEM( "Magnusson", "weapon_striderbuster" )
|
||||
end
|
||||
|
||||
-- Weapons
|
||||
ADD_WEAPON( "Gravity Gun", "weapon_physcannon" )
|
||||
ADD_WEAPON( "Stunstick", "weapon_stunstick" )
|
||||
ADD_WEAPON( "Frag Grenade", "weapon_frag" )
|
||||
ADD_WEAPON( "Crossbow", "weapon_crossbow" )
|
||||
ADD_WEAPON( "Bug Bait", "weapon_bugbait" )
|
||||
ADD_WEAPON( "RPG Launcher", "weapon_rpg" )
|
||||
ADD_WEAPON( "Crowbar", "weapon_crowbar" )
|
||||
ADD_WEAPON( "Shotgun", "weapon_shotgun" )
|
||||
ADD_WEAPON( "9mm Pistol", "weapon_pistol" )
|
||||
ADD_WEAPON( "S.L.A.M", "weapon_slam" )
|
||||
ADD_WEAPON( "SMG", "weapon_smg1" )
|
||||
ADD_WEAPON( "Pulse-Rifle", "weapon_ar2" )
|
||||
ADD_WEAPON( ".357 Magnum", "weapon_357" )
|
||||
--ADD_WEAPON( "Alyx Gun", "weapon_alyxgun" )
|
||||
--ADD_WEAPON( "Annabelle", "weapon_annabelle" )
|
||||
|
||||
-- NPC Weapons
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_pistol", title = "#weapon_pistol", category = Category } )
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_357", title = "#weapon_357", category = Category } )
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_smg1", title = "#weapon_smg1", category = Category } )
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_shotgun", title = "#weapon_shotgun", category = Category } )
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_ar2", title = "#weapon_ar2", category = Category } )
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_rpg", title = "#weapon_rpg", category = Category } )
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_alyxgun", title = "#weapon_alyxgun", category = Category } )
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_annabelle", title = "#weapon_annabelle", category = Category } )
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_crossbow", title = "#weapon_crossbow", category = Category } )
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_stunstick", title = "#weapon_stunstick", category = Category } )
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_crowbar", title = "#weapon_crowbar", category = Category } )
|
||||
|
||||
if ( IsMounted( "hl1" ) or IsMounted( "hl1mp" ) ) then
|
||||
Category = "Half-Life: Source"
|
||||
|
||||
ADD_WEAPON( "Snarks", "weapon_snark" )
|
||||
ADD_WEAPON( "Hand Grenade", "weapon_handgrenade" )
|
||||
ADD_WEAPON( "MP5", "weapon_mp5_hl1" )
|
||||
ADD_WEAPON( "Hornet Gun", "weapon_hornetgun" )
|
||||
ADD_WEAPON( "Satchel", "weapon_satchel" )
|
||||
ADD_WEAPON( "Tripmine", "weapon_tripmine" )
|
||||
ADD_WEAPON( "Crossbow", "weapon_crossbow_hl1" )
|
||||
ADD_WEAPON( ".357 Handgun", "weapon_357_hl1" )
|
||||
ADD_WEAPON( "RPG Launcher", "weapon_rpg_hl1" )
|
||||
ADD_WEAPON( "SPAS-12", "weapon_shotgun_hl1" )
|
||||
ADD_WEAPON( "Glock", "weapon_glock_hl1" )
|
||||
ADD_WEAPON( "Tau Cannon", "weapon_gauss" )
|
||||
ADD_WEAPON( "Gluon Gun", "weapon_egon" )
|
||||
ADD_WEAPON( "Crowbar", "weapon_crowbar_hl1" )
|
||||
|
||||
ADD_ITEM( "Crossbow Bolts", "ammo_crossbow", 0 )
|
||||
ADD_ITEM( "Uranium", "ammo_gaussclip", 0 )
|
||||
ADD_ITEM( "Glock Clip", "ammo_glockclip", 0 )
|
||||
ADD_ITEM( "MP5 Clip", "ammo_mp5clip", 0 )
|
||||
ADD_ITEM( "MP5 Ammo Crate", "ammo_9mmbox", 0 )
|
||||
ADD_ITEM( "MP5 Grenades", "ammo_mp5grenades", 0 )
|
||||
ADD_ITEM( ".357 Ammo", "ammo_357", 0 )
|
||||
ADD_ITEM( "RPG Rockets", "ammo_rpgclip", 0 )
|
||||
ADD_ITEM( "SPAS-12 Ammo", "ammo_buckshot", 0 )
|
||||
--ADD_ITEM( "Uranium (Egon)", "ammo_egonclip", 0 )
|
||||
--ADD_ITEM( "MP5 Ammo", "ammo_9mmclip", 0 )
|
||||
--ADD_ITEM( "MP5 Ammo", "ammo_9mmar", 0 )
|
||||
--ADD_ITEM( "MP5 Grenade", "ammo_argrenades", 0 )
|
||||
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_357_hl1", title = "#weapon_357_hl1", category = Category } )
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_glock_hl1", title = "#weapon_glock_hl1", category = Category } )
|
||||
list.Add( "NPCUsableWeapons", { class = "weapon_shotgun_hl1", title = "#weapon_shotgun_hl1", category = Category } )
|
||||
end
|
||||
|
||||
if ( IsMounted( "portal" ) ) then
|
||||
Category = "Portal"
|
||||
|
||||
ADD_ITEM( "Curiosity Core", "prop_glados_core", 32, { KeyValues = { CoreType = 0, DelayBetweenLines = 0.4 } }, "prop_glados_core" )
|
||||
ADD_ITEM( "Anger Core", "prop_glados_core", 32, { KeyValues = { CoreType = 1, DelayBetweenLines = 0.1 } }, "prop_glados_core_anger" )
|
||||
ADD_ITEM( "Intelligence Core", "prop_glados_core", 32, { KeyValues = { CoreType = 2, DelayBetweenLines = 0.1 } }, "prop_glados_core_crazy" )
|
||||
ADD_ITEM( "Morality Core", "prop_glados_core", 32, { KeyValues = { CoreType = 3 } }, "prop_glados_core_morality" )
|
||||
end
|
||||
|
||||
Category = "Other"
|
||||
ADD_WEAPON( "Physics Gun", "weapon_physgun" )
|
||||
12
lua/autorun/gm_express_init.lua
Normal file
12
lua/autorun/gm_express_init.lua
Normal file
@@ -0,0 +1,12 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile( "includes/modules/pon.lua" )
|
||||
include( "gm_express/sh_init.lua" )
|
||||
112
lua/autorun/hla_antlion_autorun.lua
Normal file
112
lua/autorun/hla_antlion_autorun.lua
Normal file
@@ -0,0 +1,112 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
/*--------------------------------------------------
|
||||
=============== Autorun File ===============
|
||||
*** Copyright (c) 2012-2021 by Mayhem, All rights reserved. ***
|
||||
No parts of this code or any of its contents may be reproduced, copied, modified or adapted,
|
||||
without the prior written consent of the author, unless otherwise indicated for stand-alone materials.
|
||||
--------------------------------------------------*/
|
||||
------------------ Addon Information ------------------
|
||||
local PublicAddonName = "Half-Life: Alyx - Antlion"
|
||||
local AddonName = "Half-Life: Alyx - Antlion"
|
||||
local AddonType = "SNPC"
|
||||
local AutorunFile = "autorun/hla_antlion_autorun.lua"
|
||||
-------------------------------------------------------
|
||||
local VJExists = file.Exists("lua/autorun/vj_base_autorun.lua","GAME")
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
sound.AddSoundOverrides("lua/sound/hla_antlions.lua")
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
if VJExists == true then
|
||||
include('autorun/vj_controls.lua')
|
||||
|
||||
local vCat = "Half-Life: Alyx"
|
||||
VJ.AddNPC("Antlion","npc_vj_hla_antlion",vCat)
|
||||
VJ.AddNPC("Antlion Spitter","npc_vj_hla_antlion_spitter",vCat)
|
||||
--VJ.AddNPC("Antlion AI Director","sent_vj_antlion_director",vCat,true) -- Currently broken
|
||||
|
||||
-- Menu --
|
||||
VJ.AddConVar("vj_antlion_director_enabled",1)
|
||||
VJ.AddConVar("vj_antlion_director_max",80)
|
||||
VJ.AddConVar("vj_antlion_director_hordecount",35)
|
||||
VJ.AddConVar("vj_antlion_director_spawnmax",300)
|
||||
VJ.AddConVar("vj_antlion_director_spawnmin",100)
|
||||
VJ.AddConVar("vj_antlion_director_hordechance",100)
|
||||
VJ.AddConVar("vj_antlion_director_hordecooldownmin",120)
|
||||
VJ.AddConVar("vj_antlion_director_hordecooldownmax",180)
|
||||
VJ.AddConVar("vj_antlion_director_delaymin",0.85)
|
||||
VJ.AddConVar("vj_antlion_director_delaymax",3)
|
||||
|
||||
if CLIENT then
|
||||
hook.Add("PopulateToolMenu", "VJ_ADDTOMENU_HLA", function()
|
||||
spawnmenu.AddToolMenuOption("DrVrej", "SNPC Configures", "Half-Life: Alyx - Antlion Director", "Half-Life: Alyx - Antlion Director", "", "", function(Panel)
|
||||
if !game.SinglePlayer() then
|
||||
if !LocalPlayer():IsAdmin() or !LocalPlayer():IsSuperAdmin() then
|
||||
Panel:AddControl( "Label", {Text = "You are not an admin!"})
|
||||
Panel:ControlHelp("Notice: Only admins can change rest of the settings.")
|
||||
return
|
||||
end
|
||||
end
|
||||
Panel:AddControl("Label", {Text = "Notice: Only admins can change this settings."})
|
||||
Panel:AddControl("Checkbox", {Label = "Enable AI Director processing?", Command = "vj_antlion_director_enabled"})
|
||||
Panel:AddControl("Slider", { Label = "Max Antlions", Command = "vj_antlion_director_max", Type = "Float", Min = "5", Max = "400"})
|
||||
Panel:AddControl("Slider", { Label = "Min Distance they can spawn from players", Command = "vj_antlion_director_spawnmin", Type = "Float", Min = "150", Max = "30000"})
|
||||
Panel:AddControl("Slider", { Label = "Max Distance they can spawn from players", Command = "vj_antlion_director_spawnmax", Type = "Float", Min = "150", Max = "30000"})
|
||||
Panel:AddControl("Slider", { Label = "Min time between spawns", Command = "vj_antlion_director_delaymin", Type = "Float", Min = "0.1", Max = "15"})
|
||||
Panel:AddControl("Slider", { Label = "Max time between spawns", Command = "vj_antlion_director_delaymax", Type = "Float", Min = "0.2", Max = "15"})
|
||||
Panel:AddControl("Slider", { Label = "Max Horde Antlions", Command = "vj_antlion_director_hordecount", Type = "Float", Min = "5", Max = "400"})
|
||||
Panel:AddControl("Slider", { Label = "Chance that a horde will appear", Command = "vj_antlion_director_hordechance", Type = "Float", Min = "1", Max = "500"})
|
||||
Panel:AddControl("Slider", { Label = "Min cooldown time for horde spawns", Command = "vj_antlion_director_hordecooldownmin", Type = "Float", Min = "1", Max = "800"})
|
||||
Panel:AddControl("Slider", { Label = "Max cooldown time for horde spawns", Command = "vj_antlion_director_hordecooldownmax", Type = "Float", Min = "1", Max = "800"})
|
||||
end, {})
|
||||
end)
|
||||
end
|
||||
|
||||
VJ_ANT_NODEPOS = {}
|
||||
hook.Add("EntityRemoved","VJ_AddNodes_Antlion",function(ent)
|
||||
if ent:GetClass() == "info_node" then
|
||||
table.insert(VJ_ANT_NODEPOS,ent:GetPos())
|
||||
end
|
||||
end)
|
||||
|
||||
VJ.AddCategoryInfo(vCat,{Icon = "vj_icons/AntlionLogoHLA.png"})
|
||||
-- !!!!!! DON'T TOUCH ANYTHING BELOW THIS !!!!!! -------------------------------------------------------------------------------------------------------------------------
|
||||
AddCSLuaFile(AutorunFile)
|
||||
VJ.AddAddonProperty(AddonName,AddonType)
|
||||
else
|
||||
if (CLIENT) then
|
||||
chat.AddText(Color(0,200,200),PublicAddonName,
|
||||
Color(0,255,0)," was unable to install, you are missing ",
|
||||
Color(255,100,0),"VJ Base!")
|
||||
end
|
||||
timer.Simple(1,function()
|
||||
if not VJF then
|
||||
if (CLIENT) then
|
||||
VJF = vgui.Create("DFrame")
|
||||
VJF:SetTitle("VJ Base is not installed")
|
||||
VJF:SetSize(900,800)
|
||||
VJF:SetPos((ScrW()-VJF:GetWide())/2,(ScrH()-VJF:GetTall())/2)
|
||||
VJF:MakePopup()
|
||||
VJF.Paint = function()
|
||||
draw.RoundedBox(8,0,0,VJF:GetWide(),VJF:GetTall(),Color(200,0,0,150))
|
||||
end
|
||||
local VJURL = vgui.Create("DHTML")
|
||||
VJURL:SetParent(VJF)
|
||||
VJURL:SetPos(VJF:GetWide()*0.005, VJF:GetTall()*0.03)
|
||||
local x,y = VJF:GetSize()
|
||||
VJURL:SetSize(x*0.99,y*0.96)
|
||||
VJURL:SetAllowLua(true)
|
||||
VJURL:OpenURL("https://sites.google.com/site/vrejgaming/vjbasemissing")
|
||||
elseif (SERVER) then
|
||||
timer.Create("VJBASEMissing",5,0,function() print("VJ Base is Missing! Download it from the workshop!") end)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
355
lua/autorun/hlr/autoreplace.lua
Normal file
355
lua/autorun/hlr/autoreplace.lua
Normal file
@@ -0,0 +1,355 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
if CLIENT then return end
|
||||
print("Executing Half-Life Resurgence auto replace script...")
|
||||
|
||||
-- https://developer.valvesoftware.com/wiki/Half-Life.fgd
|
||||
-- https://developer.valvesoftware.com/wiki/Half_Life_2.fgd
|
||||
|
||||
local replaceTbl_Entities = {
|
||||
-- Half-Life 1 --
|
||||
["monster_alien_grunt"] = "npc_vj_hlr1_aliengrunt",
|
||||
["monster_nihilanth"] = "npc_vj_hlr1_nihilanth",
|
||||
["monster_tentacle"] = "npc_vj_hlr1_tentacle",
|
||||
["monster_alien_slave"] = "npc_vj_hlr1_alienslave",
|
||||
["monster_bigmomma"] = "npc_vj_hlr1_gonarch",
|
||||
["monster_bullchicken"] = "npc_vj_hlr1_bullsquid",
|
||||
["monster_gargantua"] = "npc_vj_hlr1_garg",
|
||||
["monster_human_assassin"] = "npc_vj_hlr1_assassin_female",
|
||||
["monster_babycrab"] = "npc_vj_hlr1_headcrab_baby",
|
||||
-- ["monster_human_grunt"] = {"npc_vj_hlr1_hgrunt","npc_vj_hlrof_hgrunt","npc_vj_hlrof_hgrunt_med","npc_vj_hlrof_hgrunt_eng"},
|
||||
["monster_human_grunt"] = "npc_vj_hlr1_hgrunt",
|
||||
["monster_cockroach"] = "npc_vj_hlr1_cockroach",
|
||||
["monster_houndeye"] = "npc_vj_hlr1_houndeye",
|
||||
["monster_scientist"] = "npc_vj_hlr1_scientist",
|
||||
["monster_sitting_scientist"] = "npc_vj_hlr1_scientist",
|
||||
["monster_snark"] = "npc_vj_hlr1_snark",
|
||||
["monster_zombie"] = {"npc_vj_hlr1_zombie","npc_vj_hlr1_zombie","npc_vj_hlr1_zombie","npc_vj_hlrof_zombie_sec","npc_vj_hlrof_zombie_sec","npc_vj_hlrof_zombie_soldier"},
|
||||
["monster_headcrab"] = "npc_vj_hlr1_headcrab",
|
||||
["monster_alien_controller"] = "npc_vj_hlr1_aliencontroller",
|
||||
["monster_barney"] = "npc_vj_hlr1_securityguard",
|
||||
["monster_turret"] = "npc_vj_hlr1_turret",
|
||||
["monster_miniturret"] = "npc_vj_hlr1_turret_small",
|
||||
["monster_sentry"] = "npc_vj_hlr1_sentry",
|
||||
["monster_barnacle"] = "npc_vj_hlr1_barnacle",
|
||||
["monster_ichthyosaur"] = "npc_vj_hlr1_ichthyosaur",
|
||||
["monster_gman"] = "npc_vj_hlr1_gman",
|
||||
["monster_apache"] = "npc_vj_hlr1_apache",
|
||||
["monster_osprey"] = "npc_vj_hlr1_osprey",
|
||||
["monster_turret"] = "npc_vj_hlr1_cturret",
|
||||
["monster_miniturret"] = "npc_vj_hlr1_cturret_mini",
|
||||
-- Half-Life 2 --
|
||||
["npc_advisor"] = "npc_vj_hlr2_com_advisor",
|
||||
["npc_alyx"] = "npc_vj_hlr2_alyx",
|
||||
["npc_antlion"] = "npc_vj_hlr2_antlion",
|
||||
["npc_antlion_worker"] = "npc_vj_hlr2_antlion_worker",
|
||||
["npc_antlionguard"] = "npc_vj_hlr2_antlion_guard",
|
||||
["npc_barney"] = "npc_vj_hlr2_barney",
|
||||
["npc_citizen"] = "npc_vj_hlr2_citizen",
|
||||
["npc_combine_s"] = "npc_vj_hlr2_com_soldier",
|
||||
["npc_combinegunship"] = "npc_vj_hlr2_com_gunship",
|
||||
["npc_crabsynth"] = "npc_vj_hlr2_com_crab",
|
||||
["npc_fastzombie"] = "npc_vj_hlr2_zombie_fast",
|
||||
["npc_gman"] = "npc_vj_hlr2_gman",
|
||||
["npc_headcrab"] = "npc_vj_hlr2_headcrab",
|
||||
["npc_headcrab_black"] = "npc_vj_hlr2_headcrab_poison",
|
||||
["npc_headcrab_fast"] = "npc_vj_hlr2_headcrab_fast",
|
||||
["npc_helicopter"] = "npc_vj_hlr2_com_chopper",
|
||||
["npc_hunter"] = "npc_vj_hlr2_com_hunter",
|
||||
["npc_metropolice"] = "npc_vj_hlr2_com_civilp",
|
||||
["npc_monk"] = "npc_vj_hlr2_father_grigori",
|
||||
["npc_mortarsynth"] = "npc_vj_hlr2_com_mortar",
|
||||
["npc_poisonzombie"] = "npc_vj_hlr2_zombie_poison",
|
||||
["npc_sniper"] = "npc_vj_hlr2_com_sniper",
|
||||
["npc_stalker"] = "npc_vj_hlr2_com_stalker",
|
||||
["npc_strider"] = "npc_vj_hlr2_com_strider",
|
||||
["npc_turret_ceiling"] = "npc_vj_hlr2_com_ceilingturret",
|
||||
["npc_turret_floor"] = "npc_vj_hlr2_com_sentry",
|
||||
["npc_zombie"] = "npc_vj_hlr2_zombie",
|
||||
["npc_zombine"] = "npc_vj_hlr2_zombine",
|
||||
["prop_vehicle_apc"] = "npc_vj_hlr2_com_apc",
|
||||
}
|
||||
|
||||
local replaceTbl_Weapons = {
|
||||
-- Half-Life 2 --
|
||||
["weapon_357"] = "weapon_vj_357",
|
||||
["weapon_alyxgun"] = "weapon_vj_hlr2_alyxgun",
|
||||
["weapon_annabelle"] = "weapon_vj_hlr2_annabelle",
|
||||
["weapon_ar2"] = "weapon_vj_ar2",
|
||||
["weapon_crossbow"] = "weapon_vj_crossbow",
|
||||
["weapon_crowbar"] = "weapon_vj_crowbar",
|
||||
["weapon_pistol"] = "weapon_vj_9mmpistol",
|
||||
["weapon_rpg"] = "weapon_vj_hlr2_rpg",
|
||||
["weapon_shotgun"] = "weapon_vj_spas12",
|
||||
["weapon_smg1"] = "weapon_vj_smg1",
|
||||
["weapon_stunstick"] = "weapon_vj_hlr2_stunstick"
|
||||
}
|
||||
|
||||
local essentialTbl = { -- Will expand upon this later, I recommend we add support for custom HLR packs to add their own data to the auto-replace script (Example: Half-Life 2 HLR pack adding Kleiner or Breen to the auto-script)
|
||||
-- Half-Life 2 --
|
||||
npc_vj_hlr2_alyx=true,
|
||||
npc_vj_hlr2_barney=true,
|
||||
npc_vj_hlr2_father_grigori=true,
|
||||
}
|
||||
|
||||
-- Before Create
|
||||
local replaceOptions = {
|
||||
-- If its an antlion guardian, then make sure to spawn that variant!
|
||||
["npc_antlionguard"] = function(ent, replaceEnt)
|
||||
return (ent:GetSkin() == 0 and "npc_vj_hlr2_antlion_guard") or "npc_vj_hlr2_antlion_guardian"
|
||||
end,
|
||||
-- Handle citizen / refugee / rebel variants
|
||||
["npc_citizen"] = function(ent, replaceEnt)
|
||||
for key, val in pairs(ent:GetKeyValues()) do
|
||||
if key == "citizentype" then
|
||||
if val == 0 or val == 1 then
|
||||
return "npc_vj_hlr2_citizen"
|
||||
elseif val == 2 then
|
||||
return "npc_vj_hlr2_refugee"
|
||||
elseif val == 3 or val == 4 then
|
||||
return "npc_vj_hlr2_rebel"
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
-- Handle combine soldier variants
|
||||
["npc_combine_s"] = function(ent, replaceEnt)
|
||||
local mdl = ent:GetModel()
|
||||
if mdl == "models/combine_soldier.mdl" then
|
||||
return (ent:GetSkin() == 0 and "npc_vj_hlr2_com_soldier") or "npc_vj_hlr2_com_shotgunner"
|
||||
elseif mdl == "models/combine_soldier_prisonguard.mdl" then
|
||||
return (ent:GetSkin() == 0 and "npc_vj_hlr2_com_prospekt") or "npc_vj_hlr2_com_prospekt_sg"
|
||||
elseif mdl == "models/combine_super_soldier.mdl" then
|
||||
return "npc_vj_hlr2_com_elite"
|
||||
end
|
||||
end,
|
||||
-- Check for resistance turrets!
|
||||
["npc_turret_floor"] = function(ent, replaceEnt)
|
||||
return ent:HasSpawnFlags(SF_FLOOR_TURRET_CITIZEN) and "npc_vj_hlr2_res_sentry" or "npc_vj_hlr2_com_sentry"
|
||||
end
|
||||
}
|
||||
|
||||
-- Before Spawn
|
||||
local replacePreSpawn = {
|
||||
["npc_citizen"] = function(ent, newEnt)
|
||||
if string.find(ent:GetModel(), "female") then
|
||||
newEnt.Human_Gender = 1
|
||||
else
|
||||
newEnt.Human_Gender = 0
|
||||
end
|
||||
end,
|
||||
["npc_metropolice"] = function(ent, newEnt)
|
||||
for key, val in pairs(ent:GetKeyValues()) do
|
||||
if key == manhacks && val == 0 then
|
||||
newEnt.Metrocop_CanHaveManhack = false
|
||||
end
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
-- After Spawn
|
||||
local afterSpawned = {
|
||||
|
||||
}
|
||||
|
||||
// lua_run PrintTable(Entity(1):GetEyeTrace().Entity:GetTable())
|
||||
local defPos = Vector(0, 0, 0)
|
||||
|
||||
local gStatePrecriminal = false
|
||||
local gStateAntlionFri = false
|
||||
|
||||
-- Prepare the HL1 and HL2 tables (This includes ALL NPCs!)
|
||||
local allNPCs = list.Get("NPC")
|
||||
local allHLR = {}
|
||||
local allHLR1 = {}
|
||||
local allHLR2 = {}
|
||||
timer.Simple(0.01, function()
|
||||
for k, _ in pairs(allNPCs) do
|
||||
-- This should capture all the HL2 NPCs
|
||||
if string.StartWith(k, "npc_vj_hlr2") then
|
||||
table.insert(allHLR, k)
|
||||
table.insert(allHLR2, k)
|
||||
-- This should capture all the HL1 NPCs because many of them are "hlrof", "hlr1", "hlrsv", "hlrdc", etc.
|
||||
elseif string.StartWith(k, "npc_vj_hlr") then
|
||||
table.insert(allHLR, k)
|
||||
table.insert(allHLR1, k)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
hook.Add("OnEntityCreated", "VJ_HLR_AutoReplace_EntCreate", function(ent)
|
||||
local class = ent:GetClass()
|
||||
local rEnt = VJ_PICK(replaceTbl_Entities[class])
|
||||
if rEnt then
|
||||
-- Make sure the game is loaded
|
||||
if game && game.GetGlobalState then
|
||||
gStatePrecriminal = game.GetGlobalState("gordon_precriminal") == 1
|
||||
end
|
||||
-- Check if it's HL1 & HL2 and stop if it's not supposed to continue
|
||||
local isHL1 = string.StartWith(class, "monster_")
|
||||
if isHL1 then
|
||||
if GetConVar("vj_hlr_autoreplace_hl1"):GetInt() == 0 then
|
||||
return
|
||||
end
|
||||
elseif GetConVar("vj_hlr_autoreplace_hl2"):GetInt() == 0 then
|
||||
return
|
||||
end
|
||||
timer.Simple(0.01, function()
|
||||
if IsValid(ent) then
|
||||
local worldName = ent.GetName && ent:GetName() or nil
|
||||
//if worldName == "rocketman" then return end -- Makes Odessa work a little bit
|
||||
//local spawnAnim = ent:GetSequenceName(ent:GetSequence())
|
||||
-- Spawn the correct entity (Ex: different combine or rebels/citizens)
|
||||
if replaceOptions[class] then
|
||||
rEnt = replaceOptions[class](ent, rEnt) or rEnt
|
||||
end
|
||||
-- FUN OPTION: Randomized NPC System
|
||||
if GetConVar("vj_hlr_autoreplace_random"):GetInt() == 1 then
|
||||
if GetConVar("vj_hlr_autoreplace_randommix"):GetInt() == 1 then
|
||||
rEnt = VJ_PICK(allHLR) or rEnt
|
||||
else
|
||||
if isHL1 then
|
||||
rEnt = VJ_PICK(allHLR1) or rEnt
|
||||
else
|
||||
rEnt = VJ_PICK(allHLR2) or rEnt
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Start the actual final entity --
|
||||
local newClass = VJ_PICK(rEnt)
|
||||
local newEnt = ents.Create(newClass)
|
||||
if !IsValid(newEnt) then MsgN("Entity [" .. newClass .. "] not valid (missing pack?), keeping original entity") return end
|
||||
-- Certain entities need some checks before spawn (Ex: Citizen gender)
|
||||
if replacePreSpawn[class] then
|
||||
replacePreSpawn[class](ent, newEnt)
|
||||
end
|
||||
newEnt:SetPos(ent:GetPos() + Vector(0, 0, (class == "monster_barnacle" && -1) or 4))
|
||||
newEnt:SetAngles(ent:GetAngles())
|
||||
if IsValid(ent:GetParent()) then newEnt:SetParent(ent:GetParent()) end
|
||||
if worldName && worldName != "" then newEnt:SetName(worldName) end
|
||||
newEnt:Spawn()
|
||||
newEnt:Activate()
|
||||
-- Handle naming
|
||||
if worldName && worldName != "" then -- Scripted NPC
|
||||
newEnt.DisableWandering = true
|
||||
end
|
||||
-- Handle weapon
|
||||
local wep = ent.GetActiveWeapon && ent:GetActiveWeapon() or false -- In case GetActiveWeapon is not in the ent's metatable
|
||||
//print(worldName, wep)
|
||||
if IsValid(wep) then
|
||||
local foundWep = replaceTbl_Weapons[wep:GetClass()]
|
||||
newEnt:Give(VJ_PICK(foundWep))
|
||||
end
|
||||
-- Handle enemy
|
||||
local ene = ent.GetEnemy && ent:GetEnemy() or false -- In case GetEnemy is not in the ent's metatable
|
||||
if IsValid(ene) then
|
||||
newEnt:SetEnemy(ene)
|
||||
end
|
||||
-- Handle key values
|
||||
for key, val in pairs(ent:GetSaveTable()) do
|
||||
//print(ent, newEnt, key, val)
|
||||
key = tostring(key)
|
||||
if key == "health" then
|
||||
newEnt:SetHealth(val)
|
||||
elseif key == "max_health" then
|
||||
newEnt:SetMaxHealth(val)
|
||||
-- elseif key == "m_bSequenceLoops" && val == true && newEnt:GetInternalVariable("sequence") != -1 then
|
||||
-- newEnt.Old_AnimTbl_IdleStand = newEnt.AnimTbl_IdleStand
|
||||
-- newEnt.AnimTbl_IdleStand = {VJ_SequenceToActivity(newEnt,newEnt:GetInternalVariable("sequence"))}
|
||||
-- newEnt:SetState(VJ_STATE_ONLY_ANIMATION_NOATTACK)
|
||||
-- newEnt:VJ_ACT_PLAYACTIVITY(newEnt:GetInternalVariable("sequence"),true,false,false)
|
||||
elseif key == "m_vecLastPosition" then
|
||||
if val != defPos then
|
||||
newEnt:SetLastPosition(val)
|
||||
newEnt:VJ_TASK_GOTO_LASTPOS("TASK_WALK_PATH")
|
||||
end
|
||||
elseif key == "m_bShouldPatrol" && val == false then
|
||||
newEnt.DisableWandering = true
|
||||
-- Not what I thought it was, actual variable is m_LookDist using the function SetDistLook
|
||||
-- Which both of them can't be accessed in Lua...
|
||||
//elseif key == "m_flDistTooFar" then
|
||||
//newEnt.SightDistance = val
|
||||
end
|
||||
end
|
||||
//newEnt.SightDistance = 2048 -- Default Source engine sight distance...
|
||||
-- Handle spawn flags
|
||||
//if ent:HasSpawnFlags(SF_NPC_LONG_RANGE) then
|
||||
//newEnt.SightDistance = 6000
|
||||
//end
|
||||
newEnt:SetKeyValue("spawnflags", ent:GetSpawnFlags())
|
||||
if ent:HasSpawnFlags(SF_CITIZEN_NOT_COMMANDABLE) then
|
||||
newEnt.FollowPlayer = false
|
||||
end
|
||||
//print(ent:GetInternalVariable("m_bShouldPatrol"))
|
||||
-- Handle Gordon precriminal game state
|
||||
if gStatePrecriminal == true then -- Toggles friendly-AI for the intro of Half-Life 2
|
||||
//newEnt.DisableWandering = true
|
||||
newEnt.DisableFindEnemy = true
|
||||
newEnt.DisableMakingSelfEnemyToNPCs = true
|
||||
newEnt.FriendsWithAllPlayerAllies = true
|
||||
newEnt.FollowPlayer = false
|
||||
newEnt.Behavior = VJ_BEHAVIOR_PASSIVE
|
||||
newEnt.VJ_AutoScript_OldClass = newEnt.VJ_NPC_Class
|
||||
newEnt.VJ_NPC_Class = {"CLASS_PLAYER_ALLY", "CLASS_COMBINE"}
|
||||
newEnt.VJ_AutoScript_Reset = true
|
||||
end
|
||||
-- Things to run after it's fully spawned (EX: Turret sight distance)
|
||||
if afterSpawned[rEnt] then
|
||||
afterSpawned[rEnt](ent, newEnt)
|
||||
end
|
||||
-- Handle Essential NPCs
|
||||
if GetConVar("vj_hlr_autoreplace_essential"):GetInt() == 1 && essentialTbl[newClass] then
|
||||
newEnt.GodMode = true
|
||||
end
|
||||
-- FUN OPTION: Make them all allied together against players
|
||||
if GetConVar("vj_hlr_autoreplace_alliedagainstply"):GetInt() == 1 then
|
||||
newEnt.VJ_NPC_Class = {"CLASS_HALF_LIFE_AGAINST_PLAYERS"}
|
||||
end
|
||||
-- print(ent:GetClass(), ent:GetInternalVariable("GameEndAlly"))
|
||||
-- Set the starting animation AND velocity
|
||||
local vel = ent:GetVelocity()
|
||||
timer.Simple(0.01, function()
|
||||
if IsValid(newEnt) then
|
||||
//newEnt:VJ_ACT_PLAYACTIVITY(spawnAnim, true, false, false)
|
||||
if vel:Length() > 0 then
|
||||
newEnt:SetGroundEntity(NULL)
|
||||
newEnt:SetVelocity(vel)
|
||||
end
|
||||
end
|
||||
end)
|
||||
undo.ReplaceEntity(ent, newEnt)
|
||||
ent:Remove()
|
||||
end
|
||||
end)
|
||||
end
|
||||
end)
|
||||
|
||||
hook.Add("Think", "VJ_HLR_AutoReplace_Think", function()
|
||||
-- Make sure the game is loaded
|
||||
if game && game.GetGlobalState then
|
||||
gStatePrecriminal = game.GetGlobalState("gordon_precriminal") == 1
|
||||
gStateAntlionFri = game.GetGlobalState("antlion_allied") == 1
|
||||
end
|
||||
for _,v in ipairs(ents.GetAll()) do
|
||||
if v:IsNPC() then
|
||||
if !gStatePrecriminal && v.VJ_AutoScript_Reset then
|
||||
v.VJ_NPC_Class = v.VJ_AutoScript_OldClass
|
||||
v.VJ_AutoScript_Reset = false
|
||||
end
|
||||
if gStateAntlionFri && v.VJ_HLR_Antlion then
|
||||
table.insert(v.VJ_NPC_Class,"CLASS_PLAYER_ALLY")
|
||||
v.PlayerFriendly = true
|
||||
v.FriendsWithAllPlayerAllies = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
217
lua/autorun/include/pill_ep1.lua
Normal file
217
lua/autorun/include/pill_ep1.lua
Normal file
@@ -0,0 +1,217 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("ep1_advisorpod",{
|
||||
printName="Advisor Pod",
|
||||
side="hl_combine",
|
||||
type="phys",
|
||||
model="models/advisorpod.mdl",
|
||||
default_rp_cost=12000,
|
||||
camera={
|
||||
dist=500
|
||||
},
|
||||
health=5,
|
||||
onlyTakesExplosiveDamage=true,
|
||||
seqInit="idlefly",
|
||||
driveType="fly",
|
||||
driveOptions={
|
||||
speed=60,
|
||||
rotation2=90,
|
||||
rocketMode=true
|
||||
},
|
||||
attack={
|
||||
mode= "trigger",
|
||||
func= function(ply,ent)
|
||||
pk_pills.apply(ply,"ep2_advisor")
|
||||
ent:PillSound("breakout")
|
||||
end
|
||||
},
|
||||
damageFromWater=-1,
|
||||
sounds={
|
||||
loop_move="npc/combine_gunship/gunship_engine_loop3.wav",
|
||||
breakout="ambient/materials/cartrap_explode_impact1.wav"
|
||||
},
|
||||
trail={
|
||||
texture="trails/physbeam.vmt",
|
||||
width=200
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("ep1_ministrider",{
|
||||
printName="Ministrider",
|
||||
side="hl_combine",
|
||||
type="ply",
|
||||
model="models/ministrider.mdl",
|
||||
default_rp_cost=8000,
|
||||
camera={
|
||||
offset=Vector(0,0,100),
|
||||
dist=150
|
||||
},
|
||||
hull=Vector(60,60,100),
|
||||
anims={
|
||||
default={
|
||||
idle="idle1",
|
||||
walk="walk_all",
|
||||
run="canter_all",
|
||||
melee="meleeleft"
|
||||
}
|
||||
},
|
||||
sounds={
|
||||
melee={"npc/ministrider/alert2.wav","npc/ministrider/alert4.wav"},
|
||||
melee_hit=pk_pills.helpers.makeList("npc/zombie/claw_strike#.wav",3),
|
||||
shoot="weapons/ar2/fire1.wav",
|
||||
step={"npc/ministrider/ministrider_footstep2.wav","npc/ministrider/ministrider_footstep5.wav"}
|
||||
},
|
||||
aim={
|
||||
attachment="MiniGun",
|
||||
fixTracers=true,
|
||||
simple=true
|
||||
},
|
||||
attack={
|
||||
mode= "auto",
|
||||
func=pk_pills.common.shoot,
|
||||
delay=.1,
|
||||
damage=10,
|
||||
spread=.02,
|
||||
tracer="AR2Tracer"
|
||||
},
|
||||
attack2={
|
||||
mode="trigger",
|
||||
func = pk_pills.common.melee,
|
||||
//animCount=3,
|
||||
delay=1,
|
||||
range=75,
|
||||
dmg=75
|
||||
},
|
||||
movePoseMode="yaw",
|
||||
moveSpeed={
|
||||
walk=200,
|
||||
run=500
|
||||
},
|
||||
jumpPower=0,
|
||||
health=300,
|
||||
noFallDamage=true
|
||||
})
|
||||
|
||||
pk_pills.register("ep1_rollermine_orange",{
|
||||
parent="rollermine",
|
||||
printName="Orange Rollermine",
|
||||
side=false,
|
||||
subMats = {
|
||||
[0]="models/roller/rollermine_hacked",
|
||||
[1]="models/roller/rollermine_gloworange"
|
||||
},
|
||||
default_rp_cost=4000
|
||||
})
|
||||
|
||||
/*
|
||||
|
||||
4 = models/roller/rollermine_gloworange
|
||||
6 = models/roller/rollermine_glowred
|
||||
|
||||
*/
|
||||
|
||||
pk_pills.register("ep1_rollermine_red",{
|
||||
parent="ep1_rollermine_orange",
|
||||
printName="Red Rollermine",
|
||||
side="wild",
|
||||
subMats = {
|
||||
[0]="models/roller/rollermine_splode",
|
||||
[1]="models/roller/rollermine_glowred"
|
||||
},
|
||||
})
|
||||
|
||||
pk_pills.register("ep1_zombine",{
|
||||
parent="zombie",
|
||||
printName="Zombine",
|
||||
model="models/zombie/zombie_soldier.mdl",
|
||||
default_rp_cost=8000,
|
||||
anims={
|
||||
default={
|
||||
walk="walk_all",
|
||||
run="run_all",
|
||||
nade="pullgrenade"
|
||||
},
|
||||
nade={
|
||||
idle="idle_grenade",
|
||||
walk="walk_all_grenade",
|
||||
run="run_all_grenade"
|
||||
}
|
||||
},
|
||||
moveSpeed={
|
||||
run=200
|
||||
},
|
||||
sounds={
|
||||
melee=pk_pills.helpers.makeList("npc/zombine/zombine_charge#.wav",2),
|
||||
nade=pk_pills.helpers.makeList("npc/zombine/zombine_readygrenade#.wav",2)
|
||||
},
|
||||
attack={
|
||||
func= function(ply,ent,tbl) if !ent.forceAnimSet then pk_pills.common.melee(ply,ent,tbl) end end
|
||||
},
|
||||
attack2={
|
||||
mode="trigger",
|
||||
func= function(ply,ent)
|
||||
if !ent.forceAnimSet then
|
||||
ent:PillAnim("nade",true)
|
||||
ent:PillSound("nade")
|
||||
ent.forceAnimSet="nade"
|
||||
|
||||
local nade=ents.Create("npc_grenade_frag")
|
||||
nade:SetPos(ply:GetPos())
|
||||
nade:SetParent(ent:GetPuppet())
|
||||
nade:Spawn()
|
||||
nade:Fire("setparentattachment","grenade_attachment", 0)
|
||||
nade:Fire("SetTimer","6",0)
|
||||
nade:CallOnRemove("NadeSplodeKillPlayer",function()
|
||||
if IsValid(ent) then ply:Kill() end
|
||||
end)
|
||||
|
||||
ent:PillFilterCam(nade)
|
||||
end
|
||||
end
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("ep1_vort_blue",{
|
||||
parent="vort",
|
||||
printName="Transcendent Vortigaunt",
|
||||
visColor=Color(120,70,210),
|
||||
default_rp_cost=16000,
|
||||
superpowers=true,
|
||||
anims={
|
||||
default={teleport="todefend"}
|
||||
},
|
||||
sounds={
|
||||
ranged_fire="beams/beamstart5.wav",
|
||||
teleport="ambient/machines/teleport4.wav"
|
||||
},
|
||||
reload=function(ply,ent)
|
||||
if !ply:OnGround() or ent.cloaked then return end
|
||||
|
||||
ent:PillAnim("teleport",true)
|
||||
|
||||
timer.Simple(1,function()
|
||||
if !IsValid(ent) then return end
|
||||
local tracein={}
|
||||
tracein.maxs=Vector(16,16,72)
|
||||
tracein.mins=Vector(-16,-16,0)
|
||||
tracein.start=ply:EyePos()
|
||||
tracein.endpos=ply:EyePos()+ply:EyeAngles():Forward()*9999
|
||||
tracein.filter = {ply,ent,ent:GetPuppet()}
|
||||
|
||||
local traceout= util.TraceHull(tracein)
|
||||
ply:SetPos(traceout.HitPos)
|
||||
ent:PillSound("teleport")
|
||||
end)
|
||||
end,
|
||||
health=1000
|
||||
})
|
||||
386
lua/autorun/include/pill_ep2.lua
Normal file
386
lua/autorun/include/pill_ep2.lua
Normal file
@@ -0,0 +1,386 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("ep2_hunter",{
|
||||
printName="Hunter",
|
||||
side="hl_combine",
|
||||
type="ply",
|
||||
model="models/hunter.mdl",
|
||||
default_rp_cost=9000,
|
||||
camera={
|
||||
offset=Vector(0,0,100),
|
||||
dist=150
|
||||
},
|
||||
hull=Vector(60,60,100),
|
||||
anims={
|
||||
default={
|
||||
idle="idle1",
|
||||
walk="walk_all",
|
||||
run="canter_all",
|
||||
jump="jump",
|
||||
glide="jump_idle",
|
||||
melee1="meleeleft",
|
||||
melee2="meleert",
|
||||
melee3="melee_02"
|
||||
}
|
||||
},
|
||||
sounds={
|
||||
melee=pk_pills.helpers.makeList("npc/ministrider/hunter_defendstrider#.wav",3),
|
||||
melee_hit=pk_pills.helpers.makeList("npc/zombie/claw_strike#.wav",3),
|
||||
shoot="npc/ministrider/ministrider_fire1.wav",
|
||||
step=pk_pills.helpers.makeList("npc/ministrider/ministrider_footstep#.wav",5)
|
||||
},
|
||||
aim={
|
||||
attachment="MiniGunBase",
|
||||
simple=true
|
||||
},
|
||||
attack={
|
||||
mode= "auto",
|
||||
func=function(ply,ent)
|
||||
ent:PillSound("shoot",true)
|
||||
local f = ents.Create("hunter_flechette")
|
||||
f:SetPos(ply:GetShootPos()+ply:EyeAngles():Forward()*80)
|
||||
f:SetVelocity(ply:EyeAngles():Forward()*2000+VectorRand()*10)
|
||||
f:SetAngles(ply:EyeAngles())
|
||||
f:Spawn()
|
||||
end,
|
||||
delay=.1
|
||||
},
|
||||
attack2={
|
||||
mode="trigger",
|
||||
func = pk_pills.common.melee,
|
||||
animCount=3,
|
||||
delay=.5,
|
||||
range=75,
|
||||
dmg=25
|
||||
},
|
||||
movePoseMode="yaw",
|
||||
moveSpeed={
|
||||
walk=200,
|
||||
run=500
|
||||
},
|
||||
jumpPower=400,
|
||||
health=300,
|
||||
noFallDamage=true
|
||||
})
|
||||
|
||||
pk_pills.register("ep2_antlion_worker",{
|
||||
parent="antlion",
|
||||
printName="Antlion Worker",
|
||||
model="models/antlion_worker.mdl",
|
||||
default_rp_cost=6000,
|
||||
options=false,
|
||||
reload= function(ply,ent)
|
||||
ent:PillAnim("spit",true)
|
||||
|
||||
timer.Simple(.5,function()
|
||||
if !IsValid(ply) then return end
|
||||
for i=1,5 do
|
||||
local n=math.random(3)
|
||||
local s = ents.Create("grenade_spit")
|
||||
s:SetPos(ply:GetShootPos()+ply:EyeAngles():Forward()*100+Vector(0,0,50))
|
||||
s:SetVelocity(ply:EyeAngles():Forward()*800+Vector(0,0,400)+VectorRand()*20)
|
||||
s:Spawn()
|
||||
if n==1 then
|
||||
s:SetModel("models/spitball_medium.mdl")
|
||||
elseif n==2 then
|
||||
s:SetModel("models/spitball_small.mdl")
|
||||
end
|
||||
end
|
||||
end)
|
||||
end,
|
||||
aim={nocrosshair=false},
|
||||
anims={
|
||||
default={
|
||||
spit="spit"
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("ep2_cturret",{
|
||||
parent="cturret",
|
||||
printName="Rebel Turret",
|
||||
side=false,
|
||||
default_rp_cost=3000,
|
||||
options=function() return {
|
||||
{visMat="models/combine_turrets/floor_turret/floor_turret_citizen"},
|
||||
{visMat="models/combine_turrets/floor_turret/floor_turret_citizen4"}
|
||||
} end,
|
||||
})
|
||||
|
||||
pk_pills.register("ep2_guardian",{
|
||||
parent="antlion_guard",
|
||||
printName="Ancient Guardian",
|
||||
default_rp_cost=11000,
|
||||
visMat="Models/antlion_guard/antlionGuard2",
|
||||
attack={
|
||||
dmg=100
|
||||
},
|
||||
charge={
|
||||
dmg=200
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("ep2_vort_scientist",{
|
||||
parent="vort",
|
||||
printName="Vortigaunt Scientist",
|
||||
model="models/vortigaunt_doctor.mdl",
|
||||
})
|
||||
|
||||
pk_pills.register("ep2_sniper",{
|
||||
parent="csoldier",
|
||||
printName="Combine Sniper",
|
||||
default_rp_cost=7000,
|
||||
//model="models/Combine_Super_Soldier.mdl",
|
||||
//ammo={AR2AltFire=6},
|
||||
//health=300
|
||||
loadout={"pill_wep_csniper"}
|
||||
})
|
||||
|
||||
pk_pills.register("ep2_inventor",{
|
||||
printName="The Inventor",
|
||||
type="ply",
|
||||
model="models/magnusson.mdl",
|
||||
default_rp_cost=10000,
|
||||
anims={
|
||||
default={
|
||||
idle="lineidle02",
|
||||
walk="walk_all",
|
||||
run="run_all",
|
||||
crouch="Crouch_idleD",
|
||||
crouch_walk="Crouch_walk_aLL",
|
||||
glide="jump_holding_glide",
|
||||
jump="jump_holding_jump",
|
||||
g_attack="gesture_shoot_smg1",
|
||||
g_reload="gesture_reload_smg1"
|
||||
},
|
||||
smg={
|
||||
idle="Idle_SMG1_Aim_Alert",
|
||||
walk="walkAIMALL1",
|
||||
run="run_alert_aiming_all",
|
||||
crouch="crouch_aim_smg1",
|
||||
crouch_walk="Crouch_walk_aiming_all"
|
||||
},
|
||||
ar2={
|
||||
idle="idle_angry_Ar2",
|
||||
walk="walkAIMALL1_ar2",
|
||||
run="run_aiming_ar2_all",
|
||||
crouch="crouch_aim_smg1",
|
||||
crouch_walk="Crouch_walk_aiming_all",
|
||||
g_attack="gesture_shoot_ar2",
|
||||
g_reload="gesture_reload_ar2"
|
||||
},
|
||||
shotgun={
|
||||
idle="Idle_Angry_Shotgun",
|
||||
walk="walkAIMALL1_ar2",
|
||||
run="run_aiming_ar2_all",
|
||||
crouch="crouch_aim_smg1",
|
||||
crouch_walk="Crouch_walk_aiming_all",
|
||||
g_attack="gesture_shoot_shotgun",
|
||||
g_reload="gesture_reload_ar2"
|
||||
}
|
||||
},
|
||||
aim={
|
||||
xPose="aim_yaw",
|
||||
yPose="aim_pitch"
|
||||
},
|
||||
moveSpeed={
|
||||
walk=60,
|
||||
run=200,
|
||||
ducked=40
|
||||
},
|
||||
loadout={"pill_wep_holstered","weapon_smg1","pill_wep_magnade"},
|
||||
ammo={SMG1=100},
|
||||
health=1000,
|
||||
validHoldTypes={"smg","ar2","shotgun","grenade"},
|
||||
movePoseMode="yaw"
|
||||
})
|
||||
|
||||
pk_pills.register("ep2_grub",{
|
||||
printName="Grub",
|
||||
side="antlion",
|
||||
type="ply",
|
||||
model="models/antlion_grub.mdl",
|
||||
default_rp_cost=400,
|
||||
camera={
|
||||
offset=Vector(0,0,5),
|
||||
dist=80
|
||||
},
|
||||
hull=Vector(30,30,15),
|
||||
anims={},
|
||||
moveSpeed={
|
||||
walk=30,
|
||||
run=60
|
||||
},
|
||||
jumpPower=0,
|
||||
health=20
|
||||
})
|
||||
|
||||
pk_pills.register("ep2_gnome",{
|
||||
printName="Garden Gnome",
|
||||
type="ply",
|
||||
model="models/props_junk/gnome.mdl",
|
||||
default_rp_cost=1000,
|
||||
camera={
|
||||
offset=Vector(0,0,15),
|
||||
dist=80
|
||||
},
|
||||
hull=Vector(10,10,30),
|
||||
anims={},
|
||||
moveSpeed={
|
||||
walk=60,
|
||||
run=120
|
||||
},
|
||||
attack={
|
||||
mode="trigger",
|
||||
func=function(ply,ent)
|
||||
ent:PillSound("laugh")
|
||||
end
|
||||
},
|
||||
sounds={
|
||||
laugh=pk_pills.helpers.makeList("vo/ravenholm/madlaugh0#.wav",4),
|
||||
laugh_pitch=140
|
||||
},
|
||||
noragdoll=true,
|
||||
jumpPower=150,
|
||||
health=80,
|
||||
noFallDamage=true
|
||||
})
|
||||
|
||||
pk_pills.register("ep2_advisor",{
|
||||
printName="Enhanced Advisor",
|
||||
parent="advisor",
|
||||
model="models/birdbrainswagtrain/episodic/advisor.mdl",
|
||||
default_rp_cost=10000,
|
||||
aim={},
|
||||
attack={
|
||||
mode="trigger",
|
||||
func=function(ply,ent)
|
||||
if ent:GetSequence()!=ent:LookupSequence("idle") then return end
|
||||
ent:PillAnim("melee",true)
|
||||
|
||||
timer.Simple(.7,function()
|
||||
if !IsValid(ent) then return end
|
||||
|
||||
local tr = util.TraceHull({
|
||||
start=ent:GetPos(),
|
||||
endpos=ent:GetPos()+ent:GetAngles():Forward()*200,
|
||||
filter={ent},
|
||||
mins=Vector(-25,-25,-25),
|
||||
maxs=Vector(25,25,25)
|
||||
})
|
||||
if IsValid(tr.Entity) then
|
||||
local dmg=DamageInfo()
|
||||
dmg:SetAttacker(ply)
|
||||
dmg:SetInflictor(ent)
|
||||
dmg:SetDamageType(DMG_SLASH)
|
||||
dmg:SetDamage(50)
|
||||
|
||||
tr.Entity:TakeDamageInfo(dmg)
|
||||
|
||||
ent:PillSound("hit")
|
||||
end
|
||||
end)
|
||||
timer.Simple(1.2,function()
|
||||
if !IsValid(ent) then return end
|
||||
ent:PillAnim("idle",true)
|
||||
end)
|
||||
end
|
||||
},
|
||||
attack2={
|
||||
mode="trigger",
|
||||
func=function(ply,ent)
|
||||
if ent:GetSequence()!=ent:LookupSequence("idle") then return end
|
||||
ent:PillAnim("grab",true)
|
||||
|
||||
timer.Simple(.7,function()
|
||||
if !IsValid(ent) then return end
|
||||
|
||||
local tr = util.TraceHull({
|
||||
start=ent:GetPos(),
|
||||
endpos=ent:GetPos()+ent:GetAngles():Forward()*200,
|
||||
filter={ent},
|
||||
mins=Vector(-25,-25,-25),
|
||||
maxs=Vector(25,25,25)
|
||||
})
|
||||
if IsValid(tr.Entity) and not tr.Entity:IsFlagSet(FL_GODMODE) then
|
||||
|
||||
local mdl_ent = pk_pills.getMappedEnt(tr.Entity) or tr.Entity
|
||||
|
||||
mdl_ent = mdl_ent.subModel or mdl_ent
|
||||
|
||||
mdl_ent = mdl_ent.GetPuppet and mdl_ent:GetPuppet() or mdl_ent
|
||||
|
||||
if mdl_ent:LookupBone("ValveBiped.Bip01_Spine4") then
|
||||
local mdl_name = mdl_ent:GetModel()
|
||||
|
||||
if tr.Entity:IsPlayer() then
|
||||
tr.Entity:KillSilent()
|
||||
else
|
||||
tr.Entity:Remove()
|
||||
end
|
||||
|
||||
local attachment=ents.Create("pill_attachment_body")
|
||||
attachment.model = mdl_name
|
||||
attachment:SetPos(ent:GetPos())
|
||||
attachment:SetParent(ent)
|
||||
attachment:Spawn()
|
||||
|
||||
ent.brainsucked=true
|
||||
else
|
||||
ent.brainsucked=false
|
||||
end
|
||||
else
|
||||
ent.brainsucked=false
|
||||
end
|
||||
|
||||
if !ent.brainsucked then
|
||||
ent:PillAnim("fail",true)
|
||||
end
|
||||
end)
|
||||
timer.Simple(2.3,function()
|
||||
if !IsValid(ent) or !ent.brainsucked then return end
|
||||
|
||||
ent:PillSound("brainsuck")
|
||||
|
||||
local effectdata = EffectData()
|
||||
|
||||
effectdata:SetOrigin(ent:LocalToWorld(Vector(75,0,-20)))
|
||||
effectdata:SetNormal(ent:GetAngles():Forward())
|
||||
effectdata:SetMagnitude(1)
|
||||
effectdata:SetScale(10)
|
||||
effectdata:SetColor(0)
|
||||
effectdata:SetFlags(3)
|
||||
|
||||
util.Effect("bloodspray",effectdata)
|
||||
end)
|
||||
timer.Simple(5,function()
|
||||
if !IsValid(ent) then return end
|
||||
ent:PillAnim("idle",true)
|
||||
end)
|
||||
end
|
||||
},
|
||||
reload=function(ply,ent)
|
||||
local traceres = util.QuickTrace(ent:GetPos(),ply:EyeAngles():Forward()*99999,{ply,ent})
|
||||
|
||||
local blast = ents.Create("pill_advisor_blast")
|
||||
blast:SetPos(traceres.HitPos)
|
||||
blast:SetOwner(ply)
|
||||
blast:Spawn()
|
||||
|
||||
ent:PillSound("blast")
|
||||
end,
|
||||
sounds={
|
||||
brainsuck="physics/flesh/flesh_squishy_impact_hard3.wav",
|
||||
blast="npc/advisor/advisor_blast1.wav"
|
||||
}
|
||||
})
|
||||
29
lua/autorun/init_improvedstacker.lua
Normal file
29
lua/autorun/init_improvedstacker.lua
Normal file
@@ -0,0 +1,29 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
if ( SERVER ) then
|
||||
|
||||
-- needed for custom vgui controls in the menu
|
||||
AddCSLuaFile( "vgui/stackercontrolpresets.lua" )
|
||||
AddCSLuaFile( "vgui/stackerdnumslider.lua" )
|
||||
AddCSLuaFile( "vgui/stackerpreseteditor.lua" )
|
||||
|
||||
-- convenience modules
|
||||
AddCSLuaFile( "improvedstacker/improvedstacker.lua" )
|
||||
AddCSLuaFile( "improvedstacker/localify.lua" )
|
||||
|
||||
else
|
||||
|
||||
-- needed for custom vgui controls in the menu
|
||||
include( "vgui/stackercontrolpresets.lua" )
|
||||
include( "vgui/stackerdnumslider.lua" )
|
||||
include( "vgui/stackerpreseteditor.lua" )
|
||||
|
||||
end
|
||||
222
lua/autorun/lvs_init.lua
Normal file
222
lua/autorun/lvs_init.lua
Normal file
@@ -0,0 +1,222 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
LVS = istable( LVS ) and LVS or {}
|
||||
|
||||
LVS.VERSION = 251
|
||||
LVS.VERSION_GITHUB = 0
|
||||
LVS.VERSION_TYPE = ".WS"
|
||||
LVS.VERSION_ADDONS_OUTDATED = false
|
||||
|
||||
LVS.KEYS_CATEGORIES = {}
|
||||
LVS.KEYS_REGISTERED = {}
|
||||
LVS.pSwitchKeys = {[KEY_1] = 1,[KEY_2] = 2,[KEY_3] = 3,[KEY_4] = 4,[KEY_5] = 5,[KEY_6] = 6,[KEY_7] = 7,[KEY_8] = 8,[KEY_9] = 9,[KEY_0] = 10}
|
||||
LVS.pSwitchKeysInv = {[1] = KEY_1,[2] = KEY_2,[3] = KEY_3,[4] = KEY_4,[5] = KEY_5,[6] = KEY_6,[7] = KEY_7,[8] = KEY_8,[9] = KEY_9,[10] = KEY_0}
|
||||
|
||||
LVS.ThemeColor = Color(127,0,0,255)
|
||||
|
||||
LVS.WHEEL_BRAKE = 1
|
||||
LVS.WHEEL_STEER_NONE = 2
|
||||
LVS.WHEEL_STEER_FRONT = 3
|
||||
LVS.WHEEL_STEER_REAR = 4
|
||||
|
||||
LVS.WEAPONS = {
|
||||
["DEFAULT"] = {
|
||||
Icon = Material("lvs/weapons/bullet.png"),
|
||||
Ammo = 9999,
|
||||
Delay = 0,
|
||||
HeatRateUp = 0.2,
|
||||
HeatRateDown = 0.25,
|
||||
Attack = function( ent ) end,
|
||||
StartAttack = function( ent ) end,
|
||||
FinishAttack = function( ent ) end,
|
||||
OnSelect = function( ent, old ) end,
|
||||
OnDeselect = function( ent, new ) end,
|
||||
OnThink = function( ent, active ) end,
|
||||
OnOverheat = function( ent ) end,
|
||||
OnRemove = function( ent ) end,
|
||||
},
|
||||
}
|
||||
|
||||
function LVS:GetVersion()
|
||||
return LVS.VERSION
|
||||
end
|
||||
|
||||
function LVS:AddKey(name, category, printname, cmd, default)
|
||||
local data = {
|
||||
printname = printname,
|
||||
id = name,
|
||||
category = category,
|
||||
cmd = cmd,
|
||||
}
|
||||
|
||||
if not LVS.KEYS_CATEGORIES[ category ] then
|
||||
LVS.KEYS_CATEGORIES[ category ] = {}
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
table.insert( LVS.KEYS_REGISTERED, data )
|
||||
else
|
||||
if default then
|
||||
if isstring( default ) then
|
||||
local Key = input.LookupBinding( default )
|
||||
|
||||
if Key then
|
||||
default = input.GetKeyCode( Key )
|
||||
else
|
||||
default = 0
|
||||
end
|
||||
end
|
||||
else
|
||||
default = 0
|
||||
end
|
||||
|
||||
data.default = default
|
||||
|
||||
table.insert( LVS.KEYS_REGISTERED, data )
|
||||
|
||||
CreateClientConVar( cmd, default, true, true )
|
||||
end
|
||||
end
|
||||
|
||||
function LVS:CheckUpdates()
|
||||
http.Fetch("https://raw.githubusercontent.com/SpaxscE/lvs_base/main/lua/autorun/lvs_init.lua", function(contents,size)
|
||||
local Entry = string.match( contents, "LVS.VERSION%s=%s%d+" )
|
||||
|
||||
if Entry then
|
||||
LVS.VERSION_GITHUB = tonumber( string.match( Entry , "%d+" ) ) or 0
|
||||
else
|
||||
LVS.VERSION_GITHUB = 0
|
||||
end
|
||||
|
||||
if LVS.VERSION_GITHUB == 0 then
|
||||
print("[LVS] - Framework: latest version could not be detected, You have Version: "..LVS:GetVersion())
|
||||
else
|
||||
if LVS:GetVersion() >= LVS.VERSION_GITHUB then
|
||||
print("[LVS] - Framework is up to date, Version: "..LVS:GetVersion())
|
||||
else
|
||||
print("[LVS] - Framework: a newer version is available! Version: "..LVS.VERSION_GITHUB..", You have Version: "..LVS:GetVersion())
|
||||
|
||||
if LVS.VERSION_TYPE == ".GIT" then
|
||||
print("[LVS] - Framework: get the latest version at https://github.com/SpaxscE/lvs_base")
|
||||
else
|
||||
print("[LVS] - Framework: restart your game/server to get the latest version!")
|
||||
end
|
||||
|
||||
if CLIENT then
|
||||
timer.Simple(18, function()
|
||||
chat.AddText( Color( 255, 0, 0 ), "[LVS] - Framework: a newer version is available!" )
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local Delay = 0
|
||||
local addons = file.Find( "data_static/lvs/*", "GAME" )
|
||||
|
||||
for _, addonFile in pairs( addons ) do
|
||||
local addonInfo = file.Read( "data_static/lvs/"..addonFile, "GAME" )
|
||||
|
||||
if not addonInfo then continue end
|
||||
|
||||
local data = string.Explode( "\n", addonInfo )
|
||||
|
||||
local wsid = string.Replace( addonFile, ".txt", "" )
|
||||
local addon_name = wsid
|
||||
local addon_url
|
||||
local addon_version
|
||||
|
||||
for _, entry in pairs( data ) do
|
||||
if string.StartsWith( entry, "url=" ) then
|
||||
addon_url = string.Replace( entry, "url=", "" )
|
||||
end
|
||||
|
||||
if string.StartsWith( entry, "version=" ) then
|
||||
addon_version = string.Replace( entry, "version=", "" )
|
||||
end
|
||||
|
||||
if string.StartsWith( entry, "name=" ) then
|
||||
addon_name = string.Replace( entry, "name=", "" )
|
||||
end
|
||||
end
|
||||
|
||||
if not addon_url or not addon_version then continue end
|
||||
|
||||
addon_version = tonumber( addon_version )
|
||||
|
||||
Delay = Delay + 1.5
|
||||
|
||||
timer.Simple( Delay, function()
|
||||
http.Fetch(addon_url, function(con,_)
|
||||
local addon_entry = string.match( con, "version=%d+" )
|
||||
|
||||
local addon_version_git = 0
|
||||
|
||||
if addon_entry then
|
||||
addon_version_git = tonumber( string.match( addon_entry, "%d+" ) ) or 0
|
||||
end
|
||||
|
||||
local wsurl = "https://steamcommunity.com/sharedfiles/filedetails/?id="..wsid
|
||||
|
||||
if addon_version_git == 0 then
|
||||
print("[LVS] latest version of "..addon_name.." ( "..wsurl.." ) could not be detected, You have Version: "..addon_version)
|
||||
else
|
||||
if addon_version_git > addon_version then
|
||||
print("[LVS] - "..addon_name.." ( "..wsurl.." ) is out of date!")
|
||||
|
||||
if CLIENT then
|
||||
timer.Simple(18, function()
|
||||
chat.AddText( Color( 255, 0, 0 ),"[LVS] - "..addon_name.." is out of date!" )
|
||||
end)
|
||||
end
|
||||
|
||||
LVS.VERSION_ADDONS_OUTDATED = true
|
||||
|
||||
else
|
||||
print("[LVS] - "..addon_name.." is up to date, Version: "..addon_version)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end )
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function LVS:GetWeaponPreset( name )
|
||||
if not LVS.WEAPONS[ name ] then return table.Copy( LVS.WEAPONS["DEFAULT"] ) end
|
||||
|
||||
return table.Copy( LVS.WEAPONS[ name ] )
|
||||
end
|
||||
|
||||
function LVS:AddWeaponPreset( name, data )
|
||||
if not isstring( name ) or not istable( data ) then return end
|
||||
|
||||
LVS.WEAPONS[ name ] = data
|
||||
end
|
||||
|
||||
function LVS:GetVehicleTypes()
|
||||
local VehicleTypes = {}
|
||||
|
||||
for s, v in pairs( scripted_ents.GetList() ) do
|
||||
if not v.t or not isfunction( v.t.GetVehicleType ) then continue end
|
||||
|
||||
local vehicletype = v.t:GetVehicleType()
|
||||
|
||||
if not isstring( vehicletype ) or string.StartsWith( vehicletype, "LBase" ) or table.HasValue( VehicleTypes, vehicletype ) then continue end
|
||||
|
||||
table.insert( VehicleTypes, vehicletype )
|
||||
end
|
||||
|
||||
return VehicleTypes
|
||||
end
|
||||
|
||||
AddCSLuaFile("lvs_framework/init.lua")
|
||||
include("lvs_framework/init.lua")
|
||||
137
lua/autorun/menubar.lua
Normal file
137
lua/autorun/menubar.lua
Normal file
@@ -0,0 +1,137 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
if ( SERVER ) then return end
|
||||
|
||||
local checkList = {}
|
||||
checkList[ "cheat" ] = { tooltip = "#menubar.cheatstip", func = function() return GetConVarNumber( "sv_cheats" ) != 0 end }
|
||||
checkList[ "cheatSP" ] = { tooltip = "#menubar.cheatstip", func = function() return GetConVarNumber( "sv_cheats" ) != 0 or game.SinglePlayer() end }
|
||||
checkList[ "host" ] = { tooltip = "#menubar.host_only", func = function() return IsValid( LocalPlayer() ) and LocalPlayer():IsListenServerHost() end }
|
||||
|
||||
local function AddCVar( s, checkStr, ... )
|
||||
local cvar = s:AddCVar( ... )
|
||||
cvar.OldThink = cvar.Think
|
||||
cvar.Think = function( se )
|
||||
se:OldThink()
|
||||
local checks = string.Split( checkStr, " " )
|
||||
for k, v in ipairs( checks ) do
|
||||
if ( checkList[ v ] and !checkList[ v ].func() ) then
|
||||
se:SetEnabled( false )
|
||||
se:SetTooltip( checkList[ v ].tooltip )
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
se:SetEnabled( true )
|
||||
se:SetTooltip()
|
||||
end
|
||||
end
|
||||
|
||||
local function AddHostCVar( s, ... ) AddCVar( s, "host", ... ) end
|
||||
local function AddCheatCVar( s, ... ) AddCVar( s, "cheat", ... ) end
|
||||
local function AddCheatOrSPCVar( s, ... ) AddCVar( s, "cheatSP host", ... ) end
|
||||
|
||||
-- Display options
|
||||
hook.Add( "PopulateMenuBar", "DisplayOptions_MenuBar", function( menubar )
|
||||
|
||||
local m = menubar:AddOrGetMenu( "#menubar.drawing" )
|
||||
|
||||
m:AddCVar( "#menubar.drawing.physgun_beam", "physgun_drawbeams", "1", "0" )
|
||||
m:AddCVar( "#menubar.drawing.physgun_halo", "physgun_halo", "1", "0" )
|
||||
m:AddCVar( "#menubar.drawing.freeze", "effects_freeze", "1", "0" )
|
||||
m:AddCVar( "#menubar.drawing.unfreeze", "effects_unfreeze", "1", "0" )
|
||||
|
||||
m:AddSpacer()
|
||||
|
||||
m:AddCVar( "#menubar.drawing.hud", "cl_drawhud", "1", "0" )
|
||||
m:AddCVar( "#menubar.drawing.toolhelp", "gmod_drawhelp", "1", "0" )
|
||||
m:AddCVar( "#menubar.drawing.toolui", "gmod_drawtooleffects", "1", "0" )
|
||||
m:AddCVar( "#menubar.drawing.world_tooltips", "cl_drawworldtooltips", "1", "0" )
|
||||
m:AddCVar( "#menubar.drawing.spawn_effect", "cl_drawspawneffect", "1", "0" )
|
||||
m:AddCVar( "#menubar.drawing.effect_rings", "cl_draweffectrings", "1", "0" )
|
||||
m:AddCVar( "#menubar.drawing.cameras", "cl_drawcameras", "1", "0" )
|
||||
m:AddCVar( "#menubar.drawing.thrusters", "cl_drawthrusterseffects", "1", "0" )
|
||||
|
||||
m:AddSpacer()
|
||||
|
||||
m:AddCVar( "#menubar.drawing.shadows", "r_shadows", "1", "0" )
|
||||
m:AddCVar( "#menubar.drawing.detailprops", "r_drawdetailprops", "1", "0" )
|
||||
|
||||
m:AddSpacer()
|
||||
|
||||
m:AddCVar( "#menubar.drawing.showfps", "cl_showfps", "1", "0" )
|
||||
|
||||
AddCheatOrSPCVar( m, "#menubar.drawing.minecraftify", "mat_showlowresimage", "1", "0", function() timer.Simple( 0.1, function() RunConsoleCommand( "mat_reloadallmaterials" ) end ) end )
|
||||
AddCheatCVar( m, "#menubar.drawing.wireframe", "mat_wireframe", "1", "0" )
|
||||
|
||||
m:AddSpacer()
|
||||
|
||||
m:AddCVar( "#menubar.drawing.hints", "cl_showhints", "1", "0" )
|
||||
|
||||
end )
|
||||
|
||||
-- AI Options
|
||||
hook.Add( "PopulateMenuBar", "NPCOptions_MenuBar", function( menubar )
|
||||
|
||||
local m = menubar:AddOrGetMenu( "#menubar.npcs" )
|
||||
|
||||
AddHostCVar( m, "#menubar.npcs.disableai", "ai_disabled", "1", "0" )
|
||||
AddHostCVar( m, "#menubar.npcs.ignoreplayers", "ai_ignoreplayers", "1", "0" )
|
||||
AddHostCVar( m, "#menubar.npcs.keepcorpses", "ai_serverragdolls", "1", "0" )
|
||||
AddHostCVar( m, "#menubar.npcs.autoplayersquad", "npc_citizen_auto_player_squad", "1", "0" )
|
||||
|
||||
local wpns = m:AddSubMenu( "#menubar.npcs.weapon" )
|
||||
|
||||
wpns:SetDeleteSelf( false )
|
||||
wpns:AddCVar( "#menubar.npcs.defaultweapon", "gmod_npcweapon", "" )
|
||||
wpns:AddCVar( "#menubar.npcs.noweapon", "gmod_npcweapon", "none" )
|
||||
wpns:AddSpacer()
|
||||
|
||||
local groupedWeps = {}
|
||||
for _, v in pairs( list.Get( "NPCUsableWeapons" ) ) do
|
||||
local cat = ( v.category or "" ):lower()
|
||||
groupedWeps[ cat ] = groupedWeps[ cat ] or {}
|
||||
groupedWeps[ cat ][ v.class ] = language.GetPhrase( v.title )
|
||||
end
|
||||
|
||||
for group, items in SortedPairs( groupedWeps ) do
|
||||
wpns:AddSpacer()
|
||||
for class, title in SortedPairsByValue( items ) do
|
||||
wpns:AddCVar( title, "gmod_npcweapon", class )
|
||||
end
|
||||
end
|
||||
|
||||
end )
|
||||
|
||||
-- Server options
|
||||
hook.Add( "PopulateMenuBar", "MenuBar_ServerOptions", function( menubar )
|
||||
|
||||
local m = menubar:AddOrGetMenu( "#menubar.server" )
|
||||
|
||||
AddHostCVar( m, "#utilities.allowcslua", "sv_allowcslua", "1", "0" )
|
||||
AddHostCVar( m, "#utilities.falldamage", "mp_falldamage", "1", "0" )
|
||||
AddHostCVar( m, "#utilities.gmod_suit", "gmod_suit", "1", "0" )
|
||||
AddCheatOrSPCVar( m, "#physcannon_mega_enabled", "physcannon_mega_enabled", "1", "0" )
|
||||
|
||||
m:AddSpacer()
|
||||
AddHostCVar( m, "#enable_weapons", "sbox_weapons", "1", "0" )
|
||||
AddHostCVar( m, "#allow_god_mode", "sbox_godmode", "1", "0" )
|
||||
|
||||
m:AddSpacer()
|
||||
AddHostCVar( m, "#players_damage_players", "sbox_playershurtplayers", "1", "0" )
|
||||
AddHostCVar( m, "#allow_noclip", "sbox_noclip", "1", "0" )
|
||||
AddHostCVar( m, "#bone_manipulate_npcs", "sbox_bonemanip_npc", "1", "0" )
|
||||
AddHostCVar( m, "#bone_manipulate_players", "sbox_bonemanip_player", "1", "0" )
|
||||
AddHostCVar( m, "#bone_manipulate_others", "sbox_bonemanip_misc", "1", "0" )
|
||||
|
||||
end )
|
||||
396
lua/autorun/netstream.lua
Normal file
396
lua/autorun/netstream.lua
Normal file
@@ -0,0 +1,396 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
--A net extension which allows sending large streams of data without overflowing the reliable channel
|
||||
--Keep it in lua/autorun so it will be shared between addons
|
||||
AddCSLuaFile()
|
||||
|
||||
net.Stream = {}
|
||||
net.Stream.SendSize = 20000 --This is the size of each packet to send
|
||||
net.Stream.Timeout = 10 --How long to wait for client response before cleaning up
|
||||
net.Stream.MaxWriteStreams = 1024 --The maximum number of write data items to store
|
||||
net.Stream.MaxReadStreams = 128 --The maximum number of queued read data items to store
|
||||
net.Stream.MaxChunks = 3200 --Maximum number of pieces the stream can send to the server. 64 MB
|
||||
net.Stream.MaxSize = net.Stream.SendSize*net.Stream.MaxChunks
|
||||
net.Stream.MaxTries = 3 --Maximum times the client may retry downloading the whole data
|
||||
|
||||
local WriteStreamQueue = {
|
||||
__index = {
|
||||
Add = function(self, stream)
|
||||
local identifier = self.curidentifier
|
||||
local startid = identifier
|
||||
while self.queue[identifier] do
|
||||
identifier = identifier % net.Stream.MaxWriteStreams + 1
|
||||
if identifier == startid then
|
||||
ErrorNoHalt("Netstream is full of WriteStreams!")
|
||||
net.WriteUInt(0, 32)
|
||||
return
|
||||
end
|
||||
end
|
||||
self.curidentifier = identifier % net.Stream.MaxWriteStreams + 1
|
||||
|
||||
if next(self.queue)==nil then
|
||||
self.activitytimeout = CurTime()+net.Stream.Timeout
|
||||
timer.Create("netstream_queueclean", 5, 0, function() self:Clean() end)
|
||||
end
|
||||
self.queue[identifier] = stream
|
||||
stream.identifier = identifier
|
||||
return stream
|
||||
end,
|
||||
|
||||
Write = function(self, ply)
|
||||
local identifier = net.ReadUInt(32)
|
||||
local chunkidx = net.ReadUInt(32)
|
||||
local stream = self.queue[identifier]
|
||||
--print("Got request", identifier, chunkidx, stream)
|
||||
if stream then
|
||||
if stream:Write(ply, chunkidx) then
|
||||
self.activitytimeout = CurTime()+net.Stream.Timeout
|
||||
stream.timeout = CurTime()+net.Stream.Timeout
|
||||
end
|
||||
else
|
||||
-- Tell them the stream doesn't exist
|
||||
net.Start("NetStreamRead")
|
||||
net.WriteUInt(identifier, 32)
|
||||
net.WriteUInt(0, 32)
|
||||
if SERVER then net.Send(ply) else net.SendToServer() end
|
||||
end
|
||||
end,
|
||||
|
||||
Clean = function(self)
|
||||
local t = CurTime()
|
||||
for k, stream in pairs(self.queue) do
|
||||
if (next(stream.clients)~=nil and t >= stream.timeout) or t >= self.activitytimeout then
|
||||
stream:Remove()
|
||||
self.queue[k] = nil
|
||||
end
|
||||
end
|
||||
if next(self.queue)==nil then
|
||||
timer.Remove("netstream_queueclean")
|
||||
end
|
||||
end,
|
||||
},
|
||||
__call = function(t)
|
||||
return setmetatable({
|
||||
activitytimeout = CurTime()+net.Stream.Timeout,
|
||||
curidentifier = 1,
|
||||
queue = {}
|
||||
}, t)
|
||||
end
|
||||
}
|
||||
setmetatable(WriteStreamQueue, WriteStreamQueue)
|
||||
net.Stream.WriteStreams = WriteStreamQueue()
|
||||
|
||||
local ReadStreamQueue = {
|
||||
__index = {
|
||||
Add = function(self, stream)
|
||||
local queue = self.queues[stream.player]
|
||||
|
||||
if #queue == net.Stream.MaxReadStreams then
|
||||
ErrorNoHalt("Receiving too many ReadStream requests!")
|
||||
return
|
||||
end
|
||||
|
||||
for _, v in ipairs(queue) do
|
||||
if v.identifier == stream.identifier then
|
||||
ErrorNoHalt("Tried to start a new ReadStream for an already existing stream!")
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
queue[#queue+1] = stream
|
||||
if #queue == 1 then
|
||||
stream:Request()
|
||||
end
|
||||
return stream
|
||||
end,
|
||||
|
||||
Remove = function(self, stream)
|
||||
local queue = rawget(self.queues, stream.player)
|
||||
if queue then
|
||||
if stream == queue[1] then
|
||||
table.remove(queue, 1)
|
||||
local nextInQueue = queue[1]
|
||||
if nextInQueue then
|
||||
nextInQueue:Request()
|
||||
else
|
||||
self.queues[stream.player] = nil
|
||||
end
|
||||
else
|
||||
for k, v in ipairs(queue) do
|
||||
if v == stream then
|
||||
table.remove(queue, k)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
Read = function(self, ply)
|
||||
local identifier = net.ReadUInt(32)
|
||||
local queue = rawget(self.queues, ply)
|
||||
if queue and queue[1] then
|
||||
queue[1]:Read(identifier)
|
||||
end
|
||||
end
|
||||
},
|
||||
__call = function(t)
|
||||
return setmetatable({
|
||||
queues = setmetatable({}, {__index = function(t,k) local r={} t[k]=r return r end})
|
||||
}, t)
|
||||
end
|
||||
}
|
||||
setmetatable(ReadStreamQueue, ReadStreamQueue)
|
||||
net.Stream.ReadStreams = ReadStreamQueue()
|
||||
|
||||
|
||||
local WritingDataItem = {
|
||||
__index = {
|
||||
Write = function(self, ply, chunkidx)
|
||||
local client = self.clients[ply]
|
||||
if client.finished then return false end
|
||||
if chunkidx == #self.chunks+1 then self:Finished(ply) return true end
|
||||
|
||||
if client.downloads+#self.chunks-client.progress >= net.Stream.MaxTries * #self.chunks then self:Finished(ply) return false end
|
||||
client.downloads = client.downloads + 1
|
||||
|
||||
local chunk = self.chunks[chunkidx]
|
||||
if not chunk then return false end
|
||||
|
||||
client.progress = chunkidx
|
||||
|
||||
--print("Sending", "NetStreamRead", self.identifier, #chunk.data, chunkidx, chunk.crc)
|
||||
net.Start("NetStreamRead")
|
||||
net.WriteUInt(self.identifier, 32)
|
||||
net.WriteUInt(#chunk.data, 32)
|
||||
net.WriteUInt(chunkidx, 32)
|
||||
net.WriteString(chunk.crc)
|
||||
net.WriteData(chunk.data, #chunk.data)
|
||||
if CLIENT then net.SendToServer() else net.Send(ply) end
|
||||
return true
|
||||
end,
|
||||
|
||||
Finished = function(self, ply)
|
||||
self.clients[ply].finished = true
|
||||
if self.callback then
|
||||
local ok, err = xpcall(self.callback, debug.traceback, ply)
|
||||
if not ok then ErrorNoHalt(err) end
|
||||
end
|
||||
end,
|
||||
|
||||
GetProgress = function(self, ply)
|
||||
return self.clients[ply].progress / #self.chunks
|
||||
end,
|
||||
|
||||
Remove = function(self)
|
||||
local sendTo = {}
|
||||
for ply, client in pairs(self.clients) do
|
||||
if not client.finished then
|
||||
client.finished = true
|
||||
if CLIENT or ply:IsValid() then sendTo[#sendTo+1] = ply end
|
||||
end
|
||||
end
|
||||
|
||||
if next(sendTo)~=nil then
|
||||
--print("Sending", "NetStreamRead", self.identifier, 0)
|
||||
net.Start("NetStreamRead")
|
||||
net.WriteUInt(self.identifier, 32)
|
||||
net.WriteUInt(0, 32)
|
||||
if SERVER then net.Send(sendTo) else net.SendToServer() end
|
||||
end
|
||||
end
|
||||
|
||||
},
|
||||
__call = function(t, data, callback)
|
||||
local chunks = {}
|
||||
for i=1, math.ceil(#data / net.Stream.SendSize) do
|
||||
local datachunk = string.sub(data, (i - 1) * net.Stream.SendSize + 1, i * net.Stream.SendSize)
|
||||
chunks[i] = { data = datachunk, crc = util.CRC(datachunk) }
|
||||
end
|
||||
|
||||
return setmetatable({
|
||||
timeout = CurTime()+net.Stream.Timeout,
|
||||
chunks = chunks,
|
||||
callback = callback,
|
||||
lasttouched = 0,
|
||||
clients = setmetatable({},{__index = function(t,k)
|
||||
local r = {
|
||||
finished = false,
|
||||
downloads = 0,
|
||||
progress = 0,
|
||||
} t[k]=r return r
|
||||
end})
|
||||
}, t)
|
||||
end
|
||||
}
|
||||
setmetatable(WritingDataItem, WritingDataItem)
|
||||
|
||||
local ReadingDataItem = {
|
||||
__index = {
|
||||
Request = function(self)
|
||||
if self.downloads+self.numchunks-#self.chunks >= net.Stream.MaxTries*self.numchunks then self:Remove() return end
|
||||
self.downloads = self.downloads + 1
|
||||
timer.Create("NetStreamReadTimeout" .. self.identifier, net.Stream.Timeout*0.5, 1, function() self:Request() end)
|
||||
self:WriteRequest()
|
||||
end,
|
||||
|
||||
WriteRequest = function(self)
|
||||
--print("Requesting", self.identifier, #self.chunks)
|
||||
net.Start("NetStreamWrite")
|
||||
net.WriteUInt(self.identifier, 32)
|
||||
net.WriteUInt(#self.chunks+1, 32)
|
||||
if CLIENT then net.SendToServer() else net.Send(self.player) end
|
||||
end,
|
||||
|
||||
Read = function(self, identifier)
|
||||
if self.identifier ~= identifier then self:Request() return end
|
||||
|
||||
local size = net.ReadUInt(32)
|
||||
if size == 0 then self:Remove() return end
|
||||
|
||||
local chunkidx = net.ReadUInt(32)
|
||||
if chunkidx ~= #self.chunks+1 then self:Request() return end
|
||||
|
||||
local crc = net.ReadString()
|
||||
local data = net.ReadData(size)
|
||||
|
||||
if crc ~= util.CRC(data) then self:Request() return end
|
||||
|
||||
self.chunks[chunkidx] = data
|
||||
if #self.chunks == self.numchunks then self:Remove(true) return end
|
||||
|
||||
self:Request()
|
||||
end,
|
||||
|
||||
GetProgress = function(self)
|
||||
return #self.chunks/self.numchunks
|
||||
end,
|
||||
|
||||
Remove = function(self, finished)
|
||||
timer.Remove("NetStreamReadTimeout" .. self.identifier)
|
||||
|
||||
local data
|
||||
if finished then
|
||||
data = table.concat(self.chunks)
|
||||
if self.compressed then
|
||||
data = util.Decompress(data, net.Stream.MaxSize)
|
||||
end
|
||||
self:WriteRequest() -- Notify we finished
|
||||
end
|
||||
|
||||
local ok, err = xpcall(self.callback, debug.traceback, data)
|
||||
if not ok then ErrorNoHalt(err) end
|
||||
|
||||
net.Stream.ReadStreams:Remove(self)
|
||||
end
|
||||
},
|
||||
__call = function(t, ply, callback, numchunks, identifier, compressed)
|
||||
return setmetatable({
|
||||
identifier = identifier,
|
||||
chunks = {},
|
||||
compressed = compressed,
|
||||
numchunks = numchunks,
|
||||
callback = callback,
|
||||
player = ply,
|
||||
downloads = 0
|
||||
}, t)
|
||||
end
|
||||
}
|
||||
setmetatable(ReadingDataItem, ReadingDataItem)
|
||||
|
||||
|
||||
function net.WriteStream(data, callback, dontcompress)
|
||||
if not isstring(data) then
|
||||
error("bad argument #1 to 'WriteStream' (string expected, got " .. type(data) .. ")", 2)
|
||||
end
|
||||
if callback ~= nil and not isfunction(callback) then
|
||||
error("bad argument #2 to 'WriteStream' (function expected, got " .. type(callback) .. ")", 2)
|
||||
end
|
||||
|
||||
local compressed = not dontcompress
|
||||
if compressed then
|
||||
data = util.Compress(data) or ""
|
||||
end
|
||||
|
||||
if #data == 0 then
|
||||
net.WriteUInt(0, 32)
|
||||
return
|
||||
end
|
||||
|
||||
if #data > net.Stream.MaxSize then
|
||||
ErrorNoHalt("net.WriteStream request is too large! ", #data/1048576, "MiB")
|
||||
net.WriteUInt(0, 32)
|
||||
return
|
||||
end
|
||||
|
||||
local stream = net.Stream.WriteStreams:Add(WritingDataItem(data, callback, compressed))
|
||||
if not stream then return end
|
||||
|
||||
--print("WriteStream", #stream.chunks, stream.identifier, compressed)
|
||||
net.WriteUInt(#stream.chunks, 32)
|
||||
net.WriteUInt(stream.identifier, 32)
|
||||
net.WriteBool(compressed)
|
||||
|
||||
return stream
|
||||
end
|
||||
|
||||
--If the receiver is a player then add it to a queue.
|
||||
--If the receiver is the server then add it to a queue for each individual player
|
||||
function net.ReadStream(ply, callback)
|
||||
if CLIENT then
|
||||
ply = NULL
|
||||
else
|
||||
if type(ply) ~= "Player" then
|
||||
error("bad argument #1 to 'ReadStream' (Player expected, got " .. type(ply) .. ")", 2)
|
||||
elseif not ply:IsValid() then
|
||||
error("bad argument #1 to 'ReadStream' (Tried to use a NULL entity!)", 2)
|
||||
end
|
||||
end
|
||||
if not isfunction(callback) then
|
||||
error("bad argument #2 to 'ReadStream' (function expected, got " .. type(callback) .. ")", 2)
|
||||
end
|
||||
|
||||
local numchunks = net.ReadUInt(32)
|
||||
if numchunks == nil then
|
||||
return
|
||||
elseif numchunks == 0 then
|
||||
local ok, err = xpcall(callback, debug.traceback, "")
|
||||
if not ok then ErrorNoHalt(err) end
|
||||
return
|
||||
end
|
||||
|
||||
local identifier = net.ReadUInt(32)
|
||||
local compressed = net.ReadBool()
|
||||
|
||||
if numchunks > net.Stream.MaxChunks then
|
||||
ErrorNoHalt("ReadStream requests from ", ply, " is too large! ", numchunks * net.Stream.SendSize / 1048576, "MiB")
|
||||
return
|
||||
end
|
||||
|
||||
--print("ReadStream", numchunks, identifier, compressed)
|
||||
|
||||
return net.Stream.ReadStreams:Add(ReadingDataItem(ply, callback, numchunks, identifier, compressed))
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
util.AddNetworkString("NetStreamWrite")
|
||||
util.AddNetworkString("NetStreamRead")
|
||||
end
|
||||
|
||||
--Send requested stream data
|
||||
net.Receive("NetStreamWrite", function(len, ply)
|
||||
net.Stream.WriteStreams:Write(ply or NULL)
|
||||
end)
|
||||
|
||||
--Download the sent stream data
|
||||
net.Receive("NetStreamRead", function(len, ply)
|
||||
net.Stream.ReadStreams:Read(ply or NULL)
|
||||
end)
|
||||
20
lua/autorun/niknaks_autorun.lua
Normal file
20
lua/autorun/niknaks_autorun.lua
Normal file
@@ -0,0 +1,20 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
-- Post Init. This is to stop using traces and other functions, as they can cause a crash if used before.
|
||||
if not _NIKNAKS_POSTENTITY then
|
||||
hook.Add("InitPostEntity","NikNaks_InitPostEntity", function()
|
||||
_NIKNAKS_POSTENTITY = true
|
||||
if _MODULES["niknaks"] then
|
||||
hook.Run("NikNaks._LoadPathOptions")
|
||||
end
|
||||
hook.Remove("InitPostEntity","NikNaks_InitPostEntity")
|
||||
end)
|
||||
end
|
||||
51
lua/autorun/nmrihammo.lua
Normal file
51
lua/autorun/nmrihammo.lua
Normal file
@@ -0,0 +1,51 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
if SERVER then AddCSLuaFile() end
|
||||
|
||||
game.AddAmmoType({name = "nmrih_flare"})
|
||||
if CLIENT then
|
||||
language.Add("nmrih_flare_ammo","Flares")
|
||||
end
|
||||
|
||||
game.AddAmmoType({name = "gasoline"})
|
||||
if CLIENT then
|
||||
language.Add("gasoline_ammo","Gasoline")
|
||||
end
|
||||
|
||||
game.AddAmmoType({name = "tnt"})
|
||||
if CLIENT then
|
||||
language.Add("tnt_ammo","TNT")
|
||||
end
|
||||
|
||||
game.AddAmmoType({name = "frag"})
|
||||
if CLIENT then
|
||||
language.Add("frag_ammo","Fragmentation Grenades")
|
||||
end
|
||||
|
||||
game.AddAmmoType({name = "molly"})
|
||||
if CLIENT then
|
||||
language.Add("molly_ammo","Molotov Cocktails")
|
||||
end
|
||||
|
||||
game.AddAmmoType({name = "co2"})
|
||||
if CLIENT then
|
||||
language.Add("co2_ammo","Carbon Dioxide")
|
||||
end
|
||||
|
||||
game.AddAmmoType({name = "propane"})
|
||||
if CLIENT then
|
||||
language.Add("propane_ammo","Propane")
|
||||
end
|
||||
|
||||
game.AddAmmoType({name = "lighter"})
|
||||
if CLIENT then
|
||||
language.Add("lighter_ammo","Lighters")
|
||||
end
|
||||
175
lua/autorun/nmrihcvars.lua
Normal file
175
lua/autorun/nmrihcvars.lua
Normal file
@@ -0,0 +1,175 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
if SERVER then AddCSLuaFile() end
|
||||
|
||||
if CLIENT then
|
||||
|
||||
local function tfaNMRIHOptionServer(panel)
|
||||
--Here are whatever default categories you want.
|
||||
|
||||
local tfaOptionNMRIHSV = {Options = {}, CVars = {}, Label = "#Presets", MenuButton = "1", Folder = "TFA NRMIH Settings Server"}
|
||||
|
||||
tfaOptionNMRIHSV.Options["#Default"] = {
|
||||
sv_tfa_nmrih_flashlight_required = "0",
|
||||
sv_tfa_nmrih_fx_fext_override = "-1",
|
||||
sv_tfa_nmrih_fx_tnt = "1",
|
||||
sv_tfa_nmrih_melee_multiplier = "1"
|
||||
}
|
||||
|
||||
panel:AddControl("ComboBox", tfaOptionNMRIHSV)
|
||||
|
||||
panel:AddControl("CheckBox", {
|
||||
Label = "Require flashlight to be held",
|
||||
Command = "sv_tfa_nmrih_flashlight_required",
|
||||
})
|
||||
|
||||
panel:AddControl("CheckBox", {
|
||||
Label = "Enable TNT FX",
|
||||
Command = "sv_tfa_nmrih_fx_tnt",
|
||||
})
|
||||
|
||||
panel:AddControl("Slider", {
|
||||
Label = "Override CL Extinguisher FX (-1 = Clientside)",
|
||||
Command = "sv_tfa_nmrih_fx_fext_override",
|
||||
Type = "Integer",
|
||||
Min = "-1",
|
||||
Max = "1",
|
||||
})
|
||||
|
||||
panel:AddControl("Slider", {
|
||||
Label = "Melee Damage Multiplier",
|
||||
Command = "sv_tfa_nmrih_melee_multiplier",
|
||||
Type = "Float",
|
||||
Min = "0",
|
||||
Max = "5",
|
||||
})
|
||||
|
||||
panel:AddControl("Label", {Text = "By TheForgottenArchitect"})
|
||||
|
||||
end
|
||||
|
||||
local function tfaNMRIHOptionClient(panel)
|
||||
--Here are whatever default categories you want.
|
||||
|
||||
local tfaOptionNMRIHCL = {Options = {}, CVars = {}, Label = "#Presets", MenuButton = "1", Folder = "TFA NRMIH Settings Server"}
|
||||
|
||||
tfaOptionNMRIHCL.Options["#Default"] = {
|
||||
cl_tfa_nmrih_fx_fext = "1"
|
||||
}
|
||||
|
||||
panel:AddControl("ComboBox", tfaOptionNMRIHCL)
|
||||
|
||||
panel:AddControl("CheckBox", {
|
||||
Label = "Enable Fire Extinguisher FX",
|
||||
Command = "cl_tfa_nmrih_fx_fext",
|
||||
})
|
||||
|
||||
panel:AddControl("Label", {Text = "By TheForgottenArchitect"})
|
||||
|
||||
end
|
||||
|
||||
function tfaNMRIHAddOption()
|
||||
spawnmenu.AddToolMenuOption("Options", "TFA SWEP Base Settings", "TFANMRIHServer", "NMRIH Server", "", "", tfaNMRIHOptionServer)
|
||||
spawnmenu.AddToolMenuOption("Options", "TFA SWEP Base Settings", "TFANMRIHClient", "NMRIH Client", "", "", tfaNMRIHOptionClient)
|
||||
end
|
||||
|
||||
hook.Add("PopulateToolMenu", "tfaNMRIHAddOption", tfaNMRIHAddOption)
|
||||
|
||||
end
|
||||
|
||||
local flashlightvar = GetConVar("sv_tfa_nmrih_flashlight_required")
|
||||
|
||||
if flashlightvar == nil then
|
||||
flashlightvar = CreateConVar("sv_tfa_nmrih_flashlight_required", "0", { FCVAR_REPLICATED, FCVAR_NOTIFY, FCVAR_ARCHIVE }, "Require flashlight to be held?")
|
||||
--print("Damage Multiplier con var created")
|
||||
end
|
||||
|
||||
if GetConVar("sv_tfa_nmrih_fx_tnt") == nil then
|
||||
CreateConVar("sv_tfa_nmrih_fx_tnt", "1", { FCVAR_REPLICATED, FCVAR_NOTIFY, FCVAR_ARCHIVE }, "Enable TNT FX, or use default? 0 = off, 1 = on")
|
||||
--print("Damage Multiplier con var created")
|
||||
end
|
||||
|
||||
if GetConVar("sv_tfa_nmrih_fx_fext_override") == nil then
|
||||
CreateConVar("sv_tfa_nmrih_fx_fext_override", "-1", { FCVAR_REPLICATED, FCVAR_NOTIFY, FCVAR_ARCHIVE }, "Override fire extinguisher FX? -1 = leave to client, 0 = off, 1 = on")
|
||||
--print("Damage Multiplier con var created")
|
||||
end
|
||||
|
||||
if GetConVar("sv_tfa_nmrih_melee_multiplier") == nil then
|
||||
CreateConVar("sv_tfa_nmrih_melee_multiplier", "1", { FCVAR_REPLICATED, FCVAR_NOTIFY, FCVAR_ARCHIVE }, "Melee damage multiplier")
|
||||
--print("Damage Multiplier con var created")
|
||||
end
|
||||
|
||||
if GetConVar("cl_tfa_nmrih_fx_fext") == nil then
|
||||
CreateClientConVar("cl_tfa_nmrih_fx_fext", 1, true, true)
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
util.AddNetworkString("NMRIHFlashlightToggle")
|
||||
|
||||
net.Receive("NMRIHFlashlightToggle", function(length, ply)
|
||||
if IsValid(ply) then
|
||||
local wep = ply:GetActiveWeapon()
|
||||
|
||||
if IsValid(wep) then
|
||||
wep.IsOn = not wep.IsOn
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
hook.Add("PlayerTick", "FlashlightStuffTick", function(ply)
|
||||
if not flashlightvar or not flashlightvar:GetBool() then return end
|
||||
if not IsValid(ply) then return end
|
||||
local wep = ply:GetActiveWeapon()
|
||||
if not IsValid(wep) then return end
|
||||
|
||||
if ply:FlashlightIsOn() and (wep:GetClass() ~= "tfa_nmrih_maglite" or not wep.IsOn) then
|
||||
ply:Flashlight(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
hook.Add("PlayerBindPress", "FlashlightStuff", function(ply, bind, pressed)
|
||||
if not CLIENT then return end
|
||||
|
||||
if bind == "impulse 100" then
|
||||
if flashlightvar and flashlightvar:GetBool() then
|
||||
if not IsValid(ply) then return true end
|
||||
if not IsValid(ply:GetActiveWeapon()) then return true end
|
||||
|
||||
if ply:GetActiveWeapon():GetClass() ~= "tfa_nmrih_maglite" then
|
||||
if ply:HasWeapon("tfa_nmrih_maglite") then
|
||||
ply:ConCommand("use tfa_nmrih_maglite")
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
if pressed then
|
||||
net.Start("NMRIHFlashlightToggle")
|
||||
net.SendToServer()
|
||||
end
|
||||
|
||||
return true
|
||||
else
|
||||
if not IsValid(ply) then return true end
|
||||
if not IsValid(ply:GetActiveWeapon()) then return true end
|
||||
|
||||
if ply:GetActiveWeapon():GetClass() == "tfa_nmrih_maglite" then
|
||||
if pressed then
|
||||
net.Start("NMRIHFlashlightToggle")
|
||||
net.SendToServer()
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
4633
lua/autorun/nmrihsounds.lua
Normal file
4633
lua/autorun/nmrihsounds.lua
Normal file
File diff suppressed because it is too large
Load Diff
152
lua/autorun/nmrihsounds2.lua
Normal file
152
lua/autorun/nmrihsounds2.lua
Normal file
@@ -0,0 +1,152 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
sound.Add( {
|
||||
name = "Weapon_Melee_Blunt.Impact_Light",
|
||||
channel = CHAN_AUTO,
|
||||
level = SNDLVL_NORM,
|
||||
volume = 1.0,
|
||||
sound = {
|
||||
")nmrihimpact/blunt_light1.wav",
|
||||
")nmrihimpact/blunt_light2.wav",
|
||||
")nmrihimpact/blunt_light3.wav",
|
||||
")nmrihimpact/blunt_light4.wav",
|
||||
")nmrihimpact/blunt_light5.wav",
|
||||
")nmrihimpact/blunt_light6.wav",
|
||||
")nmrihimpact/blunt_light7.wav",
|
||||
")nmrihimpact/blunt_light8.wav"
|
||||
},
|
||||
} )
|
||||
|
||||
sound.Add( {
|
||||
name = "Weapon_Melee_Blunt.Impact_Heavy",
|
||||
channel = CHAN_AUTO,
|
||||
level = SNDLVL_NORM,
|
||||
volume = 1.0,
|
||||
sound = {
|
||||
")nmrihimpact/blunt_heavy1.wav",
|
||||
")nmrihimpact/blunt_heavy2.wav",
|
||||
")nmrihimpact/blunt_heavy3.wav",
|
||||
")nmrihimpact/blunt_heavy4.wav",
|
||||
")nmrihimpact/blunt_heavy5.wav",
|
||||
")nmrihimpact/blunt_heavy6.wav"
|
||||
},
|
||||
} )
|
||||
|
||||
sound.Add( {
|
||||
name = "Weapon_Melee_Sharp.Impact_Light",
|
||||
channel = CHAN_AUTO,
|
||||
level = SNDLVL_NORM,
|
||||
volume = 1.0,
|
||||
sound = {
|
||||
")nmrihimpact/sharp_light1.wav",
|
||||
")nmrihimpact/sharp_light2.wav",
|
||||
")nmrihimpact/sharp_light3.wav"
|
||||
},
|
||||
} )
|
||||
|
||||
sound.Add( {
|
||||
name = "Weapon_Melee_Sharp.Impact_Heavy",
|
||||
channel = CHAN_AUTO,
|
||||
level = SNDLVL_NORM,
|
||||
volume = 1.0,
|
||||
sound = {
|
||||
")nmrihimpact/sharp_heavy1.wav",
|
||||
")nmrihimpact/sharp_heavy2.wav",
|
||||
")nmrihimpact/sharp_heavy3.wav",
|
||||
")nmrihimpact/sharp_heavy4.wav",
|
||||
")nmrihimpact/sharp_heavy5.wav",
|
||||
")nmrihimpact/sharp_heavy6.wav"
|
||||
},
|
||||
} )
|
||||
|
||||
sound.Add( {
|
||||
name = "Weapon_Melee.Impact_Brick",
|
||||
channel = CHAN_AUTO,
|
||||
level = SNDLVL_NORM,
|
||||
volume = 1.0,
|
||||
sound = {
|
||||
")nmrihimpact/brick/brick_impact_bullet1.wav",
|
||||
")nmrihimpact/brick/brick_impact_bullet2.wav",
|
||||
")nmrihimpact/brick/brick_impact_bullet3.wav",
|
||||
")nmrihimpact/brick/brick_impact_bullet4.wav",
|
||||
")nmrihimpact/brick/brick_impact_bullet5.wav"
|
||||
},
|
||||
} )
|
||||
|
||||
sound.Add( {
|
||||
name = "Weapon_Melee.Impact_Cardboard",
|
||||
channel = CHAN_AUTO,
|
||||
level = SNDLVL_NORM,
|
||||
volume = 1.0,
|
||||
sound = {
|
||||
")nmrihimpact/cardboard/ammo_box_impact_01.wav",
|
||||
")nmrihimpact/cardboard/ammo_box_impact_02.wav",
|
||||
")nmrihimpact/cardboard/ammo_box_impact_03.wav",
|
||||
")nmrihimpact/cardboard/ammo_box_impact_04.wav",
|
||||
")nmrihimpact/cardboard/ammo_box_impact_05.wav"
|
||||
},
|
||||
} )
|
||||
|
||||
sound.Add( {
|
||||
name = "Weapon_Melee.Impact_Concrete",
|
||||
channel = CHAN_AUTO,
|
||||
level = SNDLVL_NORM,
|
||||
volume = 1.0,
|
||||
sound = {
|
||||
")nmrihimpact/concrete/concrete_impact_bullet1.wav",
|
||||
")nmrihimpact/concrete/concrete_impact_bullet2.wav",
|
||||
")nmrihimpact/concrete/concrete_impact_bullet3.wav",
|
||||
")nmrihimpact/concrete/concrete_impact_bullet4.wav",
|
||||
")nmrihimpact/concrete/concrete_impact_bullet5.wav"
|
||||
},
|
||||
} )
|
||||
|
||||
sound.Add( {
|
||||
name = "Weapon_Melee.Impact_Metal",
|
||||
channel = CHAN_AUTO,
|
||||
level = SNDLVL_NORM,
|
||||
volume = 1.0,
|
||||
sound = {
|
||||
")nmrihimpact/metal/metal_solid_impact_bullet1.wav",
|
||||
")nmrihimpact/metal/metal_solid_impact_bullet2.wav",
|
||||
")nmrihimpact/metal/metal_solid_impact_bullet3.wav",
|
||||
")nmrihimpact/metal/metal_solid_impact_bullet4.wav",
|
||||
")nmrihimpact/metal/metal_solid_impact_bullet5.wav"
|
||||
},
|
||||
} )
|
||||
|
||||
sound.Add( {
|
||||
name = "Weapon_Melee.Impact_Generic",
|
||||
channel = CHAN_AUTO,
|
||||
level = SNDLVL_NORM,
|
||||
volume = 1.0,
|
||||
sound = {
|
||||
")nmrihimpact/surfaces/sand_impact_bullet1.wav",
|
||||
")nmrihimpact/surfaces/sand_impact_bullet2.wav",
|
||||
")nmrihimpact/surfaces/sand_impact_bullet3.wav",
|
||||
")nmrihimpact/surfaces/sand_impact_bullet4.wav",
|
||||
")nmrihimpact/surfaces/sand_impact_bullet5.wav"
|
||||
},
|
||||
} )
|
||||
|
||||
sound.Add( {
|
||||
name = "Weapon_Melee.Impact_Wood",
|
||||
channel = CHAN_AUTO,
|
||||
level = SNDLVL_NORM,
|
||||
volume = 1.0,
|
||||
sound = {
|
||||
")nmrihimpact/wood/wood_solid_impact_bullet1.wav",
|
||||
")nmrihimpact/wood/wood_solid_impact_bullet2.wav",
|
||||
")nmrihimpact/wood/wood_solid_impact_bullet3.wav",
|
||||
")nmrihimpact/wood/wood_solid_impact_bullet4.wav",
|
||||
")nmrihimpact/wood/wood_solid_impact_bullet5.wav"
|
||||
},
|
||||
} )
|
||||
1208
lua/autorun/particlecontrol_autorun.lua
Normal file
1208
lua/autorun/particlecontrol_autorun.lua
Normal file
File diff suppressed because it is too large
Load Diff
138
lua/autorun/particlefiletest.lua
Normal file
138
lua/autorun/particlefiletest.lua
Normal file
@@ -0,0 +1,138 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
//MsgN("Added concommand for particle read test!")
|
||||
|
||||
|
||||
|
||||
function ParticleControl_FileReadTest()
|
||||
|
||||
MsgN("")
|
||||
MsgN("")
|
||||
MsgN("")
|
||||
MsgN("")
|
||||
MsgN("")
|
||||
MsgN("=====================================================")
|
||||
MsgN("STEP 1: Reading the file")
|
||||
MsgN("=====================================================")
|
||||
MsgN("")
|
||||
|
||||
local filestr = file.Read("particlelists/particlefiletest.lua","LUA")
|
||||
if !filestr then
|
||||
MsgN("FAILURE! We tried to read the file (particlelists/particlefiletest.lua) and didn't get anything. The file can't be found, or it isn't readable, or something, which doesn't make any sense, since the actual tool got farther than this.")
|
||||
return
|
||||
end
|
||||
|
||||
if type(filestr) != "string" then
|
||||
MsgN("FAILURE! We read the file but we got back a " .. type(filestr) .. "instead of a string. What!? Here's what we got:")
|
||||
MsgN("")
|
||||
MsgN(filestr)
|
||||
return
|
||||
end
|
||||
|
||||
MsgN("SUCCESS! We read the file and got back a string. Here's its contents:")
|
||||
MsgN("")
|
||||
MsgN(filestr)
|
||||
|
||||
|
||||
MsgN("")
|
||||
MsgN("")
|
||||
MsgN("")
|
||||
MsgN("")
|
||||
MsgN("")
|
||||
MsgN("=====================================================")
|
||||
MsgN("STEP 2: Converting it to a table")
|
||||
MsgN("=====================================================")
|
||||
MsgN("")
|
||||
|
||||
local keyvalues = util.KeyValuesToTable( filestr, false, true )
|
||||
if !keyvalues then
|
||||
MsgN("FAILURE! We tried to convert it to a table, but we didn't get anything.")
|
||||
return
|
||||
end
|
||||
if (table.Count(keyvalues) == 0) then
|
||||
MsgN("FAILURE! We tried to convert it, but we got an empty table. Here's its contents, by which I mean a blank space unless something's weird here:")
|
||||
MsgN("")
|
||||
PrintTable(keyvalues)
|
||||
return
|
||||
end
|
||||
|
||||
MsgN("SUCCESS! We converted it and got a table of stuff. Here's its contents:")
|
||||
MsgN("")
|
||||
PrintTable(keyvalues)
|
||||
|
||||
|
||||
MsgN("")
|
||||
MsgN("")
|
||||
MsgN("")
|
||||
MsgN("")
|
||||
MsgN("")
|
||||
MsgN("=====================================================")
|
||||
MsgN("STEP 3: Reading the table")
|
||||
MsgN("=====================================================")
|
||||
MsgN("")
|
||||
|
||||
if !keyvalues.Info then
|
||||
MsgN("FAILURE! We couldn't find a key called \"Info\" inside the table. Is something wrong with the table we got? Like some blank spaces in the key name, or weird capitalization, or something like that which means it's technically not called \"Info\"? Or is the table's formatting messed up? Here's all of the keys we COULD find inside the table, with and without quotes just in case there's weird spaces:")
|
||||
MsgN("")
|
||||
for k, v in pairs (keyvalues) do
|
||||
MsgN("\"" .. k .. "\"")
|
||||
end
|
||||
MsgN("")
|
||||
for k, v in pairs (keyvalues) do
|
||||
MsgN(k)
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
if type(keyvalues.Info) != "table" then
|
||||
MsgN("FAILURE! The key called \"Info\" inside the table was something other than a sub-table. It was a " .. type(keyvalues.Info) .. " instead. Something's wrong with the table we got. Here's what \"Info\" is:")
|
||||
MsgN("")
|
||||
MsgN(keyvalues.Info)
|
||||
return
|
||||
end
|
||||
|
||||
MsgN("Found the sub-table called \"Info\" inside the table...")
|
||||
MsgN("")
|
||||
|
||||
if !keyvalues.Info.CategoryName then
|
||||
MsgN("FAILURE! We couldn't find the \"CategoryName\" inside the \"Info\" subtable. Something's wrong with the table we got. Here's \"Info\"'s contents:")
|
||||
MsgN("")
|
||||
PrintTable(keyvalues.Info)
|
||||
return
|
||||
end
|
||||
|
||||
if type(keyvalues.Info.CategoryName) != "string" then
|
||||
MsgN("FAILURE! The \"CategoryName\" inside the \"Info\" subtable was something other than a string. Something's wrong with the table we got. Here's \"Info\"'s contents:")
|
||||
MsgN("")
|
||||
PrintTable(keyvalues.Info)
|
||||
return
|
||||
end
|
||||
|
||||
MsgN("SUCCESS! We read the table. It's for a category called " .. keyvalues.Info.CategoryName .. ", and everything else should be there too. The table contents are back up there in Step 2 and they should look normal. Congratulations, everything's working fine! If we were doing this same stuff in the actual tool, it'd use the table to make a list of particle effects. But if the tool was working perfectly for you, then you wouldn't be running this debug thing, now would you? Looks like we're back to square one here.")
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
if SERVER then
|
||||
concommand.Add("particlereadtest_server", function()
|
||||
MsgN("Beginning SERVERSIDE particle file read test!")
|
||||
ParticleControl_FileReadTest()
|
||||
end)
|
||||
end
|
||||
|
||||
if CLIENT then
|
||||
concommand.Add("particlereadtest_client", function()
|
||||
MsgN("Beginning CLIENTSIDE particle file read test!")
|
||||
ParticleControl_FileReadTest()
|
||||
end)
|
||||
end
|
||||
59
lua/autorun/pill_base_episodic.lua
Normal file
59
lua/autorun/pill_base_episodic.lua
Normal file
@@ -0,0 +1,59 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
--------------------------
|
||||
-- BOOTSTRAP CODE START --
|
||||
--------------------------
|
||||
|
||||
if !pcall(require,"pk_pills") then
|
||||
if SERVER then
|
||||
hook.Add("PlayerInitialSpawn","pk_pill_extfail_cl",function(ply)
|
||||
if game.SinglePlayer() || ply:IsListenServerHost() then
|
||||
ply:SendLua('notification.AddLegacy("One or more pill extensions failed to load. Did you forget to install Parakeet\'s Pill Pack?",NOTIFY_ERROR,30)')
|
||||
end
|
||||
end)
|
||||
hook.Add("Initialize","pk_pill_extfail_sv",function(ply)
|
||||
print("[ALERT] One or more pill extensions failed to load. Did you forget to install Parakeet's Pill Pack?")
|
||||
end)
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
------------------------
|
||||
-- BOOTSTRAP CODE END --
|
||||
------------------------
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
if SERVER then
|
||||
resource.AddWorkshop("417428923")
|
||||
end
|
||||
|
||||
game.AddParticles("particles/weapon_fx.pcf")
|
||||
PrecacheParticleSystem("weapon_combine_ion_cannon")
|
||||
PrecacheParticleSystem("weapon_combine_ion_cannon_explosion")
|
||||
|
||||
game.AddParticles("particles/striderbuster.pcf")
|
||||
PrecacheParticleSystem("striderbuster_attach")
|
||||
PrecacheParticleSystem("striderbuster_attach_flash")
|
||||
PrecacheParticleSystem("striderbuster_explode_core")
|
||||
PrecacheParticleSystem("striderbuster_explode_flash")
|
||||
PrecacheParticleSystem("striderbuster_break")
|
||||
|
||||
game.AddParticles("particles/advisor_fx.pcf")
|
||||
PrecacheParticleSystem("advisor_psychic_shield_idle")
|
||||
|
||||
pk_pills.packStart("Episode 1","ep1","games/16/hl2.png")
|
||||
pk_pills.packRequireGame("Half-Life 2: Episode 1",380)
|
||||
include("include/pill_ep1.lua")
|
||||
|
||||
pk_pills.packStart("Episode 2","ep2","games/16/hl2.png")
|
||||
pk_pills.packRequireGame("Half-Life 2: Episode 2",420)
|
||||
include("include/pill_ep2.lua")
|
||||
126
lua/autorun/ppfx_cache.lua
Normal file
126
lua/autorun/ppfx_cache.lua
Normal file
@@ -0,0 +1,126 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
game.AddParticles( "particles/pfx_redux.pcf" )
|
||||
-- 1
|
||||
PrecacheParticleSystem("[1]campfire1")
|
||||
PrecacheParticleSystem("[1]cig_smoke*")
|
||||
PrecacheParticleSystem("[1]candle_flame")
|
||||
PrecacheParticleSystem("[1]ground_fire_1")
|
||||
PrecacheParticleSystem("[1]ground_fire_1*")
|
||||
PrecacheParticleSystem("[1]smoke_lifting_01")
|
||||
PrecacheParticleSystem("[1]_large_campfire")
|
||||
PrecacheParticleSystem("[1]fireplace_default")
|
||||
PrecacheParticleSystem("[1]_smoke_colorful_1")
|
||||
PrecacheParticleSystem("[1]groundflame1")
|
||||
PrecacheParticleSystem("[1]molotov_ground")
|
||||
PrecacheParticleSystem("[1]embers")
|
||||
PrecacheParticleSystem("[1]embers_~")
|
||||
PrecacheParticleSystem("[1]flametrail")
|
||||
PrecacheParticleSystem("[1]groundflame")
|
||||
PrecacheParticleSystem("[1]flamethrower_basic")
|
||||
PrecacheParticleSystem("[1]big_smoke")
|
||||
PrecacheParticleSystem("[1]_large_campfire_red")
|
||||
PrecacheParticleSystem("[1]_campfire_red")
|
||||
PrecacheParticleSystem("[1]_large_campfire_yellow")
|
||||
PrecacheParticleSystem("[1]_campfire_yellow")
|
||||
PrecacheParticleSystem("[1]_large_campfire_purple")
|
||||
PrecacheParticleSystem("[1]_campfire_purple")
|
||||
PrecacheParticleSystem("[1]_large_campfire_green")
|
||||
PrecacheParticleSystem("[1]_campfire_green")
|
||||
PrecacheParticleSystem("[1]_large_campfire_pink")
|
||||
PrecacheParticleSystem("[1]_campfire_pink")
|
||||
PrecacheParticleSystem("[1]_large_campfire_blue")
|
||||
PrecacheParticleSystem("[1]_campfire_blue")
|
||||
PrecacheParticleSystem("[1]g_leak_flame")
|
||||
-- 2
|
||||
PrecacheParticleSystem("[2]sparkle1")
|
||||
PrecacheParticleSystem("[2]sparkle2")
|
||||
PrecacheParticleSystem("[2]gushing_blood_alien")
|
||||
PrecacheParticleSystem("[2]gushing_blood_alien*")
|
||||
PrecacheParticleSystem("[2]gushing_blood")
|
||||
PrecacheParticleSystem("[2]gushing_blood*")
|
||||
PrecacheParticleSystem("[2]acid_ground")
|
||||
PrecacheParticleSystem("[2]swirl_1")
|
||||
PrecacheParticleSystem("[2]swirl_rnd")
|
||||
PrecacheParticleSystem("[2]gman_lines")
|
||||
PrecacheParticleSystem("[2]blood_leak")
|
||||
PrecacheParticleSystem("[2]blood_leak_alien")
|
||||
-- 3
|
||||
PrecacheParticleSystem("[3]sakura_env")
|
||||
PrecacheParticleSystem("[3]leaves_env")
|
||||
-- 4
|
||||
PrecacheParticleSystem("[4]jet_r")
|
||||
PrecacheParticleSystem("[4]jet_r*")
|
||||
PrecacheParticleSystem("[4]jet_r_s")
|
||||
PrecacheParticleSystem("[4]jet_r_s*")
|
||||
PrecacheParticleSystem("[4]jet_g_s")
|
||||
PrecacheParticleSystem("[4]jet_g_s*")
|
||||
PrecacheParticleSystem("[4]jet_g")
|
||||
PrecacheParticleSystem("[4]jet_g*")
|
||||
PrecacheParticleSystem("[4]jet_b_s")
|
||||
PrecacheParticleSystem("[4]jet_b_s*")
|
||||
PrecacheParticleSystem("[4]jet_b")
|
||||
PrecacheParticleSystem("[4]jet_b*")
|
||||
PrecacheParticleSystem("[4]jet_f_s")
|
||||
PrecacheParticleSystem("[4]jet_f_s*")
|
||||
PrecacheParticleSystem("[4]jet_f")
|
||||
PrecacheParticleSystem("[4]jet_f*")
|
||||
PrecacheParticleSystem("[4]jet_v_s")
|
||||
PrecacheParticleSystem("[4]jet_v_s*")
|
||||
PrecacheParticleSystem("[4]jet_v")
|
||||
PrecacheParticleSystem("[4]jet_v*")
|
||||
PrecacheParticleSystem("[4]energy_rod_r")
|
||||
PrecacheParticleSystem("[4]energy_rod_g")
|
||||
PrecacheParticleSystem("[4]energy_rod_b")
|
||||
PrecacheParticleSystem("[4]energy_rod_y")
|
||||
PrecacheParticleSystem("[4]arcs_electric_1")
|
||||
PrecacheParticleSystem("[4]arcs_electric_1_small")
|
||||
PrecacheParticleSystem("[4]bfg_*proj")
|
||||
PrecacheParticleSystem("[4]electric_beam")
|
||||
PrecacheParticleSystem("[4]matrix_core")
|
||||
PrecacheParticleSystem("[4]binary_sphere")
|
||||
PrecacheParticleSystem("[4]_car_nitro")
|
||||
-- 5
|
||||
PrecacheParticleSystem("[5]black_hole_micro_b")
|
||||
PrecacheParticleSystem("[5]black_hole_mmicro_b")
|
||||
PrecacheParticleSystem("[5]black_hole_b")
|
||||
PrecacheParticleSystem("[5]black_hole_micro")
|
||||
PrecacheParticleSystem("[5]black_hole_mmicro")
|
||||
PrecacheParticleSystem("[5]black_hole")
|
||||
PrecacheParticleSystem("[5]starfield1")
|
||||
PrecacheParticleSystem("[5]starfield_2")
|
||||
PrecacheParticleSystem("[5]simple_galaxy")
|
||||
-- 6
|
||||
PrecacheParticleSystem("[6]gunfire_generic")
|
||||
PrecacheParticleSystem("[6]bullet_tracer_generic")
|
||||
PrecacheParticleSystem("[6]gunfire_ar2")
|
||||
PrecacheParticleSystem("[6]bullet_tracer_ar2")
|
||||
-- 7
|
||||
PrecacheParticleSystem("[7]dusty_wind1")
|
||||
PrecacheParticleSystem("[7]rain")
|
||||
PrecacheParticleSystem("[7]snow")
|
||||
PrecacheParticleSystem("[7]areal_fog_s")
|
||||
PrecacheParticleSystem("[7]area_of_fog")
|
||||
PrecacheParticleSystem("[7]blizzard_mod")
|
||||
-- 8
|
||||
PrecacheParticleSystem("[8]magic_1")
|
||||
PrecacheParticleSystem("[8]red_vortex")
|
||||
PrecacheParticleSystem("[8]magic_flame")
|
||||
PrecacheParticleSystem("[8]magic_portal*")
|
||||
PrecacheParticleSystem("[8]magic_portal")
|
||||
PrecacheParticleSystem("[8]core_1")
|
||||
PrecacheParticleSystem("[8]ball_core")
|
||||
PrecacheParticleSystem("[8]orb_1")
|
||||
PrecacheParticleSystem("[8]frostbeam")
|
||||
-- 9
|
||||
PrecacheParticleSystem("[9]colorful_trail_1")
|
||||
-- A
|
||||
PrecacheParticleSystem("[A]waterleak_1")
|
||||
96
lua/autorun/ppp_dev_iconmaker.lua
Normal file
96
lua/autorun/ppp_dev_iconmaker.lua
Normal file
@@ -0,0 +1,96 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
--[[
|
||||
This is a utility to generate icons. You can accomplish some stuff through the console command,
|
||||
but it's usually easier to just edit the source code.
|
||||
|
||||
Frequently used colors
|
||||
|
||||
combine 60,115,140
|
||||
synth 210,150,70
|
||||
bird 50,86,34
|
||||
fun 220,0,255 (4th in pallet)
|
||||
shotgunner 140 84 60
|
||||
vort mid 2nd from right in pallet
|
||||
zombie+headcrab middle-ish maroon
|
||||
resistance upper right
|
||||
|
||||
-TF2-
|
||||
normal 200,60,60
|
||||
robots grey 109, in bottom
|
||||
spooky mid row, 1/3 from the right
|
||||
weapons 197 175 145
|
||||
fun 4th from left
|
||||
|
||||
-PORTAL-
|
||||
1 - White
|
||||
2 - Dirty blue second row
|
||||
]]
|
||||
if CLIENT then
|
||||
local matBack = Material("icongen/back.png")
|
||||
local matFront = Material("icongen/front.png")
|
||||
|
||||
concommand.Add("pk_dev_iconmaker", function(ply, cmd, args, str)
|
||||
local frame = vgui.Create("DFrame")
|
||||
frame:SetPos(ScrW() / 2 - 270, ScrH() / 2 - 150) --ScrW() ScrH()
|
||||
frame:SetSize(540, 300)
|
||||
frame:SetTitle("Icon Maker")
|
||||
frame:SetVisible(true)
|
||||
frame:SetDraggable(false)
|
||||
frame:ShowCloseButton(true)
|
||||
frame:MakePopup()
|
||||
local color = vgui.Create("DColorMixer", frame)
|
||||
color:SetPos(10, 30)
|
||||
color:SetAlphaBar(false)
|
||||
--color:SetColor(Color(200,60,60)) tf2 default red
|
||||
color:SetColor(Color(200, 60, 60))
|
||||
local model = vgui.Create("DAdjustableModelPanel", frame)
|
||||
model:SetPos(270, 30)
|
||||
model:SetSize(256, 256)
|
||||
model:SetLookAt(Vector(0, 0, 0))
|
||||
model:SetModel(args[1] ~= "" and args[1] or "models/props_junk/watermelon01.mdl")
|
||||
model:SetCamPos(Vector(100, 100, 100))
|
||||
local ent = model:GetEntity()
|
||||
|
||||
--ent:SetRenderAngles(Angle(180,0,0))
|
||||
if args[2] then
|
||||
model:SetAnimated(true)
|
||||
ent:ResetSequence(ent:LookupSequence(args[2]))
|
||||
end
|
||||
|
||||
--Custom
|
||||
model:GetEntity():SetSkin(1)
|
||||
--model:GetEntity():SetBodygroup(2,1)
|
||||
--model:GetEntity():SetBodygroup(1,1)
|
||||
--[[model:GetEntity():SetBodygroup(2,1)
|
||||
model:GetEntity():SetBodygroup(3,1)
|
||||
model:GetEntity():SetBodygroup(4,1)]]
|
||||
--model:GetEntity():SetMaterial("Models/antlion_guard/antlionGuard2")
|
||||
--model:GetEntity():SetSkin(2)
|
||||
--model:GetEntity():SetBodygroup(3,1)
|
||||
--model:GetEntity():SetColor(Color(120,70,210))
|
||||
local superPaint = model.Paint
|
||||
|
||||
function model:Paint()
|
||||
surface.SetDrawColor(color:GetColor())
|
||||
surface.SetMaterial(matBack)
|
||||
surface.DrawTexturedRect(0, 0, model:GetWide(), model:GetTall())
|
||||
superPaint(model)
|
||||
cam.IgnoreZ(true)
|
||||
surface.SetDrawColor(Color(255, 255, 255, 255))
|
||||
surface.SetMaterial(matFront)
|
||||
surface.DrawTexturedRect(0, 0, model:GetWide(), model:GetTall())
|
||||
cam.IgnoreZ(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
358
lua/autorun/ppp_dev_voxgen.lua
Normal file
358
lua/autorun/ppp_dev_voxgen.lua
Normal file
@@ -0,0 +1,358 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
--This is a untility to convert lists of sounds into tables usable by the vox system.
|
||||
--TODO run the output through a spellcheck library and see if we can get it to seperate the words.
|
||||
AddCSLuaFile()
|
||||
local input_raw = [[
|
||||
|
||||
vo/npc/female01/abouttime01.wav
|
||||
vo/npc/female01/abouttime02.wav
|
||||
vo/npc/female01/ahgordon01.wav
|
||||
vo/npc/female01/ahgordon02.wav
|
||||
vo/npc/female01/ammo01.wav
|
||||
vo/npc/female01/ammo02.wav
|
||||
vo/npc/female01/ammo03.wav
|
||||
vo/npc/female01/ammo04.wav
|
||||
vo/npc/female01/ammo05.wav
|
||||
vo/npc/female01/answer01.wav
|
||||
vo/npc/female01/answer02.wav
|
||||
vo/npc/female01/answer03.wav
|
||||
vo/npc/female01/answer04.wav
|
||||
vo/npc/female01/answer05.wav
|
||||
vo/npc/female01/answer07.wav
|
||||
vo/npc/female01/answer08.wav
|
||||
vo/npc/female01/answer09.wav
|
||||
vo/npc/female01/answer10.wav
|
||||
vo/npc/female01/answer11.wav
|
||||
vo/npc/female01/answer12.wav
|
||||
vo/npc/female01/answer13.wav
|
||||
vo/npc/female01/answer14.wav
|
||||
vo/npc/female01/answer15.wav
|
||||
vo/npc/female01/answer16.wav
|
||||
vo/npc/female01/answer17.wav
|
||||
vo/npc/female01/answer18.wav
|
||||
vo/npc/female01/answer19.wav
|
||||
vo/npc/female01/answer20.wav
|
||||
vo/npc/female01/answer21.wav
|
||||
vo/npc/female01/answer22.wav
|
||||
vo/npc/female01/answer23.wav
|
||||
vo/npc/female01/answer24.wav
|
||||
vo/npc/female01/answer25.wav
|
||||
vo/npc/female01/answer26.wav
|
||||
vo/npc/female01/answer27.wav
|
||||
vo/npc/female01/answer28.wav
|
||||
vo/npc/female01/answer29.wav
|
||||
vo/npc/female01/answer30.wav
|
||||
vo/npc/female01/answer31.wav
|
||||
vo/npc/female01/answer32.wav
|
||||
vo/npc/female01/answer33.wav
|
||||
vo/npc/female01/answer34.wav
|
||||
vo/npc/female01/answer35.wav
|
||||
vo/npc/female01/answer36.wav
|
||||
vo/npc/female01/answer37.wav
|
||||
vo/npc/female01/answer38.wav
|
||||
vo/npc/female01/answer39.wav
|
||||
vo/npc/female01/answer40.wav
|
||||
vo/npc/female01/behindyou01.wav
|
||||
vo/npc/female01/behindyou02.wav
|
||||
vo/npc/female01/busy02.wav
|
||||
vo/npc/female01/cit_dropper01.wav
|
||||
vo/npc/female01/cit_dropper04.wav
|
||||
vo/npc/female01/civilprotection01.wav
|
||||
vo/npc/female01/civilprotection02.wav
|
||||
vo/npc/female01/combine01.wav
|
||||
vo/npc/female01/combine02.wav
|
||||
vo/npc/female01/coverwhilereload01.wav
|
||||
vo/npc/female01/coverwhilereload02.wav
|
||||
vo/npc/female01/cps01.wav
|
||||
vo/npc/female01/cps02.wav
|
||||
vo/npc/female01/docfreeman01.wav
|
||||
vo/npc/female01/docfreeman02.wav
|
||||
vo/npc/female01/doingsomething.wav
|
||||
vo/npc/female01/dontforgetreload01.wav
|
||||
vo/npc/female01/excuseme01.wav
|
||||
vo/npc/female01/excuseme02.wav
|
||||
vo/npc/female01/fantastic01.wav
|
||||
vo/npc/female01/fantastic02.wav
|
||||
vo/npc/female01/finally.wav
|
||||
vo/npc/female01/freeman.wav
|
||||
vo/npc/female01/getdown02.wav
|
||||
vo/npc/female01/getgoingsoon.wav
|
||||
vo/npc/female01/gethellout.wav
|
||||
vo/npc/female01/goodgod.wav
|
||||
vo/npc/female01/gordead_ans01.wav
|
||||
vo/npc/female01/gordead_ans02.wav
|
||||
vo/npc/female01/gordead_ans03.wav
|
||||
vo/npc/female01/gordead_ans04.wav
|
||||
vo/npc/female01/gordead_ans05.wav
|
||||
vo/npc/female01/gordead_ans06.wav
|
||||
vo/npc/female01/gordead_ans07.wav
|
||||
vo/npc/female01/gordead_ans08.wav
|
||||
vo/npc/female01/gordead_ans09.wav
|
||||
vo/npc/female01/gordead_ans10.wav
|
||||
vo/npc/female01/gordead_ans11.wav
|
||||
vo/npc/female01/gordead_ans12.wav
|
||||
vo/npc/female01/gordead_ans13.wav
|
||||
vo/npc/female01/gordead_ans14.wav
|
||||
vo/npc/female01/gordead_ans15.wav
|
||||
vo/npc/female01/gordead_ans16.wav
|
||||
vo/npc/female01/gordead_ans17.wav
|
||||
vo/npc/female01/gordead_ans18.wav
|
||||
vo/npc/female01/gordead_ans19.wav
|
||||
vo/npc/female01/gordead_ans20.wav
|
||||
vo/npc/female01/gordead_ques01.wav
|
||||
vo/npc/female01/gordead_ques02.wav
|
||||
vo/npc/female01/gordead_ques04.wav
|
||||
vo/npc/female01/gordead_ques05.wav
|
||||
vo/npc/female01/gordead_ques06.wav
|
||||
vo/npc/female01/gordead_ques07.wav
|
||||
vo/npc/female01/gordead_ques08.wav
|
||||
vo/npc/female01/gordead_ques10.wav
|
||||
vo/npc/female01/gordead_ques11.wav
|
||||
vo/npc/female01/gordead_ques12.wav
|
||||
vo/npc/female01/gordead_ques13.wav
|
||||
vo/npc/female01/gordead_ques14.wav
|
||||
vo/npc/female01/gordead_ques15.wav
|
||||
vo/npc/female01/gordead_ques16.wav
|
||||
vo/npc/female01/gordead_ques17.wav
|
||||
vo/npc/female01/gotone01.wav
|
||||
vo/npc/female01/gotone02.wav
|
||||
vo/npc/female01/gottareload01.wav
|
||||
vo/npc/female01/gunship02.wav
|
||||
vo/npc/female01/hacks01.wav
|
||||
vo/npc/female01/hacks02.wav
|
||||
vo/npc/female01/headcrabs01.wav
|
||||
vo/npc/female01/headcrabs02.wav
|
||||
vo/npc/female01/headsup01.wav
|
||||
vo/npc/female01/headsup02.wav
|
||||
vo/npc/female01/health01.wav
|
||||
vo/npc/female01/health02.wav
|
||||
vo/npc/female01/health03.wav
|
||||
vo/npc/female01/health04.wav
|
||||
vo/npc/female01/health05.wav
|
||||
vo/npc/female01/hellodrfm01.wav
|
||||
vo/npc/female01/hellodrfm02.wav
|
||||
vo/npc/female01/help01.wav
|
||||
vo/npc/female01/herecomehacks01.wav
|
||||
vo/npc/female01/herecomehacks02.wav
|
||||
vo/npc/female01/heretheycome01.wav
|
||||
vo/npc/female01/heretohelp01.wav
|
||||
vo/npc/female01/heretohelp02.wav
|
||||
vo/npc/female01/heydoc01.wav
|
||||
vo/npc/female01/heydoc02.wav
|
||||
vo/npc/female01/hi01.wav
|
||||
vo/npc/female01/hi02.wav
|
||||
vo/npc/female01/hitingut01.wav
|
||||
vo/npc/female01/hitingut02.wav
|
||||
vo/npc/female01/holddownspot01.wav
|
||||
vo/npc/female01/holddownspot02.wav
|
||||
vo/npc/female01/illstayhere01.wav
|
||||
vo/npc/female01/imhurt01.wav
|
||||
vo/npc/female01/imhurt02.wav
|
||||
vo/npc/female01/imstickinghere01.wav
|
||||
vo/npc/female01/incoming02.wav
|
||||
vo/npc/female01/itsamanhack01.wav
|
||||
vo/npc/female01/itsamanhack02.wav
|
||||
vo/npc/female01/leadon01.wav
|
||||
vo/npc/female01/leadon02.wav
|
||||
vo/npc/female01/leadtheway01.wav
|
||||
vo/npc/female01/leadtheway02.wav
|
||||
vo/npc/female01/letsgo01.wav
|
||||
vo/npc/female01/letsgo02.wav
|
||||
vo/npc/female01/likethat.wav
|
||||
vo/npc/female01/littlecorner01.wav
|
||||
vo/npc/female01/lookoutfm01.wav
|
||||
vo/npc/female01/lookoutfm02.wav
|
||||
vo/npc/female01/moan01.wav
|
||||
vo/npc/female01/moan02.wav
|
||||
vo/npc/female01/moan03.wav
|
||||
vo/npc/female01/moan04.wav
|
||||
vo/npc/female01/moan05.wav
|
||||
vo/npc/female01/myarm01.wav
|
||||
vo/npc/female01/myarm02.wav
|
||||
vo/npc/female01/mygut02.wav
|
||||
vo/npc/female01/myleg01.wav
|
||||
vo/npc/female01/myleg02.wav
|
||||
vo/npc/female01/nice01.wav
|
||||
vo/npc/female01/nice02.wav
|
||||
vo/npc/female01/no01.wav
|
||||
vo/npc/female01/no02.wav
|
||||
vo/npc/female01/notthemanithought01.wav
|
||||
vo/npc/female01/notthemanithought02.wav
|
||||
vo/npc/female01/ohno.wav
|
||||
vo/npc/female01/ok01.wav
|
||||
vo/npc/female01/ok02.wav
|
||||
vo/npc/female01/okimready01.wav
|
||||
vo/npc/female01/okimready02.wav
|
||||
vo/npc/female01/okimready03.wav
|
||||
vo/npc/female01/onyourside.wav
|
||||
vo/npc/female01/outofyourway02.wav
|
||||
vo/npc/female01/overhere01.wav
|
||||
vo/npc/female01/overthere01.wav
|
||||
vo/npc/female01/overthere02.wav
|
||||
vo/npc/female01/ow01.wav
|
||||
vo/npc/female01/ow02.wav
|
||||
vo/npc/female01/pain01.wav
|
||||
vo/npc/female01/pain02.wav
|
||||
vo/npc/female01/pain03.wav
|
||||
vo/npc/female01/pain04.wav
|
||||
vo/npc/female01/pain05.wav
|
||||
vo/npc/female01/pain06.wav
|
||||
vo/npc/female01/pain07.wav
|
||||
vo/npc/female01/pain08.wav
|
||||
vo/npc/female01/pain09.wav
|
||||
vo/npc/female01/pardonme01.wav
|
||||
vo/npc/female01/pardonme02.wav
|
||||
vo/npc/female01/question01.wav
|
||||
vo/npc/female01/question02.wav
|
||||
vo/npc/female01/question03.wav
|
||||
vo/npc/female01/question04.wav
|
||||
vo/npc/female01/question05.wav
|
||||
vo/npc/female01/question06.wav
|
||||
vo/npc/female01/question07.wav
|
||||
vo/npc/female01/question08.wav
|
||||
vo/npc/female01/question09.wav
|
||||
vo/npc/female01/question10.wav
|
||||
vo/npc/female01/question11.wav
|
||||
vo/npc/female01/question12.wav
|
||||
vo/npc/female01/question13.wav
|
||||
vo/npc/female01/question14.wav
|
||||
vo/npc/female01/question15.wav
|
||||
vo/npc/female01/question16.wav
|
||||
vo/npc/female01/question17.wav
|
||||
vo/npc/female01/question18.wav
|
||||
vo/npc/female01/question19.wav
|
||||
vo/npc/female01/question20.wav
|
||||
vo/npc/female01/question21.wav
|
||||
vo/npc/female01/question22.wav
|
||||
vo/npc/female01/question23.wav
|
||||
vo/npc/female01/question25.wav
|
||||
vo/npc/female01/question26.wav
|
||||
vo/npc/female01/question27.wav
|
||||
vo/npc/female01/question28.wav
|
||||
vo/npc/female01/question29.wav
|
||||
vo/npc/female01/question30.wav
|
||||
vo/npc/female01/question31.wav
|
||||
vo/npc/female01/readywhenyouare01.wav
|
||||
vo/npc/female01/readywhenyouare02.wav
|
||||
vo/npc/female01/reloadfm01.wav
|
||||
vo/npc/female01/reloadfm02.wav
|
||||
vo/npc/female01/runforyourlife01.wav
|
||||
vo/npc/female01/runforyourlife02.wav
|
||||
vo/npc/female01/scanners01.wav
|
||||
vo/npc/female01/scanners02.wav
|
||||
vo/npc/female01/sorry01.wav
|
||||
vo/npc/female01/sorry02.wav
|
||||
vo/npc/female01/sorry03.wav
|
||||
vo/npc/female01/sorrydoc01.wav
|
||||
vo/npc/female01/sorrydoc02.wav
|
||||
vo/npc/female01/sorrydoc04.wav
|
||||
vo/npc/female01/sorryfm01.wav
|
||||
vo/npc/female01/sorryfm02.wav
|
||||
vo/npc/female01/squad_affirm01.wav
|
||||
vo/npc/female01/squad_affirm02.wav
|
||||
vo/npc/female01/squad_affirm03.wav
|
||||
vo/npc/female01/squad_affirm04.wav
|
||||
vo/npc/female01/squad_affirm05.wav
|
||||
vo/npc/female01/squad_affirm06.wav
|
||||
vo/npc/female01/squad_affirm07.wav
|
||||
vo/npc/female01/squad_affirm08.wav
|
||||
vo/npc/female01/squad_affirm09.wav
|
||||
vo/npc/female01/squad_approach01.wav
|
||||
vo/npc/female01/squad_approach02.wav
|
||||
vo/npc/female01/squad_approach03.wav
|
||||
vo/npc/female01/squad_approach04.wav
|
||||
vo/npc/female01/squad_away01.wav
|
||||
vo/npc/female01/squad_away02.wav
|
||||
vo/npc/female01/squad_away03.wav
|
||||
vo/npc/female01/squad_follow01.wav
|
||||
vo/npc/female01/squad_follow02.wav
|
||||
vo/npc/female01/squad_follow03.wav
|
||||
vo/npc/female01/squad_follow04.wav
|
||||
vo/npc/female01/squad_greet01.wav
|
||||
vo/npc/female01/squad_greet02.wav
|
||||
vo/npc/female01/squad_greet04.wav
|
||||
vo/npc/female01/squad_reinforce_group01.wav
|
||||
vo/npc/female01/squad_reinforce_group02.wav
|
||||
vo/npc/female01/squad_reinforce_group03.wav
|
||||
vo/npc/female01/squad_reinforce_group04.wav
|
||||
vo/npc/female01/squad_reinforce_single01.wav
|
||||
vo/npc/female01/squad_reinforce_single02.wav
|
||||
vo/npc/female01/squad_reinforce_single03.wav
|
||||
vo/npc/female01/squad_reinforce_single04.wav
|
||||
vo/npc/female01/squad_train01.wav
|
||||
vo/npc/female01/squad_train02.wav
|
||||
vo/npc/female01/squad_train03.wav
|
||||
vo/npc/female01/squad_train04.wav
|
||||
vo/npc/female01/startle01.wav
|
||||
vo/npc/female01/startle02.wav
|
||||
vo/npc/female01/stopitfm.wav
|
||||
vo/npc/female01/strider.wav
|
||||
vo/npc/female01/strider_run.wav
|
||||
vo/npc/female01/takecover02.wav
|
||||
vo/npc/female01/thehacks01.wav
|
||||
vo/npc/female01/thehacks02.wav
|
||||
vo/npc/female01/thislldonicely01.wav
|
||||
vo/npc/female01/uhoh.wav
|
||||
vo/npc/female01/upthere01.wav
|
||||
vo/npc/female01/upthere02.wav
|
||||
vo/npc/female01/vanswer01.wav
|
||||
vo/npc/female01/vanswer02.wav
|
||||
vo/npc/female01/vanswer03.wav
|
||||
vo/npc/female01/vanswer04.wav
|
||||
vo/npc/female01/vanswer05.wav
|
||||
vo/npc/female01/vanswer06.wav
|
||||
vo/npc/female01/vanswer07.wav
|
||||
vo/npc/female01/vanswer08.wav
|
||||
vo/npc/female01/vanswer09.wav
|
||||
vo/npc/female01/vanswer10.wav
|
||||
vo/npc/female01/vanswer11.wav
|
||||
vo/npc/female01/vanswer12.wav
|
||||
vo/npc/female01/vanswer13.wav
|
||||
vo/npc/female01/vanswer14.wav
|
||||
vo/npc/female01/vquestion01.wav
|
||||
vo/npc/female01/vquestion02.wav
|
||||
vo/npc/female01/vquestion03.wav
|
||||
vo/npc/female01/vquestion04.wav
|
||||
vo/npc/female01/vquestion05.wav
|
||||
vo/npc/female01/vquestion06.wav
|
||||
vo/npc/female01/vquestion07.wav
|
||||
vo/npc/female01/waitingsomebody.wav
|
||||
vo/npc/female01/watchout.wav
|
||||
vo/npc/female01/watchwhat.wav
|
||||
vo/npc/female01/wetrustedyou01.wav
|
||||
vo/npc/female01/wetrustedyou02.wav
|
||||
vo/npc/female01/whoops01.wav
|
||||
vo/npc/female01/yeah02.wav
|
||||
vo/npc/female01/youdbetterreload01.wav
|
||||
vo/npc/female01/yougotit02.wav
|
||||
vo/npc/female01/zombies01.wav
|
||||
vo/npc/female01/zombies02.wav
|
||||
|
||||
|
||||
|
||||
]]
|
||||
|
||||
if CLIENT then
|
||||
concommand.Add("pk_dev_voxgen", function(ply, cmd, args)
|
||||
local n = args[1]
|
||||
local output = {'local ' .. n .. '={}'}
|
||||
|
||||
for _, v in pairs(("\n"):Explode(input_raw)) do
|
||||
if v:len() == 0 then continue end
|
||||
local r = string.match(v, "/([^/]*)%.")
|
||||
output[r] = v
|
||||
table.insert(output, n .. '[ "' .. r .. '" ]="' .. v .. '"')
|
||||
end
|
||||
|
||||
SetClipboardText(("\n"):Implode(output))
|
||||
end)
|
||||
end
|
||||
365
lua/autorun/ppp_include/drivemodes.lua
Normal file
365
lua/autorun/ppp_include/drivemodes.lua
Normal file
@@ -0,0 +1,365 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
pk_pills.registerDrive("roll", {
|
||||
think = function(ply, ent, options)
|
||||
local aimYaw = Angle(0, ply:EyeAngles().y, 0)
|
||||
local moveDir = Vector(0, 0, 0)
|
||||
|
||||
if (ply:KeyDown(IN_FORWARD)) then
|
||||
moveDir = moveDir + aimYaw:Forward()
|
||||
end
|
||||
|
||||
if (ply:KeyDown(IN_BACK)) then
|
||||
moveDir = moveDir - aimYaw:Forward()
|
||||
end
|
||||
|
||||
if (ply:KeyDown(IN_MOVERIGHT)) then
|
||||
moveDir = moveDir + aimYaw:Right()
|
||||
end
|
||||
|
||||
if (ply:KeyDown(IN_MOVELEFT)) then
|
||||
moveDir = moveDir - aimYaw:Right()
|
||||
end
|
||||
|
||||
local phys = ent:GetPhysicsObject()
|
||||
if not IsValid(phys) then return end
|
||||
local center = ent:LocalToWorld(phys:GetMassCenter())
|
||||
moveDir:Normalize()
|
||||
|
||||
if options.rotcap then
|
||||
local av = phys:GetAngleVelocity()
|
||||
local abs = math.abs(av.x) + math.abs(av.y) + math.abs(av.z)
|
||||
if abs > options.rotcap then return end
|
||||
end
|
||||
|
||||
phys:ApplyForceOffset(moveDir * options.power, center + Vector(0, 0, 1))
|
||||
phys:ApplyForceOffset(moveDir * -options.power, center + Vector(0, 0, -1))
|
||||
end,
|
||||
key = function(ply, ent, options, key)
|
||||
if key == IN_JUMP and options.jump then
|
||||
local shouldJump = false
|
||||
|
||||
if (ent:GetMoveType() == MOVETYPE_NONE) then
|
||||
ent:SetMoveType(MOVETYPE_VPHYSICS)
|
||||
ent:SetPos(ent:GetPos() + Vector(0, 0, ent:BoundingRadius() + options.burrow))
|
||||
shouldJump = true
|
||||
else
|
||||
local trace = util.QuickTrace(ent:GetPos(), Vector(0, 0, -ent:BoundingRadius() + 2), ent)
|
||||
|
||||
if trace.Hit then
|
||||
shouldJump = true
|
||||
end
|
||||
end
|
||||
|
||||
if shouldJump then
|
||||
ent:GetPhysicsObject():ApplyForceCenter(Vector(0, 0, options.jump))
|
||||
ent:PillSound("jump")
|
||||
end
|
||||
elseif key == IN_DUCK and options.burrow and ent:GetMoveType() == MOVETYPE_VPHYSICS then
|
||||
local trace = util.QuickTrace(ent:GetPos(), Vector(0, 0, -ent:BoundingRadius() + 2), ent)
|
||||
|
||||
if trace.Hit and (trace.MatType == MAT_DIRT or trace.MatType == MAT_SAND) then
|
||||
ent:PillSound("burrow")
|
||||
local p = ent:GetPos()
|
||||
ent:SetPos(Vector(p.x, p.y, trace.HitPos.z - options.burrow))
|
||||
ent:SetMoveType(MOVETYPE_NONE)
|
||||
|
||||
if ent.formTable.model then
|
||||
ent:SetModel(ent.formTable.model)
|
||||
end
|
||||
|
||||
ent:PillLoopStopAll()
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
pk_pills.registerDrive("fly", {
|
||||
think = function(ply, ent, options)
|
||||
local phys = ent:GetPhysicsObject()
|
||||
if not IsValid(phys) then return end
|
||||
|
||||
if phys:IsGravityEnabled() then
|
||||
phys:EnableGravity(false)
|
||||
end
|
||||
|
||||
--Lateral Movement
|
||||
local move = Vector(0, 0, 0)
|
||||
local rotatedAngle = ent:GetAngles()
|
||||
local aim = Angle(0, ply:EyeAngles().y, 0)
|
||||
|
||||
if options.spin then
|
||||
rotatedAngle = aim
|
||||
end
|
||||
|
||||
if options.rotation then
|
||||
rotatedAngle:RotateAroundAxis(rotatedAngle:Up(), options.rotation)
|
||||
end
|
||||
|
||||
if options.rotation2 then
|
||||
rotatedAngle:RotateAroundAxis(rotatedAngle:Right(), options.rotation2)
|
||||
end
|
||||
|
||||
if options.rocketMode then
|
||||
move = rotatedAngle:Forward() * options.speed
|
||||
aim.p = math.Clamp(ply:EyeAngles().p, -50, 50)
|
||||
else
|
||||
if not options.tilt then
|
||||
if (ply:KeyDown(IN_FORWARD)) then
|
||||
move = rotatedAngle:Forward() * options.speed
|
||||
elseif (ply:KeyDown(IN_BACK)) then
|
||||
move = move + rotatedAngle:Forward() * -options.speed
|
||||
end
|
||||
|
||||
if (ply:KeyDown(IN_MOVERIGHT)) then
|
||||
move = move + rotatedAngle:Right() * options.speed
|
||||
elseif (ply:KeyDown(IN_MOVELEFT)) then
|
||||
move = move + rotatedAngle:Right() * -options.speed
|
||||
end
|
||||
|
||||
aim.p = math.Clamp(ply:EyeAngles().p, -30, 30)
|
||||
else
|
||||
local baseDir = aim
|
||||
|
||||
if (ply:KeyDown(IN_FORWARD)) then
|
||||
move = baseDir:Forward() * options.speed
|
||||
aim.p = options.tilt or 0
|
||||
elseif (ply:KeyDown(IN_BACK)) then
|
||||
move = move + baseDir:Forward() * -options.speed
|
||||
aim.p = -options.tilt or 0
|
||||
end
|
||||
|
||||
if (ply:KeyDown(IN_MOVERIGHT)) then
|
||||
move = move + baseDir:Right() * options.speed
|
||||
aim.r = options.tilt or 0
|
||||
elseif (ply:KeyDown(IN_MOVELEFT)) then
|
||||
move = move + baseDir:Right() * -options.speed
|
||||
aim.r = -options.tilt or 0
|
||||
end
|
||||
end
|
||||
|
||||
--UpDown
|
||||
if (ply:KeyDown(IN_JUMP)) then
|
||||
move = move + Vector(0, 0, options.speed * 2 / 3)
|
||||
elseif (ply:KeyDown(IN_DUCK)) then
|
||||
move = move + Vector(0, 0, -options.speed * 2 / 3)
|
||||
end
|
||||
end
|
||||
|
||||
phys:AddVelocity(move - phys:GetVelocity() * .02)
|
||||
|
||||
if options.rotation then
|
||||
aim:RotateAroundAxis(aim:Up(), -options.rotation)
|
||||
end
|
||||
|
||||
if options.rotation2 then
|
||||
aim:RotateAroundAxis(aim:Right(), -options.rotation2)
|
||||
end
|
||||
|
||||
--[[if options.spin then
|
||||
aim=ent.spinAng or Angle(0,0,0)
|
||||
aim=aim+Angle(0,-options.spin,0)
|
||||
ent.spinAng=aim
|
||||
end]]
|
||||
local localAim = ent:WorldToLocalAngles(aim)
|
||||
|
||||
if options.spin then
|
||||
localAim = Angle(0, -options.spin, 0)
|
||||
end
|
||||
|
||||
local moveAng = Vector(0, 0, 0)
|
||||
moveAng.y = localAim.p * 3
|
||||
moveAng.z = localAim.y * 3
|
||||
moveAng.x = localAim.r * 3
|
||||
phys:AddAngleVelocity(-1 * phys:GetAngleVelocity() + moveAng)
|
||||
end,
|
||||
--return LocalAim
|
||||
key = function(ply, ent, options, key) end
|
||||
})
|
||||
|
||||
pk_pills.registerDrive("hover", {
|
||||
think = function(ply, ent, options)
|
||||
--UpDown
|
||||
if not ply:KeyDown(IN_DUCK) then
|
||||
local phys = ent:GetPhysicsObject()
|
||||
if not IsValid(phys) then return end
|
||||
--Lateral movement
|
||||
local move = Vector(0, 0, 0)
|
||||
local rotatedAngle = ent:GetAngles()
|
||||
|
||||
if (ply:KeyDown(IN_FORWARD)) then
|
||||
move = rotatedAngle:Forward() * options.speed
|
||||
elseif (ply:KeyDown(IN_BACK)) then
|
||||
move = move + rotatedAngle:Forward() * -options.speed
|
||||
end
|
||||
|
||||
if (ply:KeyDown(IN_MOVERIGHT)) then
|
||||
move = move + rotatedAngle:Right() * options.speed
|
||||
elseif (ply:KeyDown(IN_MOVELEFT)) then
|
||||
move = move + rotatedAngle:Right() * -options.speed
|
||||
end
|
||||
|
||||
phys:AddVelocity(move - phys:GetVelocity() * .02)
|
||||
--Hovering
|
||||
local tr = util.QuickTrace(ent:GetPos(), Vector(0, 0, -1) * (options.height or 100), ent)
|
||||
|
||||
if tr.Hit then
|
||||
phys:AddVelocity(Vector(0, 0, 10))
|
||||
end
|
||||
|
||||
local aim = Angle(0, ply:EyeAngles().y, 0)
|
||||
local localAim = ent:WorldToLocalAngles(aim)
|
||||
local moveAng = Vector(0, 0, 0)
|
||||
moveAng.y = localAim.p * 3
|
||||
moveAng.z = localAim.y * 3
|
||||
moveAng.x = localAim.r * 3
|
||||
phys:AddAngleVelocity(-1 * phys:GetAngleVelocity() + moveAng)
|
||||
end
|
||||
end,
|
||||
key = function(ply, ent, options, key) end
|
||||
})
|
||||
|
||||
pk_pills.registerDrive("swim", {
|
||||
think = function(ply, ent, options)
|
||||
local phys = ent:GetPhysicsObject()
|
||||
|
||||
if not ent.setupBuoyancy then
|
||||
phys:SetBuoyancyRatio(.135)
|
||||
ent.setupBuoyancy = true
|
||||
end
|
||||
|
||||
local speed
|
||||
|
||||
if ent:WaterLevel() > 1 then
|
||||
speed = options.speed
|
||||
else
|
||||
speed = options.speed / 3
|
||||
|
||||
if math.Rand(0, 1) > .9 then
|
||||
ent:TakeDamage(1)
|
||||
end
|
||||
end
|
||||
|
||||
--Lateral Movement
|
||||
local move = Vector(0, 0, 0)
|
||||
local rotatedAngle = ent:GetAngles()
|
||||
local aim = Angle(0, ply:EyeAngles().y, 0)
|
||||
|
||||
if (ply:KeyDown(IN_FORWARD)) then
|
||||
move = rotatedAngle:Forward()
|
||||
elseif (ply:KeyDown(IN_BACK)) then
|
||||
move = move - rotatedAngle:Forward()
|
||||
end
|
||||
|
||||
if (ply:KeyDown(IN_MOVERIGHT)) then
|
||||
move = move + rotatedAngle:Right()
|
||||
elseif (ply:KeyDown(IN_MOVELEFT)) then
|
||||
move = move - rotatedAngle:Right()
|
||||
end
|
||||
|
||||
aim.p = math.Clamp(ply:EyeAngles().p, -80, 80)
|
||||
phys:AddVelocity(move * speed)
|
||||
local localAim = ent:WorldToLocalAngles(aim)
|
||||
local moveAng = Vector(0, 0, 0)
|
||||
moveAng.y = localAim.p * 3
|
||||
moveAng.z = localAim.y * 3
|
||||
moveAng.x = localAim.r * 3
|
||||
phys:AddAngleVelocity(-1 * phys:GetAngleVelocity() + moveAng)
|
||||
end,
|
||||
--return LocalAim
|
||||
key = function(ply, ent, options, key) end
|
||||
})
|
||||
|
||||
pk_pills.registerDrive("strider", {
|
||||
think = function(ply, ent, options)
|
||||
local h = ent:GetPoseParameter("body_height")
|
||||
|
||||
if h < 200 then
|
||||
h = 200
|
||||
ent:SetPoseParameter("body_height", h)
|
||||
end
|
||||
|
||||
--UpDown
|
||||
if ply:KeyDown(IN_JUMP) and h < 500 then
|
||||
h = h + 5
|
||||
ent:SetPoseParameter("body_height", h)
|
||||
elseif ply:KeyDown(IN_DUCK) and h > 200 then
|
||||
h = h - 5
|
||||
ent:SetPoseParameter("body_height", h)
|
||||
end
|
||||
|
||||
local run = ply:KeyDown(IN_SPEED)
|
||||
local phys = ent:GetPhysicsObject()
|
||||
local aim = Angle(0, ply:EyeAngles().y, 0)
|
||||
local move = Vector(0, 0, 0)
|
||||
|
||||
if (ply:KeyDown(IN_FORWARD)) then
|
||||
move = aim:Forward()
|
||||
elseif (ply:KeyDown(IN_BACK)) then
|
||||
move = move - aim:Forward()
|
||||
end
|
||||
|
||||
if (ply:KeyDown(IN_MOVERIGHT)) then
|
||||
move = move + aim:Right()
|
||||
elseif (ply:KeyDown(IN_MOVELEFT)) then
|
||||
move = move - aim:Right()
|
||||
end
|
||||
|
||||
move:Normalize()
|
||||
|
||||
if (move:Length() > 0) then
|
||||
ent:PillAnim("walk_all")
|
||||
|
||||
if run then
|
||||
ent:SetPlaybackRate(2)
|
||||
else
|
||||
ent:SetPlaybackRate(1)
|
||||
end
|
||||
|
||||
ent:SetPoseParameter("move_yaw", ent:WorldToLocalAngles(move:Angle()).y)
|
||||
|
||||
--Stepping
|
||||
--Step Sounds
|
||||
if not ent.lastStep then
|
||||
ent.lastStep = 0
|
||||
end
|
||||
|
||||
if ent.lastStep == 0 and ent:GetCycle() > 1 / 3 then
|
||||
ent.lastStep = 1
|
||||
ent:PillSound("step")
|
||||
elseif ent.lastStep == 1 and ent:GetCycle() > 2 / 3 then
|
||||
ent.lastStep = 2
|
||||
ent:PillSound("step")
|
||||
elseif ent.lastStep == 2 and ent:GetCycle() < 2 / 3 then
|
||||
ent.lastStep = 0
|
||||
ent:PillSound("step")
|
||||
end
|
||||
else
|
||||
ent:SetPlaybackRate(1)
|
||||
ent:PillAnim("Idle01")
|
||||
end
|
||||
|
||||
--Datass
|
||||
local tr = util.QuickTrace(ent:GetPos(), Vector(0, 0, -1) * h, ent)
|
||||
|
||||
if tr.Hit then
|
||||
phys:AddVelocity(-ent:GetVelocity() + Vector(0, 0, 2000 * (1 - tr.Fraction)) + move * (run and 200 or 100))
|
||||
end
|
||||
|
||||
local localAim = ent:WorldToLocalAngles(aim)
|
||||
local moveAng = Vector(0, 0, 0)
|
||||
moveAng.y = localAim.p * 3
|
||||
moveAng.z = localAim.y * 3
|
||||
moveAng.x = localAim.r * 3
|
||||
phys:AddAngleVelocity(-1 * phys:GetAngleVelocity() + moveAng)
|
||||
end,
|
||||
key = function(ply, ent, options, key) end
|
||||
})
|
||||
179
lua/autorun/ppp_include/pill_360_noscope.lua
Normal file
179
lua/autorun/ppp_include/pill_360_noscope.lua
Normal file
@@ -0,0 +1,179 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
--Made by SkyLight http://steamcommunity.com/id/_I_I_I_I_I/, had to be indented manually because copy/pasta from github didn't. Copy pastad of Parakeet's code.
|
||||
--Formatted and edited by Parakeet
|
||||
pk_pills.register("professional", {
|
||||
printName = "Lab Gamer",
|
||||
type = "ply",
|
||||
default_rp_cost = 1337666420,
|
||||
model = "models/player/hostage/hostage_04.mdl",
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle_pistol",
|
||||
walk = "menu_walk",
|
||||
run = "run_pistol",
|
||||
crouch = "cidle_pistol",
|
||||
crouch_walk = "cwalk_pistol",
|
||||
glide = "swimming_pistol",
|
||||
jump = "jump_pistol",
|
||||
g_attack = "taunt_laugh", --flinch_head_02
|
||||
g_reload = "gesture_agree",
|
||||
dropItem = "Heal"
|
||||
}
|
||||
},
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch"
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 60,
|
||||
run = 200,
|
||||
ducked = 40
|
||||
},
|
||||
loadout = {"pill_wep_pro"},
|
||||
ammo = {
|
||||
Buckshot = 100,
|
||||
["357"] = 100
|
||||
},
|
||||
health = 1,
|
||||
validHoldTypes = {"smg", "ar2", "shotgun", "crossbow", "pistol"},
|
||||
movePoseMode = "xy"
|
||||
})
|
||||
|
||||
pk_pills.register("pubbie", {
|
||||
printName = "Pub Scrub",
|
||||
type = "ply",
|
||||
default_rp_cost = 8008135,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/player/urban.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/player/gasmask.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/player/riot.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/player/swat.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/player/guerilla.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/player/arctic.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/player/phoenix.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/player/leet.mdl"
|
||||
}
|
||||
}
|
||||
end,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle_pistol",
|
||||
walk = "walk_pistol",
|
||||
run = "run_pistol",
|
||||
crouch = "cidle_pistol",
|
||||
crouch_walk = "cwalk_pistol",
|
||||
glide = "swimming_pistol",
|
||||
jump = "jump_pistol",
|
||||
g_attack = "flinch_head_02",
|
||||
g_reload = "reload_pistol",
|
||||
dropItem = "Heal"
|
||||
},
|
||||
smg = {
|
||||
idle = "idle_smg1",
|
||||
walk = "walk_smg1",
|
||||
run = "run_smg1",
|
||||
crouch = "cidle_smg1",
|
||||
crouch_walk = "cwalk_smg1"
|
||||
},
|
||||
ar2 = {
|
||||
idle = "idle_ar2",
|
||||
walk = "walk_ar2",
|
||||
run = "run_ar2",
|
||||
crouch = "cidle_ar2",
|
||||
crouch_walk = "cwalk_ar2"
|
||||
}
|
||||
},
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch"
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 60,
|
||||
run = 200,
|
||||
ducked = 40
|
||||
},
|
||||
loadout = {"pill_wep_alyxgun"},
|
||||
ammo = {
|
||||
smg1 = 300
|
||||
},
|
||||
health = 100,
|
||||
validHoldTypes = {"smg", "ar2", "shotgun", "crossbow", "pistol"},
|
||||
movePoseMode = "xy"
|
||||
})
|
||||
|
||||
pk_pills.register("casual", {
|
||||
printName = "Casual",
|
||||
type = "ply",
|
||||
default_rp_cost = 1234567,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/player/hostage/hostage_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/player/hostage/hostage_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/player/hostage/hostage_03.mdl"
|
||||
}
|
||||
}
|
||||
end,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle_smg1",
|
||||
walk = "walk_smg1",
|
||||
run = "run_smg1",
|
||||
crouch = "cidle_smg1",
|
||||
crouch_walk = "cwalk_smg1",
|
||||
glide = "swimming_smg1",
|
||||
jump = "jump_smg1",
|
||||
g_attack = "flinch_head_02",
|
||||
g_reload = "reload_smg1",
|
||||
dropItem = "Heal"
|
||||
}
|
||||
},
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch"
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 60,
|
||||
run = 200,
|
||||
ducked = 40
|
||||
},
|
||||
loadout = {"weapon_smg1"},
|
||||
ammo = {
|
||||
smg1 = 150,
|
||||
smg1_grenade = 5
|
||||
},
|
||||
health = 150,
|
||||
validHoldTypes = {"smg", "ar2", "shotgun", "crossbow", "pistol"},
|
||||
movePoseMode = "xy"
|
||||
})
|
||||
185
lua/autorun/ppp_include/pill_antlions.lua
Normal file
185
lua/autorun/ppp_include/pill_antlions.lua
Normal file
@@ -0,0 +1,185 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("antlion", {
|
||||
printName = "Antlion",
|
||||
side = "hl_antlion",
|
||||
type = "ply",
|
||||
model = "models/antlion.mdl",
|
||||
default_rp_cost = 4000,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
skin = 0
|
||||
},
|
||||
{
|
||||
skin = 1
|
||||
},
|
||||
{
|
||||
skin = 2
|
||||
},
|
||||
{
|
||||
skin = 3
|
||||
}
|
||||
}
|
||||
end,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 30),
|
||||
dist = 150
|
||||
},
|
||||
hull = Vector(60, 60, 50),
|
||||
anims = {
|
||||
default = {
|
||||
idle = "Idle",
|
||||
walk = "walk_all",
|
||||
run = "run_all",
|
||||
glide = "jump_glide",
|
||||
jump = "jump_start",
|
||||
melee1 = "attack1",
|
||||
melee2 = "attack2",
|
||||
melee3 = "attack3",
|
||||
charge_start = "charge_start",
|
||||
charge_loop = "charge_run",
|
||||
charge_hit = "charge_end",
|
||||
swim = "drown",
|
||||
burrow_in = "digin",
|
||||
burrow_loop = "digidle",
|
||||
burrow_out = "digout"
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
melee = pk_pills.helpers.makeList("npc/antlion/attack_single#.wav", 3),
|
||||
melee_hit = pk_pills.helpers.makeList("npc/zombie/claw_strike#.wav", 3),
|
||||
charge_start = "npc/antlion/pain1.wav",
|
||||
charge_hit = "npc/antlion/land1.wav", --"npc/antlion_guard/shove1.wav",
|
||||
loop_fly = "npc/antlion/fly1.wav",
|
||||
loop_charge = "npc/antlion/charge_loop1.wav",
|
||||
land = "npc/antlion/land1.wav",
|
||||
burrow_in = "npc/antlion/digdown1.wav",
|
||||
burrow_out = "npc/antlion/digup1.wav",
|
||||
step = pk_pills.helpers.makeList("npc/antlion/foot#.wav", 4)
|
||||
},
|
||||
aim = {
|
||||
xPose = "head_yaw",
|
||||
yPose = "head_pitch",
|
||||
nocrosshair = true
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = pk_pills.common.melee,
|
||||
animCount = 3,
|
||||
delay = .5,
|
||||
range = 75,
|
||||
dmg = 25
|
||||
},
|
||||
charge = {
|
||||
vel = 800,
|
||||
dmg = 50,
|
||||
delay = .6
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
ent:PillChargeAttack()
|
||||
end
|
||||
},
|
||||
movePoseMode = "yaw",
|
||||
moveSpeed = {
|
||||
walk = 200,
|
||||
run = 500
|
||||
},
|
||||
jumpPower = 500,
|
||||
jump = function(ply, ent)
|
||||
if ply:GetVelocity():Length() < 300 then
|
||||
ply:SetVelocity(Vector(0, 0, 500))
|
||||
end
|
||||
end,
|
||||
glideThink = function(ply, ent)
|
||||
ent:PillLoopSound("fly")
|
||||
local puppet = ent:GetPuppet()
|
||||
|
||||
if puppet:GetBodygroup(1) == 0 then
|
||||
puppet:SetBodygroup(1, 1)
|
||||
end
|
||||
end,
|
||||
land = function(ply, ent)
|
||||
ent:PillLoopStop("fly")
|
||||
local puppet = ent:GetPuppet()
|
||||
puppet:SetBodygroup(1, 0)
|
||||
end,
|
||||
canBurrow = true,
|
||||
health = 120,
|
||||
noFallDamage = true,
|
||||
damageFromWater = 1
|
||||
})
|
||||
|
||||
pk_pills.register("antlion_guard", {
|
||||
printName = "Antlion Guard",
|
||||
type = "ply",
|
||||
model = "models/antlion_guard.mdl",
|
||||
default_rp_cost = 10000,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 80),
|
||||
dist = 300
|
||||
},
|
||||
hull = Vector(120, 120, 100),
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle",
|
||||
walk = "walk1",
|
||||
crouch = "cover_loop",
|
||||
crouch_walk = "cover_creep2",
|
||||
melee = "shove",
|
||||
charge_start = "charge_startfast",
|
||||
charge_loop = "charge_loop",
|
||||
g_charge_hit = "charge_hit"
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
melee = pk_pills.helpers.makeList("npc/antlion_guard/angry#.wav", 3),
|
||||
melee_hit = "npc/antlion_guard/shove1.wav",
|
||||
charge_start = pk_pills.helpers.makeList("npc/antlion_guard/angry#.wav", 3),
|
||||
charge_hit = "npc/antlion_guard/shove1.wav",
|
||||
step = {"npc/antlion_guard/foot_heavy1.wav", "npc/antlion_guard/foot_heavy2.wav", "npc/antlion_guard/foot_light1.wav", "npc/antlion_guard/foot_light2.wav"}
|
||||
},
|
||||
aim = {
|
||||
xPose = "head_yaw",
|
||||
yPose = "head_pitch",
|
||||
nocrosshair = true
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = pk_pills.common.melee,
|
||||
delay = .5,
|
||||
range = 150,
|
||||
dmg = 50
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
ent:PillChargeAttack()
|
||||
end
|
||||
},
|
||||
charge = {
|
||||
vel = 800,
|
||||
dmg = 100,
|
||||
delay = .8
|
||||
},
|
||||
movePoseMode = "yaw",
|
||||
moveSpeed = {
|
||||
walk = 250,
|
||||
ducked = 125
|
||||
},
|
||||
jumpPower = 0,
|
||||
health = 500,
|
||||
damageFromWater = 5
|
||||
})
|
||||
126
lua/autorun/ppp_include/pill_birds.lua
Normal file
126
lua/autorun/ppp_include/pill_birds.lua
Normal file
@@ -0,0 +1,126 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("bird_crow", {
|
||||
printName = "Crow",
|
||||
side = "harmless",
|
||||
type = "ply",
|
||||
model = "models/crow.mdl",
|
||||
default_rp_cost = 1000,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 5),
|
||||
dist = 40
|
||||
},
|
||||
hull = Vector(10, 10, 10),
|
||||
anims = {
|
||||
default = {
|
||||
idle = "Idle01",
|
||||
walk = "Walk",
|
||||
run = "Run",
|
||||
glide = "Soar",
|
||||
fly = "Fly01",
|
||||
eat = "Eat_A",
|
||||
jump = "Takeoff"
|
||||
}
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 15,
|
||||
run = 40
|
||||
},
|
||||
health = 20,
|
||||
moveMod = function(ply, ent, mv, cmd)
|
||||
if not ply:IsOnGround() then
|
||||
local angs = mv:GetAngles()
|
||||
|
||||
if cmd:KeyDown(IN_JUMP) then
|
||||
angs.p = -30
|
||||
mv:SetVelocity(angs:Forward() * 300)
|
||||
|
||||
if SERVER then
|
||||
ent:PillAnimTick("fly")
|
||||
end
|
||||
elseif cmd:KeyDown(IN_DUCK) then
|
||||
angs.p = 30
|
||||
mv:SetVelocity(angs:Forward() * 300)
|
||||
|
||||
if SERVER then
|
||||
ent:PillAnimTick("fly")
|
||||
end
|
||||
else
|
||||
angs.p = 10
|
||||
mv:SetVelocity(angs:Forward() * 500)
|
||||
end
|
||||
end
|
||||
end,
|
||||
land = function(ply, ent)
|
||||
ent:PillLoopStop("fly")
|
||||
end,
|
||||
sounds = {
|
||||
vocalize = pk_pills.helpers.makeList("npc/crow/alert#.wav", 2, 3),
|
||||
loop_fly = "npc/crow/flap2.wav"
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
ent:PillSound("vocalize")
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ply:IsOnGround() then
|
||||
ent:PillAnim("eat", true)
|
||||
|
||||
timer.Simple(1, function()
|
||||
if not IsValid(ent) then return end
|
||||
|
||||
if ply:Health() < 10 then
|
||||
ply:SetHealth(10)
|
||||
end
|
||||
end)
|
||||
|
||||
timer.Simple(2, function()
|
||||
if not IsValid(ent) then return end
|
||||
ply:SetHealth(20)
|
||||
end)
|
||||
end
|
||||
end
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("bird_pigeon", {
|
||||
parent = "bird_crow",
|
||||
printName = "Pigeon",
|
||||
model = "models/pigeon.mdl",
|
||||
sounds = {
|
||||
vocalize = pk_pills.helpers.makeList("ambient/creatures/pigeon_idle#.wav", 4)
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("bird_seagull", {
|
||||
parent = "bird_crow",
|
||||
printName = "Seagull",
|
||||
model = "models/seagull.mdl",
|
||||
sounds = {
|
||||
vocalize = pk_pills.helpers.makeList("ambient/creatures/seagull_idle#.wav", 3)
|
||||
},
|
||||
flapSoundPitch = 50,
|
||||
anims = {
|
||||
default = {
|
||||
fly = "Fly"
|
||||
}
|
||||
},
|
||||
health = 50,
|
||||
attack2 = {
|
||||
mode = ""
|
||||
}
|
||||
})
|
||||
118
lua/autorun/ppp_include/pill_combine_misc.lua
Normal file
118
lua/autorun/ppp_include/pill_combine_misc.lua
Normal file
@@ -0,0 +1,118 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("stalker", {
|
||||
printName = "Stalker",
|
||||
type = "ply",
|
||||
model = "models/stalker.mdl",
|
||||
default_rp_cost = 8000,
|
||||
side = "hl_combine",
|
||||
health = 100,
|
||||
duckBy = 0,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle01",
|
||||
walk = "walk_all"
|
||||
}
|
||||
},
|
||||
aim = {},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
local target = ents.Create("info_target")
|
||||
target:SetPos(ply:GetEyeTrace().HitPos + ply:EyeAngles():Forward() * 20)
|
||||
target:SetName("laser_target_" .. ent:EntIndex() .. "_" .. os.time())
|
||||
target:Spawn()
|
||||
local beam = ents.Create("env_laser")
|
||||
beam:SetPos(ply:EyePos() + ply:EyeAngles():Forward() * 30)
|
||||
beam:SetKeyValue("texture", "materials/cable/redlaser.vmt")
|
||||
beam:SetKeyValue("damage", 100)
|
||||
beam:SetKeyValue("width", 2)
|
||||
beam:SetKeyValue("dissolvetype", 0)
|
||||
beam:SetKeyValue("LaserTarget", target:GetName())
|
||||
beam:Spawn()
|
||||
beam:Fire("turnon", "", 0)
|
||||
ply:Freeze(true)
|
||||
ent:PillLoopSound("laser")
|
||||
ent:PillSound("laser_start")
|
||||
|
||||
timer.Simple(2, function()
|
||||
if IsValid(target) then
|
||||
target:Remove()
|
||||
end
|
||||
|
||||
if IsValid(beam) then
|
||||
beam:Remove()
|
||||
end
|
||||
|
||||
ply:Freeze(false)
|
||||
|
||||
if IsValid(ent) then
|
||||
ent:PillLoopStop("laser")
|
||||
end
|
||||
end)
|
||||
end
|
||||
},
|
||||
sounds = {
|
||||
loop_laser = "npc/stalker/laser_burn.wav",
|
||||
laser_start = "weapons/gauss/fire1.wav",
|
||||
step = {"npc/stalker/stalker_footstep_left1.wav", "npc/stalker/stalker_footstep_left2.wav", "npc/stalker/stalker_footstep_right1.wav", "npc/stalker/stalker_footstep_right2.wav"}
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 50,
|
||||
run = 100
|
||||
},
|
||||
jumpPower = 0
|
||||
})
|
||||
|
||||
pk_pills.register("crab_synth", {
|
||||
printName = "Crab Synth",
|
||||
side = "hl_combine",
|
||||
type = "ply",
|
||||
model = "models/Synth.mdl",
|
||||
default_rp_cost = 15000,
|
||||
side = "hl_combine",
|
||||
camera = {
|
||||
offset = Vector(0, 0, 50),
|
||||
dist = 400
|
||||
},
|
||||
hull = Vector(200, 200, 110),
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle01",
|
||||
walk = "walk01"
|
||||
}
|
||||
},
|
||||
aim = {
|
||||
offset = 120
|
||||
},
|
||||
--attachment="eyes",
|
||||
--fixTracers=true
|
||||
--simple=true
|
||||
attack = {
|
||||
mode = "auto",
|
||||
func = pk_pills.common.shoot,
|
||||
delay = .05,
|
||||
damage = 20,
|
||||
spread = .05,
|
||||
tracer = "AR2Tracer"
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 150,
|
||||
run = 300
|
||||
},
|
||||
sounds = {
|
||||
shoot = "weapons/ar2/fire1.wav"
|
||||
},
|
||||
jumpPower = 0,
|
||||
health = 5000
|
||||
})
|
||||
249
lua/autorun/ppp_include/pill_combine_new.lua
Normal file
249
lua/autorun/ppp_include/pill_combine_new.lua
Normal file
@@ -0,0 +1,249 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("ccamera", {
|
||||
printName = "Combine Camera",
|
||||
side = "hl_combine",
|
||||
type = "phys",
|
||||
model = "models/combine_camera/combine_camera.mdl",
|
||||
boxPhysics = {Vector(-10, -10, -20), Vector(10, 10, 0)},
|
||||
userSpawn = {
|
||||
type = "ceiling"
|
||||
},
|
||||
spawnFrozen = true,
|
||||
camera = {
|
||||
offset = Vector(0, 0, -50),
|
||||
dist = 100,
|
||||
underslung = true
|
||||
},
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch"
|
||||
},
|
||||
canAim = function(ply, ent) return ent.active end,
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ent.active and not ent.busy then
|
||||
ent:PillSound("pic")
|
||||
end
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ent.busy then return end
|
||||
|
||||
if ent.active then
|
||||
ent:PillAnim("retract")
|
||||
ent:PillSound("retract")
|
||||
ent.active = false
|
||||
else
|
||||
ent:PillAnim("deploy")
|
||||
ent:PillSound("deploy")
|
||||
end
|
||||
|
||||
ent.busy = true
|
||||
|
||||
timer.Simple(.2, function()
|
||||
if not IsValid(ent) then return end
|
||||
|
||||
if ent:GetSequence() == ent:LookupSequence("deploy") then
|
||||
ent.active = true
|
||||
end
|
||||
|
||||
ent.busy = false
|
||||
end)
|
||||
end
|
||||
},
|
||||
health = 40,
|
||||
sounds = {
|
||||
deploy = "npc/turret_floor/deploy.wav",
|
||||
retract = "npc/turret_floor/retract.wav",
|
||||
die = "npc/turret_floor/die.wav",
|
||||
pic = "npc/scanner/scanner_photo1.wav"
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("cturret_ceiling", {
|
||||
printName = "Combine Ceiling Turret",
|
||||
parent = "ccamera",
|
||||
model = "models/combine_turrets/ceiling_turret.mdl",
|
||||
aim = {
|
||||
attachment = "eyes"
|
||||
},
|
||||
attack = {
|
||||
mode = "auto",
|
||||
func = pk_pills.common.shoot,
|
||||
delay = .1,
|
||||
damage = 4,
|
||||
spread = .01,
|
||||
anim = "fire",
|
||||
tracer = "AR2Tracer"
|
||||
},
|
||||
sounds = {
|
||||
shoot = pk_pills.helpers.makeList("npc/turret_floor/shoot#.wav", 3)
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("ccrawler", {
|
||||
printName = "Combine Flea Drone",
|
||||
side = "hl_combine",
|
||||
type = "ply",
|
||||
model = "models/combine_turrets/ground_turret.mdl",
|
||||
noragdoll = true,
|
||||
default_rp_cost = 4000,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 30),
|
||||
dist = 80
|
||||
},
|
||||
hull = Vector(30, 30, 20),
|
||||
anims = {},
|
||||
moveSpeed = {
|
||||
walk = 100,
|
||||
run = 300
|
||||
},
|
||||
boneMorphs = {
|
||||
["Ground_turret.mesh2"] = {
|
||||
rot = Angle(0, 180, 0)
|
||||
},
|
||||
["Ground_turret.Gun"] = {
|
||||
rot = Angle(0, 0, 0),
|
||||
pos = Vector(0, -3, 39)
|
||||
}
|
||||
},
|
||||
aim = {
|
||||
attachment = "eyes",
|
||||
simple = true
|
||||
},
|
||||
attack = {
|
||||
mode = "auto",
|
||||
func = pk_pills.common.shoot,
|
||||
delay = .2,
|
||||
damage = 5,
|
||||
spread = .02,
|
||||
tracer = "AR2Tracer"
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ply:IsOnGround() then
|
||||
ply:TakeDamage(30, ply)
|
||||
local v = ply:EyeAngles():Forward() * 600 + Vector(0, 0, 600)
|
||||
ply:SetLocalVelocity(v)
|
||||
ent:PillSound("jump")
|
||||
local start = 20
|
||||
local endd = 10
|
||||
ent.trail = util.SpriteTrail(ent, 0, Color(100, 100, 100), false, start, endd, 4, 1 / (start + endd) * .5, "trails/smoke.vmt")
|
||||
end
|
||||
end
|
||||
},
|
||||
land = function(ply, ent)
|
||||
if IsValid(ent.trail) then
|
||||
ent.trail:Remove()
|
||||
end
|
||||
end,
|
||||
sounds = {
|
||||
shoot = "weapons/pistol/pistol_fire3.wav",
|
||||
jump = "weapons/grenade_launcher1.wav"
|
||||
},
|
||||
noFallDamage = true,
|
||||
muteSteps = true,
|
||||
health = 150
|
||||
})
|
||||
--[[
|
||||
pk_pills.register("bmturret",{
|
||||
printName="Mini Turret",
|
||||
type="phys",
|
||||
model="models/turret/miniturret.mdl",
|
||||
boxPhysics={Vector(-20,-20,-20),Vector(20,20,20)},
|
||||
userSpawn= {
|
||||
type="wall",
|
||||
ang=Angle(90,0,0)
|
||||
},
|
||||
seqInit="deploy",
|
||||
spawnFrozen=true,
|
||||
camera={
|
||||
offset=Vector(0,0,60),
|
||||
dist=80
|
||||
},
|
||||
aim={
|
||||
attachment="0",
|
||||
},
|
||||
canAim=function(ply,ent)
|
||||
return ent:GetCycle()==1
|
||||
end,
|
||||
attack={
|
||||
mode= "auto",
|
||||
func=pk_pills.common.shoot,
|
||||
delay=.1,
|
||||
damage=4,
|
||||
spread=.01,
|
||||
tracer="Tracer"
|
||||
},
|
||||
boneMorphs = {
|
||||
["Bone01"]=function(ply,ent)
|
||||
local a= ent:WorldToLocalAngles(ply:EyeAngles())
|
||||
if ent:GetCycle()==1 then
|
||||
return {rot=Angle(a.y,0,0)}
|
||||
end
|
||||
end,
|
||||
["Bone03"]=function(ply,ent)
|
||||
local a= ent:WorldToLocalAngles(ply:EyeAngles())
|
||||
if ent:GetCycle()==1 then
|
||||
return {rot=Angle(0,a.p,0)}
|
||||
end
|
||||
end
|
||||
},
|
||||
health=80,
|
||||
sounds={
|
||||
shoot="weapons/smg1/smg1_fire1.wav"
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("bmturret2",{
|
||||
printName="Gatling Turret",
|
||||
parent="bmturret",
|
||||
type="phys",
|
||||
model="models/turret/turret.mdl",
|
||||
camera={
|
||||
offset=Vector(0,0,80),
|
||||
dist=100
|
||||
},
|
||||
attack={
|
||||
mode= "auto",
|
||||
func=pk_pills.common.shoot,
|
||||
delay=.05,
|
||||
damage=6,
|
||||
spread=.01,
|
||||
tracer="AR2Tracer"
|
||||
},
|
||||
boneMorphs = {
|
||||
["Dummy02"]=function(ply,ent)
|
||||
local a= ent:WorldToLocalAngles(ply:EyeAngles())
|
||||
if ent:GetCycle()==1 then
|
||||
return {rot=Angle(a.y,0,0)}
|
||||
end
|
||||
end,
|
||||
["Dummy05"]=function(ply,ent)
|
||||
local a= ent:WorldToLocalAngles(ply:EyeAngles())
|
||||
if ent:GetCycle()==1 then
|
||||
return {rot=Angle(0,a.p,0)}
|
||||
end
|
||||
end
|
||||
},
|
||||
health=160,
|
||||
sounds={
|
||||
shoot="weapons/ar2/fire1.wav"
|
||||
}
|
||||
})
|
||||
]]
|
||||
466
lua/autorun/ppp_include/pill_combine_phys_large.lua
Normal file
466
lua/autorun/ppp_include/pill_combine_phys_large.lua
Normal file
@@ -0,0 +1,466 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("hunter_chopper", {
|
||||
printName = "Hunter-Chopper",
|
||||
side = "hl_combine",
|
||||
type = "phys",
|
||||
model = "models/Combine_Helicopter.mdl",
|
||||
default_rp_cost = 20000,
|
||||
spawnOffset = Vector(0, 0, 200),
|
||||
camera = {
|
||||
offset = Vector(80, 0, 0),
|
||||
dist = 1000
|
||||
},
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 20,
|
||||
tilt = 20
|
||||
},
|
||||
seqInit = "idle",
|
||||
aim = {
|
||||
xPose = "weapon_yaw",
|
||||
yPose = "weapon_pitch",
|
||||
yInvert = true,
|
||||
attachment = "Muzzle"
|
||||
},
|
||||
attack = {
|
||||
mode = "auto",
|
||||
func = pk_pills.common.shoot,
|
||||
delay = .02,
|
||||
damage = 10,
|
||||
spread = .05,
|
||||
tracer = "HelicopterTracer"
|
||||
},
|
||||
attack2 = {
|
||||
mode = "auto",
|
||||
func = function(ply, ent)
|
||||
ent:PillSound("dropBomb")
|
||||
local bomb = ents.Create("grenade_helicopter")
|
||||
bomb:SetPos(ent:LocalToWorld(Vector(-60, 0, -60)))
|
||||
bomb:SetAngles(Angle(math.Rand(-180, 180), math.Rand(-180, 180), math.Rand(-180, 180)))
|
||||
bomb:Spawn()
|
||||
bomb:SetPhysicsAttacker(ply)
|
||||
local randVec = VectorRand()
|
||||
randVec.z = 0
|
||||
bomb:GetPhysicsObject():AddVelocity(ent:GetVelocity() + randVec * 100)
|
||||
end,
|
||||
delay = .5
|
||||
},
|
||||
reload = function(ply, ent)
|
||||
if ent.lastrocket and ent.lastrocket + 1 > CurTime() then return end
|
||||
ent:PillSound("rocket")
|
||||
local rocket = ents.Create("rpg_missile")
|
||||
rocket:SetPos(ent:LocalToWorld(Vector(0, 80, -80)))
|
||||
rocket:SetAngles(ply:EyeAngles())
|
||||
rocket:SetSaveValue("m_flDamage", 200)
|
||||
rocket:SetOwner(ply)
|
||||
rocket:SetVelocity(ent:GetVelocity())
|
||||
rocket:Spawn()
|
||||
rocket = ents.Create("rpg_missile")
|
||||
rocket:SetPos(ent:LocalToWorld(Vector(0, -80, -80)))
|
||||
rocket:SetAngles(ply:EyeAngles())
|
||||
rocket:SetSaveValue("m_flDamage", 200)
|
||||
rocket:SetOwner(ply)
|
||||
rocket:SetVelocity(ent:GetVelocity())
|
||||
rocket:Spawn()
|
||||
ent.lastrocket = CurTime()
|
||||
end,
|
||||
health = 5600,
|
||||
damageFromWater = -1,
|
||||
sounds = {
|
||||
loop_move = "npc/attack_helicopter/aheli_rotor_loop1.wav",
|
||||
loop_attack = "npc/attack_helicopter/aheli_weapon_fire_loop3.wav",
|
||||
dropBomb = "npc/attack_helicopter/aheli_mine_drop1.wav",
|
||||
die = pk_pills.helpers.makeList("ambient/explosions/explode_#.wav", 9),
|
||||
rocket = "weapons/grenade_launcher1.wav"
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("gunship", {
|
||||
printName = "Combine Gunship",
|
||||
side = "hl_combine",
|
||||
type = "phys",
|
||||
model = "models/gunship.mdl",
|
||||
default_rp_cost = 20000,
|
||||
spawnOffset = Vector(0, 0, 200),
|
||||
camera = {
|
||||
offset = Vector(80, 0, 0),
|
||||
dist = 1000
|
||||
},
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 20,
|
||||
tilt = 20
|
||||
},
|
||||
seqInit = "prop_turn",
|
||||
aim = {
|
||||
xPose = "flex_horz",
|
||||
yPose = "flex_vert",
|
||||
attachment = "Muzzle"
|
||||
},
|
||||
attack = {
|
||||
mode = "auto",
|
||||
func = pk_pills.common.shoot,
|
||||
delay = .1,
|
||||
damage = 10,
|
||||
spread = .02,
|
||||
tracer = "HelicopterTracer"
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ent.usingWarpCannon then return end
|
||||
local fireAngs = ent:GetAngles()
|
||||
fireAngs.p = 45
|
||||
fireAngs.r = 0
|
||||
local tr = util.QuickTrace(ent:GetPos(), ent:GetPos() + fireAngs:Forward() * 99999, ent)
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetEntity(ent)
|
||||
effectdata:SetOrigin(tr.HitPos)
|
||||
util.Effect("warp_cannon", effectdata, true, true)
|
||||
ent:PillSound("warp_charge") --belly_cannon
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillSound("warp_fire")
|
||||
util.BlastDamage(ent, ply, tr.HitPos, 200, 1000)
|
||||
|
||||
if IsValid(tr.Entity) then
|
||||
local phys = tr.Entity:GetPhysicsObject()
|
||||
|
||||
if IsValid(phys) then
|
||||
phys:ApplyForceCenter(ply:EyeAngles():Forward() * 9 ^ 7)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
ent.usingWarpCannon = true
|
||||
|
||||
timer.Simple(2.4, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent.usingWarpCannon = nil
|
||||
end)
|
||||
end
|
||||
},
|
||||
pose = {
|
||||
fin_accel = function(ply, ent, old)
|
||||
local vel = WorldToLocal(ent:GetVelocity(), Angle(), Vector(0, 0, 0), ent:GetAngles())
|
||||
|
||||
return vel.x / 800
|
||||
end,
|
||||
fin_sway = function(ply, ent, old)
|
||||
local vel = WorldToLocal(ent:GetVelocity(), Angle(), Vector(0, 0, 0), ent:GetAngles())
|
||||
|
||||
return -vel.y / 800
|
||||
end,
|
||||
antenna_accel = function(ply, ent, old)
|
||||
local vel = WorldToLocal(ent:GetVelocity(), Angle(), Vector(0, 0, 0), ent:GetAngles())
|
||||
|
||||
return vel.x / 2000
|
||||
end,
|
||||
antenna_sway = function(ply, ent, old)
|
||||
local vel = WorldToLocal(ent:GetVelocity(), Angle(), Vector(0, 0, 0), ent:GetAngles())
|
||||
|
||||
return -vel.y / 2000
|
||||
end
|
||||
},
|
||||
health = 5,
|
||||
onlyTakesExplosiveDamage = true,
|
||||
damageFromWater = -1,
|
||||
sounds = {
|
||||
loop_move = "npc/combine_gunship/engine_whine_loop1.wav",
|
||||
loop_attack = "npc/combine_gunship/gunship_weapon_fire_loop6.wav",
|
||||
die = pk_pills.helpers.makeList("ambient/explosions/explode_#.wav", 9),
|
||||
warp_charge = "npc/strider/charging.wav",
|
||||
warp_fire = "npc/strider/fire.wav"
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("dropship", {
|
||||
printName = "Combine Dropship",
|
||||
side = "hl_combine",
|
||||
type = "phys",
|
||||
model = "models/Combine_dropship.mdl",
|
||||
default_rp_cost = 10000,
|
||||
spawnOffset = Vector(0, 0, 200),
|
||||
camera = {
|
||||
offset = Vector(0, 0, 200),
|
||||
dist = 1000
|
||||
},
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 30,
|
||||
tilt = 20
|
||||
},
|
||||
aim = {
|
||||
xPose = "weapon_yaw",
|
||||
yPose = "weapon_pitch",
|
||||
yInvert = true,
|
||||
attachment = "Muzzle",
|
||||
usesSecondaryEnt = true
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if IsValid(ent.container) then
|
||||
ent.container:Deploy()
|
||||
end
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "auto",
|
||||
func = pk_pills.common.shoot,
|
||||
delay = .1,
|
||||
damage = 4,
|
||||
spread = .01,
|
||||
tracer = "HelicopterTracer"
|
||||
},
|
||||
reload = function(ply, ent)
|
||||
if IsValid(ent.container) then
|
||||
ent.container:SetParent()
|
||||
ent.container:PhysicsInit(SOLID_VPHYSICS)
|
||||
ent.container:SetMoveType(MOVETYPE_VPHYSICS)
|
||||
ent.container:SetSolid(SOLID_VPHYSICS)
|
||||
ent.container:SetPos(ent:GetPos())
|
||||
ent.container:SetAngles(ent:GetAngles())
|
||||
ent.container:GetPhysicsObject():Wake()
|
||||
ent:SetPillAimEnt(nil)
|
||||
ent:PillSound("drop")
|
||||
ent:PillLoopStop("deploy")
|
||||
ent.container = nil
|
||||
else
|
||||
local tr = util.TraceHull({
|
||||
start = ent:GetPos(),
|
||||
endpos = ent:GetPos() + Vector(0, 0, -200),
|
||||
filter = {ent},
|
||||
mins = Vector(-50, -50, -50),
|
||||
maxs = Vector(50, 50, 50)
|
||||
})
|
||||
|
||||
local grabent = tr.Entity
|
||||
|
||||
if IsValid(grabent) then
|
||||
if (grabent:GetClass() == "pill_dropship_container") then
|
||||
grabent:SetPos(ent:GetPos())
|
||||
grabent:SetAngles(ent:GetAngles())
|
||||
grabent:SetParent(ent)
|
||||
grabent:Fire("setparentattachment", "cargo_anim")
|
||||
ent:SetPillAimEnt(grabent)
|
||||
ent:PillFilterCam(grabent)
|
||||
ent:PillSound("grab")
|
||||
ent.container = grabent
|
||||
elseif (grabent:GetClass() == "pill_dropship_strider" and not grabent.droppedfrom) then
|
||||
grabent:SetPos(ent:GetPos())
|
||||
grabent:SetAngles(ent:GetAngles())
|
||||
grabent:SetParent(ent)
|
||||
grabent:Fire("setparentattachment", "cargo_anim")
|
||||
ent:PillFilterCam(grabent)
|
||||
ent:PillSound("grab")
|
||||
ent.container = grabent
|
||||
elseif (grabent:GetClass() == "npc_strider") then
|
||||
local strider_grabbed = ents.Create("pill_dropship_strider")
|
||||
strider_grabbed:SetPos(ent:GetPos())
|
||||
strider_grabbed:SetAngles(ent:GetAngles())
|
||||
strider_grabbed:Spawn()
|
||||
strider_grabbed:SetParent(ent)
|
||||
strider_grabbed:Fire("setparentattachment", "cargo_anim")
|
||||
ent:PillFilterCam(strider_grabbed)
|
||||
ent:PillSound("grab")
|
||||
ent.container = strider_grabbed
|
||||
grabent:Remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
seqInit = "idle",
|
||||
pose = {
|
||||
body_accel = function(ply, ent, old)
|
||||
local vel = WorldToLocal(ent:GetVelocity(), Angle(), Vector(0, 0, 0), ent:GetAngles())
|
||||
|
||||
return vel.x / 800
|
||||
end,
|
||||
body_sway = function(ply, ent, old)
|
||||
local vel = WorldToLocal(ent:GetVelocity(), Angle(), Vector(0, 0, 0), ent:GetAngles())
|
||||
|
||||
return -vel.y / 800
|
||||
end
|
||||
},
|
||||
damageFromWater = -1,
|
||||
sounds = {
|
||||
loop_move = "npc/combine_gunship/dropship_engine_near_loop1.wav",
|
||||
loop_attack2 = "npc/combine_gunship/gunship_fire_loop1.wav",
|
||||
loop_deploy = "npc/combine_gunship/dropship_dropping_pod_loop1.wav",
|
||||
alert_empty = "npc/attack_helicopter/aheli_damaged_alarm1.wav",
|
||||
grab = "vehicles/Crane/crane_magnet_switchon.wav",
|
||||
drop = "vehicles/Crane/crane_magnet_release.wav",
|
||||
die = pk_pills.helpers.makeList("ambient/explosions/explode_#.wav", 9)
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("advisor", {
|
||||
printName = "Advisor",
|
||||
side = "hl_combine",
|
||||
type = "phys",
|
||||
model = "models/advisor.mdl",
|
||||
default_rp_cost = 8000,
|
||||
camera = {
|
||||
dist = 250
|
||||
},
|
||||
seqInit = "Idle01",
|
||||
sphericalPhysics = 50,
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 10
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ent:GetSequence() ~= ent:LookupSequence("Idle01") then return end
|
||||
ent:PillAnim("attackL", true)
|
||||
|
||||
local tr = util.TraceHull({
|
||||
start = ent:GetPos(),
|
||||
endpos = ent:GetPos() + ent:GetAngles():Forward() * 200,
|
||||
filter = {ent},
|
||||
mins = Vector(-25, -25, -25),
|
||||
maxs = Vector(25, 25, 25)
|
||||
})
|
||||
|
||||
if IsValid(tr.Entity) then
|
||||
local dmg = DamageInfo()
|
||||
dmg:SetAttacker(ply)
|
||||
dmg:SetInflictor(ent)
|
||||
dmg:SetDamageType(DMG_SLASH)
|
||||
dmg:SetDamage(50)
|
||||
tr.Entity:TakeDamageInfo(dmg)
|
||||
ent:PillSound("hit")
|
||||
end
|
||||
|
||||
timer.Simple(.5, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillAnim("Idle01", true)
|
||||
end)
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ent:GetSequence() ~= ent:LookupSequence("Idle01") then return end
|
||||
ent:PillAnim("attackR", true)
|
||||
|
||||
local tr = util.TraceHull({
|
||||
start = ent:GetPos(),
|
||||
endpos = ent:GetPos() + ent:GetAngles():Forward() * 200,
|
||||
filter = {ent},
|
||||
mins = Vector(-25, -25, -25),
|
||||
maxs = Vector(25, 25, 25)
|
||||
})
|
||||
|
||||
if IsValid(tr.Entity) then
|
||||
local dmg = DamageInfo()
|
||||
dmg:SetAttacker(ply)
|
||||
dmg:SetInflictor(ent)
|
||||
dmg:SetDamageType(DMG_SLASH)
|
||||
dmg:SetDamage(50)
|
||||
tr.Entity:TakeDamageInfo(dmg)
|
||||
ent:PillSound("hit")
|
||||
end
|
||||
|
||||
timer.Simple(.5, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillAnim("Idle01", true)
|
||||
end)
|
||||
end
|
||||
},
|
||||
health = 1000,
|
||||
sounds = {
|
||||
loop_move = "ambient/levels/citadel/citadel_ambient_voices1.wav",
|
||||
hit = pk_pills.helpers.makeList("npc/zombie/claw_strike#.wav", 3)
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("strider", {
|
||||
printName = "Strider",
|
||||
side = "hl_combine",
|
||||
type = "phys",
|
||||
model = "models/combine_strider.mdl",
|
||||
default_rp_cost = 20000,
|
||||
camera = {
|
||||
dist = 750
|
||||
},
|
||||
seqInit = "Idle01",
|
||||
driveType = "strider",
|
||||
aim = {
|
||||
xInvert = true,
|
||||
xPose = "minigunYaw",
|
||||
yPose = "minigunPitch",
|
||||
attachment = "MiniGun",
|
||||
fixTracers = true,
|
||||
simple = true,
|
||||
overrideStart = Vector(80, 0, -40)
|
||||
},
|
||||
attack = {
|
||||
mode = "auto",
|
||||
func = pk_pills.common.shoot,
|
||||
delay = .2,
|
||||
damage = 30,
|
||||
spread = .02,
|
||||
tracer = "HelicopterTracer"
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ent.usingWarpCannon then return end
|
||||
local tr = util.QuickTrace(ent:LocalToWorld(Vector(80, 0, -40)), ply:EyeAngles():Forward() * 99999, ent)
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetEntity(ent)
|
||||
effectdata:SetOrigin(tr.HitPos)
|
||||
util.Effect("warp_cannon", effectdata, true, true)
|
||||
ent:PillSound("warp_charge")
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillSound("warp_fire")
|
||||
util.BlastDamage(ent, ply, tr.HitPos, 200, 1000)
|
||||
|
||||
if IsValid(tr.Entity) then
|
||||
local phys = tr.Entity:GetPhysicsObject()
|
||||
|
||||
if IsValid(phys) then
|
||||
phys:ApplyForceCenter(ply:EyeAngles():Forward() * 9 ^ 7)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
ent.usingWarpCannon = true
|
||||
|
||||
timer.Simple(2.4, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent.usingWarpCannon = nil
|
||||
end)
|
||||
end
|
||||
},
|
||||
renderOffset = function(ply, ent)
|
||||
local h = ent:GetPoseParameter("body_height") * 500
|
||||
|
||||
return Vector(0, 0, 500 - h)
|
||||
end,
|
||||
health = 7,
|
||||
onlyTakesExplosiveDamage = true,
|
||||
sounds = {
|
||||
step = pk_pills.helpers.makeList("npc/strider/strider_step#.wav", 6),
|
||||
shoot = "npc/strider/strider_minigun.wav",
|
||||
warp_charge = "npc/strider/charging.wav",
|
||||
warp_fire = "npc/strider/fire.wav"
|
||||
}
|
||||
})
|
||||
375
lua/autorun/ppp_include/pill_combine_phys_small.lua
Normal file
375
lua/autorun/ppp_include/pill_combine_phys_small.lua
Normal file
@@ -0,0 +1,375 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("rollermine", {
|
||||
printName = "Rollermine",
|
||||
side = "hl_combine",
|
||||
type = "phys",
|
||||
model = "models/roller.mdl",
|
||||
model2 = "models/roller_spikes.mdl",
|
||||
default_rp_cost = 3000,
|
||||
driveType = "roll",
|
||||
driveOptions = {
|
||||
power = 8000,
|
||||
jump = 15000,
|
||||
burrow = 6
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ent:GetMoveType() ~= MOVETYPE_VPHYSICS then return end
|
||||
|
||||
if ent:GetModel() == ent.formTable.model then
|
||||
ent:PillSound("bladesOut")
|
||||
ent:PillLoopSound("charge")
|
||||
else
|
||||
ent:PillSound("bladesIn")
|
||||
ent:PillLoopStop("charge")
|
||||
end
|
||||
|
||||
ent:SetModel(ent:GetModel() == ent.formTable.model and ent.formTable.model2 or ent.formTable.model)
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
ent:PillDie()
|
||||
end
|
||||
},
|
||||
diesOnExplode = true,
|
||||
damageFromWater = -1,
|
||||
die = function(ply, ent)
|
||||
local explode = ents.Create("env_explosion")
|
||||
explode:SetPos(ent:GetPos())
|
||||
explode:Spawn()
|
||||
explode:SetOwner(ply)
|
||||
explode:SetKeyValue("iMagnitude", "100")
|
||||
explode:Fire("Explode", 0, 0)
|
||||
end,
|
||||
sounds = {
|
||||
jump = "npc/roller/mine/rmine_predetonate.wav",
|
||||
burrow = "npc/roller/mine/combine_mine_deactivate1.wav",
|
||||
contact = "npc/roller/mine/rmine_explode_shock1.wav",
|
||||
bladesIn = pk_pills.helpers.makeList("npc/roller/mine/rmine_blades_in#.wav", 3),
|
||||
bladesOut = pk_pills.helpers.makeList("npc/roller/mine/rmine_blades_out#.wav", 3),
|
||||
loop_move = "npc/roller/mine/rmine_moveslow_loop1.wav",
|
||||
loop_charge = "npc/roller/mine/rmine_seek_loop2.wav"
|
||||
},
|
||||
moveSoundControl = function(ply, ent)
|
||||
local MineSpeed = ent:GetVelocity():Length()
|
||||
if MineSpeed > 50 then return math.Clamp(MineSpeed / 2, 100, 150) end
|
||||
end,
|
||||
contact = function(ply, ent, other)
|
||||
if ent:GetModel() == ent.formTable.model2 then return 25, DMG_SHOCK, 20000 end
|
||||
end
|
||||
})
|
||||
|
||||
pk_pills.register("cityscanner", {
|
||||
printName = "City Scanner",
|
||||
side = "hl_combine",
|
||||
type = "phys",
|
||||
model = "models/Combine_Scanner.mdl",
|
||||
default_rp_cost = 1000,
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 6
|
||||
},
|
||||
aim = {
|
||||
xPose = "flex_horz",
|
||||
yPose = "flex_vert",
|
||||
nocrosshair = true
|
||||
},
|
||||
pose = {
|
||||
dynamo_wheel = function(ply, ent, old) return old + 10 end,
|
||||
tail_control = function(ply, ent) return ent:GetPhysicsObject():GetVelocity().z / 6 end
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
ent:PillSound("pic")
|
||||
end
|
||||
},
|
||||
seqInit = "idle",
|
||||
health = 30,
|
||||
damageFromWater = -1,
|
||||
sounds = {
|
||||
loop_move = "npc/scanner/scanner_scan_loop1.wav",
|
||||
die = "npc/scanner/scanner_explode_crash2.wav",
|
||||
pic = "npc/scanner/scanner_photo1.wav"
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("manhack", {
|
||||
printName = "Manhack",
|
||||
side = "hl_combine",
|
||||
type = "phys",
|
||||
model = "models/manhack.mdl",
|
||||
default_rp_cost = 2000,
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 6,
|
||||
tilt = 20
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if not ent.blades then
|
||||
ent:PillSound("toggleBlades")
|
||||
ent:PillLoopSound("blades")
|
||||
else
|
||||
ent:PillSound("toggleBlades")
|
||||
ent:PillLoopStop("blades")
|
||||
end
|
||||
|
||||
ent.blades = not ent.blades
|
||||
end
|
||||
},
|
||||
pose = {
|
||||
Panel1 = function(ply, ent, old)
|
||||
if ent.blades and old < 90 then return old + 20 end
|
||||
if not ent.blades and old > 0 then return old - 20 end
|
||||
end,
|
||||
Panel2 = function(ply, ent, old)
|
||||
if ent.blades and old < 90 then return old + 20 end
|
||||
if not ent.blades and old > 0 then return old - 20 end
|
||||
end,
|
||||
Panel3 = function(ply, ent, old)
|
||||
if ent.blades and old < 90 then return old + 20 end
|
||||
if not ent.blades and old > 0 then return old - 20 end
|
||||
end,
|
||||
Panel4 = function(ply, ent, old)
|
||||
if ent.blades and old < 90 then return old + 20 end
|
||||
if not ent.blades and old > 0 then return old - 20 end
|
||||
end
|
||||
},
|
||||
bodyGroups = {1, 2},
|
||||
seqInit = "fly",
|
||||
health = 25,
|
||||
damageFromWater = -1,
|
||||
sounds = {
|
||||
loop_move = "npc/manhack/mh_engine_loop1.wav",
|
||||
loop_blades = "npc/manhack/mh_blade_loop1.wav",
|
||||
toggleBlades = "npc/manhack/mh_blade_snick1.wav",
|
||||
cut_flesh = pk_pills.helpers.makeList("npc/manhack/grind_flesh#.wav", 3),
|
||||
cut = pk_pills.helpers.makeList("npc/manhack/grind#.wav", 5),
|
||||
die = "npc/manhack/gib.wav"
|
||||
},
|
||||
collide = function(ply, ent, collide)
|
||||
if ent.blades and collide.HitNormal.z < 0.5 and collide.HitNormal.z > -0.5 then
|
||||
local force = -collide.HitNormal
|
||||
--GTFO
|
||||
ent:GetPhysicsObject():ApplyForceCenter(force * 1000)
|
||||
--Give Damage
|
||||
local dmginfo = DamageInfo()
|
||||
dmginfo:SetDamage(25)
|
||||
dmginfo:SetAttacker(ply)
|
||||
dmginfo:SetDamageForce(force * -10000)
|
||||
collide.HitEntity:TakeDamageInfo(dmginfo)
|
||||
|
||||
if (collide.HitEntity:IsPlayer() or collide.HitEntity:IsNPC() or collide.HitEntity:GetClass() == "pill_ent_phys") then
|
||||
ent:PillSound("cut_flesh")
|
||||
else
|
||||
ent:PillSound("cut")
|
||||
end
|
||||
end
|
||||
end,
|
||||
contactForceHorizontal = true
|
||||
})
|
||||
|
||||
pk_pills.register("clawscanner", {
|
||||
printName = "Claw Scanner",
|
||||
side = "hl_combine",
|
||||
type = "phys",
|
||||
model = "models/Shield_Scanner.mdl",
|
||||
default_rp_cost = 3000,
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 6
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ent:GetSequence() == ent:LookupSequence("HoverClosed") then
|
||||
--NOT calling this twice will result in bugged animations. Fuck your animations, Valve.
|
||||
ent:PillAnim("OpenUp", true)
|
||||
ent:PillAnim("OpenUp", true)
|
||||
local mine
|
||||
|
||||
timer.Simple(1, function()
|
||||
if not IsValid(ent) then return end
|
||||
--Make a mine
|
||||
local attach = ent:LookupAttachment("claw")
|
||||
mine = ents.Create("pill_hopper")
|
||||
local angpos = ent:GetAttachment(attach)
|
||||
mine:SetPos(angpos.Pos)
|
||||
mine:SetAngles(angpos.Ang)
|
||||
mine:SetParent(ent)
|
||||
mine:Spawn()
|
||||
mine:SetOwner(ply)
|
||||
mine:Fire("setparentattachment", "claw", 0.01)
|
||||
ent:PillSound("minepop")
|
||||
end)
|
||||
|
||||
timer.Simple(3, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillAnim("CloseUp", true)
|
||||
mine:SetParent(nil)
|
||||
mine:PhysicsInit(SOLID_VPHYSICS)
|
||||
local phys = mine:GetPhysicsObject()
|
||||
|
||||
if (phys:IsValid()) then
|
||||
phys:Wake()
|
||||
end
|
||||
|
||||
ent:PillSound("minedrop")
|
||||
|
||||
timer.Simple(2, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillAnim("HoverClosed", true)
|
||||
end)
|
||||
end)
|
||||
end
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
ent:PillSound("pic")
|
||||
end
|
||||
},
|
||||
seqInit = "HoverClosed",
|
||||
health = 30,
|
||||
damageFromWater = -1,
|
||||
sounds = {
|
||||
loop_move = "npc/scanner/combat_scan_loop6.wav",
|
||||
die = "npc/scanner/scanner_explode_crash2.wav",
|
||||
minepop = "npc/ichthyosaur/snap.wav",
|
||||
minedrop = pk_pills.helpers.makeList("npc/scanner/combat_scan#.wav", 5),
|
||||
pic = "npc/scanner/scanner_photo1.wav"
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("cturret", {
|
||||
printName = "Combine Turret",
|
||||
side = "hl_combine",
|
||||
type = "phys",
|
||||
model = "models/combine_turrets/floor_turret.mdl",
|
||||
default_rp_cost = 2000,
|
||||
spawnOffset = Vector(0, 0, 5),
|
||||
camera = {
|
||||
offset = Vector(0, 0, 60)
|
||||
},
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch",
|
||||
attachment = "eyes"
|
||||
},
|
||||
canAim = function(ply, ent) return ent.active end,
|
||||
attack = {
|
||||
mode = "auto",
|
||||
func = pk_pills.common.shoot,
|
||||
delay = .1,
|
||||
damage = 4,
|
||||
spread = .01,
|
||||
anim = "fire",
|
||||
tracer = "AR2Tracer"
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ent.busy then return end
|
||||
|
||||
if ent.active then
|
||||
ent:PillAnim("retract")
|
||||
ent:PillSound("retract")
|
||||
ent.active = false
|
||||
else
|
||||
ent:PillAnim("deploy")
|
||||
ent:PillSound("deploy")
|
||||
ent:PillLoopSound("alarm")
|
||||
|
||||
timer.Simple(1, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillLoopStop("alarm")
|
||||
end)
|
||||
end
|
||||
|
||||
ent.busy = true
|
||||
|
||||
timer.Simple(.2, function()
|
||||
if not IsValid(ent) then return end
|
||||
|
||||
if ent:GetSequence() == ent:LookupSequence("deploy") then
|
||||
ent.active = true
|
||||
end
|
||||
|
||||
ent.busy = false
|
||||
end)
|
||||
end
|
||||
},
|
||||
diesOnExplode = true,
|
||||
damageFromWater = -1,
|
||||
sounds = {
|
||||
loop_alarm = "npc/turret_floor/alarm.wav",
|
||||
shoot = pk_pills.helpers.makeList("npc/turret_floor/shoot#.wav", 3),
|
||||
deploy = "npc/turret_floor/deploy.wav",
|
||||
retract = "npc/turret_floor/retract.wav",
|
||||
die = "npc/turret_floor/die.wav",
|
||||
auto_ping = "npc/turret_floor/ping.wav",
|
||||
auto_ping_func = function(ply, ent) return ent.active and not ent.loopingSounds["alarm"]:IsPlaying() and (not ent.lastAttack or ent.lastAttack + .2 < CurTime()), 1 end
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("mortar_synth", {
|
||||
printName = "Mortar Synth",
|
||||
side = "hl_combine",
|
||||
type = "phys",
|
||||
model = "models/mortarsynth.mdl",
|
||||
default_rp_cost = 8000,
|
||||
sphericalPhysics = 30,
|
||||
driveType = "hover",
|
||||
driveOptions = {
|
||||
speed = 6,
|
||||
height = 50
|
||||
},
|
||||
attack = {
|
||||
mode = "auto",
|
||||
delay = 1,
|
||||
func = function(ply, ent)
|
||||
--if ent.attacking then return end
|
||||
ent:PillAnim("Mortar_Shoot", true)
|
||||
ent:SetPlaybackRate(2)
|
||||
|
||||
--ent.attacking=true
|
||||
timer.Simple(.5, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillSound("fire")
|
||||
local angs = ply:EyeAngles()
|
||||
angs.p = angs.p - 45
|
||||
local nade = ents.Create("pill_proj_energy_grenade")
|
||||
nade:SetPos(ent:LocalToWorld(Vector(50, 0, 50)))
|
||||
nade:SetAngles(angs)
|
||||
nade:SetOwner(ply)
|
||||
nade:Spawn()
|
||||
end)
|
||||
end
|
||||
},
|
||||
--[[timer.Simple(1,function()
|
||||
if !IsValid(ent) then return end
|
||||
ent.attacking=nil
|
||||
end)]]
|
||||
health = 400,
|
||||
sounds = {
|
||||
loop_move = "npc/scanner/combat_scan_loop6.wav",
|
||||
fire = "npc/env_headcrabcanister/launch.wav"
|
||||
}
|
||||
})
|
||||
272
lua/autorun/ppp_include/pill_combine_soldiers.lua
Normal file
272
lua/autorun/ppp_include/pill_combine_soldiers.lua
Normal file
@@ -0,0 +1,272 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("csoldier", {
|
||||
printName = "Combine Soldier",
|
||||
type = "ply",
|
||||
model = "models/Combine_Soldier.mdl",
|
||||
default_rp_cost = 5000,
|
||||
skin = 0,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/Combine_Soldier.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Combine_Soldier_PrisonGuard.mdl"
|
||||
}
|
||||
}
|
||||
end,
|
||||
side = "hl_combine",
|
||||
voxSet = "combine",
|
||||
anims = {
|
||||
default = {
|
||||
idle = "Idle_Unarmed",
|
||||
walk = "WalkUnarmed_all",
|
||||
run = "Run_turretCarry_ALL",
|
||||
crouch = "CrouchIdle",
|
||||
crouch_walk = "Crouch_WalkALL",
|
||||
glide = "jump_holding_glide",
|
||||
jump = "jump_holding_jump",
|
||||
throw = "grenThrow",
|
||||
rappel = "rappelloop",
|
||||
land = "jump_holding_land",
|
||||
g_attack = "gesture_shoot_ar2",
|
||||
g_reload = "gesture_reload"
|
||||
},
|
||||
smg = {
|
||||
idle = "CombatIdle1_SMG1",
|
||||
walk = "Walk_aiming_all",
|
||||
run = "RunAIMALL1",
|
||||
crouch = "crouch_aim_sm1",
|
||||
g_reload = "gesture_reload_SMG1"
|
||||
},
|
||||
ar2 = {
|
||||
idle = "CombatIdle1",
|
||||
walk = "Walk_aiming_all",
|
||||
run = "RunAIMALL1"
|
||||
},
|
||||
shotgun = {
|
||||
idle = "CombatIdle1_SG",
|
||||
walk = "Walk_aiming_all_SG",
|
||||
run = "RunAIMALL1_SG",
|
||||
g_attack = "gesture_shoot_shotgun"
|
||||
}
|
||||
},
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch"
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ply:IsOnGround() then end
|
||||
end
|
||||
},
|
||||
flashlight = function(ply, ent)
|
||||
if not ply:IsOnGround() and not ent.grappleEnd then
|
||||
local tr = ply:GetEyeTrace()
|
||||
|
||||
if (tr.Fraction < 0.01) then
|
||||
ent.grappleEnd = tr.HitPos
|
||||
ent.grappleSliding = true
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin(ent.grappleEnd)
|
||||
effectdata:SetEntity(ent)
|
||||
util.Effect("rappel_line", effectdata, true, true)
|
||||
ent:PillSound("rappel_start")
|
||||
ent:PillLoopSound("rappel")
|
||||
end
|
||||
elseif ply:IsOnGround() then
|
||||
ent:PillAnim("throw", true)
|
||||
|
||||
if not ent.formTable.throwsManhack then
|
||||
timer.Simple(.75, function()
|
||||
if not IsValid(ent) then return end
|
||||
local nade = ents.Create("npc_grenade_frag")
|
||||
nade:SetPos(ply:EyePos() + ply:EyeAngles():Forward() * 50)
|
||||
nade:SetAngles(ply:EyeAngles())
|
||||
nade:Spawn()
|
||||
nade:SetOwner(ply)
|
||||
nade:Fire("SetTimer", 3, 0)
|
||||
nade:GetPhysicsObject():SetVelocity((ply:EyeAngles():Forward() + Vector(0, 0, .4)) * 1000)
|
||||
end)
|
||||
else
|
||||
timer.Simple(1, function()
|
||||
if not IsValid(ent) then return end
|
||||
local hax = ents.Create("npc_manhack")
|
||||
hax:SetPos(ply:EyePos() + ply:EyeAngles():Forward() * 100)
|
||||
hax:SetAngles(ply:EyeAngles())
|
||||
hax:Spawn()
|
||||
hax:GetPhysicsObject():SetVelocity(Vector(0, 0, 500))
|
||||
end)
|
||||
end
|
||||
end
|
||||
end,
|
||||
moveMod = function(ply, ent, mv, cmd)
|
||||
--garbage code... vertical velocity predicted, lateral velocity not
|
||||
if SERVER and ent.grappleEnd then
|
||||
ent:PillAnimTick("rappel")
|
||||
local targetVel = -500
|
||||
|
||||
if ply:KeyDown(IN_JUMP) then
|
||||
if ent.grappleSliding then
|
||||
ent:PillLoopStop("rappel")
|
||||
ent:PillSound("rappel_brake")
|
||||
ent.grappleSliding = false
|
||||
end
|
||||
|
||||
targetVel = 0
|
||||
else
|
||||
if not ent.grappleSliding then
|
||||
ent:PillLoopSound("rappel")
|
||||
ent.grappleSliding = true
|
||||
end
|
||||
end
|
||||
|
||||
if mv:GetVelocity().z < targetVel then
|
||||
local latforce = (ent.grappleEnd - mv:GetOrigin()) * .05
|
||||
latforce.z = 0
|
||||
mv:SetVelocity(mv:GetVelocity() + latforce)
|
||||
local curvel = mv:GetVelocity()
|
||||
curvel.z = targetVel
|
||||
mv:SetVelocity(curvel)
|
||||
end
|
||||
end
|
||||
|
||||
--dumb
|
||||
if CLIENT and ent:GetPuppet():GetSequence() == ent:GetPuppet():LookupSequence("rappelloop") then
|
||||
local targetVel = -500
|
||||
|
||||
if ply:KeyDown(IN_JUMP) then
|
||||
targetVel = 0
|
||||
end
|
||||
|
||||
if mv:GetVelocity().z < targetVel then
|
||||
local curvel = mv:GetVelocity()
|
||||
curvel.z = targetVel
|
||||
mv:SetVelocity(curvel)
|
||||
end
|
||||
end
|
||||
end,
|
||||
land = function(ply, ent)
|
||||
if ent.grappleEnd then
|
||||
ent.grappleEnd = nil
|
||||
ent.grappleSliding = nil
|
||||
ent:PillAnim("land", true)
|
||||
ent:PillLoopStop("rappel")
|
||||
end
|
||||
end,
|
||||
moveSpeed = {
|
||||
walk = 60,
|
||||
run = 200,
|
||||
ducked = 40
|
||||
},
|
||||
loadout = {"weapon_ar2", "pill_wep_holstered"},
|
||||
ammo = {
|
||||
AR2 = 90
|
||||
},
|
||||
validHoldTypes = {"ar2", "shotgun", "smg"},
|
||||
movePoseMode = "yaw",
|
||||
health = 150,
|
||||
sounds = {
|
||||
rappel_start = "weapons/crossbow/fire1.wav",
|
||||
rappel_brake = "physics/metal/sawblade_stick1.wav",
|
||||
loop_rappel = "weapons/tripwire/ropeshoot.wav",
|
||||
step = pk_pills.helpers.makeList("npc/combine_soldier/gear#.wav", 6)
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("csoldier_shotgunner", {
|
||||
parent = "csoldier",
|
||||
printName = "Combine Shotgunner",
|
||||
skin = 1,
|
||||
loadout = {"weapon_shotgun"},
|
||||
ammo = {
|
||||
AR2 = 0,
|
||||
Buckshot = 30
|
||||
}
|
||||
})
|
||||
|
||||
--[[)
|
||||
pk_pills.register("csoldier_guard",{
|
||||
parent="csoldier",
|
||||
printName="Prison Soldier",
|
||||
model="models/Combine_Soldier_PrisonGuard.mdl",
|
||||
options=false
|
||||
})
|
||||
|
||||
pk_pills.register("csoldier_guard_shotgunner",{
|
||||
parent="csoldier_shotgunner",
|
||||
printName="Prison Shotgunner",
|
||||
model="models/Combine_Soldier_PrisonGuard.mdl"
|
||||
})]]
|
||||
pk_pills.register("csoldier_elite", {
|
||||
parent = "csoldier",
|
||||
printName = "Combine Elite",
|
||||
model = "models/Combine_Super_Soldier.mdl",
|
||||
default_rp_cost = 6000,
|
||||
options = false,
|
||||
ammo = {
|
||||
AR2AltFire = 6
|
||||
},
|
||||
health = 300
|
||||
})
|
||||
|
||||
pk_pills.register("csoldier_police", {
|
||||
parent = "csoldier",
|
||||
printName = "Metrocop",
|
||||
model = "models/Police.mdl",
|
||||
options = false,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "busyidle2",
|
||||
walk = "walk_all",
|
||||
run = "run_all",
|
||||
crouch = "Crouch_idle_pistol",
|
||||
crouch_walk = "Crouch_all",
|
||||
throw = "deploy"
|
||||
},
|
||||
smg = {
|
||||
idle = "smg1angryidle1",
|
||||
walk = "walk_aiming_SMG1_all",
|
||||
run = "run_aiming_SMG1_all",
|
||||
crouch = "crouch_idle_smg1",
|
||||
g_reload = "gesture_reload_smg1",
|
||||
g_attack = "gesture_shoot_smg1"
|
||||
},
|
||||
pistol = {
|
||||
idle = "pistolangryidle2",
|
||||
walk = "walk_aiming_pistol_all",
|
||||
run = "run_aiming_pistol_all",
|
||||
g_reload = "gesture_reload_pistol",
|
||||
g_attack = "gesture_shoot_pistol"
|
||||
},
|
||||
melee = {
|
||||
idle = "batonangryidle1",
|
||||
walk = "walk_hold_baton_angry",
|
||||
g_attack = "swinggesture"
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
step = pk_pills.helpers.makeList("npc/metropolice/gear#.wav", 6)
|
||||
},
|
||||
throwsManhack = true,
|
||||
validHoldTypes = {"melee", "pistol", "smg"},
|
||||
loadout = {"weapon_stunstick", "weapon_pistol", "weapon_smg1", "pill_wep_holstered"},
|
||||
ammo = {
|
||||
AR2 = 0,
|
||||
pistol = 54,
|
||||
smg1 = 90
|
||||
},
|
||||
health = 100
|
||||
})
|
||||
449
lua/autorun/ppp_include/pill_fun.lua
Normal file
449
lua/autorun/ppp_include/pill_fun.lua
Normal file
@@ -0,0 +1,449 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("birdbrainswagtrain", {
|
||||
printName = "Bird Brain Swag Train",
|
||||
side = "wild",
|
||||
type = "phys",
|
||||
model = "models/props_trainstation/train001.mdl",
|
||||
default_rp_cost = 100000,
|
||||
spawnOffset = Vector(0, 0, 200),
|
||||
camera = {
|
||||
offset = Vector(80, 0, 0),
|
||||
dist = 2000
|
||||
},
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 100,
|
||||
rotation = 90
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
ent:PillSound("horn")
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if not ent.lastcar then
|
||||
ent.lastcar = ent
|
||||
end
|
||||
|
||||
if not IsValid(ent.lastcar) then return end
|
||||
local t = math.random(2, 4)
|
||||
|
||||
if t == 4 then
|
||||
t = 5
|
||||
end
|
||||
|
||||
local pos = ent.lastcar:LocalToWorld(Vector(0, -650, 0))
|
||||
if not util.IsInWorld(pos) then return end
|
||||
local car = ents.Create("prop_physics")
|
||||
car:SetModel("models/props_trainstation/train00" .. t .. ".mdl")
|
||||
car:SetPos(pos)
|
||||
car:SetAngles(ent.lastcar:GetAngles())
|
||||
car:Spawn()
|
||||
car:GetPhysicsObject():EnableGravity(false)
|
||||
ent:DeleteOnRemove(car)
|
||||
ent:PillFilterCam(car)
|
||||
constraint.Ballsocket(ent.lastcar, car, 0, 0, Vector(0, 300, 0), 0, 0, 1)
|
||||
ent.lastcar = car
|
||||
ent:PillSound("newCar")
|
||||
end
|
||||
},
|
||||
health = 99999,
|
||||
sounds = {
|
||||
horn = "ambient/alarms/razortrain_horn1.wav",
|
||||
newCar = "ambient/machines/wall_crash1.wav"
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("landshark", {
|
||||
parent = "ichthyosaur",
|
||||
printName = "Landshark",
|
||||
default_rp_cost = 50000,
|
||||
driveType = "hover",
|
||||
driveOptions = {
|
||||
speed = 50,
|
||||
height = 75
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("turbobird", {
|
||||
parent = "bird_seagull",
|
||||
printName = "Turbobird",
|
||||
default_rp_cost = 50000,
|
||||
side = "wild",
|
||||
camera = {
|
||||
offset = Vector(0, 0, 40),
|
||||
dist = 200
|
||||
},
|
||||
hull = Vector(50, 50, 50),
|
||||
modelScale = 5,
|
||||
health = 1337,
|
||||
moveSpeed = {
|
||||
walk = 100,
|
||||
run = 300
|
||||
},
|
||||
aim = {},
|
||||
anims = {
|
||||
default = {
|
||||
fly_rate = .5,
|
||||
kaboom = "reference"
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
vocalize = "npc/metropolice/vo/dontmove.wav",
|
||||
loop_windup = "vehicles/Crane/crane_extend_loop1.wav",
|
||||
fire = pk_pills.helpers.makeList("npc/metropolice/pain#.wav", 4)
|
||||
},
|
||||
attack = {
|
||||
mode = "auto",
|
||||
func = function(ply, ent)
|
||||
ent:PillSound("fire")
|
||||
local rocket = ents.Create("pill_proj_rocket")
|
||||
rocket:SetModel("models/crow.mdl")
|
||||
rocket:SetPos(ply:EyePos() + ply:EyeAngles():Forward() * 100)
|
||||
rocket:SetAngles(ply:EyeAngles())
|
||||
rocket.sound = "ambient/levels/canals/windmill_wind_loop1.wav"
|
||||
rocket.trail = "trails/lol.vmt"
|
||||
rocket.tcolor = HSVToColor(math.Rand(0, 360), 1, 1)
|
||||
rocket:Spawn()
|
||||
rocket:SetOwner(ply)
|
||||
end,
|
||||
delay = .3
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ent.splodin then return end
|
||||
ent:PillAnim("kaboom", true)
|
||||
ent:PillSound("vocalize")
|
||||
ent:PillLoopSound("windup")
|
||||
ent.splodin = true
|
||||
|
||||
timer.Simple(3, function()
|
||||
if not IsValid(ent) then return end
|
||||
local explode = ents.Create("env_explosion")
|
||||
explode:SetPos(ply:GetPos())
|
||||
explode:Spawn()
|
||||
explode:SetOwner(ply)
|
||||
explode:SetKeyValue("iMagnitude", "300")
|
||||
explode:Fire("Explode", 0, 0)
|
||||
ply:Kill()
|
||||
end)
|
||||
end
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("melon", {
|
||||
printName = "Melon",
|
||||
type = "phys",
|
||||
side = "harmless",
|
||||
model = "models/props_junk/watermelon01.mdl",
|
||||
default_rp_cost = 800,
|
||||
health = 69,
|
||||
driveType = "roll",
|
||||
driveOptions = {
|
||||
power = 300,
|
||||
jump = 5000,
|
||||
burrow = 6
|
||||
},
|
||||
sounds = {
|
||||
jump = "npc/headcrab_poison/ph_jump1.wav",
|
||||
burrow = "npc/antlion/digdown1.wav",
|
||||
loop_move = "npc/fast_zombie/gurgle_loop1.wav"
|
||||
},
|
||||
moveSoundControl = function(ply, ent)
|
||||
local MineSpeed = ent:GetVelocity():Length()
|
||||
if MineSpeed > 50 then return math.Clamp(MineSpeed / 2, 100, 150) end
|
||||
end
|
||||
})
|
||||
|
||||
pk_pills.register("haxman", {
|
||||
printName = "Dr. Hax",
|
||||
type = "ply",
|
||||
side = "wild",
|
||||
model = "models/breen.mdl",
|
||||
default_rp_cost = 20000,
|
||||
aim = {},
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle_angry_melee",
|
||||
walk = "walk_all",
|
||||
run = "sprint_all", --pace_all
|
||||
crouch = "Crouch_idleD",
|
||||
crouch_walk = "Crouch_walk_aLL",
|
||||
glide = "jump_holding_glide",
|
||||
jump = "jump_holding_jump",
|
||||
throw = "swing"
|
||||
}
|
||||
},
|
||||
boneMorphs = {
|
||||
["ValveBiped.Bip01_Head1"] = {
|
||||
scale = Vector(3, 3, 3)
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
throw = "vo/npc/male01/hacks01.wav"
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 100,
|
||||
run = 1000,
|
||||
ducked = 40
|
||||
},
|
||||
jumpPower = 1000,
|
||||
movePoseMode = "yaw",
|
||||
health = 10000,
|
||||
noFallDamage = true,
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if not ply:OnGround() then return end
|
||||
local computer = ents.Create("pill_proj_prop")
|
||||
computer:SetModel("models/props_lab/monitor02.mdl")
|
||||
computer:SetPos(ply:EyePos() + ply:EyeAngles():Forward() * 100)
|
||||
computer:SetAngles(ply:EyeAngles())
|
||||
computer:Spawn()
|
||||
computer:SetPhysicsAttacker(ply)
|
||||
ent:PillAnim("throw", true)
|
||||
ent:PillSound("throw")
|
||||
end
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("crate", {
|
||||
printName = "Crate",
|
||||
side = "harmless",
|
||||
type = "phys",
|
||||
model = "models/props_junk/wood_crate001a.mdl",
|
||||
default_rp_cost = 200,
|
||||
spawnOffset = Vector(0, 0, 30),
|
||||
health = 30
|
||||
})
|
||||
|
||||
pk_pills.register("lamp", {
|
||||
printName = "Lamp",
|
||||
side = "harmless",
|
||||
type = "phys",
|
||||
model = "models/props_interiors/Furniture_Lamp01a.mdl",
|
||||
default_rp_cost = 200,
|
||||
spawnOffset = Vector(0, 0, 38),
|
||||
health = 30
|
||||
})
|
||||
|
||||
pk_pills.register("cactus", {
|
||||
printName = "Cactus",
|
||||
side = "harmless",
|
||||
type = "phys",
|
||||
model = "models/props_lab/cactus.mdl",
|
||||
default_rp_cost = 200,
|
||||
spawnOffset = Vector(0, 0, 10),
|
||||
health = 30
|
||||
})
|
||||
|
||||
pk_pills.register("cone", {
|
||||
printName = "Traffic Cone",
|
||||
side = "harmless",
|
||||
type = "phys",
|
||||
model = "models/props_junk/TrafficCone001a.mdl",
|
||||
default_rp_cost = 200,
|
||||
spawnOffset = Vector(0, 0, 25),
|
||||
health = 30
|
||||
})
|
||||
|
||||
pk_pills.register("phantom", {
|
||||
printName = "Phantom",
|
||||
side = "harmless",
|
||||
type = "phys",
|
||||
model = "models/Gibs/HGIBS.mdl",
|
||||
default_rp_cost = 30000,
|
||||
spawnOffset = Vector(0, 0, 50),
|
||||
camera = {
|
||||
distFromSize = true
|
||||
},
|
||||
sounds = {
|
||||
swap = "weapons/bugbait/bugbait_squeeze1.wav",
|
||||
nope = "vo/Citadel/br_no.wav",
|
||||
spook = "ambient/creatures/town_child_scream1.wav"
|
||||
},
|
||||
aim = {},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
local tr = util.QuickTrace(ent:GetPos(), ply:EyeAngles():Forward() * 1000, ent)
|
||||
local prop = tr.Entity
|
||||
|
||||
if IsValid(prop) and prop:GetClass() == "prop_physics" and hook.Call("PhysgunPickup", GAMEMODE, ply, prop) then
|
||||
local mymdl = ent:GetModel()
|
||||
local mypos = ent:GetPos()
|
||||
local myangs = ent:GetAngles()
|
||||
ent:SetModel(prop:GetModel())
|
||||
ent:PhysicsInit(SOLID_VPHYSICS)
|
||||
ent:SetMoveType(MOVETYPE_VPHYSICS)
|
||||
ent:SetSolid(SOLID_VPHYSICS)
|
||||
ent:SetPos(prop:GetPos())
|
||||
ent:SetAngles(prop:GetAngles())
|
||||
ent:PhysWake()
|
||||
prop:SetModel(mymdl)
|
||||
prop:PhysicsInit(SOLID_VPHYSICS)
|
||||
prop:SetMoveType(MOVETYPE_VPHYSICS)
|
||||
prop:SetSolid(SOLID_VPHYSICS)
|
||||
prop:SetPos(mypos)
|
||||
prop:SetAngles(myangs)
|
||||
prop:PhysWake()
|
||||
ent:PillSound("swap")
|
||||
else
|
||||
ent:PillSound("nope")
|
||||
end
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
ent:PillSound("spook")
|
||||
end
|
||||
},
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 10
|
||||
},
|
||||
health = 666
|
||||
})
|
||||
|
||||
pk_pills.register("steelball", {
|
||||
printName = "Ball of Steel",
|
||||
side = "harmless",
|
||||
type = "phys",
|
||||
model = "models/hunter/misc/sphere375x375.mdl",
|
||||
default_rp_cost = 15000,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 0),
|
||||
dist = 1000
|
||||
},
|
||||
spawnOffset = Vector(0, 0, 60),
|
||||
driveType = "roll",
|
||||
driveOptions = {
|
||||
power = 300000,
|
||||
jump = 200000
|
||||
},
|
||||
visMat = "phoenix_storms/stripes",
|
||||
physMat = "metal",
|
||||
health = 30000
|
||||
})
|
||||
|
||||
pk_pills.register("doggie", {
|
||||
printName = "Doggie",
|
||||
side = "harmless",
|
||||
type = "ply",
|
||||
model = "models/balloons/balloon_dog.mdl",
|
||||
noragdoll = true,
|
||||
default_rp_cost = 800,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 5),
|
||||
dist = 80
|
||||
},
|
||||
hull = Vector(10, 10, 15),
|
||||
anims = {},
|
||||
moveSpeed = {
|
||||
walk = 120,
|
||||
run = 240
|
||||
},
|
||||
visColorRandom = true,
|
||||
health = 75
|
||||
})
|
||||
|
||||
pk_pills.register("skeeter", {
|
||||
printName = "Skeeter",
|
||||
side = "harmless",
|
||||
type = "ply",
|
||||
model = "models/odessa.mdl",
|
||||
default_rp_cost = 800,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 5),
|
||||
dist = 40
|
||||
},
|
||||
hull = Vector(5, 5, 10),
|
||||
duckBy = 5,
|
||||
modelScale = .2,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "cower_idle",
|
||||
walk = "walk_panicked_all",
|
||||
run = "run_all_panicked",
|
||||
crouch = "arrestidle",
|
||||
--crouch_walk="crouchrunall1", pos rot scale
|
||||
glide = "spreadwallidle",
|
||||
jump = "jump_holding_jump"
|
||||
}
|
||||
},
|
||||
boneMorphs = {
|
||||
["ValveBiped.Bip01_Head1"] = {
|
||||
pos = Vector(5, 0, 0)
|
||||
},
|
||||
["ValveBiped.Bip01_L_Thigh"] = {
|
||||
pos = Vector(10, 0, 0)
|
||||
},
|
||||
["ValveBiped.Bip01_R_Thigh"] = {
|
||||
pos = Vector(-10, 0, 0)
|
||||
}
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 30,
|
||||
run = 90
|
||||
},
|
||||
movePoseMode = "yaw",
|
||||
jumpPower = 400,
|
||||
health = 2,
|
||||
noFallDamage = true
|
||||
})
|
||||
|
||||
pk_pills.register("doge", {
|
||||
printName = "Doge",
|
||||
side = "harmless",
|
||||
type = "phys",
|
||||
sphericalPhysics = 20,
|
||||
default_rp_cost = 30000,
|
||||
sprite = {
|
||||
mat = "pillsprites/shibe.png",
|
||||
--color=Color(255,255,0),
|
||||
size = 60,
|
||||
offset = Vector(0, 0, 10)
|
||||
},
|
||||
--model="models/Gibs/HGIBS.mdl",
|
||||
spawnOffset = Vector(0, 0, 50),
|
||||
camera = {},
|
||||
--distFromSize=true
|
||||
sounds = {
|
||||
swap = "weapons/bugbait/bugbait_squeeze1.wav",
|
||||
nope = "vo/Citadel/br_no.wav",
|
||||
spook = "ambient/creatures/town_child_scream1.wav"
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin(ent:GetPos())
|
||||
util.Effect("wow_doge", effectdata, true, true)
|
||||
ent:PillSound("wow")
|
||||
end
|
||||
},
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 10
|
||||
},
|
||||
sounds = {
|
||||
wow = "birdbrainswagtrain/wow.wav"
|
||||
},
|
||||
health = 420
|
||||
})
|
||||
516
lua/autorun/ppp_include/pill_fun2.lua
Normal file
516
lua/autorun/ppp_include/pill_fun2.lua
Normal file
@@ -0,0 +1,516 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("giraffe", {
|
||||
printName = "Giraffe",
|
||||
side = "harmless",
|
||||
type = "ply",
|
||||
model = "models/mossman.mdl",
|
||||
default_rp_cost = 800,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 220),
|
||||
dist = 400
|
||||
},
|
||||
hull = Vector(50, 50, 230),
|
||||
duckBy = 150,
|
||||
modelScale = 2,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "man_gun",
|
||||
walk = "walk_holding_package_all",
|
||||
run = "run_aiming_p_all",
|
||||
crouch = "coverlow_l",
|
||||
crouch_walk = "crouchrunall1",
|
||||
glide = "sit_chair",
|
||||
jump = "cower"
|
||||
}
|
||||
},
|
||||
boneMorphs = {
|
||||
["ValveBiped.Bip01_Head1"] = {
|
||||
pos = Vector(50, 25, 0),
|
||||
scale = Vector(2, 2, 2)
|
||||
}
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 300,
|
||||
run = 900
|
||||
},
|
||||
movePoseMode = "yaw",
|
||||
jumpPower = 400,
|
||||
health = 600
|
||||
})
|
||||
|
||||
pk_pills.register("hula", {
|
||||
printName = "Hula",
|
||||
side = "harmless",
|
||||
type = "ply",
|
||||
model = "models/props_lab/huladoll.mdl",
|
||||
noragdoll = true,
|
||||
default_rp_cost = 800,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 5),
|
||||
dist = 80
|
||||
},
|
||||
hull = Vector(5, 5, 6),
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle",
|
||||
shake = "shake"
|
||||
}
|
||||
},
|
||||
attack = {
|
||||
mode = "auto",
|
||||
delay = .2,
|
||||
func = function(ply, ent)
|
||||
ent:PillAnim("shake")
|
||||
end
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 40,
|
||||
run = 100
|
||||
},
|
||||
health = 5
|
||||
})
|
||||
|
||||
pk_pills.register("wheelbarrow", {
|
||||
printName = "Wheelbarrow",
|
||||
side = "harmless",
|
||||
type = "phys",
|
||||
model = "models/props_junk/Wheebarrow01a.mdl",
|
||||
default_rp_cost = 3000,
|
||||
camera = {
|
||||
dist = 120
|
||||
},
|
||||
driveType = "hover",
|
||||
driveOptions = {
|
||||
speed = 5,
|
||||
height = 40
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("goover", {
|
||||
printName = "Goover",
|
||||
side = "harmless",
|
||||
type = "phys",
|
||||
default_rp_cost = 800,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/maxofs2d/balloon_gman.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/maxofs2d/balloon_mossman.mdl"
|
||||
}
|
||||
}
|
||||
end,
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 20
|
||||
},
|
||||
health = 50
|
||||
})
|
||||
|
||||
pk_pills.register("baby", {
|
||||
printName = "Baby",
|
||||
side = "harmless",
|
||||
type = "phys",
|
||||
model = "models/props_c17/doll01.mdl",
|
||||
default_rp_cost = 800,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 5),
|
||||
dist = 80
|
||||
},
|
||||
driveType = "hover",
|
||||
driveOptions = {
|
||||
speed = 3,
|
||||
height = 20
|
||||
},
|
||||
health = 15
|
||||
})
|
||||
|
||||
pk_pills.register("facepunch", {
|
||||
printName = "Facepunch",
|
||||
side = "wild",
|
||||
type = "phys",
|
||||
camera = {
|
||||
dist = 300
|
||||
},
|
||||
default_rp_cost = 18000,
|
||||
model = "models/props_phx/facepunch_logo.mdl",
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 60,
|
||||
rotation2 = 90
|
||||
},
|
||||
sounds = {
|
||||
fire = "physics/metal/metal_box_impact_hard2.wav"
|
||||
},
|
||||
attack = {
|
||||
mode = "auto",
|
||||
delay = .33,
|
||||
func = function(ply, ent)
|
||||
ent:PillSound("fire")
|
||||
local bomb = ents.Create("pill_proj_bomb")
|
||||
bomb:SetModel("models/props_phx/facepunch_barrel.mdl")
|
||||
bomb:SetPos(ent:GetPos() + ply:EyeAngles():Forward() * 100)
|
||||
bomb:SetAngles(ply:EyeAngles())
|
||||
bomb:SetOwner(ply)
|
||||
bomb:Spawn()
|
||||
end
|
||||
},
|
||||
health = 11111
|
||||
})
|
||||
|
||||
pk_pills.register("rpg", {
|
||||
printName = "RPG",
|
||||
side = "harmless",
|
||||
type = "phys",
|
||||
default_rp_cost = 5000,
|
||||
model = "models/weapons/w_missile_closed.mdl",
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 30,
|
||||
rocketMode = true
|
||||
},
|
||||
aim = {},
|
||||
damageFromWater = -1,
|
||||
sounds = {
|
||||
loop_move = "weapons/rpg/rocket1.wav"
|
||||
},
|
||||
trail = {
|
||||
texture = "trails/smoke.vmt",
|
||||
width = 10
|
||||
},
|
||||
collide = function(ply, ent, collide)
|
||||
ply:Kill()
|
||||
end,
|
||||
die = function(ply, ent)
|
||||
local explode = ents.Create("env_explosion")
|
||||
explode:SetPos(ent:GetPos())
|
||||
explode:Spawn()
|
||||
explode:SetOwner(ply)
|
||||
explode:SetKeyValue("iMagnitude", "100")
|
||||
explode:Fire("Explode", 0, 0)
|
||||
end
|
||||
})
|
||||
|
||||
pk_pills.register("rocket", {
|
||||
parent = "rpg",
|
||||
printName = "Rocket",
|
||||
default_rp_cost = 10000,
|
||||
model = false,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/props_phx/amraam.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_phx/ww2bomb.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_phx/torpedo.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_phx/mk-82.mdl"
|
||||
}
|
||||
}
|
||||
end,
|
||||
aim = {},
|
||||
camera = {
|
||||
dist = 300
|
||||
},
|
||||
driveOptions = {
|
||||
speed = 60
|
||||
},
|
||||
die = function(ply, ent)
|
||||
local pos = ent:GetPos()
|
||||
|
||||
local splode = function()
|
||||
if not IsValid(ply) then return end
|
||||
local explode = ents.Create("env_explosion")
|
||||
explode:SetPos(pos + VectorRand() * 100)
|
||||
explode:Spawn()
|
||||
explode:SetOwner(ply)
|
||||
explode:SetKeyValue("iMagnitude", "100")
|
||||
explode:Fire("Explode", 0, 0)
|
||||
end
|
||||
|
||||
splode()
|
||||
|
||||
for i = 1, 4 do
|
||||
timer.Simple(i / 5, splode)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
pk_pills.register("rocket2", {
|
||||
parent = "rocket",
|
||||
printName = "Super Rocket",
|
||||
default_rp_cost = 20000,
|
||||
model = "models/props_phx/rocket1.mdl",
|
||||
options = false,
|
||||
camera = {
|
||||
dist = 600
|
||||
},
|
||||
aim = {},
|
||||
driveOptions = {
|
||||
speed = 90,
|
||||
rotation2 = 90
|
||||
},
|
||||
die = function(ply, ent)
|
||||
local pos = ent:GetPos()
|
||||
|
||||
local splode = function()
|
||||
if not IsValid(ply) then return end
|
||||
local explode = ents.Create("env_explosion")
|
||||
explode:SetPos(pos + VectorRand() * 500)
|
||||
explode:Spawn()
|
||||
explode:SetOwner(ply)
|
||||
explode:SetKeyValue("iMagnitude", "100")
|
||||
explode:Fire("Explode", 0, 0)
|
||||
end
|
||||
|
||||
splode()
|
||||
|
||||
for i = 1, 19 do
|
||||
timer.Simple(i / 10, splode)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
pk_pills.register("sawblade", {
|
||||
printName = "Saw Blade",
|
||||
side = "wild",
|
||||
type = "phys",
|
||||
default_rp_cost = 9000,
|
||||
model = "models/props_junk/sawblade001a.mdl",
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 10,
|
||||
spin = 200
|
||||
},
|
||||
sounds = {
|
||||
loop_move = "vehicles/v8/third.wav",
|
||||
cut = "physics/metal/sawblade_stick1.wav"
|
||||
},
|
||||
collide = function(ply, ent, collide)
|
||||
if collide.HitNormal.z < 0.5 and collide.HitNormal.z > -0.5 then
|
||||
local force = -collide.HitNormal
|
||||
--GTFO
|
||||
ent:GetPhysicsObject():ApplyForceCenter(force * 20000)
|
||||
--Give Damage
|
||||
local dmginfo = DamageInfo()
|
||||
dmginfo:SetDamage(100)
|
||||
dmginfo:SetAttacker(ply)
|
||||
dmginfo:SetDamageForce(force * -10000)
|
||||
collide.HitEntity:TakeDamageInfo(dmginfo)
|
||||
ent:PillSound("cut")
|
||||
end
|
||||
end,
|
||||
contactForceHorizontal = true,
|
||||
health = 500
|
||||
})
|
||||
|
||||
pk_pills.register("carousel", {
|
||||
printName = "Carousel",
|
||||
side = "wild",
|
||||
type = "phys",
|
||||
camera = {
|
||||
dist = 300
|
||||
},
|
||||
default_rp_cost = 12000,
|
||||
model = "models/props_c17/playground_carousel01.mdl",
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 20,
|
||||
spin = 100
|
||||
},
|
||||
health = 1000
|
||||
})
|
||||
|
||||
pk_pills.register("chopper", {
|
||||
printName = "Chopper",
|
||||
side = "wild",
|
||||
type = "phys",
|
||||
camera = {
|
||||
dist = 300
|
||||
},
|
||||
default_rp_cost = 12000,
|
||||
model = "models/props_c17/TrapPropeller_Blade.mdl",
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 20,
|
||||
spin = -300
|
||||
},
|
||||
health = 1000
|
||||
})
|
||||
|
||||
pk_pills.register("propeller", {
|
||||
printName = "Propeller",
|
||||
side = "wild",
|
||||
type = "phys",
|
||||
camera = {
|
||||
dist = 200
|
||||
},
|
||||
default_rp_cost = 8000,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/props_phx/misc/propeller2x_small.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_phx/misc/propeller3x_small.mdl"
|
||||
}
|
||||
}
|
||||
end,
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 20,
|
||||
spin = -300
|
||||
},
|
||||
health = 600
|
||||
})
|
||||
|
||||
pk_pills.register("turbine", {
|
||||
printName = "Turbine",
|
||||
side = "wild",
|
||||
type = "phys",
|
||||
camera = {
|
||||
dist = 200
|
||||
},
|
||||
default_rp_cost = 8000,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/props_phx/misc/paddle_small.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_phx/misc/paddle_small2.mdl"
|
||||
}
|
||||
}
|
||||
end,
|
||||
driveType = "fly",
|
||||
driveOptions = {
|
||||
speed = 20,
|
||||
spin = -300
|
||||
},
|
||||
health = 600
|
||||
})
|
||||
|
||||
pk_pills.register("dorf", {
|
||||
printName = "Dorf",
|
||||
side = "harmless",
|
||||
type = "ply",
|
||||
model = "models/Eli.mdl",
|
||||
default_rp_cost = 800,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 40),
|
||||
dist = 60
|
||||
},
|
||||
hull = Vector(20, 20, 50),
|
||||
modelScale = .5,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "lineidle01",
|
||||
walk = "walk_all",
|
||||
run = "run_all_panicked",
|
||||
jump = "jump_holding_jump"
|
||||
}
|
||||
},
|
||||
boneMorphs = {
|
||||
["ValveBiped.Bip01_Pelvis"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine1"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine2"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine4"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Head1"] = {
|
||||
scale = Vector(4, 4, 4)
|
||||
},
|
||||
["ValveBiped.Bip01_L_Clavicle"] = {
|
||||
pos = Vector(0, 0, 10)
|
||||
},
|
||||
["ValveBiped.Bip01_R_Clavicle"] = {
|
||||
pos = Vector(0, 0, -10)
|
||||
}
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 60,
|
||||
run = 150
|
||||
},
|
||||
movePoseMode = "yaw",
|
||||
jumpPower = 200,
|
||||
health = 40
|
||||
})
|
||||
|
||||
pk_pills.register("babyguardian", {
|
||||
printName = "Baby Guardian",
|
||||
parent = "antlion_guard",
|
||||
side = "harmless",
|
||||
type = "ply",
|
||||
default_rp_cost = 15000,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 20),
|
||||
dist = 60
|
||||
},
|
||||
hull = Vector(30, 30, 30),
|
||||
modelScale = .25,
|
||||
moveSpeed = {
|
||||
walk = 90,
|
||||
run = 90
|
||||
},
|
||||
attack = {
|
||||
range = 50,
|
||||
dmg = 25
|
||||
},
|
||||
charge = {
|
||||
vel = 300,
|
||||
dmg = 50
|
||||
},
|
||||
movePoseMode = "yaw",
|
||||
jumpPower = 500,
|
||||
health = 200
|
||||
})
|
||||
|
||||
pk_pills.register("headcrab_jumbo", {
|
||||
printName = "Jumbo Crab",
|
||||
parent = "headcrab_poison",
|
||||
side = "harmless",
|
||||
type = "ply",
|
||||
default_rp_cost = 15000,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 40),
|
||||
dist = 300
|
||||
},
|
||||
hull = Vector(200, 200, 75),
|
||||
modelScale = 5,
|
||||
moveSpeed = {
|
||||
walk = 100,
|
||||
run = 200
|
||||
},
|
||||
sounds = {
|
||||
step = {"npc/antlion_guard/foot_heavy1.wav", "npc/antlion_guard/foot_heavy2.wav", "npc/antlion_guard/foot_light1.wav", "npc/antlion_guard/foot_light2.wav"}
|
||||
},
|
||||
jump = false,
|
||||
glideThink = false,
|
||||
movePoseMode = "yaw",
|
||||
health = 1000
|
||||
})
|
||||
297
lua/autorun/ppp_include/pill_fun3.lua
Normal file
297
lua/autorun/ppp_include/pill_fun3.lua
Normal file
@@ -0,0 +1,297 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("parakeet", {
|
||||
parent = "bird_pigeon",
|
||||
printName = "Parakeet",
|
||||
visColorRandom = true,
|
||||
reload = function(ply, ent)
|
||||
local egg = ents.Create("prop_physics")
|
||||
egg:SetModel("models/props_phx/misc/egg.mdl")
|
||||
local ang = ply:EyeAngles()
|
||||
ang.p = 0
|
||||
egg:SetPos(ply:EyePos() + ang:Forward() * 30)
|
||||
egg:Spawn()
|
||||
local phys = egg:GetPhysicsObject()
|
||||
|
||||
if IsValid(phys) then
|
||||
phys:SetVelocity(ply:GetVelocity() + ply:EyeAngles():Forward() * 800 + (ply:IsOnGround() and Vector(0, 0, 600) or Vector()))
|
||||
end
|
||||
|
||||
egg:Fire("FadeAndRemove", nil, 10)
|
||||
end,
|
||||
sounds = {
|
||||
vocalize = pk_pills.helpers.makeList("ambient/levels/canals/swamp_bird#.wav", 6)
|
||||
}
|
||||
})
|
||||
|
||||
local dragon_attacks = {
|
||||
function(ply, pos)
|
||||
local thing = ents.Create("pill_proj_prop")
|
||||
thing:SetModel(table.Random{"models/props_lab/monitor02.mdl", "models/props_junk/CinderBlock01a.mdl", "models/props_junk/sawblade001a.mdl", "models/props_junk/harpoon002a.mdl", "models/props_junk/watermelon01.mdl", "models/props_c17/FurnitureWashingmachine001a.mdl", "models/props_c17/FurnitureFridge001a.mdl", "models/props_c17/FurnitureBathtub001a.mdl", "models/props_wasteland/prison_toilet01.mdl", "models/props_vehicles/carparts_tire01a.mdl"})
|
||||
thing:SetPos(pos)
|
||||
thing:SetAngles(ply:EyeAngles())
|
||||
thing:Spawn()
|
||||
thing:SetPhysicsAttacker(ply)
|
||||
end,
|
||||
function(ply, pos)
|
||||
local thing = ents.Create("prop_physics")
|
||||
thing:SetModel(table.Random{"models/props_c17/oildrum001_explosive.mdl", "models/props_junk/propane_tank001a.mdl", "models/props_junk/gascan001a.mdl"})
|
||||
thing:SetPos(pos)
|
||||
thing:SetAngles(ply:EyeAngles())
|
||||
thing:Spawn()
|
||||
thing:SetPhysicsAttacker(ply)
|
||||
thing:Ignite(100)
|
||||
local phys = thing:GetPhysicsObject()
|
||||
|
||||
if IsValid(phys) then
|
||||
phys:Wake()
|
||||
phys:EnableGravity(false)
|
||||
phys:EnableDrag(false)
|
||||
phys:SetDamping(0, 0)
|
||||
phys:SetVelocity(ply:EyeAngles():Forward() * 3000)
|
||||
end
|
||||
end,
|
||||
function(ply, pos)
|
||||
local thing = ents.Create("pill_proj_energy_grenade")
|
||||
thing:SetPos(pos)
|
||||
thing:SetAngles(ply:EyeAngles() + Angle(-50 + math.Rand(-10, 10), math.Rand(-10, 10), math.Rand(-10, 10)))
|
||||
thing:Spawn()
|
||||
thing:SetOwner(ply)
|
||||
end,
|
||||
function(ply, pos)
|
||||
local rocket = ents.Create("rpg_missile")
|
||||
rocket:SetPos(pos)
|
||||
rocket:SetAngles(ply:EyeAngles())
|
||||
rocket:SetSaveValue("m_flDamage", 200)
|
||||
rocket:SetOwner(ply)
|
||||
rocket:SetVelocity(ply:EyeAngles():Forward() * 1500)
|
||||
rocket:Spawn()
|
||||
end,
|
||||
function(ply, pos)
|
||||
local bomb = ents.Create("grenade_helicopter")
|
||||
bomb:SetPos(pos)
|
||||
bomb:SetAngles(Angle(math.Rand(-180, 180), math.Rand(-180, 180), math.Rand(-180, 180)))
|
||||
bomb:Spawn()
|
||||
bomb:SetPhysicsAttacker(ply)
|
||||
bomb:GetPhysicsObject():AddVelocity(ply:EyeAngles():Forward() * 3000)
|
||||
end,
|
||||
function(ply, pos)
|
||||
local nade = ents.Create("npc_grenade_frag")
|
||||
nade:SetPos(pos)
|
||||
nade:SetAngles(ply:EyeAngles())
|
||||
nade:Spawn()
|
||||
nade:SetOwner(ply)
|
||||
nade:Fire("SetTimer", 3, 0)
|
||||
nade:GetPhysicsObject():SetVelocity((ply:EyeAngles():Forward() + Vector(0, 0, .2)) * 3000)
|
||||
end,
|
||||
function(ply, pos)
|
||||
local ball = ents.Create("prop_combine_ball")
|
||||
ball:SetPos(pos)
|
||||
ball:SetAngles(ply:EyeAngles())
|
||||
ball:Spawn()
|
||||
ball:SetOwner(ply)
|
||||
ball:SetSaveValue('m_flRadius', 12)
|
||||
ball:SetSaveValue("m_nState", 3)
|
||||
ball:SetSaveValue("m_nMaxBounces", 10)
|
||||
ball:GetPhysicsObject():SetVelocity(ply:EyeAngles():Forward() * 3000)
|
||||
end
|
||||
}
|
||||
|
||||
pk_pills.register("dagent", {
|
||||
printName = "Dragon Agent",
|
||||
side = "wild",
|
||||
type = "ply",
|
||||
default_rp_cost = 20000,
|
||||
visColorRandom = true,
|
||||
model = "models/player/combine_super_soldier.mdl",
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch"
|
||||
},
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle_magic",
|
||||
walk = "walk_magic",
|
||||
run = "run_magic",
|
||||
crouch = "cidle_magic",
|
||||
crouch_walk = "cwalk_magic",
|
||||
glide = "jump_magic",
|
||||
jump = "jump_magic",
|
||||
swim = "swimming_magic"
|
||||
}
|
||||
},
|
||||
attack = {
|
||||
mode = "auto",
|
||||
delay = .2,
|
||||
func = function(ply, ent)
|
||||
ent:PillSound("attack", true)
|
||||
table.Random(dragon_attacks)(ply, ply:GetShootPos() + ply:EyeAngles():Forward() * 100)
|
||||
end
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 60,
|
||||
run = 600,
|
||||
ducked = 60
|
||||
},
|
||||
sounds = {
|
||||
attack = "weapons/gauss/fire1.wav"
|
||||
},
|
||||
jumpPower = 800,
|
||||
movePoseMode = "xy",
|
||||
health = 10000
|
||||
})
|
||||
|
||||
pk_pills.register("dingus", {
|
||||
printName = "Dingus",
|
||||
side = "harmless",
|
||||
type = "ply",
|
||||
default_rp_cost = 1000,
|
||||
visColorRandom = true,
|
||||
model = "models/player/soldier_stripped.mdl",
|
||||
visMat = "models/debug/debugwhite",
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch"
|
||||
},
|
||||
camera = {
|
||||
offset = Vector(0, 0, 50)
|
||||
},
|
||||
hull = Vector(15, 15, 50),
|
||||
duckBy = 10,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle_magic",
|
||||
walk = "walk_magic",
|
||||
run = "run_magic",
|
||||
crouch = "cidle_magic",
|
||||
crouch_walk = "cwalk_magic",
|
||||
glide = "jump_magic",
|
||||
jump = "jump_magic",
|
||||
swim = "swimming_magic"
|
||||
}
|
||||
},
|
||||
attack = {
|
||||
mode = "auto",
|
||||
delay = .2,
|
||||
func = function(ply, ent)
|
||||
ent:PillSound("attack", true)
|
||||
local ball = ents.Create("sent_ball")
|
||||
ball:SetPos(ply:GetShootPos() + ply:EyeAngles():Forward() * 150)
|
||||
ball:SetBallSize(100)
|
||||
ball:Spawn()
|
||||
local color = ent:GetPuppet():GetColor()
|
||||
ball:SetBallColor(Vector(color.r / 255, color.g / 255, color.b / 255))
|
||||
ball:GetPhysicsObject():SetVelocity(ply:EyeAngles():Forward() * 1000)
|
||||
|
||||
timer.Simple(5, function()
|
||||
if IsValid(ball) then
|
||||
ball:Remove()
|
||||
end
|
||||
end)
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "auto",
|
||||
delay = 1,
|
||||
func = function(ply, ent)
|
||||
ent:PillSound("donger")
|
||||
end
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 40,
|
||||
run = 300,
|
||||
ducked = 20
|
||||
},
|
||||
modelScale = .8,
|
||||
sounds = {
|
||||
attack = "weapons/physcannon/energy_bounce1.wav",
|
||||
donger = pk_pills.helpers.makeList("birdbrainswagtrain/dingus#.wav", 9),
|
||||
donger_pitch = 80
|
||||
},
|
||||
jumpPower = 400,
|
||||
movePoseMode = "xy",
|
||||
health = 80
|
||||
})
|
||||
|
||||
pk_pills.register("error", {
|
||||
printName = "ERROR",
|
||||
side = "harmless",
|
||||
type = "ply",
|
||||
model = "models/error.mdl",
|
||||
noragdoll = true,
|
||||
default_rp_cost = 800,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 25),
|
||||
dist = 100
|
||||
},
|
||||
hull = Vector(80, 80, 80),
|
||||
anims = {},
|
||||
moveSpeed = {
|
||||
walk = 200,
|
||||
run = 400
|
||||
},
|
||||
jumpPower = 500,
|
||||
health = 128
|
||||
})
|
||||
--[[
|
||||
pk_pills.register("chicken",{
|
||||
printName="Chicken",
|
||||
side="harmless",
|
||||
type="ply",
|
||||
model="models/chicken/chicken.mdl",
|
||||
options=function() return {
|
||||
{skin=0},
|
||||
{skin=1}
|
||||
} end,
|
||||
noragdoll=true,
|
||||
default_rp_cost=800,
|
||||
camera={
|
||||
offset=Vector(0,0,5),
|
||||
dist=80
|
||||
},
|
||||
hull=Vector(15,15,15),
|
||||
anims={
|
||||
default={
|
||||
idle="idle01",
|
||||
walk="walk01",
|
||||
run="run01",
|
||||
glide="flap_falling"
|
||||
}
|
||||
},
|
||||
moveSpeed={
|
||||
walk=20,
|
||||
run=120
|
||||
},
|
||||
noFallDamage=true,
|
||||
health=30
|
||||
})
|
||||
|
||||
pk_pills.register("turbochicken",{
|
||||
printName="Fubar's Little Helper",
|
||||
parent="chicken",
|
||||
attachments={"models/antlers/antlers.mdl"},
|
||||
default_rp_cost=8000,
|
||||
camera={
|
||||
offset=Vector(0,0,40),
|
||||
dist=300
|
||||
},
|
||||
hull=Vector(90,90,90),
|
||||
modelScale=6,
|
||||
moveSpeed={
|
||||
walk=120,
|
||||
run=800
|
||||
},
|
||||
jumpPower=800,
|
||||
health=300
|
||||
})
|
||||
]]
|
||||
206
lua/autorun/ppp_include/pill_headcrabs.lua
Normal file
206
lua/autorun/ppp_include/pill_headcrabs.lua
Normal file
@@ -0,0 +1,206 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
local combineMdls = {"models/combine_soldier.mdl", "models/combine_soldier_prisonguard.mdl", "models/combine_super_soldier.mdl", "models/police.mdl", "models/zombie/zombie_soldier.mdl", "models/player/combine_soldier.mdl", "models/player/combine_soldier_prisonguard.mdl", "models/player/combine_super_soldier.mdl", "models/player/police.mdl", "models/player/police_fem.mdl", "models/player/zombie_soldier.mdl"}
|
||||
|
||||
pk_pills.register("headcrab", {
|
||||
printName = "Headcrab",
|
||||
side = "hl_zombie",
|
||||
zombie = "zombie",
|
||||
type = "ply",
|
||||
model = "models/headcrabclassic.mdl",
|
||||
default_rp_cost = 6000,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 5),
|
||||
dist = 75
|
||||
},
|
||||
hull = Vector(20, 20, 10),
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle01",
|
||||
walk = "run1",
|
||||
jump = "jumpattack_broadcast",
|
||||
swim = "drown",
|
||||
burrow_in = "burrowin",
|
||||
burrow_loop = "burrowidle",
|
||||
burrow_out = "burrowout"
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
jump = pk_pills.helpers.makeList("npc/headcrab/attack#.wav", 3),
|
||||
bite = "npc/headcrab/headbite.wav",
|
||||
burrow_in = "npc/antlion/digdown1.wav",
|
||||
burrow_out = "npc/antlion/digup1.wav",
|
||||
step = pk_pills.helpers.makeList("npc/headcrab_poison/ph_step#.wav", 4)
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 30,
|
||||
run = 60
|
||||
},
|
||||
jumpPower = 300,
|
||||
jump = function(ply, ent)
|
||||
v = ply:EyeAngles():Forward()
|
||||
v.z = 0
|
||||
v:Normalize()
|
||||
ply:SetVelocity(v * 200)
|
||||
ent:PillSound("jump")
|
||||
ent.canBite = true
|
||||
end,
|
||||
glideThink = function(ply, ent)
|
||||
if ent.canBite then
|
||||
local aim = ply:GetAimVector()
|
||||
aim.z = 0
|
||||
aim:Normalize()
|
||||
local tracedata = {}
|
||||
tracedata.start = ply:EyePos()
|
||||
tracedata.endpos = ply:EyePos() + aim * 5 + Vector(0, 0, -5)
|
||||
tracedata.filter = ply
|
||||
tracedata.mins = Vector(-8, -8, -8)
|
||||
tracedata.maxs = Vector(8, 8, 8)
|
||||
local trace = util.TraceHull(tracedata)
|
||||
|
||||
if IsValid(trace.Entity) then
|
||||
local crabbed = trace.Entity
|
||||
|
||||
if crabbed:IsNPC() or crabbed:IsPlayer() then
|
||||
ent:PillSound("bite")
|
||||
end
|
||||
|
||||
if crabbed:Health() <= ent.formTable.biteDmg and not crabbed:IsFlagSet(FL_GODMODE) then
|
||||
local crabbed_actual
|
||||
|
||||
if pk_pills.getMappedEnt(crabbed) then
|
||||
crabbed_actual = pk_pills.getMappedEnt(crabbed)
|
||||
else
|
||||
crabbed_actual = crabbed
|
||||
end
|
||||
|
||||
if crabbed_actual:LookupBone("ValveBiped.Bip01_Head1") and crabbed_actual:LookupBone("ValveBiped.Bip01_L_Foot") and crabbed_actual:LookupBone("ValveBiped.Bip01_R_Foot") then
|
||||
local mdl
|
||||
|
||||
if pk_pills.getMappedEnt(crabbed) then
|
||||
local crabbedpill = pk_pills.getMappedEnt(crabbed)
|
||||
|
||||
if crabbedpill.subModel then
|
||||
mdl = crabbedpill.subModel --doesnt work
|
||||
else
|
||||
mdl = crabbedpill:GetPuppet():GetModel()
|
||||
end
|
||||
else
|
||||
mdl = crabbed:GetModel()
|
||||
end
|
||||
|
||||
local t = ent.formTable.zombie
|
||||
|
||||
if t == "zombie" and pk_pills.hasPack("ep1") and table.HasValue(combineMdls, mdl) then
|
||||
t = "ep1_zombine"
|
||||
end
|
||||
|
||||
local newPill = pk_pills.apply(ply, t)
|
||||
local dbl = ents.Create("pill_attachment_zed")
|
||||
dbl:SetParent(newPill:GetPuppet())
|
||||
dbl:SetModel(mdl)
|
||||
dbl:Spawn()
|
||||
newPill.subModel = mdl
|
||||
|
||||
if crabbed:IsNPC() or crabbed:IsPlayer() then
|
||||
ply:SetPos(crabbed:GetPos())
|
||||
ply:SetEyeAngles(crabbed:EyeAngles())
|
||||
else
|
||||
ent:PillSound("bite")
|
||||
end
|
||||
|
||||
if crabbed:IsPlayer() then
|
||||
crabbed:KillSilent()
|
||||
else
|
||||
crabbed:Remove()
|
||||
end
|
||||
else
|
||||
crabbed:TakeDamage(10000, ply, ply)
|
||||
end
|
||||
else
|
||||
crabbed:TakeDamage(ent.formTable.biteDmg, ply, ply)
|
||||
end
|
||||
|
||||
ent.canBite = nil
|
||||
end
|
||||
end
|
||||
end,
|
||||
land = function(ply, ent)
|
||||
ent.canBite = nil
|
||||
end,
|
||||
biteDmg = 60,
|
||||
canBurrow = true,
|
||||
health = 40
|
||||
})
|
||||
|
||||
pk_pills.register("headcrab_fast", {
|
||||
parent = "headcrab",
|
||||
printName = "Fast Headcrab",
|
||||
zombie = "zombie_fast",
|
||||
type = "ply",
|
||||
model = "models/headcrab.mdl",
|
||||
default_rp_cost = 8000,
|
||||
anims = {
|
||||
default = {
|
||||
jump = "attack"
|
||||
}
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 100,
|
||||
run = 200
|
||||
},
|
||||
canBurrow = false
|
||||
})
|
||||
|
||||
pk_pills.register("headcrab_poison", {
|
||||
parent = "headcrab",
|
||||
printName = "Poison Headcrab",
|
||||
zombie = "zombie_poison",
|
||||
type = "ply",
|
||||
model = "models/headcrabblack.mdl",
|
||||
default_rp_cost = 7000,
|
||||
anims = {
|
||||
default = {
|
||||
jump = false,
|
||||
poison_jump = "tele_attack_a",
|
||||
run = "scurry"
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
rattle = pk_pills.helpers.makeList("npc/headcrab_poison/ph_rattle#.wav", 3),
|
||||
jump = pk_pills.helpers.makeList("npc/headcrab_poison/ph_jump#.wav", 3),
|
||||
bite = pk_pills.helpers.makeList("npc/headcrab_poison/ph_poisonbite#.wav", 3)
|
||||
},
|
||||
moveSpeed = {
|
||||
run = 100
|
||||
},
|
||||
jumpPower = 0,
|
||||
jump = function(ply, ent)
|
||||
if ent.poison_jump_blocked then return end
|
||||
v = ply:EyeAngles():Forward()
|
||||
v.z = 0
|
||||
v:Normalize()
|
||||
ent:PillSound("rattle")
|
||||
ent:PillAnim("poison_jump")
|
||||
ent.poison_jump_blocked = true
|
||||
|
||||
timer.Simple(1.6, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent.poison_jump_blocked = false
|
||||
ent:PillSound("jump")
|
||||
ply:SetVelocity(v * 200 + Vector(0, 0, 300))
|
||||
ent.canBite = true
|
||||
end)
|
||||
end,
|
||||
biteDmg = 100,
|
||||
canBurrow = false
|
||||
})
|
||||
539
lua/autorun/ppp_include/pill_jake.lua
Normal file
539
lua/autorun/ppp_include/pill_jake.lua
Normal file
@@ -0,0 +1,539 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
local function all_humans()
|
||||
--{model="models/Combine_Super_Soldier.mdl"},
|
||||
--{model="models/Combine_Soldier_PrisonGuard.mdl"},
|
||||
--{model="models/Combine_Soldier.mdl"},
|
||||
--{model="models/Police.mdl"}
|
||||
return {
|
||||
{
|
||||
model = "models/Humans/Group01/male_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_05.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_07.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_08.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_09.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_05.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_07.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_08.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_09.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_05.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_07.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_08.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_09.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_05.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_07.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_08.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_09.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/female_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/female_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/female_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/female_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/female_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/female_07.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/female_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/female_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/female_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/female_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/female_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/female_07.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/female_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/female_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/female_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/female_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/female_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/female_07.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/female_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/female_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/female_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/female_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/female_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/female_07.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/barney.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/monk.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/gman_high.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/alyx.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Kleiner.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Eli.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/mossman.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/odessa.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/breen.mdl"
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
pk_pills.register("jake_e", {
|
||||
printName = "WE LOVE JAKE",
|
||||
model = false,
|
||||
options = all_humans,
|
||||
parent = "zombie_fast",
|
||||
anims = {
|
||||
default = {
|
||||
idle = "fear_reaction_idle",
|
||||
run = "run_protected_all",
|
||||
jump = "cower",
|
||||
glide = "cower_idle",
|
||||
jump_attack = "cower",
|
||||
glide_attack = "cower_idle",
|
||||
attack = "walkaimall1",
|
||||
climb = "lineidle02",
|
||||
climb_start = "jump_holding_jump",
|
||||
release = "swing"
|
||||
}
|
||||
},
|
||||
boneMorphs = {
|
||||
["ValveBiped.Bip01_Spine"] = {
|
||||
rot = Angle(90, 0, 0)
|
||||
},
|
||||
["ValveBiped.Bip01_Head1"] = {
|
||||
scale = Vector(2, 2, 2),
|
||||
rot = Angle(90, 0, 0)
|
||||
}
|
||||
},
|
||||
crab = "melon"
|
||||
})
|
||||
|
||||
pk_pills.register("jake_k", {
|
||||
printName = "JAKE IS THE BEST",
|
||||
model = false,
|
||||
options = all_humans,
|
||||
parent = "antlion",
|
||||
modelScale = 1,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "sit_ground",
|
||||
walk = "walk_all",
|
||||
run = "run_protected_all",
|
||||
fly = "run_protected_all",
|
||||
jump = "run_protected_all",
|
||||
glide = "run_protected_all",
|
||||
melee1 = "meleeattack01",
|
||||
melee2 = "meleeattack01",
|
||||
melee3 = "meleeattack01",
|
||||
charge_start = "jump_holding_land",
|
||||
charge_loop = "crouchrunall1",
|
||||
charge_hit = "kick_door",
|
||||
burrow_in = "idle_to_sit_ground",
|
||||
burrow_out = "sit_ground_to_idle",
|
||||
burrow_loop = "injured1"
|
||||
}
|
||||
},
|
||||
boneMorphs = {
|
||||
["ValveBiped.Bip01_Pelvis"] = {
|
||||
scale = Vector(2, 2, 2),
|
||||
rot = Angle(0, 0, 20),
|
||||
pos = Vector(0, 0, 0)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine"] = {
|
||||
scale = Vector(2, 2, 1)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine1"] = {
|
||||
scale = Vector(2, 2, 1)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine2"] = {
|
||||
scale = Vector(2, 2, 1)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine4"] = {
|
||||
scale = Vector(2, 2, 1)
|
||||
},
|
||||
["ValveBiped.Bip01_Head1"] = {
|
||||
scale = Vector(4, 4, 1),
|
||||
rot = Angle(0, 20, 0)
|
||||
},
|
||||
["ValveBiped.Bip01_L_Clavicle"] = {
|
||||
pos = Vector(0, 0, 10)
|
||||
},
|
||||
["ValveBiped.Bip01_R_Clavicle"] = {
|
||||
pos = Vector(0, 0, -10)
|
||||
}
|
||||
},
|
||||
--["ValveBiped.Bip01_R_Forearm"]={pos=Vector(-100,0,-100),scale=Vector(1,100,1)},
|
||||
--["ValveBiped.Bip01_L_Forearm"]={pos=Vector(-100,0,100),scale=Vector(1,100,1)},
|
||||
--["ValveBiped.Bip01_R_Foot"]={pos=Vector(20,0,0)},
|
||||
--["ValveBiped.Bip01_L_Foot"]={pos=Vector(20,0,0)},
|
||||
--[[moveSpeed={
|
||||
walk=100,
|
||||
run=400
|
||||
},]]
|
||||
movePoseMode = "yaw"
|
||||
})
|
||||
|
||||
--jumpPower=400,
|
||||
--health=40,
|
||||
--muteSteps=true
|
||||
pk_pills.register("jake_a", {
|
||||
printName = "JAKE IS A COOL GUY",
|
||||
side = "harmless",
|
||||
type = "ply",
|
||||
model = false,
|
||||
options = all_humans,
|
||||
camera = {
|
||||
--offset=Vector(0,0,40),
|
||||
dist = 300
|
||||
},
|
||||
hull = Vector(200, 200, 100),
|
||||
modelScale = 2,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "lineidle01",
|
||||
walk = "walk_all",
|
||||
run = "run_protected_all",
|
||||
jump = "jump_holding_jump"
|
||||
}
|
||||
},
|
||||
boneMorphs = {
|
||||
["ValveBiped.Bip01_Pelvis"] = {
|
||||
scale = Vector(2, 2, 2),
|
||||
rot = Angle(0, 0, 90),
|
||||
pos = Vector(0, 0, 0)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine1"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine2"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine4"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Head1"] = {
|
||||
scale = Vector(4, 4, 4),
|
||||
rot = Angle(0, 90, 0)
|
||||
},
|
||||
["ValveBiped.Bip01_L_Clavicle"] = {
|
||||
pos = Vector(0, 0, 10)
|
||||
},
|
||||
["ValveBiped.Bip01_R_Clavicle"] = {
|
||||
pos = Vector(0, 0, -10)
|
||||
},
|
||||
["ValveBiped.Bip01_R_Forearm"] = {
|
||||
pos = Vector(50, 0, 0)
|
||||
},
|
||||
["ValveBiped.Bip01_L_Forearm"] = {
|
||||
pos = Vector(50, 0, 0)
|
||||
},
|
||||
["ValveBiped.Bip01_R_Foot"] = {
|
||||
pos = Vector(20, 0, 0)
|
||||
},
|
||||
["ValveBiped.Bip01_L_Foot"] = {
|
||||
pos = Vector(20, 0, 0)
|
||||
}
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 100,
|
||||
run = 400
|
||||
},
|
||||
movePoseMode = "yaw",
|
||||
jumpPower = 400,
|
||||
health = 40,
|
||||
muteSteps = true
|
||||
})
|
||||
|
||||
pk_pills.register("jake_j", {
|
||||
printName = "GIVE US JAKE",
|
||||
model = false,
|
||||
options = all_humans,
|
||||
parent = "bird_pigeon",
|
||||
modelScale = .2,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "sit_ground",
|
||||
walk = "walk_all",
|
||||
run = "run_protected_all",
|
||||
fly = "run_protected_all",
|
||||
jump = "run_protected_all",
|
||||
glide = "run_protected_all",
|
||||
eat = "preskewer"
|
||||
}
|
||||
},
|
||||
boneMorphs = {
|
||||
["ValveBiped.Bip01_Pelvis"] = {
|
||||
scale = Vector(2, 2, 2),
|
||||
rot = Angle(0, 0, 20),
|
||||
pos = Vector(0, 0, 0)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine1"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine2"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Spine4"] = {
|
||||
scale = Vector(2, 2, 2)
|
||||
},
|
||||
["ValveBiped.Bip01_Head1"] = {
|
||||
scale = Vector(4, 4, 4),
|
||||
rot = Angle(0, 20, 0)
|
||||
},
|
||||
["ValveBiped.Bip01_L_Clavicle"] = {
|
||||
pos = Vector(0, 0, 10)
|
||||
},
|
||||
["ValveBiped.Bip01_R_Clavicle"] = {
|
||||
pos = Vector(0, 0, -10)
|
||||
},
|
||||
["ValveBiped.Bip01_R_Forearm"] = {
|
||||
pos = Vector(-100, 0, -100),
|
||||
scale = Vector(1, 100, 1)
|
||||
},
|
||||
["ValveBiped.Bip01_L_Forearm"] = {
|
||||
pos = Vector(-100, 0, 100),
|
||||
scale = Vector(1, 100, 1)
|
||||
}
|
||||
},
|
||||
--["ValveBiped.Bip01_R_Foot"]={pos=Vector(20,0,0)},
|
||||
--["ValveBiped.Bip01_L_Foot"]={pos=Vector(20,0,0)},
|
||||
--[[moveSpeed={
|
||||
walk=100,
|
||||
run=400
|
||||
},]]
|
||||
movePoseMode = "yaw"
|
||||
})
|
||||
|
||||
--jumpPower=400,
|
||||
--health=40,
|
||||
--muteSteps=true
|
||||
pk_pills.register("jake_2", {
|
||||
printName = "~ALL HAIL JAKE~",
|
||||
parent = "hero_overseer",
|
||||
model = false,
|
||||
options = all_humans,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "fear_reaction_idle"
|
||||
}
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if not ply:OnGround() then return end
|
||||
ent:PillSound("clang")
|
||||
local puppet = ent:GetPuppet()
|
||||
|
||||
for i = 1, puppet:GetBoneCount() do
|
||||
puppet:ManipulateBonePosition(i, puppet:GetManipulateBonePosition(i) + VectorRand() * 2)
|
||||
end
|
||||
end
|
||||
},
|
||||
sounds = {
|
||||
clang = "weapons/crowbar/crowbar_impact1.wav"
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("jake_car", {
|
||||
printName = "~JAKE'S CAR~",
|
||||
parent = "wheelbarrow",
|
||||
model = false,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/props_vehicles/car002a_physics.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_vehicles/car001b_hatchback.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_vehicles/car001a_hatchback.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_vehicles/car002b_physics.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_vehicles/car003a_physics.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_vehicles/car003b_physics.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_vehicles/car004a_physics.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_vehicles/car004b_physics.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_vehicles/car005a_physics.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_vehicles/car005b_physics.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/props_vehicles/van001a_physics.mdl"
|
||||
}
|
||||
}
|
||||
end,
|
||||
driveOptions = {
|
||||
speed = 5000
|
||||
},
|
||||
camera = {
|
||||
dist = 500
|
||||
}
|
||||
})
|
||||
353
lua/autorun/ppp_include/pill_resistance.lua
Normal file
353
lua/autorun/ppp_include/pill_resistance.lua
Normal file
@@ -0,0 +1,353 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("citizen_m", {
|
||||
printName = "Male Citizen",
|
||||
type = "ply",
|
||||
voxSet = "citm",
|
||||
default_rp_cost = 600,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/Humans/Group01/male_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_05.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_07.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_08.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/male_09.mdl"
|
||||
}
|
||||
}
|
||||
end,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle_angry",
|
||||
walk = "walk_all",
|
||||
run = "run_all",
|
||||
crouch = "Crouch_idleD",
|
||||
crouch_walk = "Crouch_walk_aLL",
|
||||
glide = "jump_holding_glide",
|
||||
jump = "jump_holding_jump",
|
||||
g_attack = "gesture_shoot_smg1",
|
||||
g_reload = "gesture_reload_smg1",
|
||||
dropItem = "Heal"
|
||||
},
|
||||
smg = {
|
||||
idle = "Idle_SMG1_Aim_Alert",
|
||||
walk = "walkAIMALL1",
|
||||
run = "run_aiming_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all"
|
||||
},
|
||||
ar2 = {
|
||||
idle = "idle_angry_Ar2",
|
||||
walk = "walkAIMALL1_ar2",
|
||||
run = "run_aiming_ar2_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all",
|
||||
g_attack = "gesture_shoot_ar2",
|
||||
g_reload = "gesture_reload_ar2"
|
||||
},
|
||||
shotgun = {
|
||||
idle = "Idle_Angry_Shotgun",
|
||||
walk = "walkAIMALL1_ar2",
|
||||
run = "run_aiming_ar2_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all",
|
||||
g_attack = "gesture_shoot_shotgun",
|
||||
g_reload = "gesture_reload_ar2"
|
||||
}
|
||||
},
|
||||
flashlight = function(ply, ent)
|
||||
if ply:IsOnGround() and ent.formTable.drops then
|
||||
ent:PillAnim("dropItem", true)
|
||||
|
||||
timer.Simple(1.25, function()
|
||||
if not IsValid(ent) then return end
|
||||
local ang = ply:EyeAngles()
|
||||
ang.p = 0
|
||||
local item = ents.Create(table.Random(ent.formTable.drops))
|
||||
item:SetPos(ply:EyePos() + ang:Forward() * 70)
|
||||
item:Spawn()
|
||||
end)
|
||||
end
|
||||
end,
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch"
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 60,
|
||||
run = 200,
|
||||
ducked = 40
|
||||
},
|
||||
loadout = {"pill_wep_holstered"},
|
||||
health = 100,
|
||||
validHoldTypes = {"smg", "ar2", "shotgun"},
|
||||
movePoseMode = "yaw"
|
||||
})
|
||||
|
||||
pk_pills.register("refugee_m", {
|
||||
parent = "citizen_m",
|
||||
printName = "Male Refugee",
|
||||
default_rp_cost = 4000,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/Humans/Group02/male_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_05.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_07.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_08.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/male_09.mdl"
|
||||
}
|
||||
}
|
||||
end,
|
||||
loadout = {nil, "weapon_smg1"},
|
||||
ammo = {
|
||||
smg1 = 50
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("rebel_m", {
|
||||
parent = "citizen_m",
|
||||
printName = "Male Rebel",
|
||||
drops = {"item_ammo_pistol", "item_ammo_smg1", "item_ammo_ar2", "item_box_buckshot"},
|
||||
default_rp_cost = 5000,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/Humans/Group03/male_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_05.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_07.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_08.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/male_09.mdl"
|
||||
}
|
||||
}
|
||||
end,
|
||||
loadout = {nil, "weapon_ar2", "weapon_shotgun"},
|
||||
ammo = {
|
||||
AR2 = 50,
|
||||
Buckshot = 50
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("medic_m", {
|
||||
parent = "citizen_m",
|
||||
printName = "Male Medic",
|
||||
drops = {"item_healthkit"},
|
||||
default_rp_cost = 6000,
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/Humans/Group03m/male_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_05.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_07.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_08.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/male_09.mdl"
|
||||
}
|
||||
}
|
||||
end,
|
||||
loadout = {nil, "weapon_smg1"},
|
||||
ammo = {
|
||||
smg1 = 50
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("citizen_f", {
|
||||
parent = "citizen_m",
|
||||
printName = "Female Citizen",
|
||||
voxSet = "citf",
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/Humans/Group01/female_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/female_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/female_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/female_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/female_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group01/female_07.mdl"
|
||||
}
|
||||
}
|
||||
end
|
||||
})
|
||||
|
||||
pk_pills.register("refugee_f", {
|
||||
parent = "refugee_m",
|
||||
printName = "Female Refugee",
|
||||
voxSet = "citf",
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/Humans/Group02/female_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/female_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/female_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/female_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/female_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group02/female_07.mdl"
|
||||
}
|
||||
}
|
||||
end
|
||||
})
|
||||
|
||||
pk_pills.register("rebel_f", {
|
||||
parent = "rebel_m",
|
||||
printName = "Female Rebel",
|
||||
voxSet = "citf",
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/Humans/Group03/female_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/female_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/female_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/female_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/female_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03/female_07.mdl"
|
||||
}
|
||||
}
|
||||
end
|
||||
})
|
||||
|
||||
pk_pills.register("medic_f", {
|
||||
parent = "medic_m",
|
||||
printName = "Female Medic",
|
||||
voxSet = "citf",
|
||||
options = function()
|
||||
return {
|
||||
{
|
||||
model = "models/Humans/Group03m/female_01.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/female_02.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/female_03.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/female_04.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/female_06.mdl"
|
||||
},
|
||||
{
|
||||
model = "models/Humans/Group03m/female_07.mdl"
|
||||
}
|
||||
}
|
||||
end
|
||||
})
|
||||
493
lua/autorun/ppp_include/pill_resistance_heros.lua
Normal file
493
lua/autorun/ppp_include/pill_resistance_heros.lua
Normal file
@@ -0,0 +1,493 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("dog", {
|
||||
printName = "Dog",
|
||||
type = "ply",
|
||||
model = "models/dog.mdl",
|
||||
default_rp_cost = 10000,
|
||||
camera = {
|
||||
dist = 300
|
||||
},
|
||||
hull = Vector(120, 120, 100),
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle01",
|
||||
walk = "walk_all",
|
||||
run = "run_all",
|
||||
melee = "throw"
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
melee = "npc/dog/dog_servo6.wav",
|
||||
melee_hit = pk_pills.helpers.makeList("physics/metal/metal_box_impact_hard#.wav", 3),
|
||||
step = pk_pills.helpers.makeList("npc/dog/dog_footstep#.wav", 4)
|
||||
},
|
||||
aim = {
|
||||
xPose = "head_yaw",
|
||||
yPose = "head_pitch"
|
||||
},
|
||||
reload = function(ply, ent)
|
||||
pk_pills.common.melee(ply, ent, {
|
||||
delay = .5,
|
||||
range = 150,
|
||||
dmg = 50
|
||||
})
|
||||
end,
|
||||
movePoseMode = "yaw",
|
||||
moveSpeed = {
|
||||
walk = 150,
|
||||
run = 500
|
||||
},
|
||||
jumpPower = 0,
|
||||
loadout = {"weapon_physcannon"},
|
||||
hideWeapons = true,
|
||||
health = 1200
|
||||
})
|
||||
|
||||
pk_pills.register("hero_infiltrator", {
|
||||
printName = "The Infiltrator",
|
||||
type = "ply",
|
||||
model = "models/barney.mdl",
|
||||
default_rp_cost = 10000,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle_angry",
|
||||
walk = "walk_all",
|
||||
run = "run_all",
|
||||
crouch = "Crouch_idleD",
|
||||
crouch_walk = "Crouch_walk_aLL",
|
||||
glide = "jump_holding_glide",
|
||||
jump = "jump_holding_jump",
|
||||
g_attack = "gesture_shoot_smg1",
|
||||
g_reload = "gesture_reload_smg1",
|
||||
change = "helmet_reveal"
|
||||
},
|
||||
smg = {
|
||||
idle = "Idle_SMG1_Aim_Alert",
|
||||
walk = "walkAIMALL1",
|
||||
run = "run_aiming_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all"
|
||||
},
|
||||
ar2 = {
|
||||
idle = "idle_angry_Ar2",
|
||||
walk = "walkAIMALL1_ar2",
|
||||
run = "run_aiming_ar2_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all",
|
||||
--g_attack="gesture_shoot_ar2",
|
||||
g_reload = "gesture_reload_ar2"
|
||||
},
|
||||
shotgun = {
|
||||
idle = "Idle_Angry_Shotgun",
|
||||
walk = "walkAIMALL1_ar2",
|
||||
run = "run_aiming_ar2_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all",
|
||||
g_attack = "gesture_shoot_shotgun",
|
||||
g_reload = "gesture_reload_ar2"
|
||||
}
|
||||
},
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch"
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 60,
|
||||
run = 200,
|
||||
ducked = 40
|
||||
},
|
||||
loadout = {"pill_wep_holstered", "weapon_ar2", "weapon_shotgun", "weapon_smg1"},
|
||||
ammo = {
|
||||
AR2 = 100,
|
||||
Buckshot = 100,
|
||||
smg1 = 100
|
||||
},
|
||||
health = 1000,
|
||||
validHoldTypes = {"smg", "ar2", "shotgun"},
|
||||
movePoseMode = "yaw",
|
||||
flashlight = function(ply, ent)
|
||||
if not ply:IsOnGround() then return end
|
||||
ent:PillAnim("change", true)
|
||||
|
||||
if ent.disguised then
|
||||
ent.disguised = nil
|
||||
|
||||
timer.Simple(1, function()
|
||||
if IsValid(ent.disguise_faceplate) then
|
||||
ent.disguise_faceplate:Fire("setparentattachment", "faceplate_attachment", 0)
|
||||
end
|
||||
|
||||
if IsValid(ent) then
|
||||
pk_pills.setAiTeam(ply, "default")
|
||||
end
|
||||
end)
|
||||
|
||||
timer.Simple(2, function()
|
||||
if IsValid(ent.disguise_faceplate) then
|
||||
ent.disguise_faceplate:Remove()
|
||||
end
|
||||
|
||||
if IsValid(ent.disguise_helmet) then
|
||||
ent.disguise_helmet:Remove()
|
||||
end
|
||||
end)
|
||||
else --helmet_attachment faceplate_attachment
|
||||
ent.disguised = true
|
||||
ent.disguise_faceplate = ents.Create("prop_dynamic")
|
||||
ent.disguise_faceplate:SetModel("models/barneyhelmet_faceplate.mdl")
|
||||
ent.disguise_faceplate:SetPos(ply:GetPos())
|
||||
ent.disguise_faceplate:SetParent(ent:GetPuppet())
|
||||
ent.disguise_faceplate:Spawn()
|
||||
ent.disguise_faceplate:Fire("setparentattachment", "faceplate_attachment", 0)
|
||||
ent.disguise_helmet = ents.Create("prop_dynamic")
|
||||
ent.disguise_helmet:SetModel("models/barneyhelmet.mdl")
|
||||
ent.disguise_helmet:SetPos(ply:GetPos())
|
||||
ent.disguise_helmet:SetParent(ent:GetPuppet())
|
||||
ent.disguise_helmet:Spawn()
|
||||
ent.disguise_helmet:Fire("setparentattachment", "helmet_attachment", 0)
|
||||
|
||||
timer.Simple(1, function()
|
||||
if IsValid(ent.disguise_faceplate) then
|
||||
ent.disguise_faceplate:Fire("setparentattachment", "helmet_attachment", 0)
|
||||
end
|
||||
|
||||
if IsValid(ent) then
|
||||
pk_pills.setAiTeam(ply, "hl_infiltrator")
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
pk_pills.register("hero_monk", {
|
||||
printName = "The Monk",
|
||||
type = "ply",
|
||||
model = "models/monk.mdl",
|
||||
default_rp_cost = 10000,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "lineidle02",
|
||||
walk = "walk_all",
|
||||
run = "run_all",
|
||||
crouch = "Crouch_idleD",
|
||||
crouch_walk = "Crouch_walk_aLL",
|
||||
glide = "jump_holding_glide",
|
||||
jump = "jump_holding_jump",
|
||||
g_attack = "gesture_shoot_smg1",
|
||||
g_reload = "gesture_reload_smg1"
|
||||
},
|
||||
smg = {
|
||||
idle = "Idle_SMG1_Aim_Alert",
|
||||
walk = "walkAIMALL1",
|
||||
run = "run_alert_aiming_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all"
|
||||
},
|
||||
ar2 = {
|
||||
idle = "idle_angry_Ar2",
|
||||
walk = "walkAIMALL1_ar2",
|
||||
run = "run_aiming_ar2_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all",
|
||||
g_attack = "gesture_shoot_ar2",
|
||||
g_reload = "gesture_reload_ar2"
|
||||
},
|
||||
shotgun = {
|
||||
idle = "Idle_Angry_Shotgun",
|
||||
walk = "walkAIMALL1_ar2",
|
||||
run = "run_aiming_ar2_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all",
|
||||
g_attack = "gesture_shoot_shotgun",
|
||||
g_reload = "gesture_reload_ar2"
|
||||
},
|
||||
crossbow = {
|
||||
idle = "Idle_SMG1_Aim_Alert",
|
||||
walk = "walkAIMALL1_ar2",
|
||||
run = "run_aiming_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all",
|
||||
g_attack = "gesture_shoot_ar2",
|
||||
g_reload = "gesture_reload_ar2"
|
||||
}
|
||||
},
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch"
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 60,
|
||||
run = 200,
|
||||
ducked = 40
|
||||
},
|
||||
loadout = {"pill_wep_holstered", "weapon_shotgun", "pill_wep_annabelle"},
|
||||
ammo = {
|
||||
Buckshot = 100,
|
||||
["357"] = 100
|
||||
},
|
||||
health = 1000,
|
||||
validHoldTypes = {"smg", "ar2", "shotgun", "crossbow"},
|
||||
movePoseMode = "yaw"
|
||||
})
|
||||
|
||||
pk_pills.register("hero_overseer", {
|
||||
printName = "The Overseer",
|
||||
type = "ply",
|
||||
model = "models/gman_high.mdl",
|
||||
default_rp_cost = 20000,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle",
|
||||
walk = "walk_all",
|
||||
run = "sprint_all", --pace_all
|
||||
crouch = "Crouch_idleD",
|
||||
crouch_walk = "Crouch_walk_aLL",
|
||||
glide = "jump_holding_glide",
|
||||
jump = "jump_holding_jump",
|
||||
melee = "swing",
|
||||
cloak = "open_door_away",
|
||||
teleport = "tiefidget"
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
--melee=pk_pills.helpers.makeList("npc/zombie/zo_attack#.wav",2),
|
||||
melee_hit = pk_pills.helpers.makeList("npc/zombie/claw_strike#.wav", 3),
|
||||
melee_miss = pk_pills.helpers.makeList("npc/zombie/claw_miss#.wav", 2),
|
||||
cloak = "buttons/combine_button1.wav",
|
||||
uncloak = "buttons/combine_button1.wav",
|
||||
teleport = "ambient/machines/teleport4.wav"
|
||||
},
|
||||
cloak = {
|
||||
max = -1
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 100,
|
||||
run = 1000,
|
||||
ducked = 40
|
||||
},
|
||||
jumpPower = 1000,
|
||||
movePoseMode = "yaw",
|
||||
health = 10000,
|
||||
noFallDamage = true,
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(a, b, c)
|
||||
if not b.iscloaked then
|
||||
pk_pills.common.melee(a, b, c)
|
||||
end
|
||||
end,
|
||||
delay = .3,
|
||||
range = 40,
|
||||
dmg = 1000
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if not ply:OnGround() then return end
|
||||
ent:PillAnim("cloak", true)
|
||||
|
||||
timer.Simple(1, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:ToggleCloak()
|
||||
end)
|
||||
end
|
||||
},
|
||||
--[[
|
||||
if ent.cloaked then
|
||||
ent.cloaked=nil
|
||||
|
||||
timer.Simple(1,function()
|
||||
if !IsValid(ent) then return end
|
||||
ent:PillSound("cloak")
|
||||
ent:GetPuppet():SetMaterial()
|
||||
ent:GetPuppet():DrawShadow(true)
|
||||
pk_pills.setAiTeam(ply,"default")
|
||||
end)
|
||||
else
|
||||
ent.cloaked=true
|
||||
|
||||
timer.Simple(1,function()
|
||||
if !IsValid(ent) or !IsValid(ent:GetPuppet()) then return end
|
||||
ent:PillSound("cloak")
|
||||
ent:GetPuppet():SetMaterial("Models/effects/vol_light001")
|
||||
ent:GetPuppet():DrawShadow(false)
|
||||
pk_pills.setAiTeam(ply,"harmless")
|
||||
end)
|
||||
end]]
|
||||
reload = function(ply, ent)
|
||||
if not ply:OnGround() then return end
|
||||
ent:PillAnim("teleport", true)
|
||||
|
||||
timer.Simple(1, function()
|
||||
if not IsValid(ent) then return end
|
||||
local tracein = {}
|
||||
tracein.maxs = Vector(16, 16, 72)
|
||||
tracein.mins = Vector(-16, -16, 0)
|
||||
tracein.start = ply:EyePos()
|
||||
tracein.endpos = ply:EyePos() + ply:EyeAngles():Forward() * 9999
|
||||
tracein.filter = {ply, ent, ent:GetPuppet()}
|
||||
local traceout = util.TraceHull(tracein)
|
||||
ply:SetPos(traceout.HitPos)
|
||||
ent:PillSound("teleport")
|
||||
end)
|
||||
end
|
||||
})
|
||||
|
||||
pk_pills.register("hero_hacker", {
|
||||
printName = "The Hacker",
|
||||
type = "ply",
|
||||
model = "models/alyx.mdl",
|
||||
default_rp_cost = 10000,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle_angry",
|
||||
walk = "walk_all",
|
||||
run = "run_all",
|
||||
crouch = "Crouch_idleD",
|
||||
crouch_walk = "Crouch_walk_aLL",
|
||||
glide = "jump_holding_glide",
|
||||
jump = "jump_holding_jump",
|
||||
g_attack = "gesture_shoot_smg1",
|
||||
g_reload = "gesture_reload_smg1"
|
||||
},
|
||||
smg = {
|
||||
idle = "Idle_SMG1_Aim_Alert",
|
||||
walk = "walkAIMALL1",
|
||||
run = "run_aiming_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all"
|
||||
},
|
||||
ar2 = {
|
||||
idle = "idle_ar2_aim",
|
||||
walk = "walkAIMALL1_ar2",
|
||||
run = "run_aiming_ar2_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all",
|
||||
--g_attack="gesture_shoot_ar2",
|
||||
g_reload = "gesture_reload_ar2"
|
||||
},
|
||||
shotgun = {
|
||||
idle = "idle_ar2_aim",
|
||||
walk = "walkAIMALL1_ar2",
|
||||
run = "run_aiming_ar2_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all",
|
||||
g_attack = "gesture_shoot_shotgun",
|
||||
g_reload = "gesture_reload_ar2"
|
||||
},
|
||||
pistol = {
|
||||
idle = "Pistol_idle_aim",
|
||||
walk = "walk_aiming_p_all",
|
||||
run = "run_aiming_p_all"
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
hack = "buttons/blip1.wav",
|
||||
nohack = "buttons/button2.wav"
|
||||
},
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch"
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 60,
|
||||
run = 200,
|
||||
ducked = 40
|
||||
},
|
||||
loadout = {"pill_wep_holstered", "pill_wep_alyxgun", "weapon_shotgun"},
|
||||
ammo = {
|
||||
smg1 = 300
|
||||
},
|
||||
health = 1000,
|
||||
validHoldTypes = {"pistol", "smg", "ar2", "shotgun"},
|
||||
movePoseMode = "yaw",
|
||||
flashlight = function(ply, ent)
|
||||
local tr = ply:GetEyeTrace()
|
||||
local hackables = {"npc_turret_floor", "npc_rollermine", "npc_manhack"}
|
||||
|
||||
if (tr.HitPos:Distance(tr.StartPos) < 100 and table.HasValue(hackables, tr.Entity:GetClass())) and pk_pills.getAiTeam(tr.Entity) ~= "default" then
|
||||
pk_pills.setAiTeam(tr.Entity, "default")
|
||||
ent:PillSound("hack")
|
||||
|
||||
if tr.Entity:GetClass() ~= "npc_turret_floor" then
|
||||
tr.Entity:GetPhysicsObject():SetVelocity(ply:GetAimVector() * 100)
|
||||
end
|
||||
else
|
||||
ent:PillSound("nohack")
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
pk_pills.register("hero_physicist", {
|
||||
printName = "The Physicist",
|
||||
type = "ply",
|
||||
model = "models/Kleiner.mdl",
|
||||
default_rp_cost = 10000,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle_angry",
|
||||
walk = "walk_all",
|
||||
run = "run_all",
|
||||
crouch = "Crouch_idleD",
|
||||
crouch_walk = "Crouch_walk_aLL",
|
||||
glide = "jump_holding_glide",
|
||||
jump = "jump_holding_jump",
|
||||
g_attack = "gesture_shoot_smg1",
|
||||
g_reload = "gesture_reload_smg1"
|
||||
},
|
||||
smg = {
|
||||
idle = "Idle_SMG1_Aim_Alert",
|
||||
walk = "walkAIMALL1",
|
||||
run = "run_aiming_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all"
|
||||
},
|
||||
ar2 = {
|
||||
idle = "idle_ar2_aim",
|
||||
walk = "walkAIMALL1_ar2",
|
||||
run = "run_aiming_ar2_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all",
|
||||
--g_attack="gesture_shoot_ar2",
|
||||
g_reload = "gesture_reload_ar2"
|
||||
},
|
||||
shotgun = {
|
||||
idle = "idle_ar2_aim",
|
||||
walk = "walkAIMALL1_ar2",
|
||||
run = "run_aiming_ar2_all",
|
||||
crouch = "crouch_aim_smg1",
|
||||
crouch_walk = "Crouch_walk_aiming_all",
|
||||
g_attack = "gesture_shoot_shotgun",
|
||||
g_reload = "gesture_reload_ar2"
|
||||
}
|
||||
},
|
||||
aim = {
|
||||
xPose = "aim_yaw",
|
||||
yPose = "aim_pitch"
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 60,
|
||||
run = 200,
|
||||
ducked = 40
|
||||
},
|
||||
loadout = {"pill_wep_holstered", "weapon_shotgun", "pill_wep_translocator"},
|
||||
ammo = {
|
||||
AR2 = 100,
|
||||
Buckshot = 100,
|
||||
smg1 = 100
|
||||
},
|
||||
health = 1000,
|
||||
validHoldTypes = {"smg", "ar2", "shotgun"},
|
||||
movePoseMode = "yaw"
|
||||
})
|
||||
100
lua/autorun/ppp_include/pill_vorts.lua
Normal file
100
lua/autorun/ppp_include/pill_vorts.lua
Normal file
@@ -0,0 +1,100 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("vort", {
|
||||
printName = "Vortigaunt",
|
||||
type = "ply",
|
||||
model = "models/vortigaunt.mdl",
|
||||
default_rp_cost = 8000,
|
||||
voxSet = "vort",
|
||||
camera = {
|
||||
dist = 200
|
||||
},
|
||||
anims = {
|
||||
default = {
|
||||
idle = "Idle01",
|
||||
walk = "Walk_all",
|
||||
run = "Run_all",
|
||||
melee1 = "MeleeHigh1",
|
||||
melee2 = "MeleeHigh2",
|
||||
melee3 = "MeleeHigh3",
|
||||
melee4 = "MeleeLow",
|
||||
attackRanged = "zapattack1"
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
melee = pk_pills.helpers.makeList("npc/vort/claw_swing#.wav", 2),
|
||||
melee_hit = pk_pills.helpers.makeList("npc/zombie/claw_strike#.wav", 3),
|
||||
loop_ranged_charge = "npc/vort/attack_charge.wav",
|
||||
ranged_fire = "npc/vort/attack_shoot.wav",
|
||||
step = pk_pills.helpers.makeList("npc/vort/vort_foot#.wav", 4)
|
||||
},
|
||||
aim = {
|
||||
xPose = "head_yaw",
|
||||
yPose = "head_pitch"
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
local superpowers = ent.formTable.superpowers
|
||||
ent:PillAnim("attackRanged", true)
|
||||
ent:PillLoopSound("ranged_charge")
|
||||
local puppet = ent:GetPuppet()
|
||||
ParticleEffectAttach("vortigaunt_charge_token", PATTACH_POINT_FOLLOW, puppet, puppet:LookupAttachment("leftclaw"))
|
||||
ParticleEffectAttach("vortigaunt_charge_token", PATTACH_POINT_FOLLOW, puppet, puppet:LookupAttachment("rightclaw"))
|
||||
|
||||
timer.Simple(1.5, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillLoopStop("ranged_charge")
|
||||
ent:PillSound("ranged_fire")
|
||||
local tr = ply:GetEyeTrace()
|
||||
local attachment = puppet:GetAttachment(puppet:LookupAttachment("leftclaw"))
|
||||
puppet:StopParticles()
|
||||
|
||||
if attachment then
|
||||
util.ParticleTracerEx(superpowers and "weapon_combine_ion_cannon" or "vortigaunt_beam", attachment.Pos, tr.HitPos, true, puppet:EntIndex(), puppet:LookupAttachment("leftclaw"))
|
||||
end
|
||||
|
||||
if superpowers then
|
||||
ParticleEffect("weapon_combine_ion_cannon_explosion", tr.HitPos, Angle(0, 0, 0))
|
||||
sound.Play("ambient/explosions/explode_1.wav", tr.HitPos, 75, 100, 1)
|
||||
util.BlastDamage(ent, ply, tr.HitPos, 200, 400)
|
||||
else
|
||||
util.BlastDamage(ent, ply, tr.HitPos, 10, 400)
|
||||
end
|
||||
end)
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = pk_pills.common.melee,
|
||||
animCount = 4,
|
||||
delay = .5,
|
||||
range = 40,
|
||||
dmg = 25
|
||||
},
|
||||
movePoseMode = "yaw",
|
||||
moveSpeed = {
|
||||
walk = 100,
|
||||
run = 300
|
||||
},
|
||||
duckBy = 0,
|
||||
jumpPower = 0,
|
||||
health = 120
|
||||
})
|
||||
|
||||
pk_pills.register("vort_slave", {
|
||||
parent = "vort",
|
||||
side = "hl_combine",
|
||||
printName = "Vortigaunt Slave",
|
||||
model = "models/vortigaunt_slave.mdl"
|
||||
})
|
||||
235
lua/autorun/ppp_include/pill_wild.lua
Normal file
235
lua/autorun/ppp_include/pill_wild.lua
Normal file
@@ -0,0 +1,235 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("ichthyosaur", {
|
||||
printName = "Ichthyosaur",
|
||||
side = "wild",
|
||||
type = "phys",
|
||||
model = "models/Ichthyosaur.mdl",
|
||||
default_rp_cost = 600,
|
||||
camera = {
|
||||
dist = 350
|
||||
},
|
||||
seqInit = "swim",
|
||||
sphericalPhysics = 30,
|
||||
driveType = "swim",
|
||||
driveOptions = {
|
||||
speed = 10
|
||||
},
|
||||
aim = {
|
||||
xPose = "sidetoside",
|
||||
yPose = "upanddown",
|
||||
nocrosshair = true
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
if ent:GetSequence() ~= ent:LookupSequence("swim") then return end
|
||||
ent:PillAnim("attackstart", true)
|
||||
|
||||
timer.Simple(.5, function()
|
||||
if not IsValid(ent) then return end
|
||||
|
||||
local tr = util.TraceHull({
|
||||
start = ent:GetPos(),
|
||||
endpos = ent:GetPos() + ent:GetAngles():Forward() * 200,
|
||||
filter = {ent},
|
||||
mins = Vector(-5, -5, -5),
|
||||
maxs = Vector(5, 5, 5)
|
||||
})
|
||||
|
||||
if IsValid(tr.Entity) then
|
||||
local dmg = DamageInfo()
|
||||
dmg:SetAttacker(ply)
|
||||
dmg:SetInflictor(ent)
|
||||
dmg:SetDamageType(DMG_SLASH)
|
||||
dmg:SetDamage(50)
|
||||
tr.Entity:TakeDamageInfo(dmg)
|
||||
ent:PillAnim("attackend", true)
|
||||
ent:PillSound("bite")
|
||||
|
||||
timer.Simple(1.8, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillAnim("swim", true)
|
||||
end)
|
||||
else
|
||||
ent:PillAnim("attackmiss", true)
|
||||
|
||||
timer.Simple(.5, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillAnim("swim", true)
|
||||
end)
|
||||
end
|
||||
end)
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
ent:PillSound("vocalize")
|
||||
end
|
||||
},
|
||||
health = 400,
|
||||
sounds = {
|
||||
loop_move = "npc/ichthyosaur/water_breath.wav",
|
||||
vocalize = pk_pills.helpers.makeList("npc/ichthyosaur/attack_growl#.wav", 3),
|
||||
bite = "npc/ichthyosaur/snap.wav"
|
||||
}
|
||||
})
|
||||
|
||||
pk_pills.register("barnacle", {
|
||||
printName = "Barnacle",
|
||||
side = "harmless",
|
||||
type = "phys",
|
||||
model = "models/barnacle.mdl",
|
||||
boxPhysics = {Vector(-10, -10, -20), Vector(10, 10, 0)},
|
||||
default_rp_cost = 1000,
|
||||
userSpawn = {
|
||||
type = "ceiling",
|
||||
offset = Vector(0, 0, 2)
|
||||
},
|
||||
spawnFrozen = true,
|
||||
camera = {
|
||||
offset = Vector(0, 0, -50),
|
||||
dist = 100,
|
||||
underslung = true
|
||||
},
|
||||
seqInit = "idle01",
|
||||
attack = {
|
||||
mode = "auto",
|
||||
delay = 0,
|
||||
func = function(ply, ent)
|
||||
if ent.busy then return end
|
||||
|
||||
if not IsValid(ent.tongue) then
|
||||
ent.tongue = ents.Create("pill_barnacle_tongue")
|
||||
ent.tongue:SetPos(ent:GetPos() + Vector(0, 0, -40))
|
||||
ent.tongue:Spawn()
|
||||
ent:DeleteOnRemove(ent.tongue)
|
||||
constraint.NoCollide(ent, ent.tongue, 0, 0)
|
||||
ent.tongue_constraint, ent.tongue_vis = constraint.Elastic(ent, ent.tongue, 0, 0, Vector(0, 0, -30), Vector(0, 0, 0), 20000, 4000, 0, "cable/rope", 1, true)
|
||||
ent.tongue_len = 20
|
||||
elseif IsValid(ent.tongue_constraint) then
|
||||
ent.tongue_len = ent.tongue_len + 1
|
||||
ent.tongue_constraint:Fire("SetSpringLength", ent.tongue_len, 0)
|
||||
ent.tongue_vis:Fire("SetLength", ent.tongue_len, 0)
|
||||
end
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "auto",
|
||||
delay = 0,
|
||||
func = function(ply, ent)
|
||||
if ent.busy then return end
|
||||
|
||||
if not IsValid(ent.tongue) or ent.tongue_len <= 20 then
|
||||
ent:PillAnim("attack_smallthings", true)
|
||||
ent:PillAnim("attack_smallthings", true)
|
||||
ent.busy = true
|
||||
|
||||
timer.Simple(.8, function()
|
||||
if not IsValid(ent) then return end
|
||||
|
||||
local tr = util.TraceHull({
|
||||
start = ent:GetPos() + Vector(0, 0, -10),
|
||||
endpos = ent:GetPos() + Vector(0, 0, -60),
|
||||
filter = {ent, ply, (IsValid(ent.tongue) and ent.tongue or nil)},
|
||||
mins = Vector(-10, -10, -10),
|
||||
maxs = Vector(10, 10, 10)
|
||||
})
|
||||
|
||||
if (tr.HitNonWorld) then
|
||||
if tr.Entity:IsRagdoll() then
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin(ent:GetPos() + Vector(0, 0, -30))
|
||||
effectdata:SetNormal(Vector(0, 0, -1))
|
||||
effectdata:SetMagnitude(1)
|
||||
effectdata:SetScale(10)
|
||||
effectdata:SetColor(0)
|
||||
effectdata:SetFlags(3)
|
||||
util.Effect("bloodspray", effectdata)
|
||||
ent:PillSound("chompgib")
|
||||
tr.Entity:Remove()
|
||||
|
||||
for k, v in pairs{"models/Gibs/HGIBS.mdl", "models/Gibs/HGIBS_rib.mdl", "models/Gibs/HGIBS_scapula.mdl", "models/Gibs/HGIBS_spine.mdl"} do
|
||||
local d = ents.Create("prop_physics")
|
||||
d:SetModel(v)
|
||||
d:SetPos(ent:GetPos() + Vector(0, 0, -30))
|
||||
d:Spawn()
|
||||
d:SetCollisionGroup(COLLISION_GROUP_DEBRIS)
|
||||
d:Fire("Kill", nil, 10)
|
||||
local p = d:GetPhysicsObject()
|
||||
|
||||
if IsValid(p) then
|
||||
p:ApplyForceCenter(VectorRand() * 1000)
|
||||
end
|
||||
end
|
||||
else
|
||||
tr.Entity:TakeDamage(20, ply, ent)
|
||||
ent:PillSound("chomp")
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
timer.Simple(1.5, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillAnim("idle01", true)
|
||||
ent.busy = false
|
||||
end)
|
||||
elseif IsValid(ent.tongue_constraint) then
|
||||
ent.tongue_len = ent.tongue_len - 1
|
||||
ent.tongue_constraint:Fire("SetSpringLength", ent.tongue_len, 0)
|
||||
ent.tongue_vis:Fire("SetLength", ent.tongue_len, 0)
|
||||
end
|
||||
end
|
||||
},
|
||||
reload = function(ply, ent)
|
||||
if IsValid(ent.tongue) then
|
||||
if constraint.RemoveConstraints(ent.tongue, "Weld") then
|
||||
ent:PillSound("drop")
|
||||
end
|
||||
end
|
||||
end,
|
||||
boneMorphs = {
|
||||
["Barnacle.tongue1"] = {
|
||||
scale = Vector(0, 0, 0),
|
||||
pos = Vector(0, 0, 50)
|
||||
},
|
||||
["Barnacle.tongue2"] = {
|
||||
scale = Vector(0, 0, 0)
|
||||
},
|
||||
["Barnacle.tongue3"] = {
|
||||
scale = Vector(0, 0, 0)
|
||||
},
|
||||
["Barnacle.tongue4"] = {
|
||||
scale = Vector(0, 0, 0)
|
||||
},
|
||||
["Barnacle.tongue5"] = {
|
||||
scale = Vector(0, 0, 0)
|
||||
},
|
||||
["Barnacle.tongue6"] = {
|
||||
scale = Vector(0, 0, 0)
|
||||
},
|
||||
["Barnacle.tongue7"] = {
|
||||
scale = Vector(0, 0, 0)
|
||||
},
|
||||
["Barnacle.tongue8"] = {
|
||||
scale = Vector(0, 0, 0)
|
||||
}
|
||||
},
|
||||
health = 35,
|
||||
sounds = {
|
||||
chomp = "npc/barnacle/barnacle_crunch3.wav",
|
||||
chompgib = "player/pl_fallpain1.wav",
|
||||
drop = "npc/barnacle/barnacle_bark1.wav"
|
||||
}
|
||||
})
|
||||
294
lua/autorun/ppp_include/pill_zombies.lua
Normal file
294
lua/autorun/ppp_include/pill_zombies.lua
Normal file
@@ -0,0 +1,294 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
pk_pills.register("zombie", {
|
||||
printName = "Zombie",
|
||||
side = "hl_zombie",
|
||||
crab = "headcrab",
|
||||
type = "ply",
|
||||
model = "models/Zombie/Classic.mdl",
|
||||
default_rp_cost = 7000,
|
||||
health = 100,
|
||||
bodyGroups = {1},
|
||||
anims = {
|
||||
default = {
|
||||
idle = "Idle01",
|
||||
walk = "walk",
|
||||
melee1 = "attackA",
|
||||
melee2 = "attackB",
|
||||
melee3 = "attackC",
|
||||
melee4 = "attackD",
|
||||
melee5 = "attackE",
|
||||
melee6 = "attackF",
|
||||
release = "releasecrab"
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
melee = pk_pills.helpers.makeList("npc/zombie/zo_attack#.wav", 2),
|
||||
melee_hit = pk_pills.helpers.makeList("npc/zombie/claw_strike#.wav", 3),
|
||||
melee_miss = pk_pills.helpers.makeList("npc/zombie/claw_miss#.wav", 2),
|
||||
bust = "npc/barnacle/barnacle_crunch2.wav",
|
||||
release = pk_pills.helpers.makeList("npc/zombie/zombie_pain#.wav", 6),
|
||||
step = pk_pills.helpers.makeList("npc/zombie/foot#.wav", 3)
|
||||
},
|
||||
attack = {
|
||||
mode = "trigger",
|
||||
func = pk_pills.common.melee,
|
||||
animCount = 6,
|
||||
delay = .8,
|
||||
range = 40,
|
||||
dmg = 25
|
||||
},
|
||||
reload = function(ply, ent)
|
||||
ent:PillAnim("release", true)
|
||||
ent:PillSound("release")
|
||||
|
||||
timer.Simple(1, function()
|
||||
if not IsValid(ent) then return end
|
||||
local r = ents.Create("prop_ragdoll")
|
||||
r:SetModel(ent.subModel or ent:GetPuppet():GetModel())
|
||||
r:SetPos(ply:GetPos())
|
||||
r:SetAngles(ply:GetAngles())
|
||||
r:Spawn()
|
||||
r:SetCollisionGroup(COLLISION_GROUP_DEBRIS)
|
||||
r:Fire("FadeAndRemove", nil, 10)
|
||||
local puppet = ent:GetPuppet()
|
||||
local attach = puppet:GetAttachment(puppet:LookupAttachment("head"))
|
||||
pk_pills.apply(ply, ent.formTable.crab)
|
||||
|
||||
if (attach) then
|
||||
ply:SetPos(attach.Pos)
|
||||
else
|
||||
ply:SetPos(ply:GetPos() + Vector(0, 0, 60))
|
||||
end
|
||||
end)
|
||||
end,
|
||||
flashlight = function(ply, ent)
|
||||
if ent.formTable.printName == "Zombie" or ent.formTable.printName == "Fast Zombie" then
|
||||
ent:PillSound("bust")
|
||||
local e = pk_pills.apply(ply, ent.formTable.printName == "Zombie" and "zombie_torso" or "zombie_torso_fast")
|
||||
e:PillAnim("fall", true)
|
||||
ply:SetPos(ply:GetPos() + Vector(0, 0, 30))
|
||||
ply:SetVelocity(Vector(0, 0, 400) + ply:GetAimVector() * 300)
|
||||
local r = ents.Create("prop_ragdoll")
|
||||
r:SetModel(ent.formTable.printName == "Zombie" and "models/zombie/classic_legs.mdl" or "models/gibs/fast_zombie_legs.mdl")
|
||||
r:SetPos(ply:GetPos())
|
||||
r:SetAngles(ply:GetAngles())
|
||||
r:Spawn()
|
||||
r:SetCollisionGroup(COLLISION_GROUP_DEBRIS)
|
||||
r:Fire("FadeAndRemove", nil, 10)
|
||||
end
|
||||
end,
|
||||
movePoseMode = "yaw",
|
||||
moveSpeed = {
|
||||
walk = 50,
|
||||
run = 100
|
||||
},
|
||||
jumpPower = 0,
|
||||
duckBy = 0
|
||||
})
|
||||
|
||||
pk_pills.register("zombie_poison", {
|
||||
parent = "zombie",
|
||||
printName = "Poison Zombie",
|
||||
crab = "headcrab_poison",
|
||||
model = "models/Zombie/Poison.mdl",
|
||||
default_rp_cost = 8000,
|
||||
health = 300,
|
||||
anims = {
|
||||
default = {
|
||||
run = "run",
|
||||
melee = "melee_01",
|
||||
throw = "Throw"
|
||||
}
|
||||
},
|
||||
bodyGroups = {nil, 2, 3, 4},
|
||||
sounds = {
|
||||
throw1 = pk_pills.helpers.makeList("npc/zombie_poison/pz_throw#.wav", 2, 3),
|
||||
throw2 = pk_pills.helpers.makeList("npc/headcrab_poison/ph_jump#.wav", 1, 3)
|
||||
},
|
||||
attack = {
|
||||
animCount = false
|
||||
},
|
||||
attack2 = {
|
||||
mode = "trigger",
|
||||
func = function(ply, ent)
|
||||
ent:PillAnim("throw", true)
|
||||
ent:PillSound("throw1")
|
||||
|
||||
timer.Simple(1.3, function()
|
||||
if not IsValid(ent) then return end
|
||||
ent:PillSound("throw2")
|
||||
local headcrab = ents.Create("pill_jumper_headcrab")
|
||||
local puppet = ent:GetPuppet()
|
||||
local angs = ply:EyeAngles()
|
||||
angs.p = 0
|
||||
headcrab:SetPos(ply:EyePos() + angs:Forward() * 100)
|
||||
headcrab:SetAngles(angs)
|
||||
headcrab:Spawn()
|
||||
headcrab:GetPhysicsObject():SetVelocity(angs:Forward() * 300 + Vector(0, 0, 200))
|
||||
end)
|
||||
end
|
||||
},
|
||||
moveSpeed = {
|
||||
run = 200
|
||||
},
|
||||
movePoseMode = false
|
||||
})
|
||||
|
||||
pk_pills.register("zombie_fast", {
|
||||
parent = "zombie",
|
||||
printName = "Fast Zombie",
|
||||
crab = "headcrab_fast",
|
||||
model = "models/Zombie/fast.mdl",
|
||||
default_rp_cost = 9000,
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle",
|
||||
walk = "walk_all",
|
||||
run = "Run",
|
||||
jump = "leap_start",
|
||||
glide = "leap_loop",
|
||||
jump_attack = "leap",
|
||||
glide_attack = "leapstrike",
|
||||
attack = "Melee",
|
||||
climb = "climbloop",
|
||||
climb_start = "climbmount",
|
||||
release = "br2_roar"
|
||||
}
|
||||
},
|
||||
sounds = {
|
||||
jump = "npc/fast_zombie/fz_scream1.wav",
|
||||
attack = "npc/fast_zombie/fz_frenzy1.wav"
|
||||
},
|
||||
attack = {
|
||||
mode = "tick",
|
||||
func = function(ply, ent)
|
||||
if not ply:IsOnGround() or ply:GetVelocity():Length() > 1 then return end
|
||||
ent:PillAnimTick("attack")
|
||||
|
||||
if not ent.lastAttack or ent.lastAttack + .3 < CurTime() then
|
||||
if ply:TraceHullAttack(ply:EyePos(), ply:EyePos() + ply:EyeAngles():Forward() * 40, Vector(-10, -10, -10), Vector(10, 10, 10), 10, DMG_SLASH, 1, true) then
|
||||
ent:PillSound("melee_hit")
|
||||
else
|
||||
ent:PillSound("melee_miss")
|
||||
end
|
||||
|
||||
ent.lastAttack = CurTime()
|
||||
end
|
||||
|
||||
if not ent.lastAttackSound or ent.lastAttackSound + 2 < CurTime() then
|
||||
ent:PillSound("attack")
|
||||
ent.lastAttackSound = CurTime()
|
||||
end
|
||||
end
|
||||
},
|
||||
attack2 = {
|
||||
mode = "tick",
|
||||
func = function(ply, ent)
|
||||
local start = ply:GetPos() + Vector(0, 0, 10)
|
||||
local dir = ply:GetAimVector()
|
||||
dir.z = 0
|
||||
dir:Normalize()
|
||||
local tracedata = {}
|
||||
tracedata.start = start
|
||||
tracedata.endpos = start + dir * 20
|
||||
tracedata.filter = ply
|
||||
tracedata.mins = Vector(-8, -8, -8)
|
||||
tracedata.maxs = Vector(8, 8, 8)
|
||||
|
||||
if util.TraceHull(tracedata).Hit then
|
||||
if ply:IsOnGround() then
|
||||
ply:SetVelocity(Vector(0, 0, 150))
|
||||
ent:PillAnim("climb_start")
|
||||
end
|
||||
|
||||
ply:SetLocalVelocity(Vector(0, 0, 100))
|
||||
ent:PillAnimTick("climb")
|
||||
end
|
||||
end
|
||||
},
|
||||
noFallDamage = true,
|
||||
jump = function(ply, ent)
|
||||
if ply:GetVelocity():Length() < 350 then
|
||||
v = ply:EyeAngles():Forward()
|
||||
v.z = 0
|
||||
v:Normalize()
|
||||
ply:SetVelocity(v * 100 + Vector(0, 0, 300))
|
||||
else
|
||||
ent:PillAnim("jump_attack")
|
||||
ent.canAttack = true
|
||||
end
|
||||
|
||||
ent:PillSound("jump")
|
||||
end,
|
||||
glideThink = function(ply, ent)
|
||||
if ent.canAttack then
|
||||
if ply:TraceHullAttack(ply:EyePos(), ply:EyePos() + ply:EyeAngles():Forward() * 50, Vector(-20, -20, -20), Vector(20, 20, 20), 50, DMG_SLASH, 1, true) then
|
||||
ent:PillSound("melee_hit")
|
||||
ent.canAttack = nil
|
||||
end
|
||||
|
||||
ent:PillAnimTick("glide_attack")
|
||||
end
|
||||
end,
|
||||
land = function(ply, ent)
|
||||
ent.canAttack = nil
|
||||
end,
|
||||
moveSpeed = {
|
||||
run = 400
|
||||
},
|
||||
jumpPower = 400
|
||||
})
|
||||
|
||||
pk_pills.register("zombie_torso", {
|
||||
parent = "zombie",
|
||||
printName = "Zombie Torso",
|
||||
model = "models/Zombie/classic_torso.mdl",
|
||||
default_rp_cost = 6500,
|
||||
camera = {
|
||||
offset = Vector(0, 0, 10),
|
||||
dist = 150
|
||||
},
|
||||
hull = Vector(30, 30, 20),
|
||||
anims = {
|
||||
default = {
|
||||
idle = "idle",
|
||||
walk = "crawl",
|
||||
melee = "attack",
|
||||
fall = "fall"
|
||||
}
|
||||
},
|
||||
attack = {
|
||||
animCount = false,
|
||||
delay = .4
|
||||
},
|
||||
movePoseMode = false
|
||||
})
|
||||
|
||||
pk_pills.register("zombie_torso_fast", {
|
||||
parent = "zombie_torso",
|
||||
printName = "Fast Zombie Torso",
|
||||
model = "models/zombie/fast_torso.mdl",
|
||||
default_rp_cost = 8500,
|
||||
crab = "headcrab_fast",
|
||||
anims = {
|
||||
default = {
|
||||
melee = "attack01",
|
||||
fall = false
|
||||
}
|
||||
},
|
||||
moveSpeed = {
|
||||
walk = 100,
|
||||
run = 200
|
||||
}
|
||||
})
|
||||
1421
lua/autorun/ppp_include/vox_lists.lua
Normal file
1421
lua/autorun/ppp_include/vox_lists.lua
Normal file
File diff suppressed because it is too large
Load Diff
13
lua/autorun/ppp_master_autorun_2018.lua
Normal file
13
lua/autorun/ppp_master_autorun_2018.lua
Normal file
@@ -0,0 +1,13 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
-- Sooner or later the entire damn addon will be launched from here.
|
||||
55
lua/autorun/ppp_pack_core.lua
Normal file
55
lua/autorun/ppp_pack_core.lua
Normal file
@@ -0,0 +1,55 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
require("pk_pills")
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
if SERVER then
|
||||
resource.AddWorkshop("106427033")
|
||||
include("ppp_include/drivemodes.lua")
|
||||
end
|
||||
|
||||
game.AddParticles("particles/Vortigaunt_FX.pcf")
|
||||
PrecacheParticleSystem("vortigaunt_beam")
|
||||
PrecacheParticleSystem("vortigaunt_beam_b")
|
||||
|
||||
include("ppp_include/vox_lists.lua")
|
||||
|
||||
pk_pills.packStart("Half-Life 2","base","games/16/hl2.png")
|
||||
|
||||
include("ppp_include/pill_combine_soldiers.lua")
|
||||
include("ppp_include/pill_combine_phys_small.lua")
|
||||
include("ppp_include/pill_combine_phys_large.lua")
|
||||
include("ppp_include/pill_combine_misc.lua")
|
||||
include("ppp_include/pill_combine_new.lua")
|
||||
|
||||
include("ppp_include/pill_headcrabs.lua")
|
||||
include("ppp_include/pill_zombies.lua")
|
||||
|
||||
include("ppp_include/pill_antlions.lua")
|
||||
include("ppp_include/pill_wild.lua")
|
||||
|
||||
include("ppp_include/pill_resistance_heros.lua")
|
||||
include("ppp_include/pill_resistance.lua")
|
||||
include("ppp_include/pill_vorts.lua")
|
||||
|
||||
include("ppp_include/pill_birds.lua")
|
||||
|
||||
pk_pills.packStart("Fun","fun","icon16/rainbow.png")
|
||||
|
||||
include("ppp_include/pill_fun.lua")
|
||||
include("ppp_include/pill_fun2.lua")
|
||||
include("ppp_include/pill_fun3.lua")
|
||||
include("ppp_include/pill_360_noscope.lua")
|
||||
|
||||
pk_pills.packStart("Jake","jake","icon16/box.png")
|
||||
|
||||
include("ppp_include/pill_jake.lua")
|
||||
26
lua/autorun/properties.lua
Normal file
26
lua/autorun/properties.lua
Normal file
@@ -0,0 +1,26 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
include( "properties/bone_manipulate.lua" )
|
||||
include( "properties/remove.lua" )
|
||||
include( "properties/statue.lua" )
|
||||
include( "properties/keep_upright.lua" )
|
||||
include( "properties/persist.lua" )
|
||||
include( "properties/drive.lua" )
|
||||
include( "properties/ignite.lua" )
|
||||
include( "properties/collisions.lua" )
|
||||
include( "properties/gravity.lua" )
|
||||
include( "properties/npc_scale.lua" )
|
||||
include( "properties/editentity.lua" )
|
||||
include( "properties/kinect_controller.lua" )
|
||||
include( "properties/bodygroups.lua" )
|
||||
include( "properties/skin.lua" )
|
||||
|
||||
138
lua/autorun/properties/bodygroups.lua
Normal file
138
lua/autorun/properties/bodygroups.lua
Normal file
@@ -0,0 +1,138 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
properties.Add( "bodygroups", {
|
||||
MenuLabel = "#bodygroups",
|
||||
Order = 600,
|
||||
MenuIcon = "icon16/link_edit.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( ent:IsPlayer() ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "bodygroups", ent ) ) then return false end
|
||||
if ( IsValid( ent.AttachedEntity ) ) then ent = ent.AttachedEntity end -- If our ent has an attached entity, we want to use and modify its bodygroups instead
|
||||
|
||||
--
|
||||
-- Get a list of bodygroups
|
||||
--
|
||||
local options = ent:GetBodyGroups()
|
||||
if ( !options ) then return false end
|
||||
|
||||
--
|
||||
-- If a bodygroup has more than one state - then we can configure it
|
||||
--
|
||||
for k, v in pairs( options ) do
|
||||
if ( v.num > 1 ) then return true end
|
||||
end
|
||||
|
||||
return false
|
||||
|
||||
end,
|
||||
|
||||
MenuOpen = function( self, option, ent, tr )
|
||||
|
||||
local target = IsValid( ent.AttachedEntity ) and ent.AttachedEntity or ent
|
||||
|
||||
--
|
||||
-- Get a list of bodygroups
|
||||
--
|
||||
local options = target:GetBodyGroups()
|
||||
|
||||
--
|
||||
-- Add a submenu to our automatically created menu option
|
||||
--
|
||||
local submenu = option:AddSubMenu()
|
||||
|
||||
--
|
||||
-- For each body group - add a menu or checkbox
|
||||
--
|
||||
for k, v in pairs( options ) do
|
||||
|
||||
if ( v.num <= 1 ) then continue end
|
||||
|
||||
--
|
||||
-- If there's only 2 options, add it as a checkbox instead of a submenu
|
||||
--
|
||||
if ( v.num == 2 ) then
|
||||
|
||||
local current = target:GetBodygroup( v.id )
|
||||
local opposite = 1
|
||||
if ( current == opposite ) then opposite = 0 end
|
||||
|
||||
local opt = submenu:AddOption( string.NiceName( v.name ) )
|
||||
opt:SetChecked( current == 1 )
|
||||
opt:SetIsCheckable( true )
|
||||
opt.OnChecked = function( s, checked ) self:SetBodyGroup( ent, v.id, checked and 1 or 0 ) end
|
||||
|
||||
--
|
||||
-- More than 2 options we add our own submenu
|
||||
--
|
||||
else
|
||||
|
||||
local groups = submenu:AddSubMenu( string.NiceName( v.name ) )
|
||||
|
||||
for i = 1, v.num do
|
||||
local modelname = "Model #" .. i
|
||||
if ( v.submodels and v.submodels[ i - 1 ] != "" ) then modelname = v.submodels[ i - 1 ] end
|
||||
modelname = string.Trim( modelname, "." )
|
||||
modelname = string.Trim( modelname, "/" )
|
||||
modelname = string.Trim( modelname, "\\" )
|
||||
modelname = string.StripExtension( modelname )
|
||||
modelname = string.GetFileFromFilename( modelname )
|
||||
|
||||
local opt = groups:AddOption( string.NiceName( modelname ) )
|
||||
opt:SetRadio( true )
|
||||
opt:SetChecked( target:GetBodygroup( v.id ) == i - 1 )
|
||||
opt:SetIsCheckable( true )
|
||||
opt.OnChecked = function( s, checked ) if ( checked ) then self:SetBodyGroup( ent, v.id, i - 1 ) end end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
-- Nothing - we use SetBodyGroup below
|
||||
|
||||
end,
|
||||
|
||||
SetBodyGroup = function( self, ent, body, id )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
net.WriteUInt( body, 8 )
|
||||
net.WriteUInt( id, 8 )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
local body = net.ReadUInt( 8 )
|
||||
local id = net.ReadUInt( 8 )
|
||||
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
ent = IsValid( ent.AttachedEntity ) and ent.AttachedEntity or ent
|
||||
|
||||
ent:SetBodygroup( body, id )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
236
lua/autorun/properties/bone_manipulate.lua
Normal file
236
lua/autorun/properties/bone_manipulate.lua
Normal file
@@ -0,0 +1,236 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
properties.Add( "bone_manipulate", {
|
||||
MenuLabel = "#edit_bones",
|
||||
Order = 500,
|
||||
MenuIcon = "icon16/vector.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !gamemode.Call( "CanProperty", ply, "bonemanipulate", ent ) ) then return false end
|
||||
if ( IsValid( ent.AttachedEntity ) ) then ent = ent.AttachedEntity end -- If our ent has an attached entity, we want to use and modify its bones instead
|
||||
|
||||
local bonecount = ent:GetBoneCount()
|
||||
if ( bonecount <= 1 ) then return false end
|
||||
|
||||
return ents.FindByClassAndParent( "widget_bones", ent ) == nil
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
if ( IsValid( ent.AttachedEntity ) ) then ent = ent.AttachedEntity end
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
ent.widget = ents.Create( "widget_bones" )
|
||||
ent.widget:Setup( ent )
|
||||
ent.widget:Spawn()
|
||||
ent.widget.LastBonePress = 0
|
||||
ent.widget.BonePressCount = 0
|
||||
|
||||
-- What happens when we click on a bone?
|
||||
ent.widget.OnBoneClick = function( w, boneid, pl )
|
||||
|
||||
-- If we have an old axis, remove it
|
||||
if ( IsValid( w.axis ) ) then w.axis:Remove() end
|
||||
|
||||
-- We clicked on the same bone
|
||||
if ( w.LastBonePress == boneid ) then
|
||||
w.BonePressCount = w.BonePressCount + 1
|
||||
if ( w.BonePressCount >= 3 ) then w.BonePressCount = 0 end
|
||||
-- We clicked on a new bone!
|
||||
else
|
||||
w.BonePressCount = 0
|
||||
w.LastBonePress = boneid
|
||||
end
|
||||
|
||||
local EntityCycle = { "widget_bonemanip_move", "widget_bonemanip_rotate", "widget_bonemanip_scale" }
|
||||
|
||||
w.axis = ents.Create( EntityCycle[ w.BonePressCount + 1 ] )
|
||||
w.axis:Setup( ent, boneid, w.BonePressCount == 1 )
|
||||
w.axis:Spawn()
|
||||
w.axis:SetPriority( 0.5 )
|
||||
w:DeleteOnRemove( w.axis )
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
} )
|
||||
|
||||
properties.Add( "bone_manipulate_end", {
|
||||
MenuLabel = "#stop_editing_bones",
|
||||
Order = 500,
|
||||
MenuIcon = "icon16/vector_delete.png",
|
||||
|
||||
Filter = function( self, ent )
|
||||
|
||||
if ( IsValid( ent.AttachedEntity ) ) then ent = ent.AttachedEntity end -- If our ent has an attached entity, we want to use and modify its bones instead
|
||||
|
||||
return ents.FindByClassAndParent( "widget_bones", ent ) != nil
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
if ( IsValid( ent.AttachedEntity ) ) then ent = ent.AttachedEntity end
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
if ( !IsValid( ent.widget ) ) then return end
|
||||
|
||||
ent.widget:Remove()
|
||||
|
||||
end
|
||||
} )
|
||||
|
||||
local widget_bonemanip_move = {
|
||||
Base = "widget_axis",
|
||||
|
||||
OnArrowDragged = function( self, num, dist, pl, mv )
|
||||
|
||||
-- Prediction doesn't work properly yet.. because of the confusion with the bone moving, and the parenting, Agh.
|
||||
if ( CLIENT ) then return end
|
||||
|
||||
local ent = self:GetParent()
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
|
||||
local bone = self:GetParentAttachment()
|
||||
if ( bone <= 0 ) then return end
|
||||
|
||||
local v = Vector( 0, 0, 0 )
|
||||
|
||||
if ( num == 1 ) then v.x = dist end
|
||||
if ( num == 2 ) then v.y = dist end
|
||||
if ( num == 3 ) then v.z = dist end
|
||||
|
||||
ent:ManipulateBonePosition( bone, ent:GetManipulateBonePosition( bone ) + v )
|
||||
|
||||
end,
|
||||
|
||||
--
|
||||
-- Although we use the position from our bone, we want to use the angles from the
|
||||
-- parent bone - because that's the direction our bone goes
|
||||
--
|
||||
CalcAbsolutePosition = function( self, v, a )
|
||||
|
||||
local ent = self:GetParent()
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
|
||||
local bone = ent:GetBoneParent( self:GetParentAttachment() )
|
||||
if ( bone <= 0 ) then return end
|
||||
|
||||
local _, ang = ent:GetBonePosition( bone )
|
||||
local pos, _ = ent:GetBonePosition( self:GetParentAttachment() )
|
||||
return pos, ang
|
||||
|
||||
end
|
||||
}
|
||||
|
||||
scripted_ents.Register( widget_bonemanip_move, "widget_bonemanip_move" )
|
||||
|
||||
local widget_bonemanip_rotate = {
|
||||
Base = "widget_axis",
|
||||
|
||||
OnArrowDragged = function( self, num, dist, pl, mv )
|
||||
|
||||
-- Prediction doesn't work properly yet.. because of the confusion with the bone moving, and the parenting, Agh.
|
||||
if ( CLIENT ) then return end
|
||||
|
||||
local ent = self:GetParent()
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
|
||||
local bone = self:GetParentAttachment()
|
||||
if ( bone <= 0 ) then return end
|
||||
|
||||
local v = Angle( 0, 0, 0 )
|
||||
|
||||
if ( num == 2 ) then v.x = dist end
|
||||
if ( num == 3 ) then v.y = dist end
|
||||
if ( num == 1 ) then v.z = dist end
|
||||
|
||||
ent:ManipulateBoneAngles( bone, ent:GetManipulateBoneAngles( bone ) + v )
|
||||
|
||||
end
|
||||
}
|
||||
scripted_ents.Register( widget_bonemanip_rotate, "widget_bonemanip_rotate" )
|
||||
|
||||
local widget_bonemanip_scale = {
|
||||
Base = "widget_axis",
|
||||
IsScaleArrow = true,
|
||||
|
||||
OnArrowDragged = function( self, num, dist, pl, mv )
|
||||
|
||||
-- Prediction doesn't work properly yet.. because of the confusion with the bone moving, and the parenting, Agh.
|
||||
if ( CLIENT ) then return end
|
||||
|
||||
local ent = self:GetParent()
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
|
||||
local bone = self:GetParentAttachment()
|
||||
if ( bone <= 0 ) then return end
|
||||
|
||||
local v = Vector( 0, 0, 0 )
|
||||
|
||||
if ( num == 1 ) then v.x = dist end
|
||||
if ( num == 2 ) then v.y = dist end
|
||||
if ( num == 3 ) then v.z = dist end
|
||||
|
||||
ent:ManipulateBoneScale( bone, ent:GetManipulateBoneScale( bone ) + v * 0.1 )
|
||||
ent:ManipulateBoneScale( ent:GetBoneParent( bone ), ent:GetManipulateBoneScale( ent:GetBoneParent( bone ) ) + v )
|
||||
|
||||
end,
|
||||
|
||||
--
|
||||
-- Although we use the position from our bone, we want to use the angles from the
|
||||
-- parent bone - because that's the direction our bone goes
|
||||
--
|
||||
CalcAbsolutePosition = function( self, v, a )
|
||||
|
||||
local ent = self:GetParent()
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
|
||||
local bone = self:GetParentAttachment()
|
||||
if ( bone <= 0 ) then return end
|
||||
|
||||
local pbone = ent:GetBoneParent( bone )
|
||||
if ( pbone <= 0 ) then return end
|
||||
|
||||
local pos, ang = ent:GetBonePosition( bone )
|
||||
local pos2, _ = ent:GetBonePosition( pbone )
|
||||
|
||||
return pos + ( pos2 - pos ) * 0.5, ang
|
||||
|
||||
end
|
||||
}
|
||||
scripted_ents.Register( widget_bonemanip_scale, "widget_bonemanip_scale" )
|
||||
83
lua/autorun/properties/collisions.lua
Normal file
83
lua/autorun/properties/collisions.lua
Normal file
@@ -0,0 +1,83 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
properties.Add( "collision_off", {
|
||||
MenuLabel = "#collision_off",
|
||||
Order = 1500,
|
||||
MenuIcon = "icon16/collision_off.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( ent:IsPlayer() ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "collision", ent ) ) then return false end
|
||||
if ( ent:GetCollisionGroup() == COLLISION_GROUP_WORLD ) then return false end
|
||||
|
||||
return true
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
ent:SetCollisionGroup( COLLISION_GROUP_WORLD )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
|
||||
properties.Add( "collision_on", {
|
||||
MenuLabel = "#collision_on",
|
||||
Order = 1500,
|
||||
MenuIcon = "icon16/collision_on.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( ent:IsPlayer() ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "collision", ent ) ) then return false end
|
||||
|
||||
return ent:GetCollisionGroup() == COLLISION_GROUP_WORLD
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
ent:SetCollisionGroup( COLLISION_GROUP_NONE )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
62
lua/autorun/properties/drive.lua
Normal file
62
lua/autorun/properties/drive.lua
Normal file
@@ -0,0 +1,62 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
properties.Add( "drive", {
|
||||
MenuLabel = "#drive",
|
||||
Order = 1100,
|
||||
MenuIcon = "icon16/joystick.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) || !IsValid( ply ) ) then return false end
|
||||
if ( ent:IsPlayer() || IsValid( ply:GetVehicle() ) ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "drive", ent ) ) then return false end
|
||||
if ( !gamemode.Call( "CanDrive", ply, ent ) ) then return false end
|
||||
|
||||
-- We cannot drive these, maybe this should have a custom GetEntityDriveMode?
|
||||
if ( ent:GetClass() == "prop_vehicle_jeep" || ent:GetClass() == "prop_vehicle_jeep_old" ) then return false end
|
||||
|
||||
-- Make sure nobody else is driving this or we can get into really invalid states
|
||||
for id, pl in ipairs( player.GetAll() ) do
|
||||
if ( pl:GetDrivingEntity() == ent ) then return false end
|
||||
end
|
||||
|
||||
return true
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
local drivemode = "drive_sandbox"
|
||||
|
||||
if ( ent.GetEntityDriveMode ) then
|
||||
drivemode = ent:GetEntityDriveMode( ply )
|
||||
end
|
||||
|
||||
drive.PlayerStartDriving( ply, ent, drivemode )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
48
lua/autorun/properties/editentity.lua
Normal file
48
lua/autorun/properties/editentity.lua
Normal file
@@ -0,0 +1,48 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
properties.Add( "editentity", {
|
||||
MenuLabel = "#entedit",
|
||||
Order = 90001,
|
||||
PrependSpacer = true,
|
||||
MenuIcon = "icon16/pencil.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( !ent.Editable ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "editentity", ent ) ) then return false end
|
||||
|
||||
return true
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
local window = g_ContextMenu:Add( "DFrame" )
|
||||
window:SetSize( 320, 400 )
|
||||
window:SetTitle( tostring( ent ) )
|
||||
window:Center()
|
||||
window:SetSizable( true )
|
||||
|
||||
local control = window:Add( "DEntityProperties" )
|
||||
control:SetEntity( ent )
|
||||
control:Dock( FILL )
|
||||
|
||||
control.OnEntityLost = function()
|
||||
|
||||
window:Remove()
|
||||
|
||||
end
|
||||
end
|
||||
} )
|
||||
92
lua/autorun/properties/gravity.lua
Normal file
92
lua/autorun/properties/gravity.lua
Normal file
@@ -0,0 +1,92 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
-- The following is for the server's eyes only
|
||||
local GravityDuplicator
|
||||
if ( SERVER ) then
|
||||
function GravityDuplicator( ply, ent, data )
|
||||
|
||||
if ( !data || !data.enabled ) then
|
||||
|
||||
duplicator.ClearEntityModifier( ent, "gravity_property" )
|
||||
return
|
||||
|
||||
end
|
||||
|
||||
-- Simply restore the value whenever we are duplicated
|
||||
-- We don't need to reapply EnableGravity because duplicator already does it for us
|
||||
ent:SetNWBool( "gravity_disabled", data.enabled )
|
||||
|
||||
duplicator.StoreEntityModifier( ent, "gravity_property", data )
|
||||
|
||||
end
|
||||
duplicator.RegisterEntityModifier( "gravity_property", GravityDuplicator )
|
||||
end
|
||||
|
||||
properties.Add( "gravity", {
|
||||
MenuLabel = "#gravity",
|
||||
Type = "toggle",
|
||||
Order = 1001,
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "gravity", ent ) ) then return false end
|
||||
|
||||
if ( ent:GetClass() == "prop_physics" ) then return true end
|
||||
if ( ent:GetClass() == "prop_ragdoll" ) then return true end
|
||||
|
||||
return false
|
||||
|
||||
end,
|
||||
|
||||
Checked = function( self, ent, ply )
|
||||
|
||||
return ent:GetNWBool( "gravity_disabled" ) == false
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
local bones = ent:GetPhysicsObjectCount()
|
||||
local b = ent:GetNWBool( "gravity_disabled" )
|
||||
|
||||
for i = 0, bones - 1 do
|
||||
|
||||
local phys = ent:GetPhysicsObjectNum( i )
|
||||
if ( IsValid( phys ) ) then
|
||||
phys:EnableGravity( b )
|
||||
phys:Wake()
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
ent:SetNWBool( "gravity_disabled", b == false )
|
||||
|
||||
GravityDuplicator( ply, ent, { enabled = ent:GetNWBool( "gravity_disabled" ) } )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
96
lua/autorun/properties/ignite.lua
Normal file
96
lua/autorun/properties/ignite.lua
Normal file
@@ -0,0 +1,96 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
local function CanEntityBeSetOnFire( ent )
|
||||
|
||||
-- func_pushable, func_breakable & func_physbox cannot be ignited
|
||||
if ( ent:GetClass() == "item_item_crate" ) then return true end
|
||||
if ( ent:GetClass() == "simple_physics_prop" ) then return true end
|
||||
if ( ent:GetClass():match( "prop_physics*" ) ) then return true end
|
||||
if ( ent:GetClass():match( "prop_ragdoll*" ) ) then return true end
|
||||
if ( ent:IsNPC() ) then return true end
|
||||
|
||||
return false
|
||||
|
||||
end
|
||||
|
||||
properties.Add( "ignite", {
|
||||
MenuLabel = "#ignite",
|
||||
Order = 999,
|
||||
MenuIcon = "icon16/fire.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( ent:IsPlayer() ) then return false end
|
||||
if ( !CanEntityBeSetOnFire( ent ) ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "ignite", ent ) ) then return false end
|
||||
|
||||
return !ent:IsOnFire()
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
ent:Ignite( 360 )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
|
||||
properties.Add( "extinguish", {
|
||||
MenuLabel = "#extinguish",
|
||||
Order = 999,
|
||||
MenuIcon = "icon16/water.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( ent:IsPlayer() ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "extinguish", ent ) ) then return false end
|
||||
|
||||
return ent:IsOnFire()
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
ent:Extinguish()
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
107
lua/autorun/properties/keep_upright.lua
Normal file
107
lua/autorun/properties/keep_upright.lua
Normal file
@@ -0,0 +1,107 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
properties.Add( "keepupright", {
|
||||
MenuLabel = "#keepupright",
|
||||
Order = 900,
|
||||
MenuIcon = "icon16/arrow_up.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( ent:GetClass() != "prop_physics" ) then return false end
|
||||
if ( ent:GetNWBool( "IsUpright" ) ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "keepupright", ent ) ) then return false end
|
||||
|
||||
return true
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
if ( !IsValid( ply ) ) then return end
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( ent:GetClass() != "prop_physics" ) then return end
|
||||
if ( ent:GetNWBool( "IsUpright" ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
local Phys = ent:GetPhysicsObjectNum( 0 )
|
||||
if ( !IsValid( Phys ) ) then return end
|
||||
|
||||
local constraint = constraint.Keepupright( ent, Phys:GetAngles(), 0, 999999 )
|
||||
|
||||
-- I feel like this is not stable enough
|
||||
-- This cannot be implemented without a custom constraint.Keepupright function or modification for proper duplicator support.
|
||||
--print( constraint:GetSaveTable().m_worldGoalAxis )
|
||||
--constraint:SetSaveValue( "m_localTestAxis", constraint:GetSaveTable().m_worldGoalAxis ) --ent:GetAngles():Up() )
|
||||
--constraint:SetSaveValue( "m_worldGoalAxis", Vector( 0, 0, 1 ) )
|
||||
--constraint:SetSaveValue( "m_bDampAllRotation", true )
|
||||
|
||||
if ( constraint ) then
|
||||
|
||||
ply:AddCleanup( "constraints", constraint )
|
||||
ent:SetNWBool( "IsUpright", true )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
|
||||
properties.Add( "keepupright_stop", {
|
||||
MenuLabel = "#keepupright_stop",
|
||||
Order = 900,
|
||||
MenuIcon = "icon16/arrow_rotate_clockwise.png",
|
||||
|
||||
Filter = function( self, ent )
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( ent:GetClass() != "prop_physics" ) then return false end
|
||||
if ( !ent:GetNWBool( "IsUpright" ) ) then return false end
|
||||
return true
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
if ( !IsValid( ply ) ) then return end
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( ent:GetClass() != "prop_physics" ) then return end
|
||||
if ( !ent:GetNWBool( "IsUpright" ) ) then return end
|
||||
|
||||
constraint.RemoveConstraints( ent, "Keepupright" )
|
||||
|
||||
ent:SetNWBool( "IsUpright", false )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
91
lua/autorun/properties/kinect_controller.lua
Normal file
91
lua/autorun/properties/kinect_controller.lua
Normal file
@@ -0,0 +1,91 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
if ( SERVER ) then
|
||||
|
||||
CreateConVar( "sensor_debugragdoll", "0", FCVAR_NOTIFY )
|
||||
CreateConVar( "sensor_stretchragdoll", "0", FCVAR_NOTIFY )
|
||||
|
||||
end
|
||||
|
||||
local playerTimeouts = {}
|
||||
|
||||
properties.Add( "motioncontrol_ragdoll", {
|
||||
MenuLabel = "#control_with_motion_sensor",
|
||||
Order = 2500,
|
||||
MenuIcon = "icon16/controller.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( CLIENT && !motionsensor ) then return false end
|
||||
if ( CLIENT && !motionsensor.IsAvailable() ) then return false end
|
||||
if ( !ent:IsRagdoll() ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "motioncontrol_ragdoll", ent ) ) then return false end
|
||||
|
||||
return true
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
--
|
||||
-- Start up the kinect controller. This will freeze the game for a second.
|
||||
--
|
||||
if ( !motionsensor.IsActive() ) then
|
||||
motionsensor.Start()
|
||||
end
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, player )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !self:Filter( ent, player ) ) then return end
|
||||
|
||||
-- Do not spam please!
|
||||
local timeout = playerTimeouts[ player ]
|
||||
if ( timeout && timeout.time > CurTime() ) then
|
||||
if ( !timeout.sentMessage ) then
|
||||
ServerLog( "Player " .. tostring( player ) .. " tried to use 'motioncontrol_ragdoll' property too rapidly!\n" )
|
||||
player:PrintMessage( HUD_PRINTTALK, "Please wait at least 0.2 seconds before trying to control another ragdoll." )
|
||||
timeout.sentMessage = true
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
-- Only 1 controller per ragdoll please!
|
||||
if ( IsValid( ent.MotionSensorController ) ) then
|
||||
ent.MotionSensorController:Remove()
|
||||
end
|
||||
|
||||
local ragdoll_motion = ents.Create( "ragdoll_motion" )
|
||||
ragdoll_motion:SetPos( player:EyePos() + player:EyeAngles():Forward() * 10 )
|
||||
ragdoll_motion:SetAngles( Angle( 0, player:EyeAngles().yaw, 0 ) )
|
||||
ragdoll_motion:SetRagdoll( ent )
|
||||
ragdoll_motion:SetController( player )
|
||||
ragdoll_motion:Spawn()
|
||||
|
||||
undo.Create( "MotionController" )
|
||||
undo.AddEntity( ragdoll_motion )
|
||||
undo.SetPlayer( player )
|
||||
undo.Finish()
|
||||
|
||||
playerTimeouts[ player ] = { time = CurTime() + 0.2, sentMessage = false }
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
82
lua/autorun/properties/npc_scale.lua
Normal file
82
lua/autorun/properties/npc_scale.lua
Normal file
@@ -0,0 +1,82 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
properties.Add( "npc_bigger", {
|
||||
MenuLabel = "#biggify",
|
||||
Order = 1799,
|
||||
MenuIcon = "icon16/magnifier_zoom_in.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !gamemode.Call( "CanProperty", ply, "npc_bigger", ent ) ) then return false end
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( !ent:IsNPC() ) then return false end
|
||||
|
||||
return true
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
ent:SetModelScale( ent:GetModelScale() * 1.25, 1 )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
|
||||
properties.Add( "npc_smaller", {
|
||||
MenuLabel = "#smallify",
|
||||
Order = 1800,
|
||||
MenuIcon = "icon16/magifier_zoom_out.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !gamemode.Call( "CanProperty", ply, "npc_smaller", ent ) ) then return false end
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( !ent:IsNPC() ) then return false end
|
||||
|
||||
return true
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
ent:SetModelScale( ent:GetModelScale() * 0.8, 1 )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
89
lua/autorun/properties/persist.lua
Normal file
89
lua/autorun/properties/persist.lua
Normal file
@@ -0,0 +1,89 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
properties.Add( "persist", {
|
||||
MenuLabel = "#makepersistent",
|
||||
Order = 400,
|
||||
MenuIcon = "icon16/link.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( ent:IsPlayer() ) then return false end
|
||||
if ( GetConVarString( "sbox_persist" ):Trim() == "" ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "persist", ent ) ) then return false end
|
||||
|
||||
return !ent:GetPersistent()
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
-- TODO: Start some kind of animation, take 5 seconds to make something persistent
|
||||
|
||||
ent:SetPersistent( true )
|
||||
--ent:EnableMotion( false )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
|
||||
properties.Add( "persist_end", {
|
||||
MenuLabel = "#stoppersisting",
|
||||
Order = 400,
|
||||
MenuIcon = "icon16/link_break.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( ent:IsPlayer() ) then return false end
|
||||
if ( GetConVarString( "sbox_persist" ):Trim() == "" ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "persist", ent ) ) then return false end
|
||||
|
||||
return ent:GetPersistent()
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
-- TODO: Start some kind of animation, take 5 seconds to make something persistent
|
||||
|
||||
ent:SetPersistent( false )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
67
lua/autorun/properties/remove.lua
Normal file
67
lua/autorun/properties/remove.lua
Normal file
@@ -0,0 +1,67 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
properties.Add( "remove", {
|
||||
MenuLabel = "#remove",
|
||||
Order = 1000,
|
||||
MenuIcon = "icon16/delete.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !gamemode.Call( "CanProperty", ply, "remover", ent ) ) then return false end
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( ent:IsPlayer() ) then return false end
|
||||
|
||||
return true
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
if ( !IsValid( ply ) ) then return end
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
|
||||
-- Don't allow removal of players or objects that cannot be physically targeted by properties
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
-- Remove all constraints (this stops ropes from hanging around)
|
||||
constraint.RemoveAll( ent )
|
||||
|
||||
-- Remove it properly in 1 second
|
||||
timer.Simple( 1, function() if ( IsValid( ent ) ) then ent:Remove() end end )
|
||||
|
||||
-- Make it non solid
|
||||
ent:SetNotSolid( true )
|
||||
ent:SetMoveType( MOVETYPE_NONE )
|
||||
ent:SetNoDraw( true )
|
||||
|
||||
-- Send Effect
|
||||
local ed = EffectData()
|
||||
ed:SetEntity( ent )
|
||||
util.Effect( "entity_remove", ed, true, true )
|
||||
|
||||
ply:SendLua( "achievements.Remover()" )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
85
lua/autorun/properties/skin.lua
Normal file
85
lua/autorun/properties/skin.lua
Normal file
@@ -0,0 +1,85 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
properties.Add( "skin", {
|
||||
MenuLabel = "#skin",
|
||||
Order = 601,
|
||||
MenuIcon = "icon16/picture_edit.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( ent:IsPlayer() ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "skin", ent ) ) then return false end
|
||||
if ( IsValid( ent.AttachedEntity ) ) then ent = ent.AttachedEntity end -- If our ent has an attached entity, we want to modify its skin instead
|
||||
if ( !ent:SkinCount() ) then return false end
|
||||
|
||||
return ent:SkinCount() > 1
|
||||
|
||||
end,
|
||||
|
||||
MenuOpen = function( self, option, ent, tr )
|
||||
|
||||
--
|
||||
-- Add a submenu to our automatically created menu option
|
||||
--
|
||||
local submenu = option:AddSubMenu()
|
||||
|
||||
--
|
||||
-- Create a check item for each skin
|
||||
--
|
||||
local target = IsValid( ent.AttachedEntity ) and ent.AttachedEntity or ent
|
||||
|
||||
local num = target:SkinCount()
|
||||
|
||||
for i = 0, num - 1 do
|
||||
|
||||
local opt = submenu:AddOption( "Skin " .. i )
|
||||
opt:SetRadio( true )
|
||||
opt:SetChecked( target:GetSkin() == i )
|
||||
opt:SetIsCheckable( true )
|
||||
opt.OnChecked = function( s, checked ) if ( checked ) then self:SetSkin( ent, i ) end end
|
||||
|
||||
end
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
-- Nothing - we use SetSkin below
|
||||
|
||||
end,
|
||||
|
||||
SetSkin = function( self, ent, id )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
net.WriteUInt( id, 8 )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
local skinid = net.ReadUInt( 8 )
|
||||
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
ent = IsValid( ent.AttachedEntity ) and ent.AttachedEntity or ent
|
||||
ent:SetSkin( skinid )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
202
lua/autorun/properties/statue.lua
Normal file
202
lua/autorun/properties/statue.lua
Normal file
@@ -0,0 +1,202 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
-- The following is for the server's eyes only
|
||||
local StatueDuplicator
|
||||
if ( SERVER ) then
|
||||
|
||||
function StatueDuplicator( ply, ent, data )
|
||||
|
||||
if ( !data ) then
|
||||
|
||||
duplicator.ClearEntityModifier( ent, "statue_property" )
|
||||
return
|
||||
|
||||
end
|
||||
|
||||
-- We have been pasted from duplicator, restore the necessary variables for the unstatue to work
|
||||
if ( ent.StatueInfo == nil ) then
|
||||
|
||||
-- Ew. Have to wait a frame for the constraints to get pasted
|
||||
timer.Simple( 0, function()
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
|
||||
local bones = ent:GetPhysicsObjectCount()
|
||||
if ( bones < 2 ) then return end
|
||||
|
||||
ent:SetNWBool( "IsStatue", true )
|
||||
ent.StatueInfo = {}
|
||||
|
||||
local con = constraint.FindConstraints( ent, "Weld" )
|
||||
for id, t in pairs( con ) do
|
||||
if ( t.Ent1 != t.Ent2 || t.Ent1 != ent || t.Bone1 != 0 ) then continue end
|
||||
|
||||
ent.StatueInfo[ t.Bone2 ] = t.Constraint
|
||||
end
|
||||
|
||||
local numC = table.Count( ent.StatueInfo )
|
||||
if ( numC < 1 --[[or numC != bones - 1]] ) then duplicator.ClearEntityModifier( ent, "statue_property" ) end
|
||||
end )
|
||||
end
|
||||
|
||||
duplicator.StoreEntityModifier( ent, "statue_property", data )
|
||||
|
||||
end
|
||||
duplicator.RegisterEntityModifier( "statue_property", StatueDuplicator )
|
||||
|
||||
end
|
||||
|
||||
local playerTimeouts = {}
|
||||
|
||||
properties.Add( "statue", {
|
||||
MenuLabel = "#makestatue",
|
||||
Order = 1501,
|
||||
MenuIcon = "icon16/lock.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( ent:GetClass() != "prop_ragdoll" ) then return false end
|
||||
if ( ent:GetNWBool( "IsStatue" ) ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "statue", ent ) ) then return false end
|
||||
return true
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
if ( !IsValid( ply ) ) then return end
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( ent:GetClass() != "prop_ragdoll" ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
-- Do not spam please!
|
||||
local timeout = playerTimeouts[ ply ]
|
||||
if ( timeout && timeout.time > CurTime() ) then
|
||||
if ( !timeout.sentMessage ) then
|
||||
ServerLog( "Player " .. tostring( ply ) .. " tried to use 'statue' property too rapidly!\n" )
|
||||
ply:PrintMessage( HUD_PRINTTALK, "Please wait at least 0.2 seconds before trying to make another ragdoll a statue." )
|
||||
timeout.sentMessage = true
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
local bones = ent:GetPhysicsObjectCount()
|
||||
if ( bones < 2 ) then return end
|
||||
if ( ent.StatueInfo ) then return end
|
||||
|
||||
ent.StatueInfo = {}
|
||||
|
||||
undo.Create( "Statue" )
|
||||
|
||||
for bone = 1, bones - 1 do
|
||||
|
||||
local constr = constraint.Weld( ent, ent, 0, bone, 0 )
|
||||
|
||||
if ( constr ) then
|
||||
|
||||
ent.StatueInfo[ bone ] = constr
|
||||
ply:AddCleanup( "constraints", constr )
|
||||
undo.AddEntity( constr )
|
||||
|
||||
end
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( ent:GetPhysicsObjectNum( bone ):GetPos() )
|
||||
effectdata:SetScale( 1 )
|
||||
effectdata:SetMagnitude( 1 )
|
||||
util.Effect( "GlassImpact", effectdata, true, true )
|
||||
|
||||
end
|
||||
|
||||
ent:SetNWBool( "IsStatue", true )
|
||||
|
||||
undo.AddFunction( function()
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
|
||||
ent:SetNWBool( "IsStatue", false )
|
||||
ent.StatueInfo = nil
|
||||
StatueDuplicator( ply, ent, nil )
|
||||
|
||||
end )
|
||||
|
||||
undo.SetPlayer( ply )
|
||||
undo.Finish()
|
||||
|
||||
StatueDuplicator( ply, ent, {} )
|
||||
|
||||
playerTimeouts[ ply ] = { time = CurTime() + 0.2, sentMessage = false }
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
|
||||
properties.Add( "statue_stop", {
|
||||
MenuLabel = "#unstatue",
|
||||
Order = 1501,
|
||||
MenuIcon = "icon16/lock_open.png",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( ent:GetClass() != "prop_ragdoll" ) then return false end
|
||||
if ( !ent:GetNWBool( "IsStatue" ) ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, "unstatue", ent ) ) then return false end
|
||||
return true
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
if ( !IsValid( ply ) ) then return end
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( ent:GetClass() != "prop_ragdoll" ) then return end
|
||||
|
||||
local bones = ent:GetPhysicsObjectCount()
|
||||
if ( bones < 2 ) then return end
|
||||
if ( !ent.StatueInfo ) then return end
|
||||
|
||||
for k, v in pairs( ent.StatueInfo ) do
|
||||
|
||||
if ( IsValid( v ) ) then
|
||||
v:Remove()
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
ent:SetNWBool( "IsStatue", false )
|
||||
ent.StatueInfo = nil
|
||||
|
||||
StatueDuplicator( ply, ent, nil )
|
||||
|
||||
end
|
||||
|
||||
} )
|
||||
167
lua/autorun/random.lua
Normal file
167
lua/autorun/random.lua
Normal file
@@ -0,0 +1,167 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
local INTENSE_WHITE = Color(255,255,255)
|
||||
local PEPPER_WHITE = Color(243,227,219)
|
||||
local WHITE = Color(240,240,240)
|
||||
local SILVER = Color(183,208,211)
|
||||
local LIGHT_LIGHT_GREY = Color(200,200,200)
|
||||
local LIGHT_GREY = Color(160,160,160)
|
||||
local GREY = Color(120,120,120)
|
||||
local THUNDER_GREY = Color(68,71,77)
|
||||
local DARK_GREY = Color(70,70,70)
|
||||
local BLACK = Color(24,24,24)
|
||||
local VERY_BLACK = Color(0,0,0)
|
||||
|
||||
local RED_RACE = Color(255,37,37)
|
||||
local RED = Color(156,25,25)
|
||||
local INTENSE_RED = Color(255,0,0)
|
||||
local DARK_RED = Color(122,14,14)
|
||||
local BURGUNDY = Color(41,3,3)
|
||||
local PINK = Color(225,14,185)
|
||||
local BEIGE = Color(245,245,220)
|
||||
|
||||
local CREAM = Color(255,255,204)
|
||||
local DARK_CREAM = Color(85,85,62)
|
||||
local YELLOW = Color(225,195,0)
|
||||
local INTENSE_YELLOW = Color(255,255,0)
|
||||
local NEON_YELLOW = Color(195,255,0)
|
||||
local GOLDEN = Color(130,116,24)
|
||||
local ORANGE = Color(229,136,37)
|
||||
local SOLARIS_ORANGE = Color(255,97,0)
|
||||
local INTENSE_ORANGE = Color(255,131,0)
|
||||
|
||||
local GREEN = Color(12,127,12)
|
||||
local DARK_GREEN = Color(22,80,22)
|
||||
local LIME = Color(39,190,52)
|
||||
local EMERALD = Color(21,132,84)
|
||||
local SWAMP = Color(13,61,48)
|
||||
local INTENSE_GREEN = Color(0,255,0)
|
||||
|
||||
local DARK_DARK_BLUE = Color(0,3,15)
|
||||
local DARK_BLUE = Color(13,14,75)
|
||||
local BLUE = Color(10,41,95)
|
||||
local LIGHT_BLUE = Color(3,119,177)
|
||||
local INTENSE_LIGHT_BLUE = Color(0,255,255)
|
||||
local INTENSE_BLUE = Color(0,0,255)
|
||||
local ICE = Color(130,233,238)
|
||||
local ICE2 = Color(0,151,182)
|
||||
local TURQUOISE = Color(45,201,186)
|
||||
|
||||
local PURPLE = Color(54,10,90)
|
||||
local DARK_PURPLE = Color(29,15,59)
|
||||
local MAGENTA = Color(111,25,209)
|
||||
local INTENSE_PURPLE = Color(255,0,255)
|
||||
|
||||
local MIDGET_GREEN = Color(159,203,153)
|
||||
local MIDGET_BLUE = Color(85,163,211)
|
||||
|
||||
local GM_MEDIUM_BLUE = Color(94,115,156)
|
||||
local GM_LIGHT_DRIFTWOOD = Color(169,158,136)
|
||||
local GM_DARK_CARMINE_RED = Color(88,14,12)
|
||||
local GM_NIGHTMIST_AUBURN = Color(75,51,53)
|
||||
local GM_DARK_JADE_GREEN = Color(9,54,60)
|
||||
local GM_TORCH_RED = Color(194,33,26)
|
||||
|
||||
local LIGHT_SADDLE = Color(216,200,188)
|
||||
local MEDIUM_BERRY = Color(99,39,60)
|
||||
local IVORY = Color(223,190,157)
|
||||
local MEDIUM_WILLOW = Color(49,75,87)
|
||||
local LIGHT_WILLOW = Color(135,168,180)
|
||||
local SILVER_FROST = Color(172,186,197)
|
||||
|
||||
CreateConVar( "ctv_selective_color_enabled", 1, FCVAR_ARCHIVE, "", 0, 1)
|
||||
CreateConVar( "ctv_random_skin_enabled", 1, FCVAR_ARCHIVE, "", 0, 1)
|
||||
CreateConVar( "ctv_random_bg_enabled", 1, FCVAR_ARCHIVE, "", 0, 1)
|
||||
CreateConVar( "ctv_usestormfoxtime", 1, FCVAR_ARCHIVE, "", 0, 1)
|
||||
|
||||
local function GetAllSkins(path)
|
||||
local skinss = file.Find("materials/models/ctvehicles/" .. path .. "*.vmt", "GAME")
|
||||
|
||||
for k,v in pairs(skinss) do
|
||||
skinss[k] = tonumber(string.match(skinss[k] , "%d+"))
|
||||
if skinss[k] == nil then skinss[k] = 0 end
|
||||
end
|
||||
return skinss
|
||||
end
|
||||
|
||||
local colors = {["models/ctvehicles/chevrolet/corvette_c8.mdl"]={BLUE, RED, ORANGE, LIGHT_BLUE, WHITE, BLACK, GREY, YELLOW},
|
||||
["models/ctvehicles/bmw/m8_f92.mdl"]={BLUE, BURGUNDY, BLACK, WHITE, RED, EMERALD, ORANGE, LIGHT_GREY, DARK_GREEN},
|
||||
["models/ctvehicles/mclaren/speedtail.mdl"]={ICE, SILVER, LIGHT_GREY, LIGHT_LIGHT_GREY, BLACK, DARK_BLUE, BLUE, RED_RACE, PURPLE, ORANGE},
|
||||
["models/ctvehicles/rolls_royce/cullinan.mdl"]={RED, ORANGE, BLACK, SILVER, GREY, LIGHT_GREY, DARK_GREY, WHITE, BLUE, DARK_BLUE},
|
||||
["models/ctvehicles/alfa_romeo/carabo_concept.mdl"]={INTENSE_PURPLE, MAGENTA, INTENSE_LIGHT_BLUE, INTENSE_BLUE, INTENSE_GREEN, INTENSE_ORANGE, NEON_YELLOW, INTENSE_YELLOW, INTENSE_RED, INTENSE_WHITE},
|
||||
["models/ctvehicles/cadillac/one.mdl"]={VERY_BLACK},
|
||||
["models/ctvehicles/gaz/13.mdl"]={VERY_BLACK, WHITE, RED, CREAM, BLUE},
|
||||
["models/ctvehicles/gaz/13b.mdl"]={VERY_BLACK, WHITE, RED, CREAM, BLUE},
|
||||
["models/ctvehicles/buick/1957_roadmaster.mdl"]={VERY_BLACK, WHITE, RED, CREAM, BLUE, LIGHT_BLUE, BEIGE, TURQUOISE, ORANGE, DARK_BLUE, EMERALD, GREEN},
|
||||
["models/ctvehicles/pontiac/1958_bonneville_coupe.mdl"]={VERY_BLACK, WHITE, RED, CREAM, BLUE, LIGHT_BLUE, BEIGE, TURQUOISE, ORANGE, DARK_BLUE, EMERALD, GREEN},
|
||||
["models/ctvehicles/pontiac/1958_bonneville_convertible.mdl"]={VERY_BLACK, WHITE, RED, CREAM, BLUE, LIGHT_BLUE, BEIGE, TURQUOISE, ORANGE, DARK_BLUE, EMERALD, GREEN},
|
||||
["models/ctvehicles/fallout/station_wagon.mdl"]={VERY_BLACK, WHITE, RED, ICE2, BLUE, YELLOW},
|
||||
["models/ctvehicles/daihatsu/midget_mp5.mdl"]={MIDGET_GREEN, WHITE, MIDGET_BLUE},
|
||||
["models/ctvehicles/chevrolet/colorado_zr2.mdl"]={RED_RACE, RED, GREY, LIGHT_GREY, DARK_GREY, SILVER, WHITE, DARK_BLUE},
|
||||
["models/ctvehicles/mini/hatch_jcw_convertible.mdl"]={TURQUOISE, SWAMP, THUNDER_GREY, SILVER, BLACK, DARK_CREAM, SOLARIS_ORANGE, GREY, DARK_BLUE, RED, DARK_DARK_BLUE, PEPPER_WHITE},
|
||||
["models/ctvehicles/lancia/stratos_zero.mdl"]={SOLARIS_ORANGE, LIGHT_GREY},
|
||||
["models/ctvehicles/chevrolet/impala_2000.mdl"]={LIGHT_LIGHT_GREY, WHITE, GM_MEDIUM_BLUE, DARK_BLUE, GM_LIGHT_DRIFTWOOD, VERY_BLACK, GM_DARK_CARMINE_RED, GM_NIGHTMIST_AUBURN, GM_DARK_JADE_GREEN, GM_TORCH_RED},
|
||||
["models/ctvehicles/ford/crown_vic_1996.mdl"]={LIGHT_SADDLE, MEDIUM_BERRY, DARK_RED, IVORY, MEDIUM_WILLOW, LIGHT_WILLOW, SILVER_FROST, VERY_BLACK, WHITE, DARK_GREY},
|
||||
[""]={},}
|
||||
|
||||
local skins = {["models/ctvehicles/alfa_romeo/carabo_concept.mdl"] = GetAllSkins("alfa_romeo/carabo_concept/skin"),
|
||||
["models/ctvehicles/monster_jam/grave_digger.mdl"] = GetAllSkins("monster_jam/grave_digger/skin"),
|
||||
["models/ctvehicles/cadillac/one.mdl"] = GetAllSkins("cadillac/one/national_flags"),
|
||||
["models/ctvehicles/buick/1957_roadmaster.mdl"] = GetAllSkins("buick/1957_roadmaster/skin"),
|
||||
["models/ctvehicles/pontiac/1958_bonneville_coupe.mdl"] = GetAllSkins("pontiac/1958_bonneville/skin"),
|
||||
["models/ctvehicles/pontiac/1958_bonneville_convertible.mdl"] = GetAllSkins("pontiac/1958_bonneville/skin"),
|
||||
["models/ctvehicles/batman/tumbler.mdl"] = GetAllSkins("batman/tumbler/skin"),
|
||||
["models/ctvehicles/shelby/daytona_coupe.mdl"] = GetAllSkins("shelby/daytona_coupe/skin"),
|
||||
["models/ctvehicles/chevrolet/corvette_c1_1960.mdl"] = GetAllSkins("chevrolet/corvette_c1_1960/skin"),
|
||||
["models/ctvehicles/minecraft/minecart.mdl"] = GetAllSkins("minecraft/minecart/skin"),
|
||||
["models/ctvehicles/spania_gta/spano_2012.mdl"] = GetAllSkins("spania_gta/spano_2012/skin"),
|
||||
["models/ctvehicles/amc/gremlin_x.mdl"] = GetAllSkins("amc/gremlin_x/skin"),
|
||||
["models/ctvehicles/tf2/civilian_limousine.mdl"] = GetAllSkins("tf2/civilian_limousine/skin"),
|
||||
["models/ctvehicles/tf2/civilian_limousine_modified.mdl"] = GetAllSkins("tf2/civilian_limousine_modified/skin"),
|
||||
[""] = GetAllSkins(""),}
|
||||
|
||||
local bodygroups = {["models/ctvehicles/chevrolet/corvette_c8.mdl"] = {0,0,0,0,0,0,0,0,0,2,1,1,0,0,0,1},
|
||||
["models/ctvehicles/monster_jam/grave_digger.mdl"] = {0,0,3},
|
||||
["models/ctvehicles/chevrolet/colorado_zr2.mdl"] = {0,0,0,0,0,1,1,1,1,3,3,5,3},
|
||||
["models/ctvehicles/fleetwood/bounder.mdl"] = {0,0,0,0,1,0,0,0,0,0,0,0,1},
|
||||
["models/ctvehicles/pontiac/1958_bonneville_convertible.mdl"] = {0,1},
|
||||
["models/ctvehicles/chevrolet/impala_2000.mdl"] = {0,0,0,0,0,0,0,1,1,1,1,0,0,3},
|
||||
["models/ctvehicles/amc/gremlin_x.mdl"] = {0,0,0,0,0,0,0,1,1,1,2,3},
|
||||
["models/ctvehicles/ford/crown_vic_1996.mdl"] = {1,1,0,0,0,0,0,0,0,0,0,1,2},
|
||||
["models/ctvehicles/tf2/civilian_limousine.mdl"] = {0,0,0,1},
|
||||
["models/ctvehicles/tf2/civilian_limousine_modified.mdl"] = {0,0,0,1,0,2},
|
||||
[""] = {},}
|
||||
|
||||
if SERVER then
|
||||
local model
|
||||
hook.Add( "PlayerSpawnedVehicle", "CTV_Randomness",
|
||||
function(ply, ent)
|
||||
timer.Simple(.1,
|
||||
function()
|
||||
if IsValid(ent) then
|
||||
model = ent:GetModel()
|
||||
if colors[model] ~= nil and GetConVarNumber("ctv_selective_color_enabled") == 1 then
|
||||
ent:SetColor(colors[model][math.random(#colors[model])])
|
||||
end
|
||||
if skins[model] ~= nil and GetConVarNumber("ctv_random_skin_enabled") == 1 then
|
||||
ent:SetSkin(skins[model][math.random(#skins[model])])
|
||||
end
|
||||
if bodygroups[model] ~= nil and GetConVarNumber("ctv_random_bg_enabled") == 1 then
|
||||
for k, v in pairs(bodygroups[model]) do
|
||||
ent:SetBodygroup(k, math.random(0,v))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
)
|
||||
end
|
||||
)
|
||||
end
|
||||
646
lua/autorun/rb655_ext_props.lua
Normal file
646
lua/autorun/rb655_ext_props.lua
Normal file
@@ -0,0 +1,646 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
local function rb655_property_filter( filtor, ent, ply )
|
||||
if ( type( filtor ) == "string" && filtor != ent:GetClass() ) then return false end
|
||||
if ( type( filtor ) == "table" && !table.HasValue( filtor, ent:GetClass() ) ) then return false end
|
||||
if ( type( filtor ) == "function" && !filtor( ent, ply ) ) then return false end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function AddEntFunctionProperty( name, label, pos, filtor, func, icon )
|
||||
properties.Add( name, {
|
||||
MenuLabel = label,
|
||||
MenuIcon = icon,
|
||||
Order = pos,
|
||||
Filter = function( self, ent, ply )
|
||||
if ( !IsValid( ent ) or !gamemode.Call( "CanProperty", ply, name, ent ) ) then return false end
|
||||
if ( !rb655_property_filter( filtor, ent, ply ) ) then return false end
|
||||
return true
|
||||
end,
|
||||
Action = function( self, ent )
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
end,
|
||||
Receive = function( self, length, ply )
|
||||
local ent = net.ReadEntity()
|
||||
|
||||
if ( !IsValid( ply ) or !IsValid( ent ) or !self:Filter( ent, ply ) ) then return false end
|
||||
|
||||
func( ent, ply )
|
||||
end
|
||||
} )
|
||||
end
|
||||
|
||||
function AddEntFireProperty( name, label, pos, class, input, icon )
|
||||
AddEntFunctionProperty( name, label, pos, class, function( e ) e:Fire( unpack( string.Explode( " ", input ) ) ) end, icon )
|
||||
end
|
||||
|
||||
local ExplodeIcon = "icon16/bomb.png"
|
||||
local EnableIcon = "icon16/tick.png"
|
||||
local DisableIcon = "icon16/cross.png"
|
||||
local ToggleIcon = "icon16/arrow_switch.png"
|
||||
|
||||
if ( SERVER ) then
|
||||
|
||||
local SyncFuncs = {}
|
||||
|
||||
SyncFuncs.prop_door_rotating = function( ent )
|
||||
ent:SetNWBool( "Locked", ent:GetInternalVariable( "m_bLocked" ) )
|
||||
local state = ent:GetInternalVariable( "m_eDoorState" )
|
||||
ent:SetNWBool( "Closed", state == 0 or state == 3 )
|
||||
end
|
||||
SyncFuncs.func_door = function( ent )
|
||||
ent:SetNWBool( "Locked", ent:GetInternalVariable( "m_bLocked" ) )
|
||||
--[[local state = ent:GetInternalVariable( "m_eDoorState" )
|
||||
ent:SetNWBool( "Closed", state == 0 or state == 3 )]]
|
||||
end
|
||||
SyncFuncs.func_door_rotating = function( ent )
|
||||
ent:SetNWBool( "Locked", ent:GetInternalVariable( "m_bLocked" ) )
|
||||
--[[local state = ent:GetInternalVariable( "m_eDoorState" )
|
||||
ent:SetNWBool( "Closed", state == 0 or state == 3 )]]
|
||||
end
|
||||
SyncFuncs.prop_vehicle_jeep = function( ent )
|
||||
ent:SetNWBool( "Locked", ent:GetInternalVariable( "VehicleLocked" ) )
|
||||
ent:SetNWBool( "HasDriver", IsValid( ent:GetDriver() ) )
|
||||
ent:SetNWBool( "m_bRadarEnabled", ent:GetInternalVariable( "m_bRadarEnabled" ) )
|
||||
end
|
||||
SyncFuncs.prop_vehicle_airboat = function( ent )
|
||||
ent:SetNWBool( "Locked", ent:GetInternalVariable( "VehicleLocked" ) )
|
||||
ent:SetNWBool( "HasDriver", IsValid( ent:GetDriver() ) )
|
||||
end
|
||||
--[[SyncFuncs.prop_vehicle_prisoner_pod = function( ent )
|
||||
ent:SetNWBool( "Locked", ent:GetInternalVariable( "VehicleLocked" ) )
|
||||
ent:SetNWBool( "HasDriver", IsValid( ent:GetDriver() ) )
|
||||
end]]
|
||||
SyncFuncs.func_tracktrain = function( ent )
|
||||
ent:SetNWInt( "m_dir", ent:GetInternalVariable( "m_dir" ) )
|
||||
ent:SetNWBool( "m_moving", ent:GetInternalVariable( "speed" ) != 0 )
|
||||
--[[local driver = ent:GetDriver()
|
||||
ent:SetNWBool( "HasDriver", IsValid( driver ) )]]
|
||||
end
|
||||
|
||||
-- Periodically sync server data to clients.
|
||||
local nextSync = 0
|
||||
hook.Add( "Tick", "rb655_propperties_sync", function()
|
||||
if ( CLIENT ) then return end
|
||||
|
||||
if ( nextSync > CurTime() ) then return end
|
||||
nextSync = CurTime() + 1
|
||||
|
||||
for id, ent in pairs( ents.GetAll() ) do -- TODO: Swtich to ents.Iterator at some point!
|
||||
if ( IsValid( ent ) && SyncFuncs[ ent:GetClass() ] ) then
|
||||
SyncFuncs[ ent:GetClass() ]( ent )
|
||||
end
|
||||
end
|
||||
end )
|
||||
|
||||
end
|
||||
|
||||
local e = 0
|
||||
local dissolver
|
||||
function rb655_dissolve( ent )
|
||||
local phys = ent:GetPhysicsObject()
|
||||
if ( IsValid( phys ) ) then phys:EnableGravity( false ) end
|
||||
|
||||
ent:SetName( "rb655_dissolve" .. e )
|
||||
|
||||
if ( !IsValid( dissolver ) ) then
|
||||
dissolver = ents.Create( "env_entity_dissolver" )
|
||||
dissolver:SetPos( ent:GetPos() )
|
||||
dissolver:Spawn()
|
||||
dissolver:Activate()
|
||||
dissolver:SetKeyValue( "magnitude", 100 )
|
||||
dissolver:SetKeyValue( "dissolvetype", 0 )
|
||||
end
|
||||
dissolver:Fire( "Dissolve", "rb655_dissolve" .. e )
|
||||
|
||||
timer.Create( "rb655_ep_cleanupDissolved", 60, 1, function()
|
||||
if ( IsValid( dissolver ) ) then dissolver:Remove() end
|
||||
end )
|
||||
|
||||
e = e + 1
|
||||
end
|
||||
|
||||
-------------------------------------------------- Half - Life 2 Specific --------------------------------------------------
|
||||
|
||||
AddEntFireProperty( "rb655_door_open", "Open", 655, function( ent, ply )
|
||||
if ( !ent:GetNWBool( "Closed" ) && ent:GetClass() == "prop_door_rotating" ) then return false end
|
||||
|
||||
return rb655_property_filter( { "prop_door_rotating", "func_door_rotating", "func_door" }, ent, ply )
|
||||
end, "Open", "icon16/door_open.png" )
|
||||
AddEntFireProperty( "rb655_door_close", "Close", 656, function( ent, ply )
|
||||
if ( ent:GetNWBool( "Closed" ) && ent:GetClass() == "prop_door_rotating" ) then return false end
|
||||
|
||||
return rb655_property_filter( { "prop_door_rotating", "func_door_rotating", "func_door" }, ent, ply )
|
||||
end, "Close", "icon16/door.png" )
|
||||
AddEntFireProperty( "rb655_door_lock", "Lock", 657, function( ent, ply )
|
||||
if ( ent:GetNWBool( "Locked" ) && ent:GetClass() != "prop_vehicle_prisoner_pod" ) then return false end
|
||||
|
||||
return rb655_property_filter( { "prop_door_rotating", "func_door_rotating", "func_door", "prop_vehicle_jeep", "prop_vehicle_airboat", "prop_vehicle_prisoner_pod" }, ent, ply )
|
||||
end, "Lock", "icon16/lock.png" )
|
||||
AddEntFireProperty( "rb655_door_unlock", "Unlock", 658, function( ent, ply )
|
||||
if ( !ent:GetNWBool( "Locked" ) && ent:GetClass() != "prop_vehicle_prisoner_pod" ) then return false end
|
||||
|
||||
return rb655_property_filter( { "prop_door_rotating", "func_door_rotating", "func_door", "prop_vehicle_jeep", "prop_vehicle_airboat", "prop_vehicle_prisoner_pod" }, ent, ply )
|
||||
end, "Unlock", "icon16/lock_open.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_func_movelinear_open", "Start", 655, "func_movelinear", "Open", "icon16/arrow_right.png" )
|
||||
AddEntFireProperty( "rb655_func_movelinear_close", "Return", 656, "func_movelinear", "Close", "icon16/arrow_left.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_func_tracktrain_StartForward", "Start Forward", 655, function( ent, ply )
|
||||
if ( ent:GetNWInt( "m_dir" ) == 1 ) then return false end
|
||||
|
||||
return rb655_property_filter( "func_tracktrain", ent, ply )
|
||||
end, "StartForward", "icon16/arrow_right.png" )
|
||||
AddEntFireProperty( "rb655_func_tracktrain_StartBackward", "Start Backward", 656, function( ent, ply )
|
||||
if ( ent:GetNWInt( "m_dir" ) == -1 ) then return false end
|
||||
|
||||
return rb655_property_filter( "func_tracktrain", ent, ply )
|
||||
end, "StartBackward", "icon16/arrow_left.png" )
|
||||
--AddEntFireProperty( "rb655_func_tracktrain_Reverse", "Reverse", 657, "func_tr2acktrain", "Reverse", "icon16/arrow_undo.png" ) -- Same as two above
|
||||
AddEntFireProperty( "rb655_func_tracktrain_Stop", "Stop", 658, function( ent, ply )
|
||||
if ( !ent:GetNWBool( "m_moving" ) ) then return false end
|
||||
|
||||
return rb655_property_filter( "func_tracktrain", ent, ply )
|
||||
end, "Stop", "icon16/shape_square.png" )
|
||||
AddEntFireProperty( "rb655_func_tracktrain_Resume", "Resume", 659, function( ent, ply )
|
||||
if ( ent:GetNWInt( "m_moving" ) ) then return false end
|
||||
|
||||
return rb655_property_filter( "func_tracktrain", ent, ply )
|
||||
end, "Resume", "icon16/resultset_next.png" )
|
||||
--AddEntFireProperty( "rb655_func_tracktrain_Toggle", "Toggle", 660, "func_track2train", "Toggle", ToggleIcon ) -- Same as two above
|
||||
|
||||
AddEntFireProperty( "rb655_breakable_break", "Break", 655, function( ent, ply )
|
||||
if ( ent:Health() < 1 ) then return false end
|
||||
|
||||
return rb655_property_filter( { "func_breakable", "func_physbox", "prop_physics", "func_pushable" }, ent, ply )
|
||||
end, "Break", ExplodeIcon ) -- Do not include item_item_crate, it insta crashes the server, dunno why.
|
||||
|
||||
AddEntFunctionProperty( "rb655_dissolve", "Disintegrate", 657, function( ent, ply )
|
||||
if ( ent:GetModel() && ent:GetModel():StartWith( "*" ) ) then return false end
|
||||
if ( ent:IsPlayer() ) then return false end
|
||||
|
||||
return true
|
||||
end, function( ent )
|
||||
rb655_dissolve( ent )
|
||||
end, "icon16/wand.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_turret_toggle", "Toggle", 655, { "npc_combine_camera", "npc_turret_ceiling", "npc_turret_floor" }, "Toggle", ToggleIcon )
|
||||
AddEntFireProperty( "rb655_self_destruct", "Self Destruct", 656, { "npc_turret_floor", "npc_helicopter" }, "SelfDestruct", ExplodeIcon )
|
||||
|
||||
AddEntFunctionProperty( "rb655_turret_ammo_remove", "Deplete Ammo", 657, function( ent )
|
||||
if ( bit.band( ent:GetSpawnFlags(), 256 ) == 256 ) then return false end
|
||||
if ( ent:GetClass() == "npc_turret_floor" or ent:GetClass() == "npc_turret_ceiling" ) then return true end
|
||||
return false
|
||||
end, function( ent )
|
||||
ent:SetKeyValue( "spawnflags", bit.bor( ent:GetSpawnFlags(), 256 ) )
|
||||
ent:Activate()
|
||||
end, "icon16/delete.png" )
|
||||
|
||||
AddEntFunctionProperty( "rb655_turret_ammo_restore", "Restore Ammo", 658, function( ent )
|
||||
if ( bit.band( ent:GetSpawnFlags(), 256 ) == 0 ) then return false end
|
||||
if ( ent:GetClass() == "npc_turret_floor" or ent:GetClass() == "npc_turret_ceiling" ) then return true end
|
||||
return false
|
||||
end, function( ent )
|
||||
ent:SetKeyValue( "spawnflags", bit.bxor( ent:GetSpawnFlags(), 256 ) )
|
||||
ent:Activate()
|
||||
end, "icon16/add.png" )
|
||||
|
||||
AddEntFunctionProperty( "rb655_turret_make_friendly", "Make Friendly", 659, function( ent )
|
||||
if ( bit.band( ent:GetSpawnFlags(), 512 ) == 512 ) then return false end
|
||||
if ( ent:GetClass() == "npc_turret_floor" ) then return true end
|
||||
return false
|
||||
end, function( ent )
|
||||
ent:SetKeyValue( "spawnflags", bit.bor( ent:GetSpawnFlags(), SF_FLOOR_TURRET_CITIZEN ) )
|
||||
--ent:SetMaterial( "models/combine_turrets/floor_turret/floor_turret_citizen" )
|
||||
ent:Activate()
|
||||
end, "icon16/user_green.png" )
|
||||
|
||||
AddEntFunctionProperty( "rb655_turret_make_hostile", "Make Hostile", 660, function( ent )
|
||||
if ( bit.band( ent:GetSpawnFlags(), 512 ) == 0 ) then return false end
|
||||
if ( ent:GetClass() == "npc_turret_floor" ) then return true end
|
||||
return false
|
||||
end, function( ent )
|
||||
ent:SetKeyValue( "spawnflags", bit.bxor( ent:GetSpawnFlags(), SF_FLOOR_TURRET_CITIZEN ) )
|
||||
ent:Activate()
|
||||
end, "icon16/user_red.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_suitcharger_recharge", "Recharge", 655, "item_suitcharger", "Recharge", "icon16/arrow_refresh.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_manhack_jam", "Jam", 655, "npc_manhack", "InteractivePowerDown", ExplodeIcon )
|
||||
|
||||
AddEntFireProperty( "rb655_scanner_mineadd", "Equip Mine", 655, "npc_clawscanner", "EquipMine", "icon16/add.png" )
|
||||
AddEntFireProperty( "rb655_scanner_minedeploy", "Deploy Mine", 656, "npc_clawscanner", "DeployMine", "icon16/arrow_down.png" ) -- m_bIsOpen
|
||||
AddEntFireProperty( "rb655_scanner_disable_spotlight", "Disable Spotlight", 658, { "npc_clawscanner", "npc_cscanner" }, "DisableSpotlight", DisableIcon ) -- SpotlightDisabled
|
||||
|
||||
-- AddEntFireProperty( "rb655_dropship_d1", "1", 655, "npc_combinedropship", "DropMines 1", DisableIcon )
|
||||
|
||||
AddEntFireProperty( "rb655_rollermine_selfdestruct", "Self Destruct", 655, "npc_rollermine", "InteractivePowerDown", ExplodeIcon )
|
||||
AddEntFireProperty( "rb655_rollermine_turnoff", "Turn Off", 656, "npc_rollermine", "TurnOff", DisableIcon ) -- m_bTurnedOn
|
||||
AddEntFireProperty( "rb655_rollermine_turnon", "Turn On", 657, "npc_rollermine", "TurnOn", EnableIcon )
|
||||
|
||||
AddEntFireProperty( "rb655_helicopter_gun_on", "Enable Turret", 655, "npc_helicopter", "GunOn", EnableIcon ) -- m_fHelicopterFlags = 1?
|
||||
AddEntFireProperty( "rb655_helicopter_gun_off", "Disable Turret", 656, "npc_helicopter", "GunOff", DisableIcon ) -- m_fHelicopterFlags = 0?
|
||||
AddEntFireProperty( "rb655_helicopter_dropbomb", "Drop Bomb", 657, "npc_helicopter", "DropBomb", "icon16/arrow_down.png" )
|
||||
AddEntFireProperty( "rb655_helicopter_norm_shoot", "Start Normal Shooting", 660, "npc_helicopter", "StartNormalShooting", "icon16/clock.png" ) -- m_nShootingMode = 0
|
||||
AddEntFireProperty( "rb655_helicopter_long_shoot", "Start Long Cycle Shooting", 661, "npc_helicopter", "StartLongCycleShooting", "icon16/clock_red.png" ) -- m_nShootingMode = 1
|
||||
AddEntFireProperty( "rb655_helicopter_deadly_on", "Enable Deadly Shooting", 662, "npc_helicopter", "EnableDeadlyShooting", EnableIcon ) -- m_bDeadlyShooting
|
||||
AddEntFireProperty( "rb655_helicopter_deadly_off", "Disable Deadly Shooting", 663, "npc_helicopter", "DisableDeadlyShooting", DisableIcon )
|
||||
|
||||
AddEntFireProperty( "rb655_gunship_OmniscientOn", "Enable Omniscient", 655, "npc_combinegunship", "OmniscientOn", EnableIcon ) -- m_fOmniscient
|
||||
AddEntFireProperty( "rb655_gunship_OmniscientOff", "Disable Omniscient", 656, "npc_combinegunship", "OmniscientOff", DisableIcon )
|
||||
AddEntFireProperty( "rb655_gunship_BlindfireOn", "Enable Blindfire", 657, "npc_combinegunship", "BlindfireOn", EnableIcon ) -- m_fBlindfire
|
||||
AddEntFireProperty( "rb655_gunship_BlindfireOff", "Disable Blindfire", 658, "npc_combinegunship", "BlindfireOff", DisableIcon )
|
||||
|
||||
AddEntFireProperty( "rb655_alyx_HolsterWeapon", "Holster Weapon", 655, function( ent )
|
||||
if ( !ent:IsNPC() or ent:GetClass() != "npc_alyx" or !IsValid( ent:GetActiveWeapon() ) ) then return false end
|
||||
return true
|
||||
end, "HolsterWeapon", "icon16/gun.png" )
|
||||
AddEntFireProperty( "rb655_alyx_UnholsterWeapon", "Unholster Weapon", 656, "npc_alyx", "UnholsterWeapon", "icon16/gun.png" )
|
||||
AddEntFireProperty( "rb655_alyx_HolsterAndDestroyWeapon", "Holster And Destroy Weapon", 657, function( ent )
|
||||
if ( !ent:IsNPC() or ent:GetClass() != "npc_alyx" or !IsValid( ent:GetActiveWeapon() ) ) then return false end
|
||||
return true
|
||||
end, "HolsterAndDestroyWeapon", "icon16/gun.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_antlion_burrow", "Burrow", 655, { "npc_antlion" , "npc_antlion_worker" }, "BurrowAway", "icon16/arrow_down.png" )
|
||||
AddEntFireProperty( "rb655_barnacle_free", "Free Target", 655, "npc_barnacle", "LetGo", "icon16/heart.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_zombine_suicide", "Suicide", 655, "npc_zombine", "PullGrenade", ExplodeIcon )
|
||||
AddEntFireProperty( "rb655_zombine_sprint", "Sprint", 656, "npc_zombine", "StartSprint", "icon16/flag_blue.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_thumper_enable", "Enable", 655, "prop_thumper", "Enable", EnableIcon ) -- m_bEnabled
|
||||
AddEntFireProperty( "rb655_thumper_disable", "Disable", 656, "prop_thumper", "Disable", DisableIcon )
|
||||
|
||||
AddEntFireProperty( "rb655_dog_fetch_on", "Start Playing Fetch", 655, "npc_dog", "StartCatchThrowBehavior", "icon16/accept.png" ) -- m_bDoCatchThrowBehavior=true
|
||||
AddEntFireProperty( "rb655_dog_fetch_off", "Stop Playing Fetch", 656, "npc_dog", "StopCatchThrowBehavior", "icon16/cancel.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_soldier_look_off", "Enable Blindness", 655, "npc_combine_s", "LookOff", "icon16/user_green.png" )
|
||||
AddEntFireProperty( "rb655_soldier_look_on", "Disable Blindness", 656, "npc_combine_s", "LookOn", "icon16/user_gray.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_citizen_wep_pick_on", "Permit Weapon Upgrade Pickup", 655, "npc_citizen", "EnableWeaponPickup", EnableIcon )
|
||||
AddEntFireProperty( "rb655_citizen_wep_pick_off", "Restrict Weapon Upgrade Pickup", 656, "npc_citizen", "DisableWeaponPickup", DisableIcon )
|
||||
AddEntFireProperty( "rb655_citizen_panic", "Start Panicking", 658, { "npc_citizen", "npc_alyx", "npc_barney" }, "SetReadinessPanic", "icon16/flag_red.png" )
|
||||
AddEntFireProperty( "rb655_citizen_panic_off", "Stop Panicking", 659, { "npc_citizen", "npc_alyx", "npc_barney" }, "SetReadinessHigh", "icon16/flag_green.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_camera_angry", "Make Angry", 656, "npc_combine_camera", "SetAngry", "icon16/flag_red.png" )
|
||||
AddEntFireProperty( "rb655_combine_mine_disarm", "Disarm", 655, "combine_mine", "Disarm", "icon16/wrench.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_hunter_enable", "Enable Shooting", 655, "npc_hunter", "EnableShooting", EnableIcon )
|
||||
AddEntFireProperty( "rb655_hunter_disable", "Disable Shooting", 656, "npc_hunter", "DisableShooting", DisableIcon )
|
||||
|
||||
AddEntFireProperty( "rb655_vortigaunt_enable", "Enable Armor Recharge", 655, "npc_vortigaunt", "EnableArmorRecharge", EnableIcon )
|
||||
AddEntFireProperty( "rb655_vortigaunt_disable", "Disable Armor Recharge", 656, "npc_vortigaunt", "DisableArmorRecharge", DisableIcon )
|
||||
|
||||
AddEntFireProperty( "rb655_antlion_enable", "Enable Jump", 655, { "npc_antlion", "npc_antlion_worker" }, "EnableJump", EnableIcon )
|
||||
AddEntFireProperty( "rb655_antlion_disable", "Disable Jump", 656, { "npc_antlion", "npc_antlion_worker" }, "DisableJump", DisableIcon )
|
||||
AddEntFireProperty( "rb655_antlion_hear", "Hear Bugbait", 657, { "npc_antlion", "npc_antlion_worker" }, "HearBugbait", EnableIcon )
|
||||
AddEntFireProperty( "rb655_antlion_ignore", "Ignore Bugbait", 658, { "npc_antlion", "npc_antlion_worker" }, "IgnoreBugbait", DisableIcon )
|
||||
|
||||
AddEntFireProperty( "rb655_antlion_grub_squash", "Squash", 655, "npc_antlion_grub", "Squash", "icon16/bug.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_antlionguard_bark_on", "Enable Antlion Summon", 655, "npc_antlionguard", "EnableBark", EnableIcon )
|
||||
AddEntFireProperty( "rb655_antlionguard_bark_off", "Disable Antlion Summon", 656, "npc_antlionguard", "DisableBark", DisableIcon )
|
||||
|
||||
AddEntFireProperty( "rb655_headcrab_burrow", "Burrow", 655, "npc_headcrab", "BurrowImmediate", "icon16/arrow_down.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_strider_stand", "Force Stand", 655, "npc_strider", "Stand", "icon16/arrow_up.png" )
|
||||
AddEntFireProperty( "rb655_strider_crouch", "Force Crouch", 656, "npc_strider", "Crouch", "icon16/arrow_down.png" )
|
||||
AddEntFireProperty( "rb655_strider_break", "Destroy", 657, { "npc_strider", "npc_clawscanner", "npc_cscanner" }, "Break", ExplodeIcon )
|
||||
|
||||
-- This just doesn't do anything
|
||||
AddEntFireProperty( "rb655_patrol_on", "Start Patrolling", 660, { "npc_citizen", "npc_combine_s" }, "StartPatrolling", "icon16/flag_green.png" )
|
||||
AddEntFireProperty( "rb655_patrol_off", "Stop Patrolling", 661, { "npc_citizen", "npc_combine_s" }, "StopPatrolling", "icon16/flag_red.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_strider_aggressive_e", "Make More Aggressive", 658, "npc_strider", "EnableAggressiveBehavior", EnableIcon )
|
||||
AddEntFireProperty( "rb655_strider_aggressive_d", "Make Less Aggressive", 659, "npc_strider", "DisableAggressiveBehavior", DisableIcon )
|
||||
|
||||
AddEntFunctionProperty( "rb655_healthcharger_recharge", "Recharge", 655, "item_healthcharger", function( ent )
|
||||
local n = ents.Create( "item_healthcharger" )
|
||||
n:SetPos( ent:GetPos() )
|
||||
n:SetAngles( ent:GetAngles() )
|
||||
n:Spawn()
|
||||
n:Activate()
|
||||
n:EmitSound( "items/suitchargeok1.wav" )
|
||||
|
||||
undo.ReplaceEntity( ent, n )
|
||||
cleanup.ReplaceEntity( ent, n )
|
||||
|
||||
ent:Remove()
|
||||
end, "icon16/arrow_refresh.png" )
|
||||
|
||||
-------------------------------------------------- Vehicles --------------------------------------------------
|
||||
|
||||
AddEntFunctionProperty( "rb655_vehicle_exit", "Kick Driver", 655, function( ent )
|
||||
if ( ent:IsVehicle() && ent:GetNWBool( "HasDriver" ) ) then return true end
|
||||
return false
|
||||
end, function( ent )
|
||||
if ( !IsValid( ent:GetDriver() ) or !ent:GetDriver().ExitVehicle ) then return end
|
||||
ent:GetDriver():ExitVehicle()
|
||||
end, "icon16/car.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_vehicle_radar", "Enable Radar", 655, function( ent )
|
||||
if ( !ent:IsVehicle() or ent:GetClass() != "prop_vehicle_jeep" ) then return false end
|
||||
if ( ent:LookupAttachment( "controlpanel0_ll" ) == 0 ) then return false end -- These two attachments must exist!
|
||||
if ( ent:LookupAttachment( "controlpanel0_ur" ) == 0 ) then return false end
|
||||
if ( ent:GetNWBool( "m_bRadarEnabled", false ) ) then return false end
|
||||
return true
|
||||
end, "EnableRadar", "icon16/application_add.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_vehicle_radar_off", "Disable Radar", 655, function( ent )
|
||||
if ( !ent:IsVehicle() or ent:GetClass() != "prop_vehicle_jeep" ) then return false end
|
||||
-- if ( ent:LookupAttachment( "controlpanel0_ll" ) == 0 ) then return false end -- These two attachments must exist!
|
||||
-- if ( ent:LookupAttachment( "controlpanel0_ur" ) == 0 ) then return false end
|
||||
if ( !ent:GetNWBool( "m_bRadarEnabled", false ) ) then return false end
|
||||
return true
|
||||
end, "DisableRadar", "icon16/application_delete.png" )
|
||||
|
||||
AddEntFunctionProperty( "rb655_vehicle_enter", "Enter Vehicle", 656, function( ent )
|
||||
if ( ent:IsVehicle() && !ent:GetNWBool( "HasDriver" ) ) then return true end
|
||||
return false
|
||||
end, function( ent, ply )
|
||||
ply:ExitVehicle()
|
||||
ply:EnterVehicle( ent )
|
||||
end, "icon16/car.png" )
|
||||
|
||||
AddEntFunctionProperty( "rb655_vehicle_add_gun", "Mount Gun", 657, function( ent )
|
||||
if ( !ent:IsVehicle() ) then return false end
|
||||
if ( ent:GetNWBool( "EnableGun", false ) ) then return false end
|
||||
if ( ent:GetBodygroup( 1 ) == 1 ) then return false end
|
||||
if ( ent:LookupSequence( "aim_all" ) > 0 ) then return true end
|
||||
if ( ent:LookupSequence( "weapon_yaw" ) > 0 && ent:LookupSequence( "weapon_pitch" ) > 0 ) then return true end
|
||||
return false
|
||||
end, function( ent )
|
||||
ent:SetKeyValue( "EnableGun", "1" )
|
||||
ent:Activate()
|
||||
|
||||
ent:SetBodygroup( 1, 1 )
|
||||
|
||||
ent:SetNWBool( "EnableGun", true )
|
||||
end, "icon16/gun.png" )
|
||||
|
||||
-------------------------------------------------- Garry's Mod Specific --------------------------------------------------
|
||||
|
||||
AddEntFunctionProperty( "rb655_baloon_break", "Pop", 655, "gmod_balloon", function( ent, ply )
|
||||
local dmginfo = DamageInfo()
|
||||
dmginfo:SetAttacker( ply )
|
||||
|
||||
ent:OnTakeDamage( dmginfo )
|
||||
end, ExplodeIcon )
|
||||
|
||||
AddEntFunctionProperty( "rb655_dynamite_activate", "Explode", 655, "gmod_dynamite", function( ent, ply )
|
||||
ent:Explode( 0, ply )
|
||||
end, ExplodeIcon )
|
||||
|
||||
-- Emitter
|
||||
AddEntFunctionProperty( "rb655_emitter_on", "Start Emitting", 655, function( ent )
|
||||
if ( ent:GetClass() == "gmod_emitter" && !ent:GetOn() ) then return true end
|
||||
return false
|
||||
end, function( ent, ply )
|
||||
ent:SetOn( true )
|
||||
end, EnableIcon )
|
||||
|
||||
AddEntFunctionProperty( "rb655_emitter_off", "Stop Emitting", 656, function( ent )
|
||||
if ( ent:GetClass() == "gmod_emitter" && ent:GetOn() ) then return true end
|
||||
return false
|
||||
end, function( ent, ply )
|
||||
ent:SetOn( false )
|
||||
end, DisableIcon )
|
||||
|
||||
-- Lamps
|
||||
AddEntFunctionProperty( "rb655_lamp_on", "Enable", 655, function( ent )
|
||||
if ( ent:GetClass() == "gmod_lamp" && !ent:GetOn() ) then return true end
|
||||
return false
|
||||
end, function( ent, ply )
|
||||
ent:Switch( true )
|
||||
end, EnableIcon )
|
||||
|
||||
AddEntFunctionProperty( "rb655_lamp_off", "Disable", 656, function( ent )
|
||||
if ( ent:GetClass() == "gmod_lamp" && ent:GetOn() ) then return true end
|
||||
return false
|
||||
end, function( ent, ply )
|
||||
ent:Switch( false )
|
||||
end, DisableIcon )
|
||||
|
||||
-- Light
|
||||
AddEntFunctionProperty( "rb655_light_on", "Enable", 655, function( ent )
|
||||
if ( ent:GetClass() == "gmod_light" && !ent:GetOn() ) then return true end
|
||||
return false
|
||||
end, function( ent, ply )
|
||||
ent:SetOn( true )
|
||||
end, EnableIcon )
|
||||
|
||||
AddEntFunctionProperty( "rb655_light_off", "Disable", 656, function( ent )
|
||||
if ( ent:GetClass() == "gmod_light" && ent:GetOn() ) then return true end
|
||||
return false
|
||||
end, function( ent, ply )
|
||||
ent:SetOn( false )
|
||||
end, DisableIcon )
|
||||
|
||||
-- No thruster, it is glitchy
|
||||
|
||||
-------------------------------------------------- HL1 Specific --------------------------------------------------
|
||||
|
||||
AddEntFireProperty( "rb655_func_rotating_forward", "Start Forward", 655, "func_rotating", "StartForward", "icon16/arrow_right.png" )
|
||||
AddEntFireProperty( "rb655_func_rotating_backward", "Start Backward", 656, "func_rotating", "StartBackward", "icon16/arrow_left.png" )
|
||||
AddEntFireProperty( "rb655_func_rotating_reverse", "Reverse", 657, "func_rotating", "Reverse", "icon16/arrow_undo.png" )
|
||||
AddEntFireProperty( "rb655_func_rotating_stop", "Stop", 658, "func_rotating", "Stop", "icon16/shape_square.png" )
|
||||
|
||||
AddEntFireProperty( "rb655_func_platrot_up", "Go Up", 655, "func_platrot", "GoUp", "icon16/arrow_up.png" )
|
||||
AddEntFireProperty( "rb655_func_platrot_down", "Go Down", 656, "func_platrot", "GoDown", "icon16/arrow_down.png" )
|
||||
AddEntFireProperty( "rb655_func_platrot_toggle", "Toggle", 657, "func_platrot", "Toggle", ToggleIcon )
|
||||
|
||||
AddEntFireProperty( "rb655_func_train_start", "Start", 655, "func_train", "Start", "icon16/arrow_right.png" )
|
||||
AddEntFireProperty( "rb655_func_train_stop", "Stop", 656, "func_train", "Stop", "icon16/arrow_left.png" )
|
||||
AddEntFireProperty( "rb655_func_train_toggle", "Toggle", 657, "func_train", "Toggle", ToggleIcon )
|
||||
|
||||
-------------------------------------------------- Pickupable Items --------------------------------------------------
|
||||
|
||||
AddEntFunctionProperty( "rb655_item_suit", "Wear", 655, function( ent, ply )
|
||||
if ( ent:GetClass() != "item_suit" ) then return false end
|
||||
if ( !ply:IsSuitEquipped() ) then return true end
|
||||
return false
|
||||
end, function( ent, ply )
|
||||
ent:Remove()
|
||||
ply:EquipSuit()
|
||||
end, "icon16/user_green.png" )
|
||||
|
||||
local CheckFuncs = {}
|
||||
CheckFuncs[ "item_ammo_pistol" ] = function( ply ) return ply:GetAmmoCount( "pistol" ) < 9999 end
|
||||
CheckFuncs[ "item_ammo_pistol_large" ] = function( ply ) return ply:GetAmmoCount( "pistol" ) < 9999 end
|
||||
CheckFuncs[ "item_ammo_smg1" ] = function( ply ) return ply:GetAmmoCount( "smg1" ) < 9999 end
|
||||
CheckFuncs[ "item_ammo_smg1_large" ] = function( ply ) return ply:GetAmmoCount( "smg1" ) < 9999 end
|
||||
CheckFuncs[ "item_ammo_smg1_grenade" ] = function( ply ) return ply:GetAmmoCount( "smg1_grenade" ) < 9999 end
|
||||
CheckFuncs[ "item_ammo_ar2" ] = function( ply ) return ply:GetAmmoCount( "ar2" ) < 9999 end
|
||||
CheckFuncs[ "item_ammo_ar2_large" ] = function( ply ) return ply:GetAmmoCount( "ar2" ) < 9999 end
|
||||
CheckFuncs[ "item_ammo_ar2_altfire" ] = function( ply ) return ply:GetAmmoCount( "AR2AltFire" ) < 9999 end
|
||||
CheckFuncs[ "item_ammo_357" ] = function( ply ) return ply:GetAmmoCount( "357" ) < 9999 end
|
||||
CheckFuncs[ "item_ammo_357_large" ] = function( ply ) return ply:GetAmmoCount( "357" ) < 9999 end
|
||||
CheckFuncs[ "item_ammo_crossbow" ] = function( ply ) return ply:GetAmmoCount( "xbowbolt" ) < 9999 end
|
||||
CheckFuncs[ "item_rpg_round" ] = function( ply ) return ply:GetAmmoCount( "rpg_round" ) < 9999 end
|
||||
CheckFuncs[ "item_box_buckshot" ] = function( ply ) return ply:GetAmmoCount( "buckshot" ) < 9999 end
|
||||
CheckFuncs[ "item_battery" ] = function( ply ) return ply:Armor() < 100 end
|
||||
CheckFuncs[ "item_healthvial" ] = function( ply ) return ply:Health() < 100 end
|
||||
CheckFuncs[ "item_healthkit" ] = function( ply ) return ply:Health() < 100 end
|
||||
CheckFuncs[ "item_grubnugget" ] = function( ply ) return ply:Health() < 100 end
|
||||
|
||||
AddEntFunctionProperty( "rb655_pickupitem", "Pick up", 655, function( ent, ply )
|
||||
if ( !table.HasValue( table.GetKeys( CheckFuncs ), ent:GetClass() ) ) then return false end
|
||||
if ( CheckFuncs[ ent:GetClass() ]( ply ) ) then return true end
|
||||
return false
|
||||
end, function( ent, ply )
|
||||
ply:Give( ent:GetClass() )
|
||||
ent:Remove()
|
||||
end, "icon16/user_green.png" )
|
||||
|
||||
-------------------------------------------------- NPCs --------------------------------------------------
|
||||
|
||||
-- Passive NPCs - You cannot make these hostile or friendly
|
||||
local passive = {
|
||||
"npc_seagull", "npc_crow", "npc_piegon", "monster_cockroach",
|
||||
"npc_dog", "npc_gman", "npc_antlion_grub",
|
||||
-- "monster_scientist", -- Can't attack, but does run away
|
||||
"monster_nihilanth", -- Doesn't attack from spawn menu, so not allowing to change his dispositions
|
||||
"npc_turret_floor" -- Uses a special input for this sort of stuff
|
||||
}
|
||||
|
||||
local friendly = {
|
||||
"npc_monk", "npc_alyx", "npc_barney", "npc_citizen",
|
||||
"npc_turret_floor", "npc_dog", "npc_vortigaunt",
|
||||
"npc_kleiner", "npc_eli", "npc_magnusson", "npc_breen", "npc_mossman", -- They can use SHOTGUNS!
|
||||
"npc_fisherman", -- He sorta can use shotgun
|
||||
"monster_barney", "monster_scientist", "player"
|
||||
}
|
||||
|
||||
local hostile = {
|
||||
"npc_turret_ceiling", "npc_combine_s", "npc_combinegunship", "npc_combinedropship",
|
||||
"npc_cscanner", "npc_clawscanner", "npc_turret_floor", "npc_helicopter", "npc_hunter", "npc_manhack",
|
||||
"npc_stalker", "npc_rollermine", "npc_strider", "npc_metropolice", "npc_turret_ground",
|
||||
"npc_cscanner", "npc_clawscanner", "npc_combine_camera", -- These are friendly to enemies
|
||||
|
||||
"monster_human_assassin", "monster_human_grunt", "monster_turret", "monster_miniturret", "monster_sentry"
|
||||
}
|
||||
|
||||
local monsters = {
|
||||
"npc_antlion", "npc_antlion_worker", "npc_antlionguard", "npc_barnacle", "npc_fastzombie", "npc_fastzombie_torso",
|
||||
"npc_headcrab", "npc_headcrab_fast", "npc_headcrab_black", "npc_headcrab_poison", "npc_poisonzombie", "npc_zombie", "npc_zombie_torso", "npc_zombine",
|
||||
"monster_alien_grunt", "monster_alien_slave", "monster_babycrab", "monster_headcrab", "monster_bigmomma", "monster_bullchicken", "monster_barnacle",
|
||||
"monster_alien_controller", "monster_gargantua", "monster_nihilanth", "monster_snark", "monster_zombie", "monster_tentacle", "monster_houndeye"
|
||||
}
|
||||
|
||||
---------------------------- Functional stuff ----------------------------
|
||||
|
||||
local NPCsThisWorksOn = {}
|
||||
local function RecalcUsableNPCs()
|
||||
-- Not resetting NPCsThisWorksOn as you can't remove classes from the tables below
|
||||
-- Not including passive monsters here, you can't make them hostile or friendly
|
||||
for _, class in pairs( friendly ) do NPCsThisWorksOn[ class ] = true end
|
||||
for _, class in pairs( hostile ) do NPCsThisWorksOn[ class ] = true end
|
||||
for _, class in pairs( monsters ) do NPCsThisWorksOn[ class ] = true end
|
||||
end
|
||||
RecalcUsableNPCs()
|
||||
|
||||
-- For mods
|
||||
function ExtProp_AddPassive( class ) table.insert( passive, class ) end -- Probably shouldn't exist
|
||||
function ExtProp_AddFriendly( class ) table.insert( friendly, class ) RecalcUsableNPCs() end
|
||||
function ExtProp_AddHostile( class ) table.insert( hostile, class ) RecalcUsableNPCs() end
|
||||
function ExtProp_AddMonster( class ) table.insert( monsters, class ) RecalcUsableNPCs() end
|
||||
|
||||
local friendliedNPCs = {}
|
||||
local hostaliziedNPCs = {}
|
||||
local function SetRelationships( ent, tab, status )
|
||||
for id, fnpc in pairs( tab ) do
|
||||
if ( !IsValid( fnpc ) ) then table.remove( tab, id ) continue end
|
||||
fnpc:AddEntityRelationship( ent, status, 999 )
|
||||
ent:AddEntityRelationship( fnpc, status, 999 )
|
||||
end
|
||||
end
|
||||
|
||||
local function Rbt_ProcessOtherNPC( ent )
|
||||
if ( table.HasValue( friendly, ent:GetClass() ) && !table.HasValue( hostaliziedNPCs, ent ) ) then -- It's a friendly that isn't made hostile
|
||||
SetRelationships( ent, friendliedNPCs, D_LI )
|
||||
SetRelationships( ent, hostaliziedNPCs, D_HT )
|
||||
elseif ( table.HasValue( hostile, ent:GetClass() ) && !table.HasValue( friendliedNPCs, ent ) ) then -- It's a hostile that isn't made friendly
|
||||
SetRelationships( ent, friendliedNPCs, D_HT )
|
||||
SetRelationships( ent, hostaliziedNPCs, D_LI )
|
||||
elseif ( table.HasValue( monsters, ent:GetClass() ) && !table.HasValue( friendliedNPCs, ent ) && !table.HasValue( hostaliziedNPCs, ent ) ) then -- It's a monster that isn't made friendly or hostile to the player
|
||||
SetRelationships( ent, friendliedNPCs, D_HT )
|
||||
SetRelationships( ent, hostaliziedNPCs, D_HT )
|
||||
end
|
||||
end
|
||||
|
||||
if ( SERVER ) then
|
||||
hook.Add( "OnEntityCreated", "rb655_properties_friently/hostile", function( ent )
|
||||
if ( ent:IsNPC() ) then Rbt_ProcessOtherNPC( ent ) end
|
||||
end )
|
||||
end
|
||||
|
||||
AddEntFunctionProperty( "rb655_make_friendly", "Make Friendly", 652, function( ent )
|
||||
if ( ent:IsNPC() && !table.HasValue( passive, ent:GetClass() ) && NPCsThisWorksOn[ ent:GetClass() ] ) then return true end
|
||||
return false
|
||||
end, function( ent )
|
||||
table.insert( friendliedNPCs, ent )
|
||||
table.RemoveByValue( hostaliziedNPCs, ent )
|
||||
|
||||
-- Remove the NPC from any squads so the console doesn't spam. TODO: Add a suffix like _friendly instead?
|
||||
ent:Fire( "SetSquad", "" )
|
||||
|
||||
-- Special case for stalkers
|
||||
if ( ent:GetClass() == "npc_stalker" ) then
|
||||
ent:SetSaveValue( "m_iPlayerAggression", 0 )
|
||||
end
|
||||
|
||||
-- Is this even necessary anymore?
|
||||
for id, class in pairs( friendly ) do ent:AddRelationship( class .. " D_LI 999" ) end
|
||||
for id, class in pairs( monsters ) do ent:AddRelationship( class .. " D_HT 999" ) end
|
||||
for id, class in pairs( hostile ) do ent:AddRelationship( class .. " D_HT 999" ) end
|
||||
|
||||
SetRelationships( ent, friendliedNPCs, D_LI )
|
||||
SetRelationships( ent, hostaliziedNPCs, D_HT )
|
||||
|
||||
for id, oent in pairs( ents.GetAll() ) do
|
||||
if ( oent:IsNPC() && oent != ent ) then Rbt_ProcessOtherNPC( oent ) end
|
||||
end
|
||||
|
||||
ent:Activate()
|
||||
end, "icon16/user_green.png" )
|
||||
|
||||
AddEntFunctionProperty( "rb655_make_hostile", "Make Hostile", 653, function( ent )
|
||||
if ( ent:IsNPC() && !table.HasValue( passive, ent:GetClass() ) && NPCsThisWorksOn[ ent:GetClass() ] ) then return true end
|
||||
return false
|
||||
end, function( ent )
|
||||
table.insert( hostaliziedNPCs, ent )
|
||||
table.RemoveByValue( friendliedNPCs, ent )
|
||||
|
||||
-- Remove the NPC from any squads so the console doesn't spam. TODO: Add a suffix like _hostile instead?
|
||||
ent:Fire( "SetSquad", "" )
|
||||
|
||||
-- Special case for stalkers
|
||||
if ( ent:GetClass() == "npc_stalker" ) then
|
||||
ent:SetSaveValue( "m_iPlayerAggression", 1 )
|
||||
end
|
||||
|
||||
-- Is this even necessary anymore?
|
||||
for id, class in pairs( hostile ) do ent:AddRelationship( class .. " D_LI 999" ) end
|
||||
for id, class in pairs( monsters ) do ent:AddRelationship( class .. " D_HT 999" ) end
|
||||
for id, class in pairs( friendly ) do ent:AddRelationship( class .. " D_HT 999" ) end
|
||||
|
||||
SetRelationships( ent, friendliedNPCs, D_HT )
|
||||
SetRelationships( ent, hostaliziedNPCs, D_LI )
|
||||
|
||||
for id, oent in pairs( ents.GetAll() ) do
|
||||
if ( oent:IsNPC() && oent != ent ) then Rbt_ProcessOtherNPC( oent ) end
|
||||
end
|
||||
end, "icon16/user_red.png" )
|
||||
178
lua/autorun/rb655_ext_props_wpn_slct.lua
Normal file
178
lua/autorun/rb655_ext_props_wpn_slct.lua
Normal file
@@ -0,0 +1,178 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
local extraItems = {
|
||||
{ ClassName = "weapon_alyxgun", PrintName = "#weapon_alyxgun", Category = "Half-Life 2", Author = "VALVe", Spawnable = true },
|
||||
{ ClassName = "weapon_oldmanharpoon", PrintName = "#weapon_oldmanharpoon", Category = "Half-Life 2", Author = "VALVe", Spawnable = true },
|
||||
{ ClassName = "weapon_annabelle", PrintName = "#weapon_annabelle", Category = "Half-Life 2", Author = "VALVe", Spawnable = true },
|
||||
{ ClassName = "weapon_citizenpackage", PrintName = "#weapon_citizenpackage", Category = "Half-Life 2", Author = "VALVe", Spawnable = true },
|
||||
{ ClassName = "weapon_citizensuitcase", PrintName = "#weapon_citizensuitcase", Category = "Half-Life 2", Author = "VALVe", Spawnable = true }
|
||||
}
|
||||
|
||||
local function GiveWeapon( ply, ent, args )
|
||||
if ( !args or !args[ 1 ] or !isstring( args[ 1 ] ) ) then return end
|
||||
|
||||
local className = args[ 1 ]
|
||||
|
||||
local swep = list.Get( "Weapon" )[ className ]
|
||||
if ( swep == nil ) then
|
||||
for id, t in pairs( extraItems ) do
|
||||
if ( t.ClassName == className ) then swep = t end
|
||||
end
|
||||
end
|
||||
if ( swep == nil ) then return end
|
||||
|
||||
-- Cannot validate if the player is admin for admin weapons if we got no player object (saves)
|
||||
if ( IsValid( ply ) ) then
|
||||
if ( ( !swep.Spawnable && !ply:IsAdmin() ) or ( swep.AdminOnly && !ply:IsAdmin() ) ) then return end
|
||||
if ( !hook.Run( "PlayerGiveSWEP", ply, className, swep ) ) then return end
|
||||
end
|
||||
|
||||
ent:Give( className )
|
||||
if ( SERVER ) then duplicator.StoreEntityModifier( ent, "rb655_npc_weapon", args ) end
|
||||
end
|
||||
duplicator.RegisterEntityModifier( "rb655_npc_weapon", GiveWeapon )
|
||||
|
||||
local function changeWep( it, ent, wep )
|
||||
it:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
net.WriteString( wep )
|
||||
it:MsgEnd()
|
||||
end
|
||||
|
||||
local nowep = {
|
||||
"cycler", "npc_furniture", "monster_generic",
|
||||
|
||||
-- HL2
|
||||
"npc_seagull", "npc_crow", "npc_piegon", "npc_rollermine", "npc_turret_floor", "npc_stalker", "npc_turret_ground",
|
||||
"npc_combine_camera", "npc_turret_ceiling", "npc_cscanner", "npc_clawscanner", "npc_manhack", "npc_sniper",
|
||||
"npc_combinegunship", "npc_combinedropship", "npc_helicopter", "npc_antlion_worker", "npc_headcrab_black",
|
||||
"npc_hunter", "npc_vortigaunt", "npc_antlion", "npc_antlionguard", "npc_barnacle", "npc_headcrab",
|
||||
"npc_dog", "npc_gman", "npc_antlion_grub", "npc_strider", "npc_fastzombie", "npc_fastzombie_torso",
|
||||
"npc_headcrab_poison", "npc_headcrab_fast", "npc_poisonzombie", "npc_zombie", "npc_zombie_torso", "npc_zombine",
|
||||
|
||||
-- HLS
|
||||
"monster_scientist", "monster_zombie", "monster_headcrab", "class C_AI_BaseNPC", "monster_tentacle",
|
||||
"monster_alien_grunt", "monster_alien_slave", "monster_human_assassin", "monster_babycrab", "monster_bullchicken",
|
||||
"monster_cockroach", "monster_alien_controller", "monster_gargantua", "monster_bigmomma", "monster_human_grunt",
|
||||
"monster_houndeye", "monster_nihilanth", "monster_barney", "monster_snark", "monster_turret", "monster_miniturret", "monster_sentry"
|
||||
}
|
||||
|
||||
AddEntFunctionProperty( "rb655_npc_weapon_strip", "Strip Weapon", 651, function( ent )
|
||||
if ( ent:IsNPC() && IsValid( ent:GetActiveWeapon() ) && !table.HasValue( nowep, ent:GetClass() ) ) then return true end
|
||||
return false
|
||||
end, function( ent )
|
||||
ent:GetActiveWeapon():Remove()
|
||||
end, "icon16/gun.png" )
|
||||
|
||||
properties.Add( "rb655_npc_weapon", {
|
||||
MenuLabel = "Change Weapon (Popup)",
|
||||
MenuIcon = "icon16/gun.png",
|
||||
Order = 650,
|
||||
Filter = function( self, ent, ply )
|
||||
if ( !IsValid( ent ) or !gamemode.Call( "CanProperty", ply, "rb655_npc_weapon", ent ) ) then return false end
|
||||
if ( ent:IsNPC() && !table.HasValue( nowep, ent:GetClass() ) ) then return true end
|
||||
return false
|
||||
end,
|
||||
Action = function( self, ent )
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
|
||||
local frame = vgui.Create( "DFrame" )
|
||||
frame:SetSize( ScrW() / 1.2, ScrH() / 1.1 )
|
||||
frame:SetTitle( "Change weapon of " .. language.GetPhrase( "#" .. ent:GetClass() ) )
|
||||
frame:Center()
|
||||
|
||||
frame:MakePopup()
|
||||
|
||||
frame:SetDraggable( false )
|
||||
|
||||
function frame:Paint( w, h )
|
||||
Derma_DrawBackgroundBlur( self, self.m_fCreateTime )
|
||||
draw.RoundedBox( 0, 0, 0, w, h, Color( 0, 0, 0, 200 ) )
|
||||
end
|
||||
|
||||
local PropPanel = vgui.Create( "ContentContainer", frame )
|
||||
PropPanel:SetTriggerSpawnlistChange( false )
|
||||
PropPanel:Dock( FILL )
|
||||
|
||||
local Categorised = {}
|
||||
|
||||
-- Add the hidden NPC only weapons
|
||||
Categorised[ "Half-Life 2" ] = table.Copy( extraItems )
|
||||
|
||||
for k, weapon in pairs( list.Get( "Weapon" ) ) do
|
||||
if ( !weapon.Spawnable && !weapon.AdminSpawnable ) then continue end
|
||||
|
||||
local cat = weapon.Category or "Other"
|
||||
if ( !isstring( cat ) ) then cat = tostring( cat ) end
|
||||
|
||||
Categorised[ cat ] = Categorised[ cat ] or {}
|
||||
table.insert( Categorised[ cat ], weapon )
|
||||
end
|
||||
|
||||
for CategoryName, v in SortedPairs( Categorised ) do
|
||||
local Header = vgui.Create( "ContentHeader", PropPanel )
|
||||
Header:SetText( CategoryName )
|
||||
PropPanel:Add( Header )
|
||||
|
||||
for k, WeaponTable in SortedPairsByMemberValue( v, "PrintName" ) do
|
||||
if ( WeaponTable.AdminOnly && !LocalPlayer():IsAdmin() ) then continue end
|
||||
|
||||
local icon = vgui.Create( "ContentIcon", PropPanel )
|
||||
icon:SetMaterial( "entities/" .. WeaponTable.ClassName .. ".png" )
|
||||
icon:SetName( WeaponTable.PrintName or "#" .. WeaponTable.ClassName )
|
||||
icon:SetAdminOnly( WeaponTable.AdminOnly or false )
|
||||
|
||||
icon.DoClick = function()
|
||||
changeWep( self, ent, WeaponTable.ClassName )
|
||||
frame:Close()
|
||||
end
|
||||
|
||||
PropPanel:Add( icon )
|
||||
end
|
||||
end
|
||||
|
||||
local WarningThing = vgui.Create( "Panel", frame )
|
||||
WarningThing:SetHeight( 70 )
|
||||
WarningThing:Dock( BOTTOM )
|
||||
WarningThing:DockMargin( 0, 5, 0, 0 )
|
||||
function WarningThing:Paint( w, h )
|
||||
draw.RoundedBox( 0, 0, 0, w, h, Color( 255, 0, 0 ) )
|
||||
end
|
||||
|
||||
local WarningText = vgui.Create( "DLabel", WarningThing )
|
||||
WarningText:Dock( TOP )
|
||||
WarningText:SetHeight( 35 )
|
||||
WarningText:SetContentAlignment( 5 )
|
||||
WarningText:SetTextColor( color_white )
|
||||
WarningText:SetFont( "DermaLarge" )
|
||||
WarningText:SetText( "WARNING! Not all NPCs can use weapons and not all weapons are usable by NPCs." )
|
||||
|
||||
local WarningText2 = vgui.Create( "DLabel", WarningThing )
|
||||
WarningText2:Dock( TOP )
|
||||
WarningText2:SetHeight( 35 )
|
||||
WarningText2:SetContentAlignment( 5 )
|
||||
WarningText2:SetTextColor( color_white )
|
||||
WarningText2:SetFont( "DermaLarge" )
|
||||
WarningText2:SetText( "This is entirely dependent on the Addon the weapon and the NPC are from. This mod cannot change that." )
|
||||
end,
|
||||
Receive = function( self, length, ply )
|
||||
local ent = net.ReadEntity()
|
||||
if ( !IsValid( ent ) ) then return end
|
||||
if ( !ent:IsNPC() or table.HasValue( nowep, ent:GetClass() ) ) then return end
|
||||
|
||||
local wep = net.ReadString()
|
||||
|
||||
GiveWeapon( ply, ent, { wep } )
|
||||
end
|
||||
} )
|
||||
816
lua/autorun/rb655_extended_spawnmenu.lua
Normal file
816
lua/autorun/rb655_extended_spawnmenu.lua
Normal file
@@ -0,0 +1,816 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
if ( SERVER ) then
|
||||
|
||||
util.AddNetworkString( "rb655_playsound" )
|
||||
|
||||
concommand.Add( "rb655_playsound_all", function( ply, cmd, args )
|
||||
if ( !ply:IsSuperAdmin() or !args[ 1 ] or string.Trim( args[ 1 ] ) == "" ) then return end
|
||||
|
||||
net.Start( "rb655_playsound" )
|
||||
net.WriteString( args[ 1 ] or "" )
|
||||
net.Broadcast()
|
||||
end )
|
||||
|
||||
return
|
||||
|
||||
end
|
||||
|
||||
local cl_addTabs = CreateClientConVar( "rb655_create_sm_tabs", "0", true, true )
|
||||
|
||||
--[[local function removeOldTabls()
|
||||
for k, v in pairs( g_SpawnMenu.CreateMenu.Items ) do
|
||||
if (v.Tab:GetText() == language.GetPhrase( "spawnmenu.category.npcs" ) or
|
||||
v.Tab:GetText() == language.GetPhrase( "spawnmenu.category.entities" ) or
|
||||
v.Tab:GetText() == language.GetPhrase( "spawnmenu.category.weapons" ) or
|
||||
v.Tab:GetText() == language.GetPhrase( "spawnmenu.category.vehicles" ) or
|
||||
v.Tab:GetText() == language.GetPhrase( "spawnmenu.category.postprocess" ) ) then
|
||||
g_SpawnMenu.CreateMenu:CloseTab( v.Tab, true )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
hook.Add( "PopulateContent", "rb655_extended_spawnmenu", function( pnlContent, tree, node )
|
||||
removeOldTabls() removeOldTabls() removeOldTabls() -- For some reason it doesn't work with only one call
|
||||
end )]]
|
||||
|
||||
local function getGameList()
|
||||
local games = engine.GetGames()
|
||||
table.insert( games, {
|
||||
title = "All",
|
||||
folder = "GAME",
|
||||
icon = "all",
|
||||
mounted = true
|
||||
} )
|
||||
table.insert( games, {
|
||||
title = "Garry's Mod",
|
||||
folder = "garrysmod",
|
||||
mounted = true
|
||||
} )
|
||||
return games
|
||||
end
|
||||
|
||||
--[[ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ]]
|
||||
|
||||
local theSound = nil
|
||||
|
||||
function rb655_playsound( snd )
|
||||
|
||||
if ( theSound ) then theSound:Stop() end
|
||||
|
||||
theSound = CreateSound( LocalPlayer(), snd )
|
||||
theSound:Play()
|
||||
|
||||
end
|
||||
|
||||
net.Receive( "rb655_playsound", function( len )
|
||||
rb655_playsound( net.ReadString() )
|
||||
end )
|
||||
|
||||
spawnmenu.AddContentType( "sound", function( container, obj )
|
||||
if ( !obj.nicename ) then return end
|
||||
if ( !obj.spawnname ) then return end
|
||||
|
||||
local icon = vgui.Create( "ContentIcon", container )
|
||||
icon:SetContentType( "sound" )
|
||||
icon:SetSpawnName( obj.spawnname )
|
||||
icon:SetName( obj.nicename )
|
||||
icon:SetMaterial( "icon16/sound.png" )
|
||||
|
||||
icon.DoClick = function()
|
||||
rb655_playsound( obj.spawnname )
|
||||
end
|
||||
|
||||
icon.OpenMenu = function( icn )
|
||||
local menu = DermaMenu()
|
||||
menu:AddOption( "#spawnmenu.menu.copy", function() SetClipboardText( obj.spawnname ) end ):SetIcon( "icon16/page_copy.png" )
|
||||
menu:AddOption( "Play on all clients", function() RunConsoleCommand( "rb655_playsound_all", obj.spawnname ) end ):SetIcon( "icon16/sound.png" )
|
||||
menu:AddOption( "Stop all sounds", function() RunConsoleCommand( "stopsound" ) end ):SetIcon( "icon16/sound_mute.png" )
|
||||
menu:AddSpacer()
|
||||
menu:AddOption( "#spawnmenu.menu.delete", function() icn:Remove() hook.Run( "SpawnlistContentChanged", icn ) end ):SetIcon( "icon16/bin_closed.png" )
|
||||
menu:Open()
|
||||
end
|
||||
|
||||
if ( IsValid( container ) ) then
|
||||
container:Add( icon )
|
||||
end
|
||||
|
||||
return icon
|
||||
|
||||
end )
|
||||
|
||||
local function OnSndNodeSelected( self, node, name, path, pathid, icon, ViewPanel, pnlContent )
|
||||
|
||||
ViewPanel:Clear( true )
|
||||
|
||||
local Path = node:GetFolder()
|
||||
|
||||
local files = file.Find( Path .. "/*.wav", node:GetPathID() )
|
||||
files = table.Add( files, file.Find( Path .. "/*.mp3", node:GetPathID() ) )
|
||||
files = table.Add( files, file.Find( Path .. "/*.ogg", node:GetPathID() ) )
|
||||
|
||||
local offset = 0
|
||||
local limit = 512
|
||||
if ( node.offset ) then offset = node.offset or 0 end
|
||||
|
||||
for k, v in pairs( files ) do
|
||||
if ( k > limit + offset ) then
|
||||
if ( !node.Done ) then
|
||||
offset = offset + limit
|
||||
local mats = ( self.Parent or node ):AddNode( ( self.Text or node:GetText() ) .. " (" .. offset .. " - " .. offset + limit .. ")" )
|
||||
mats:SetFolder( node:GetFolder() )
|
||||
mats.Text = self.Text or node:GetText()
|
||||
mats.Parent = self.Parent or node
|
||||
mats:SetPathID( node:GetPathID() )
|
||||
mats:SetIcon( node:GetIcon() )
|
||||
mats.offset = offset
|
||||
mats.OnNodeSelected = function( mats_self, mats_node )
|
||||
OnSndNodeSelected( mats_self, mats_node, mats_self.Text, mats_node:GetFolder(), mats_node:GetPathID(), mats_node:GetIcon(), ViewPanel, pnlContent )
|
||||
end
|
||||
end
|
||||
node.Done = true
|
||||
break end
|
||||
if ( k <= offset ) then continue end
|
||||
|
||||
local p = Path .. "/"
|
||||
if ( string.StartWith( path, "addons/" ) or string.StartWith( path, "download/" ) ) then
|
||||
p = string.sub( p, string.find( p, "/sound/" ) + 1 )
|
||||
end
|
||||
|
||||
p = string.sub( p .. v, 7 )
|
||||
|
||||
spawnmenu.CreateContentIcon( "sound", ViewPanel, { spawnname = p, nicename = string.Trim( v ) } )
|
||||
|
||||
end
|
||||
|
||||
pnlContent:SwitchPanel( ViewPanel )
|
||||
|
||||
end
|
||||
|
||||
local function AddBrowseContentSnd( node, name, icon, path, pathid )
|
||||
|
||||
local ViewPanel = node.ViewPanel
|
||||
local pnlContent = node.pnlContent
|
||||
|
||||
if ( !string.EndsWith( path, "/" ) && string.len( path ) > 1 ) then path = path .. "/" end
|
||||
|
||||
local fi, fo = file.Find( path .. "sound", pathid )
|
||||
if ( !fo && !fi ) then return end
|
||||
|
||||
local sounds = node:AddFolder( name, path .. "sound", pathid, false, false, "*.*" )
|
||||
sounds:SetIcon( icon )
|
||||
|
||||
sounds.OnNodeSelected = function( self, node_sel )
|
||||
OnSndNodeSelected( self, node_sel, name, path, pathid, icon, ViewPanel, pnlContent )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
language.Add( "spawnmenu.category.browsesounds", "Browse Sounds" )
|
||||
|
||||
local function RefreshAddonSounds( browseAddonSounds )
|
||||
for _, addon in SortedPairsByMemberValue( engine.GetAddons(), "title" ) do
|
||||
|
||||
if ( !addon.downloaded ) then continue end
|
||||
if ( !addon.mounted ) then continue end
|
||||
if ( !table.HasValue( select( 2, file.Find( "*", addon.title ) ), "sound" ) ) then continue end
|
||||
|
||||
AddBrowseContentSnd( browseAddonSounds, addon.title, "icon16/bricks.png", "", addon.title )
|
||||
end
|
||||
end
|
||||
local function RefreshGameSounds( browseGameSounds )
|
||||
local games = getGameList()
|
||||
|
||||
for _, game in SortedPairsByMemberValue( games, "title" ) do
|
||||
if ( !game.mounted ) then continue end
|
||||
AddBrowseContentSnd( browseGameSounds, game.title, "games/16/" .. ( game.icon or game.folder ) .. ".png", "", game.folder )
|
||||
end
|
||||
end
|
||||
|
||||
local browseGameSounds
|
||||
local browseAddonSounds
|
||||
hook.Add( "PopulateContent", "SpawnmenuLoadSomeSounds", function( pnlContent, tree, browseNode ) timer.Simple( 0.5, function()
|
||||
|
||||
if ( !IsValid( tree ) or !IsValid( pnlContent ) ) then
|
||||
print( "!!! Extended Spawnmenu: FAILED TO INITALIZE PopulateContent HOOK FOR SOUNDS !!!" )
|
||||
print( "!!! Extended Spawnmenu: FAILED TO INITALIZE PopulateContent HOOK FOR SOUNDS !!!" )
|
||||
print( "!!! Extended Spawnmenu: FAILED TO INITALIZE PopulateContent HOOK FOR SOUNDS !!!" )
|
||||
return
|
||||
end
|
||||
|
||||
local ViewPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
ViewPanel:SetVisible( false )
|
||||
|
||||
local browseSounds = tree:AddNode( "#spawnmenu.category.browsesounds", "icon16/sound.png" )
|
||||
browseSounds.ViewPanel = ViewPanel
|
||||
browseSounds.pnlContent = pnlContent
|
||||
|
||||
--[[ --------------------------------------------------------------------------------------- ]]
|
||||
|
||||
browseAddonSounds = browseSounds:AddNode( "#spawnmenu.category.addons", "icon16/folder_database.png" )
|
||||
browseAddonSounds.ViewPanel = ViewPanel
|
||||
browseAddonSounds.pnlContent = pnlContent
|
||||
|
||||
RefreshAddonSounds( browseAddonSounds )
|
||||
|
||||
--[[ --------------------------------------------------------------------------------------- ]]
|
||||
|
||||
local addon_sounds = {}
|
||||
local _, snd_folders = file.Find( "addons/*", "MOD" )
|
||||
for _, addon in SortedPairs( snd_folders ) do
|
||||
|
||||
if ( !file.IsDir( "addons/" .. addon .. "/sound/", "MOD" ) ) then continue end
|
||||
|
||||
table.insert( addon_sounds, addon )
|
||||
|
||||
end
|
||||
|
||||
local browseLegacySounds = browseSounds:AddNode( "#spawnmenu.category.addonslegacy", "icon16/folder_database.png" )
|
||||
browseLegacySounds.ViewPanel = ViewPanel
|
||||
browseLegacySounds.pnlContent = pnlContent
|
||||
|
||||
for _, addon in SortedPairsByValue( addon_sounds ) do
|
||||
|
||||
AddBrowseContentSnd( browseLegacySounds, addon, "icon16/bricks.png", "addons/" .. addon .. "/", "MOD" )
|
||||
|
||||
end
|
||||
|
||||
--[[ --------------------------------------------------------------------------------------- ]]
|
||||
|
||||
AddBrowseContentSnd( browseSounds, "#spawnmenu.category.downloads", "icon16/folder_database.png", "download/", "MOD" )
|
||||
|
||||
--[[ --------------------------------------------------------------------------------------- ]]
|
||||
|
||||
browseGameSounds = browseSounds:AddNode( "#spawnmenu.category.games", "icon16/folder_database.png" )
|
||||
browseGameSounds.ViewPanel = ViewPanel
|
||||
browseGameSounds.pnlContent = pnlContent
|
||||
|
||||
RefreshGameSounds( browseGameSounds )
|
||||
|
||||
end ) end )
|
||||
|
||||
hook.Add( "GameContentChanged", "ES_RefreshSpawnmenuSounds", function()
|
||||
|
||||
if ( IsValid( browseAddonSounds ) ) then
|
||||
|
||||
-- TODO: Maybe be more advaced and do not delete => recreate all the nodes, only delete nodes for addons that were removed, add only the new ones?
|
||||
browseAddonSounds:Clear()
|
||||
browseAddonSounds.ViewPanel:Clear( true )
|
||||
|
||||
RefreshAddonSounds( browseAddonSounds )
|
||||
|
||||
end
|
||||
|
||||
if ( IsValid( browseGameSounds ) ) then
|
||||
|
||||
-- TODO: Maybe be more advaced and do not delete => recreate all the nodes, only delete nodes for addons that were removed, add only the new ones?
|
||||
browseGameSounds:Clear()
|
||||
browseGameSounds.ViewPanel:Clear( true )
|
||||
|
||||
RefreshGameSounds( browseGameSounds )
|
||||
|
||||
end
|
||||
|
||||
end )
|
||||
|
||||
--[[ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ]]
|
||||
|
||||
local function IsMaterialUsableOnEntities( matPath )
|
||||
-- A png file? No thanks
|
||||
if ( string.GetExtensionFromFilename( matPath ) ) then return false end
|
||||
|
||||
local mat = Material( matPath )
|
||||
if ( !string.find( mat:GetShader(), "LightmappedGeneric" )
|
||||
&& !string.find( mat:GetShader(), "WorldVertexTransition" )
|
||||
&& !string.find( mat:GetShader(), "Spritecard" )
|
||||
&& !string.find( mat:GetShader(), "Water" )
|
||||
&& !string.find( mat:GetShader(), "Cable" )
|
||||
--&& !string.find( mat:GetShader(), "UnlitGeneric" )
|
||||
&& !string.find( mat:GetShader(), "Refract" ) ) then
|
||||
return true
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
local DisplayedWarning = false
|
||||
local function DisplayOneTimeWarning()
|
||||
if ( DisplayedWarning ) then return end
|
||||
DisplayedWarning = true
|
||||
|
||||
Derma_Message( "Please note that not all materials are usable on entities, such as map textures, etc.\nYou can still try though!", "Warning", "OK" )
|
||||
end
|
||||
|
||||
spawnmenu.AddContentType( "material", function( container, obj )
|
||||
if ( !obj.nicename ) then return end
|
||||
if ( !obj.spawnname ) then return end
|
||||
|
||||
local icon = vgui.Create( "ContentIcon", container )
|
||||
icon:SetContentType( "material" )
|
||||
icon:SetSpawnName( obj.spawnname )
|
||||
icon:SetName( obj.nicename )
|
||||
if ( string.GetExtensionFromFilename( obj.spawnname ) == "png" ) then
|
||||
icon:SetMaterial( obj.spawnname )
|
||||
else
|
||||
icon.Image:SetImage( obj.spawnname )
|
||||
end
|
||||
|
||||
icon.DoClick = function()
|
||||
if ( !IsMaterialUsableOnEntities( obj.spawnname ) ) then DisplayOneTimeWarning() end
|
||||
|
||||
RunConsoleCommand( "material_override", obj.spawnname )
|
||||
spawnmenu.ActivateTool( "material" )
|
||||
surface.PlaySound( "garrysmod/ui_click.wav" )
|
||||
end
|
||||
|
||||
icon.OpenMenu = function( icn )
|
||||
local menu = DermaMenu()
|
||||
menu:AddOption( "#spawnmenu.menu.copy", function() SetClipboardText( obj.spawnname ) end ):SetIcon( "icon16/page_copy.png" )
|
||||
|
||||
local str = "Use with Material Tool"
|
||||
if ( !IsMaterialUsableOnEntities( obj.spawnname ) ) then
|
||||
str = "Try to use with Material Tool (Probably won't work)"
|
||||
end
|
||||
menu:AddOption( str, function()
|
||||
RunConsoleCommand( "material_override", obj.spawnname )
|
||||
spawnmenu.ActivateTool( "material" )
|
||||
end ):SetIcon( "icon16/pencil.png" )
|
||||
|
||||
menu:AddSpacer()
|
||||
menu:AddOption( "#spawnmenu.menu.delete", function() icn:Remove() hook.Run( "SpawnlistContentChanged", icn ) end ):SetIcon( "icon16/bin_closed.png" )
|
||||
menu:Open()
|
||||
end
|
||||
|
||||
if ( IsValid( container ) ) then
|
||||
container:Add( icon )
|
||||
end
|
||||
|
||||
return icon
|
||||
|
||||
end )
|
||||
|
||||
local function OnMatNodeSelected( self, node, name, path, pathid, icon, ViewPanel, pnlContent )
|
||||
|
||||
ViewPanel:Clear( true )
|
||||
|
||||
local Path = node:GetFolder()
|
||||
|
||||
local mat_files = file.Find( Path .. "/*.vmt", node:GetPathID() )
|
||||
mat_files = table.Add( mat_files, file.Find( Path .. "/*.png", node:GetPathID() ) )
|
||||
|
||||
local offset = 0
|
||||
local limit = 512
|
||||
if ( node.offset ) then offset = node.offset or 0 end
|
||||
|
||||
for k, v in pairs( mat_files ) do
|
||||
if ( k > limit + offset ) then
|
||||
if ( !node.Done ) then
|
||||
offset = offset + limit
|
||||
local mats = ( self.Parent or node ):AddNode( ( self.Text or node:GetText() ) .. " (" .. offset .. " - " .. offset + limit .. ")" )
|
||||
mats:SetFolder( node:GetFolder() )
|
||||
mats.Text = self.Text or node:GetText()
|
||||
mats.Parent = self.Parent or node
|
||||
mats:SetPathID( node:GetPathID() )
|
||||
mats:SetIcon( node:GetIcon() )
|
||||
mats.offset = offset
|
||||
mats.OnNodeSelected = function( self_mats, node_sel )
|
||||
OnMatNodeSelected( self_mats, node_sel, self_mats.Text, node_sel:GetFolder(), node_sel:GetPathID(), node_sel:GetIcon(), ViewPanel, pnlContent )
|
||||
end
|
||||
end
|
||||
node.Done = true
|
||||
break end
|
||||
if ( k <= offset ) then continue end
|
||||
|
||||
local p = Path .. "/"
|
||||
if ( string.StartWith( path, "addons/" ) or string.StartWith( path, "download/" ) ) then
|
||||
p = string.sub( p, string.find( p, "/materials/" ) + 1 )
|
||||
end
|
||||
|
||||
p = string.sub( p .. v, 11 )
|
||||
|
||||
if ( string.GetExtensionFromFilename( p ) == "vmt" ) then
|
||||
p = string.StripExtension( p )
|
||||
v = string.StripExtension( v )
|
||||
end
|
||||
|
||||
if ( Material( p ):GetShader() == "Spritecard" ) then continue end
|
||||
|
||||
spawnmenu.CreateContentIcon( "material", ViewPanel, { spawnname = p, nicename = v } )
|
||||
end
|
||||
|
||||
pnlContent:SwitchPanel( ViewPanel )
|
||||
|
||||
end
|
||||
|
||||
local function AddBrowseContentMaterial( node, name, icon, path, pathid )
|
||||
|
||||
local ViewPanel = node.ViewPanel
|
||||
local pnlContent = node.pnlContent
|
||||
|
||||
if ( !string.EndsWith( path, "/" ) && string.len( path ) > 1 ) then path = path .. "/" end
|
||||
|
||||
local fi, fo = file.Find( path .. "materials", pathid )
|
||||
if ( !fi && !fo ) then return end
|
||||
|
||||
local materials = node:AddFolder( name, path .. "materials", pathid, false, false, "*.*" )
|
||||
materials:SetIcon( icon )
|
||||
|
||||
materials.OnNodeSelected = function( self, node_sel )
|
||||
OnMatNodeSelected( self, node_sel, name, path, pathid, icon, ViewPanel, pnlContent )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
language.Add( "spawnmenu.category.browsematerials", "Browse Materials" )
|
||||
|
||||
local function RefreshAddonMaterials( node )
|
||||
for _, addon in SortedPairsByMemberValue( engine.GetAddons(), "title" ) do
|
||||
|
||||
if ( !addon.downloaded ) then continue end
|
||||
if ( !addon.mounted ) then continue end
|
||||
if ( !table.HasValue( select( 2, file.Find( "*", addon.title ) ), "materials" ) ) then continue end
|
||||
|
||||
AddBrowseContentMaterial( node, addon.title, "icon16/bricks.png", "", addon.title )
|
||||
|
||||
end
|
||||
end
|
||||
local function RefreshGameMaterials( node )
|
||||
local games = getGameList()
|
||||
|
||||
for _, game in SortedPairsByMemberValue( games, "title" ) do
|
||||
if ( !game.mounted ) then continue end
|
||||
AddBrowseContentMaterial( node, game.title, "games/16/" .. ( game.icon or game.folder ) .. ".png", "", game.folder )
|
||||
end
|
||||
end
|
||||
|
||||
local browseAddonMaterials
|
||||
local browseGameMaterials
|
||||
hook.Add( "PopulateContent", "SpawnmenuLoadSomeMaterials", function( pnlContent, tree, browseNode ) timer.Simple( 0.5, function()
|
||||
|
||||
if ( !IsValid( tree ) or !IsValid( pnlContent ) ) then
|
||||
print( "!!! Extended Spawnmenu: FAILED TO INITALIZE PopulateContent HOOK FOR MATERIALS!!!" )
|
||||
print( "!!! Extended Spawnmenu: FAILED TO INITALIZE PopulateContent HOOK FOR MATERIALS!!!" )
|
||||
print( "!!! Extended Spawnmenu: FAILED TO INITALIZE PopulateContent HOOK FOR MATERIALS!!!" )
|
||||
return
|
||||
end
|
||||
|
||||
local ViewPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
ViewPanel:SetVisible( false )
|
||||
|
||||
local browseMaterials = tree:AddNode( "#spawnmenu.category.browsematerials", "icon16/picture_empty.png" )
|
||||
browseMaterials.ViewPanel = ViewPanel
|
||||
browseMaterials.pnlContent = pnlContent
|
||||
|
||||
--[[ --------------------------------------------------------------------------------------- ]]
|
||||
|
||||
browseAddonMaterials = browseMaterials:AddNode( "#spawnmenu.category.addons", "icon16/folder_database.png" )
|
||||
browseAddonMaterials.ViewPanel = ViewPanel
|
||||
browseAddonMaterials.pnlContent = pnlContent
|
||||
|
||||
RefreshAddonMaterials( browseAddonMaterials )
|
||||
|
||||
--[[ --------------------------------------------------------------------------------------- ]]
|
||||
|
||||
local addon_mats = {}
|
||||
local _, mat_folders = file.Find( "addons/*", "MOD" )
|
||||
for _, addon in SortedPairs( mat_folders ) do
|
||||
|
||||
if ( !file.IsDir( "addons/" .. addon .. "/materials/", "MOD" ) ) then continue end
|
||||
|
||||
table.insert( addon_mats, addon )
|
||||
|
||||
end
|
||||
|
||||
local browseLegacyMaterials = browseMaterials:AddNode( "#spawnmenu.category.addonslegacy", "icon16/folder_database.png" )
|
||||
browseLegacyMaterials.ViewPanel = ViewPanel
|
||||
browseLegacyMaterials.pnlContent = pnlContent
|
||||
|
||||
for _, addon in SortedPairsByValue( addon_mats ) do
|
||||
|
||||
AddBrowseContentMaterial( browseLegacyMaterials, addon, "icon16/bricks.png", "addons/" .. addon .. "/", "MOD" )
|
||||
|
||||
end
|
||||
|
||||
--[[ --------------------------------------------------------------------------------------- ]]
|
||||
|
||||
AddBrowseContentMaterial( browseMaterials, "#spawnmenu.category.downloads", "icon16/folder_database.png", "download/", "MOD" )
|
||||
|
||||
--[[ --------------------------------------------------------------------------------------- ]]
|
||||
|
||||
browseGameMaterials = browseMaterials:AddNode( "#spawnmenu.category.games", "icon16/folder_database.png" )
|
||||
browseGameMaterials.ViewPanel = ViewPanel
|
||||
browseGameMaterials.pnlContent = pnlContent
|
||||
|
||||
RefreshGameMaterials( browseGameMaterials )
|
||||
|
||||
end ) end )
|
||||
|
||||
hook.Add( "GameContentChanged", "ES_RefreshSpawnmenuMaterials", function()
|
||||
|
||||
if ( IsValid( browseAddonMaterials ) ) then
|
||||
|
||||
-- TODO: Maybe be more advaced and do not delete => recreate all the nodes, only delete nodes for addons that were removed, add only the new ones?
|
||||
browseAddonMaterials:Clear()
|
||||
browseAddonMaterials.ViewPanel:Clear( true )
|
||||
|
||||
RefreshAddonMaterials( browseAddonMaterials )
|
||||
|
||||
end
|
||||
|
||||
if ( IsValid( browseGameMaterials ) ) then
|
||||
|
||||
-- TODO: Maybe be more advaced and do not delete => recreate all the nodes, only delete nodes for addons that were removed, add only the new ones?
|
||||
browseGameMaterials:Clear()
|
||||
browseGameMaterials.ViewPanel:Clear( true )
|
||||
|
||||
RefreshGameMaterials( browseGameMaterials )
|
||||
|
||||
end
|
||||
|
||||
end )
|
||||
|
||||
--[[ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ]]
|
||||
--[[ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ]]
|
||||
--[[ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ]]
|
||||
--[[ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ]]
|
||||
--[[ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ]]
|
||||
|
||||
hook.Add( "PopulateContent", "rb655_extended_spawnmenu_entities", function( pnlContent, tree, node )
|
||||
if ( !cl_addTabs:GetBool() ) then return end
|
||||
|
||||
local node_w = tree:AddNode( "#spawnmenu.category.entities", "icon16/bricks.png" )
|
||||
|
||||
node_w.PropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
node_w.PropPanel:SetVisible( false )
|
||||
|
||||
function node_w:DoClick()
|
||||
pnlContent:SwitchPanel( self.PropPanel )
|
||||
end
|
||||
|
||||
local Categorised = {}
|
||||
|
||||
local SpawnableEntities = list.Get( "SpawnableEntities" )
|
||||
if ( SpawnableEntities ) then
|
||||
for k, v in pairs( SpawnableEntities ) do
|
||||
v.Category = v.Category or "Other"
|
||||
Categorised[ v.Category ] = Categorised[ v.Category ] or {}
|
||||
table.insert( Categorised[ v.Category ], v )
|
||||
end
|
||||
end
|
||||
|
||||
for CategoryName, v in SortedPairs( Categorised ) do
|
||||
|
||||
local node_new = node_w:AddNode( CategoryName, "icon16/bricks.png" )
|
||||
|
||||
local CatPropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
CatPropPanel:SetVisible( false )
|
||||
|
||||
local Header = vgui.Create("ContentHeader", node_w.PropPanel )
|
||||
Header:SetText( CategoryName )
|
||||
node_w.PropPanel:Add( Header )
|
||||
|
||||
for k, ent in SortedPairsByMemberValue( v, "PrintName" ) do
|
||||
local t = {
|
||||
nicename = ent.PrintName or ent.ClassName,
|
||||
spawnname = ent.ClassName,
|
||||
material = "entities/" .. ent.ClassName .. ".png",
|
||||
admin = ent.AdminOnly
|
||||
}
|
||||
spawnmenu.CreateContentIcon( ent.ScriptedEntityType or "entity", CatPropPanel, t )
|
||||
spawnmenu.CreateContentIcon( ent.ScriptedEntityType or "entity", node_w.PropPanel, t )
|
||||
end
|
||||
|
||||
function node_new:DoClick()
|
||||
pnlContent:SwitchPanel( CatPropPanel )
|
||||
end
|
||||
|
||||
end
|
||||
end )
|
||||
|
||||
hook.Add( "PopulateContent", "rb655_extended_spawnmenu_post_processing", function( pnlContent, tree, node )
|
||||
if ( !cl_addTabs:GetBool() ) then return end
|
||||
|
||||
local node_w = tree:AddNode( "#spawnmenu.category.postprocess", "icon16/picture.png" )
|
||||
|
||||
node_w.PropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
node_w.PropPanel:SetVisible( false )
|
||||
|
||||
function node_w:DoClick()
|
||||
pnlContent:SwitchPanel( self.PropPanel )
|
||||
end
|
||||
|
||||
-- Get the table
|
||||
|
||||
local Categorised = {}
|
||||
local PostProcess = list.Get( "PostProcess" )
|
||||
|
||||
if ( PostProcess ) then
|
||||
for k, v in pairs( PostProcess ) do
|
||||
v.category = v.category or "Other"
|
||||
v.name = k
|
||||
Categorised[ v.category ] = Categorised[ v.category ] or {}
|
||||
table.insert( Categorised[ v.category ], v )
|
||||
end
|
||||
end
|
||||
|
||||
-- Put table into panels
|
||||
for CategoryName, v in SortedPairs( Categorised ) do
|
||||
|
||||
local node_new = node_w:AddNode( CategoryName, "icon16/picture.png" )
|
||||
|
||||
local CatPropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
CatPropPanel:SetVisible( false )
|
||||
|
||||
local Header = vgui.Create( "ContentHeader", node_w.PropPanel )
|
||||
Header:SetText( CategoryName )
|
||||
node_w.PropPanel:Add( Header )
|
||||
|
||||
for k, pp in SortedPairsByMemberValue( v, "PrintName" ) do
|
||||
if ( pp.func ) then pp.func( CatPropPanel ) pp.func( node_w.PropPanel ) continue end
|
||||
|
||||
local t = {
|
||||
name = pp.name,
|
||||
icon = pp.icon
|
||||
}
|
||||
|
||||
spawnmenu.CreateContentIcon( "postprocess", CatPropPanel, t )
|
||||
spawnmenu.CreateContentIcon( "postprocess", node_w.PropPanel, t )
|
||||
end
|
||||
|
||||
function node_new:DoClick()
|
||||
pnlContent:SwitchPanel( CatPropPanel )
|
||||
end
|
||||
end
|
||||
|
||||
end )
|
||||
|
||||
hook.Add( "PopulateContent", "rb655_extended_spawnmenu_npcs", function( pnlContent, tree, node )
|
||||
if ( !cl_addTabs:GetBool() ) then return end
|
||||
|
||||
local node_w = tree:AddNode( "#spawnmenu.category.npcs", "icon16/monkey.png" )
|
||||
|
||||
node_w.PropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
node_w.PropPanel:SetVisible( false )
|
||||
|
||||
function node_w:DoClick()
|
||||
pnlContent:SwitchPanel( self.PropPanel )
|
||||
end
|
||||
|
||||
local NPCList = list.Get( "NPC" )
|
||||
local Categories = {}
|
||||
|
||||
for k, v in pairs( NPCList ) do
|
||||
local Category = v.Category or "Other"
|
||||
local Tab = Categories[ Category ] or {}
|
||||
|
||||
Tab[ k ] = v
|
||||
|
||||
Categories[ Category ] = Tab
|
||||
end
|
||||
|
||||
for CategoryName, v in SortedPairs( Categories ) do
|
||||
|
||||
local node_new = node_w:AddNode( CategoryName, "icon16/monkey.png" )
|
||||
|
||||
local CatPropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
CatPropPanel:SetVisible( false )
|
||||
|
||||
local Header = vgui.Create("ContentHeader", node_w.PropPanel )
|
||||
Header:SetText( CategoryName )
|
||||
node_w.PropPanel:Add( Header )
|
||||
|
||||
for name, ent in SortedPairsByMemberValue( v, "Name" ) do
|
||||
local t = {
|
||||
nicename = ent.Name or name,
|
||||
spawnname = name,
|
||||
material = "entities/" .. name .. ".png",
|
||||
weapon = ent.Weapons,
|
||||
admin = ent.AdminOnly
|
||||
}
|
||||
spawnmenu.CreateContentIcon( "npc", CatPropPanel, t )
|
||||
spawnmenu.CreateContentIcon( "npc", node_w.PropPanel, t )
|
||||
end
|
||||
|
||||
function node_new:DoClick()
|
||||
pnlContent:SwitchPanel( CatPropPanel )
|
||||
end
|
||||
|
||||
end
|
||||
end )
|
||||
|
||||
hook.Add( "PopulateContent", "rb655_extended_spawnmenu_vehicles", function( pnlContent, tree, node )
|
||||
if ( !cl_addTabs:GetBool() ) then return end
|
||||
|
||||
local node_w = tree:AddNode( "#spawnmenu.category.vehicles", "icon16/car.png" )
|
||||
|
||||
node_w.PropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
node_w.PropPanel:SetVisible( false )
|
||||
|
||||
function node_w:DoClick()
|
||||
pnlContent:SwitchPanel( self.PropPanel )
|
||||
end
|
||||
|
||||
local Categorised = {}
|
||||
local Vehicles = list.Get( "Vehicles" )
|
||||
if ( Vehicles ) then
|
||||
for k, v in pairs( Vehicles ) do
|
||||
v.Category = v.Category or "Other"
|
||||
Categorised[ v.Category ] = Categorised[ v.Category ] or {}
|
||||
v.ClassName = k
|
||||
v.PrintName = v.Name
|
||||
v.ScriptedEntityType = "vehicle"
|
||||
table.insert( Categorised[ v.Category ], v )
|
||||
end
|
||||
end
|
||||
|
||||
for CategoryName, v in SortedPairs( Categorised ) do
|
||||
|
||||
local node_new = node_w:AddNode( CategoryName, "icon16/car.png" )
|
||||
|
||||
local CatPropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
CatPropPanel:SetVisible( false )
|
||||
|
||||
local Header = vgui.Create("ContentHeader", node_w.PropPanel )
|
||||
Header:SetText( CategoryName )
|
||||
node_w.PropPanel:Add( Header )
|
||||
|
||||
for k, ent in SortedPairsByMemberValue( v, "PrintName" ) do
|
||||
local t = {
|
||||
nicename = ent.PrintName or ent.ClassName,
|
||||
spawnname = ent.ClassName,
|
||||
material = "entities/" .. ent.ClassName .. ".png",
|
||||
admin = ent.AdminOnly
|
||||
}
|
||||
spawnmenu.CreateContentIcon( ent.ScriptedEntityType or "entity", node_w.PropPanel, t )
|
||||
spawnmenu.CreateContentIcon( ent.ScriptedEntityType or "entity", CatPropPanel, t )
|
||||
end
|
||||
|
||||
function node_new:DoClick()
|
||||
pnlContent:SwitchPanel( CatPropPanel )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end )
|
||||
|
||||
hook.Add( "PopulateContent", "rb655_extended_spawnmenu_weapons", function( pnlContent, tree, node )
|
||||
if ( !cl_addTabs:GetBool() ) then return end
|
||||
|
||||
local node_w = tree:AddNode( "#spawnmenu.category.weapons", "icon16/gun.png" )
|
||||
|
||||
node_w.PropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
node_w.PropPanel:SetVisible( false )
|
||||
|
||||
function node_w:DoClick()
|
||||
pnlContent:SwitchPanel( self.PropPanel )
|
||||
end
|
||||
|
||||
local Weapons = list.Get( "Weapon" )
|
||||
local Categorised = {}
|
||||
|
||||
for k, weapon in pairs( Weapons ) do
|
||||
if ( !weapon.Spawnable && !weapon.AdminSpawnable ) then continue end
|
||||
|
||||
Categorised[ weapon.Category ] = Categorised[ weapon.Category ] or {}
|
||||
table.insert( Categorised[ weapon.Category ], weapon )
|
||||
end
|
||||
|
||||
for CategoryName, v in SortedPairs( Categorised ) do
|
||||
local node_new = node_w:AddNode( CategoryName, "icon16/gun.png" )
|
||||
|
||||
local CatPropPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
CatPropPanel:SetVisible( false )
|
||||
|
||||
local Header = vgui.Create("ContentHeader", node_w.PropPanel )
|
||||
Header:SetText( CategoryName )
|
||||
node_w.PropPanel:Add( Header )
|
||||
|
||||
for k, ent in SortedPairsByMemberValue( v, "PrintName" ) do
|
||||
local t = {
|
||||
nicename = ent.PrintName or ent.ClassName,
|
||||
spawnname = ent.ClassName,
|
||||
material = "entities/" .. ent.ClassName .. ".png",
|
||||
admin = ent.AdminOnly
|
||||
}
|
||||
spawnmenu.CreateContentIcon( ent.ScriptedEntityType or "weapon", CatPropPanel, t )
|
||||
spawnmenu.CreateContentIcon( ent.ScriptedEntityType or "weapon", node_w.PropPanel, t )
|
||||
end
|
||||
|
||||
function node_new:DoClick()
|
||||
pnlContent:SwitchPanel( CatPropPanel )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end )
|
||||
456
lua/autorun/rb655_legacy_addon_props.lua
Normal file
456
lua/autorun/rb655_legacy_addon_props.lua
Normal file
@@ -0,0 +1,456 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
if ( SERVER ) then return end
|
||||
|
||||
language.Add( "spawnmenu.category.addonslegacy", "Addons - Legacy" )
|
||||
language.Add( "spawnmenu.category.downloads", "Downloads" )
|
||||
|
||||
local function AddRecursive( pnl, folder )
|
||||
local files, folders = file.Find( folder .. "*", "MOD" )
|
||||
|
||||
for k, v in pairs( files or {} ) do
|
||||
if ( !string.EndsWith( v, ".mdl" ) ) then continue end
|
||||
|
||||
local cp = spawnmenu.GetContentType( "model" )
|
||||
if ( cp ) then
|
||||
local mdl = folder .. v
|
||||
mdl = string.sub( mdl, string.find( mdl, "models/" ), string.len( mdl ) )
|
||||
mdl = string.gsub( mdl, "models/models/", "models/" )
|
||||
cp( pnl, { model = mdl } )
|
||||
end
|
||||
end
|
||||
|
||||
for k, v in pairs( folders or {} ) do AddRecursive( pnl, folder .. v .. "/" ) end
|
||||
end
|
||||
|
||||
local function CountRecursive( folder )
|
||||
local files, folders = file.Find( folder .. "*", "MOD" )
|
||||
local val = 0
|
||||
|
||||
for k, v in pairs( files or {} ) do if ( string.EndsWith( v, ".mdl" ) ) then val = val + 1 end end
|
||||
for k, v in pairs( folders or {} ) do val = val + CountRecursive( folder .. v .. "/" ) end
|
||||
return val
|
||||
end
|
||||
|
||||
hook.Add( "PopulateContent", "LegacyAddonProps", function( pnlContent, tree, node )
|
||||
|
||||
if ( !IsValid( node ) or !IsValid( pnlContent ) ) then
|
||||
print( "!!! Extended Spawnmenu: FAILED TO INITALIZE PopulateContent HOOK FOR LEGACY ADDONS!!!" )
|
||||
print( "!!! Extended Spawnmenu: FAILED TO INITALIZE PopulateContent HOOK FOR LEGACY ADDONS!!!" )
|
||||
print( "!!! Extended Spawnmenu: FAILED TO INITALIZE PopulateContent HOOK FOR LEGACY ADDONS!!!" )
|
||||
return
|
||||
end
|
||||
|
||||
local ViewPanel = vgui.Create( "ContentContainer", pnlContent )
|
||||
ViewPanel:SetVisible( false )
|
||||
|
||||
local addons = {}
|
||||
|
||||
local _files, folders = file.Find( "addons/*", "MOD" )
|
||||
for _, f in pairs( folders ) do
|
||||
|
||||
if ( !file.IsDir( "addons/" .. f .. "/models/", "MOD" ) ) then continue end
|
||||
|
||||
local count = CountRecursive( "addons/" .. f .. "/models/", "MOD" )
|
||||
if ( count == 0 ) then continue end
|
||||
|
||||
table.insert( addons, {
|
||||
name = f,
|
||||
count = count,
|
||||
path = "addons/" .. f .. "/models/"
|
||||
} )
|
||||
|
||||
end
|
||||
|
||||
local LegacyAddons = node:AddNode( "#spawnmenu.category.addonslegacy", "icon16/folder_database.png" )
|
||||
for _, f in SortedPairsByMemberValue( addons, "name" ) do
|
||||
|
||||
local models = LegacyAddons:AddNode( f.name .. " (" .. f.count .. ")", "icon16/bricks.png" )
|
||||
models.DoClick = function()
|
||||
ViewPanel:Clear( true )
|
||||
AddRecursive( ViewPanel, f.path )
|
||||
pnlContent:SwitchPanel( ViewPanel )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
--[[ -------------------------- DOWNLOADS -------------------------- ]]
|
||||
|
||||
local fi, fo = file.Find( "download/models", "MOD" )
|
||||
if ( !fi && !fo ) then return end
|
||||
|
||||
local Downloads = node:AddFolder( "#spawnmenu.category.downloads", "download/models", "MOD", false, false, "*.*" )
|
||||
Downloads:SetIcon( "icon16/folder_database.png" )
|
||||
|
||||
Downloads.OnNodeSelected = function( self, selectedNode )
|
||||
ViewPanel:Clear( true )
|
||||
|
||||
local path = selectedNode:GetFolder()
|
||||
|
||||
if ( !string.EndsWith( path, "/" ) && string.len( path ) > 1 ) then path = path .. "/" end
|
||||
local path_mdl = string.sub( path, string.find( path, "/models/" ) + 1 )
|
||||
|
||||
for k, v in pairs( file.Find( path .. "/*.mdl", selectedNode:GetPathID() ) ) do
|
||||
|
||||
local cp = spawnmenu.GetContentType( "model" )
|
||||
if ( cp ) then
|
||||
cp( ViewPanel, { model = path_mdl .. "/" .. v } )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
pnlContent:SwitchPanel( ViewPanel )
|
||||
end
|
||||
|
||||
end )
|
||||
|
||||
--[[ -------------------------------------------------------------------------- The addon info -------------------------------------------------------------------------- ]]
|
||||
|
||||
concommand.Add( "extsm_addoninfo", function()
|
||||
local frame = vgui.Create( "DFrame" )
|
||||
frame:SetSize( ScrW() - 100, ScrH() - 100 )
|
||||
frame:Center()
|
||||
frame:MakePopup()
|
||||
|
||||
local sp = frame:Add( "DScrollPanel" )
|
||||
sp:Dock( FILL )
|
||||
|
||||
sp:Add( "rb655_addonInfo" )
|
||||
end )
|
||||
|
||||
hook.Add( "AddToolMenuCategories", "LegacyAddonPropsInfoCategory", function()
|
||||
spawnmenu.AddToolCategory( "Utilities", "Robotboy655", "#Robotboy655" )
|
||||
end )
|
||||
|
||||
hook.Add( "PopulateToolMenu", "LegacyAddonPropsInfoThing", function()
|
||||
spawnmenu.AddToolMenuOption( "Utilities", "Robotboy655", "LegacyInfoPanel", "Addon Information", "", "", function( panel )
|
||||
panel:ClearControls()
|
||||
panel:Button( "Open addon data window", "extsm_addoninfo" )
|
||||
end )
|
||||
end )
|
||||
|
||||
----------------------------------
|
||||
|
||||
function ScreenScaleH( size )
|
||||
return size * ( ScrH() / 480.0 )
|
||||
end
|
||||
|
||||
surface.CreateFont( "AddonInfo_Header", {
|
||||
font = "Helvetica",
|
||||
size = ScreenScaleH( 24 ),
|
||||
weight = 1000
|
||||
} )
|
||||
|
||||
surface.CreateFont( "AddonInfo_Text", {
|
||||
font = "Helvetica",
|
||||
size = ScreenScaleH( 9 ),
|
||||
weight = 1000
|
||||
} )
|
||||
|
||||
surface.CreateFont( "AddonInfo_Small", {
|
||||
font = "Helvetica",
|
||||
size = ScreenScaleH( 8 )
|
||||
} )
|
||||
|
||||
local function GetWorkshopLeftovers()
|
||||
|
||||
local subscriptions = {}
|
||||
|
||||
for id, t in pairs( engine.GetAddons() ) do
|
||||
subscriptions[ tonumber( t.wsid ) ] = true
|
||||
end
|
||||
|
||||
local t = {}
|
||||
for id, fileh in pairs( file.Find( "addons/*.gma", "MOD" ) ) do
|
||||
local a = string.StripExtension( fileh )
|
||||
a = string.Explode( "_", a )
|
||||
a = tonumber( a[ #a ] )
|
||||
if ( !subscriptions[ a ] ) then
|
||||
table.insert( t, fileh )
|
||||
end
|
||||
end
|
||||
|
||||
return t
|
||||
|
||||
end
|
||||
|
||||
local function GetSize( b )
|
||||
b = b / 1000
|
||||
|
||||
if ( b < 1000 ) then
|
||||
return math.floor( b * 10 ) / 10 .. " KB"
|
||||
end
|
||||
|
||||
b = b / 1000
|
||||
|
||||
if ( b < 1000 ) then
|
||||
return math.floor( b * 10 ) / 10 .. " MB"
|
||||
end
|
||||
|
||||
b = b / 1000
|
||||
|
||||
return math.floor( b * 10 ) / 10 .. " GB"
|
||||
end
|
||||
|
||||
local function DrawText( txt, font, x, y, clr )
|
||||
draw.SimpleText( txt, font, x, y, clr )
|
||||
|
||||
surface.SetFont( font )
|
||||
return surface.GetTextSize( txt )
|
||||
end
|
||||
|
||||
local PANEL = {}
|
||||
|
||||
function PANEL:Init()
|
||||
self.Computed = false
|
||||
end
|
||||
|
||||
function PANEL:Compute()
|
||||
|
||||
self.WorkshopSize = 0
|
||||
for id, fle in pairs( file.Find( "addons/*.gma", "MOD" ) ) do
|
||||
self.WorkshopSize = self.WorkshopSize + ( file.Size( "addons/" .. fle, "MOD" ) or 0 )
|
||||
end
|
||||
|
||||
self.WorkshopWaste = 0
|
||||
self.WorkshopWasteFiles = {}
|
||||
for id, fle in pairs( GetWorkshopLeftovers() ) do
|
||||
self.WorkshopWaste = self.WorkshopWaste + ( file.Size( "addons/" .. fle, "MOD" ) or 0 )
|
||||
table.insert( self.WorkshopWasteFiles, { "addons/" .. fle, ( file.Size( "addons/" .. fle, "MOD" ) or 0 ) } )
|
||||
end
|
||||
|
||||
-- -------------------------------------------
|
||||
|
||||
local _files, folders = file.Find( "addons/*", "MOD" )
|
||||
|
||||
self.LegacyAddons = {}
|
||||
for k, v in pairs( folders or {} ) do
|
||||
self.LegacyAddons[ "addons/" .. v .. "/" ] = "Installed"
|
||||
|
||||
if ( file.IsDir( "addons/" .. v .. "/models/", "MOD" ) ) then
|
||||
self.LegacyAddons[ "addons/" .. v .. "/" ] = "Installed (Has Models)"
|
||||
end
|
||||
|
||||
local _fi, fo = file.Find( "addons/" .. v .. "/*", "MOD" )
|
||||
if ( table.Count( fo or {} ) < 1 ) then
|
||||
self.LegacyAddons[ "addons/" .. v .. "/" ] = "Installed (Empty)"
|
||||
end
|
||||
|
||||
if ( !file.IsDir( "addons/" .. v .. "/models/", "MOD" ) && !file.IsDir( "addons/" .. v .. "/materials/", "MOD" ) && !file.IsDir( "addons/" .. v .. "/lua/", "MOD" ) && !file.IsDir( "addons/" .. v .. "/sound/", "MOD" ) ) then
|
||||
self.LegacyAddons[ "addons/" .. v .. "/" ] = "Installed Incorrectly!"
|
||||
end
|
||||
end
|
||||
|
||||
-- -------------------------------------------
|
||||
|
||||
local luaFiles = file.Find( "cache/lua/*", "MOD" ) -- Too many files to count actual size!
|
||||
self.LuaCacheSize = #luaFiles * 1400
|
||||
self.LuaCacheFiles = #luaFiles
|
||||
|
||||
local wsFiles = file.Find( "cache/workshop/*", "MOD" )
|
||||
self.WSCacheSize = 0
|
||||
for id, fle in pairs( wsFiles ) do
|
||||
self.WSCacheSize = self.WSCacheSize + ( file.Size( "cache/workshop/" .. fle, "MOD" ) or 0 )
|
||||
end
|
||||
self.WSCacheFiles = #wsFiles
|
||||
|
||||
self.Computed = true
|
||||
|
||||
end
|
||||
|
||||
function PANEL:Paint( w, h )
|
||||
|
||||
if ( !self.Computed ) then
|
||||
self:Compute()
|
||||
end
|
||||
|
||||
local txtW = self:GetParent():GetWide()
|
||||
local txtH = 0
|
||||
|
||||
-- -----------------------
|
||||
|
||||
local tW, tH = DrawText( "Cache Sizes", "AddonInfo_Header", 0, txtH, color_white )
|
||||
txtH = txtH + tH
|
||||
|
||||
local localH = 0
|
||||
local localW = 0
|
||||
|
||||
-- -----------------------
|
||||
|
||||
tW, tH = DrawText( "~" .. GetSize( self.LuaCacheSize or 0 ) .. " (" .. self.LuaCacheFiles .. " files)", "AddonInfo_Small", 0, txtH + localH, Color( 220, 220, 220 ) )
|
||||
localH = localH + tH
|
||||
localW = math.max( localW, tW )
|
||||
|
||||
tW, tH = DrawText( "~" .. GetSize( self.WSCacheSize or 0 ) .. " (" .. self.WSCacheFiles .. " files)", "AddonInfo_Small", 0, txtH + localH, Color( 220, 220, 220 ) )
|
||||
localH = localH + tH
|
||||
localW = math.max( localW, tW )
|
||||
|
||||
-- -----------------------
|
||||
|
||||
localW = localW + 25
|
||||
|
||||
tW, tH = DrawText( "Server Lua cache", "AddonInfo_Small", localW, txtH, color_white )
|
||||
txtH = txtH + tH
|
||||
|
||||
tW, tH = DrawText( "Workshop download cache", "AddonInfo_Small", localW, txtH, color_white )
|
||||
txtH = txtH + tH
|
||||
|
||||
-- -------------------------------------------
|
||||
|
||||
txtH = txtH + ScreenScaleH( 8 )
|
||||
tW, tH = DrawText( "Workshop Subscriptions", "AddonInfo_Header", 0, txtH, color_white )
|
||||
txtH = txtH + tH
|
||||
|
||||
-- -------------------------------------------
|
||||
|
||||
tW, tH = DrawText( "Used Size: ", "AddonInfo_Text", 0, txtH, color_white )
|
||||
local maxW = tW
|
||||
txtH = txtH + tH
|
||||
|
||||
tW, tH = DrawText( "Wasted Space: ", "AddonInfo_Text", 0, txtH, color_white )
|
||||
maxW = math.max( maxW, tW )
|
||||
txtH = txtH + tH
|
||||
|
||||
tW, tH = DrawText( "Total Size: ", "AddonInfo_Text", 0, txtH, color_white )
|
||||
maxW = math.max( maxW, tW )
|
||||
txtH = txtH - tH * 2
|
||||
|
||||
-- -------------------------------------------
|
||||
|
||||
tW, tH = DrawText( GetSize( ( self.WorkshopSize - self.WorkshopWaste ) or 0 ), "AddonInfo_Text", maxW, txtH, Color( 220, 220, 220 ) )
|
||||
txtH = txtH + tH
|
||||
|
||||
tW, tH = DrawText( GetSize( self.WorkshopWaste or 0 ), "AddonInfo_Text", maxW, txtH, Color( 220, 220, 220 ) )
|
||||
txtH = txtH + tH
|
||||
|
||||
tW, tH = DrawText( GetSize( self.WorkshopSize or 0 ), "AddonInfo_Text", maxW, txtH, Color( 220, 220, 220 ) )
|
||||
txtH = txtH + tH * 2
|
||||
|
||||
-- -------------------------------------------
|
||||
|
||||
tW, tH = DrawText( "Files that aren't used: ( Safe to delete )", "AddonInfo_Text", 0, txtH, color_white )
|
||||
txtH = txtH + tH
|
||||
|
||||
localH = 0
|
||||
localW = 0
|
||||
for id, t in pairs( self.WorkshopWasteFiles or {} ) do
|
||||
tW, tH = DrawText( GetSize( t[ 2 ] ) .. " ", "AddonInfo_Small", 0, txtH + localH, Color( 220, 220, 220 ) )
|
||||
localH = localH + tH
|
||||
localW = math.max( localW, tW )
|
||||
end
|
||||
|
||||
for id, t in pairs( self.WorkshopWasteFiles or {} ) do
|
||||
tW, tH = DrawText( t[ 1 ], "AddonInfo_Small", localW, txtH, color_white )
|
||||
txtH = txtH + tH
|
||||
end
|
||||
|
||||
-- -------------------------------------------
|
||||
|
||||
tW, tH = DrawText( "Legacy Addons", "AddonInfo_Header", 0, txtH + ScreenScaleH( 8 ), color_white )
|
||||
txtH = txtH + tH + ScreenScaleH( 8 )
|
||||
|
||||
-- -------------------------------------------
|
||||
|
||||
tW, tH = DrawText( "Legacy Addons with models:", "AddonInfo_Text", 0, txtH, color_white )
|
||||
txtH = txtH + tH
|
||||
|
||||
if ( table.Count( self.LegacyAddons or {} ) > 0 ) then
|
||||
local maxNameW = 0
|
||||
local oldH = txtH
|
||||
for path, status in pairs( self.LegacyAddons or {} ) do
|
||||
tW, tH = DrawText( path, "AddonInfo_Small", 0, txtH, color_white )
|
||||
maxNameW = math.max( maxNameW, tW )
|
||||
txtH = txtH + tH
|
||||
end
|
||||
|
||||
maxNameW = maxNameW + 25
|
||||
txtH = oldH
|
||||
|
||||
for path, status in pairs( self.LegacyAddons or {} ) do
|
||||
tW, tH = DrawText( status, "AddonInfo_Small", maxNameW, txtH, Color( 220, 220, 220 ) )
|
||||
txtH = txtH + tH
|
||||
end
|
||||
else
|
||||
tW, tH = DrawText( "None.", "AddonInfo_Small", 0, txtH, color_white )
|
||||
txtH = txtH + tH
|
||||
end
|
||||
|
||||
if ( !system.IsWindows() ) then
|
||||
txtH = txtH + tH
|
||||
|
||||
tW, tH = DrawText( "OSX AND LINUX USERS BEWARE:", "AddonInfo_Text", 0, txtH, color_white )
|
||||
txtH = txtH + tH
|
||||
tW, tH = DrawText( "MAKE SURE ALL FILE AND FOLDER NAMES", "AddonInfo_Text", 0, txtH, color_white )
|
||||
txtH = txtH + tH
|
||||
tW, tH = DrawText( "IN ALL ADDONS ARE LOWERCASE ONLY", "AddonInfo_Text", 0, txtH, color_white )
|
||||
txtH = txtH + tH
|
||||
tW, tH = DrawText( "INCLUDING ALL SUB FOLDERS", "AddonInfo_Text", 0, txtH, color_white )
|
||||
txtH = txtH + tH
|
||||
end
|
||||
|
||||
txtH = txtH + tH
|
||||
|
||||
-- -------------------------------------------
|
||||
|
||||
self:SetSize( txtW, txtH )
|
||||
end
|
||||
|
||||
vgui.Register( "rb655_addonInfo", PANEL, "Panel" )
|
||||
|
||||
--[[ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ]]
|
||||
|
||||
-- I spent too much time on this than I care to admit
|
||||
hook.Add( "PopulatePropMenu", "rb655_LoadLegacySpawnlists", function()
|
||||
|
||||
local sid = 0 --table.Count( spawnmenu.GetPropTable() )
|
||||
|
||||
--local added = false
|
||||
|
||||
for id, spawnlist in pairs( file.Find( "settings/spawnlist/*.txt", "MOD" ) ) do
|
||||
local content = file.Read( "settings/spawnlist/" .. spawnlist, "MOD" )
|
||||
if ( !content ) then continue end
|
||||
|
||||
--[[local is = string.find( content, "TableToKeyValues" )
|
||||
if ( is != nil ) then continue end
|
||||
|
||||
for id, t in pairs( spawnmenu.GetPropTable() ) do -- This somehow freezes the game when opening Q menu => FUCK THIS SHIT
|
||||
if ( t.name == "Legacy Spawnlists" ) then
|
||||
added = true
|
||||
sid = t.id
|
||||
end
|
||||
end
|
||||
|
||||
if ( !added ) then
|
||||
spawnmenu.AddPropCategory( "rb655_legacy_spawnlists", "Legacy Spawnlists", {}, "icon16/folder.png", sid, 0 )
|
||||
added = true
|
||||
end]]
|
||||
|
||||
content = util.KeyValuesToTable( content )
|
||||
|
||||
if ( !content.entries or content.contents ) then continue end
|
||||
|
||||
local contents = {}
|
||||
|
||||
for eid, entry in pairs( content.entries ) do
|
||||
if ( type( entry ) == "table" ) then entry = entry.model end
|
||||
table.insert( contents, { type = "model", model = entry } )
|
||||
end
|
||||
|
||||
if ( !content.information ) then content.information = { name = spawnlist } end
|
||||
|
||||
spawnmenu.AddPropCategory( "settings/spawnlist/" .. spawnlist, content.information.name, contents, "icon16/page.png", sid + id, sid )
|
||||
|
||||
end
|
||||
|
||||
end )
|
||||
195
lua/autorun/rb655_make_animatable.lua
Normal file
195
lua/autorun/rb655_make_animatable.lua
Normal file
@@ -0,0 +1,195 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
properties.Add( "rb655_make_animatable", {
|
||||
MenuLabel = "#tool.rb655_easy_animation.property",
|
||||
Order = 654,
|
||||
MenuIcon = "icon16/tick.png",
|
||||
Filter = function( self, ent, ply )
|
||||
if ( !IsValid( ent ) or !gamemode.Call( "CanProperty", ply, "rb655_make_animatable", ent ) ) then return false end
|
||||
if ( ent:GetClass() == "prop_animatable" ) then return false end
|
||||
if ( ent:IsPlayer() or !ent:GetModel() or ent:GetModel():StartWith( "*" ) ) then return false end
|
||||
--if ( string.find( ent:GetClass(), "prop_physics" ) or string.find( ent:GetClass(), "prop_ragdoll" ) ) then return true end
|
||||
return true
|
||||
end,
|
||||
Action = function( self, ent )
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
end,
|
||||
Receive = function( self, len, ply )
|
||||
local ent = net.ReadEntity()
|
||||
|
||||
if ( !IsValid( ply ) or !IsValid( ent ) or !self:Filter( ent, ply ) ) then return false end
|
||||
|
||||
local entActual = ent
|
||||
if ( IsValid( ent.AttachedEntity ) ) then
|
||||
ent = ent.AttachedEntity
|
||||
end
|
||||
|
||||
local ragPos = ent:GetPos()
|
||||
|
||||
-- Try to not make entity fly
|
||||
if ( ent:IsRagdoll() ) then
|
||||
for i = 0, ent:GetPhysicsObjectCount() - 1 do
|
||||
local bone = ent:GetPhysicsObjectNum( i )
|
||||
if ( IsValid( bone ) ) then
|
||||
local pos = bone:GetPos()
|
||||
|
||||
-- Yes I like my pyramids
|
||||
if ( pos.z < ragPos.z ) then
|
||||
ragPos.z = pos.z
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local prop_animatable = ents.Create( "prop_animatable" )
|
||||
prop_animatable:SetModel( ent:GetModel() )
|
||||
prop_animatable:SetPos( ragPos )
|
||||
prop_animatable:SetAngles( ent:GetAngles() )
|
||||
prop_animatable:SetSequence( ent:GetSequence() )
|
||||
prop_animatable:SetCycle( ent:GetCycle() )
|
||||
--prop_animatable:SetPlaybackRate( ent:GetPlaybackRate() )
|
||||
|
||||
if ( IsValid( ply ) ) then
|
||||
ply:AddCount( "prop_animatable", prop_animatable )
|
||||
ply:AddCleanup( "prop_animatable", prop_animatable )
|
||||
prop_animatable:SetPlayer( ply )
|
||||
end
|
||||
|
||||
prop_animatable:SetSkin( ent:GetSkin() or 0 )
|
||||
prop_animatable:SetFlexScale( ent:GetFlexScale() )
|
||||
for i = 0, ent:GetFlexNum() - 1 do prop_animatable:SetFlexWeight( i, ent:GetFlexWeight( i ) ) end
|
||||
for i = 0, ( ent:GetNumBodyGroups() or 0 ) - 1 do prop_animatable:SetBodygroup( i, ent:GetBodygroup( i ) ) end
|
||||
for i = 0, ent:GetNumPoseParameters() - 1 do prop_animatable:SetPoseParameter( ent:GetPoseParameterName( i ) , ent:GetPoseParameter( i ) ) end
|
||||
for i = 0, ent:GetBoneCount() do
|
||||
prop_animatable:ManipulateBoneScale( i, ent:GetManipulateBoneScale( i ) )
|
||||
prop_animatable:ManipulateBoneAngles( i, ent:GetManipulateBoneAngles( i ) )
|
||||
prop_animatable:ManipulateBonePosition( i, ent:GetManipulateBonePosition( i ) )
|
||||
prop_animatable:ManipulateBoneJiggle( i, ent:GetManipulateBoneJiggle( i ) )
|
||||
end
|
||||
-- prop_animatable:InvalidateBoneCache()
|
||||
|
||||
prop_animatable:Spawn()
|
||||
prop_animatable:Activate()
|
||||
|
||||
prop_animatable.EntityMods = ent.EntityMods
|
||||
prop_animatable.BoneMods = ent.BoneMods
|
||||
duplicator.ApplyEntityModifiers( ply, prop_animatable )
|
||||
duplicator.ApplyBoneModifiers( ply, prop_animatable )
|
||||
|
||||
-- We use string find because there are might be subclasses, like prop_ragdoll_multiplayer or something
|
||||
if ( string.find( entActual:GetClass(), "prop_ragdoll" ) or entActual:IsNPC() ) then
|
||||
prop_animatable:FixRagdoll() -- This WILL have false-positives, but it will have to do for now
|
||||
end
|
||||
|
||||
undo.ReplaceEntity( entActual, prop_animatable )
|
||||
cleanup.ReplaceEntity( entActual, prop_animatable )
|
||||
|
||||
constraint.RemoveAll( entActual ) -- Remove all constraints ( this stops ropes from hanging around )
|
||||
entActual:Remove()
|
||||
end
|
||||
} )
|
||||
|
||||
properties.Add( "rb655_make_ragdoll", {
|
||||
MenuLabel = "#tool.rb655_easy_animation.property_ragdoll",
|
||||
Order = 653,
|
||||
MenuIcon = "icon16/tick.png",
|
||||
Filter = function( self, ent, ply )
|
||||
if ( !IsValid( ent ) or !gamemode.Call( "CanProperty", ply, "rb655_make_ragdoll", ent ) ) then return false end
|
||||
if ( ent:GetClass() != "prop_animatable" ) then return false end
|
||||
if ( !ent.GetIsRagdoll or !ent:GetIsRagdoll() ) then return false end
|
||||
return true
|
||||
end,
|
||||
Action = function( self, ent )
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
end,
|
||||
Receive = function( self, len, ply )
|
||||
local ent = net.ReadEntity()
|
||||
|
||||
if ( !IsValid( ply ) or !IsValid( ent ) or !self:Filter( ent, ply ) ) then return false end
|
||||
|
||||
ent:BecomeRagdollLua()
|
||||
end
|
||||
} )
|
||||
|
||||
local function MakeDTVarToggleProperty( class, tab )
|
||||
|
||||
local origTab = {
|
||||
Type = "toggle",
|
||||
|
||||
Filter = function( self, ent, ply )
|
||||
|
||||
if ( !IsValid( ent ) ) then return false end
|
||||
if ( !gamemode.Call( "CanProperty", ply, class, ent ) ) then return false end
|
||||
|
||||
if ( self.ClassRestrict and ent:GetClass() != self.ClassRestrict ) then return false end
|
||||
|
||||
return true
|
||||
|
||||
end,
|
||||
|
||||
Checked = function( self, ent, ply )
|
||||
|
||||
-- This should never happen
|
||||
if ( !isfunction( ent[ "Get" .. self.DTVariable ] ) ) then return false end
|
||||
|
||||
return ent[ "Get" .. self.DTVariable ]( ent )
|
||||
|
||||
end,
|
||||
|
||||
Action = function( self, ent )
|
||||
|
||||
self:MsgStart()
|
||||
net.WriteEntity( ent )
|
||||
self:MsgEnd()
|
||||
|
||||
end,
|
||||
|
||||
Receive = function( self, length, ply )
|
||||
|
||||
local ent = net.ReadEntity()
|
||||
if ( !properties.CanBeTargeted( ent, ply ) ) then return end
|
||||
if ( !self:Filter( ent, ply ) ) then return end
|
||||
|
||||
if ( !isfunction( ent[ "Get" .. self.DTVariable ] ) ) then return end
|
||||
if ( !isfunction( ent[ "Set" .. self.DTVariable ] ) ) then return end
|
||||
|
||||
ent[ "Set" .. self.DTVariable ]( ent, !ent[ "Get" .. self.DTVariable ]( ent ) )
|
||||
|
||||
end
|
||||
|
||||
}
|
||||
|
||||
properties.Add( class, table.Merge( origTab, tab ) )
|
||||
|
||||
end
|
||||
|
||||
MakeDTVarToggleProperty( "rb655_animatable_body_xy", {
|
||||
MenuLabel = "#tool.rb655_easy_animation.property_bodyxy",
|
||||
Order = 600,
|
||||
|
||||
ClassRestrict = "prop_animatable",
|
||||
DTVariable = "AnimateBodyXY"
|
||||
} )
|
||||
|
||||
MakeDTVarToggleProperty( "rb655_animatable_ragdoll_on_dmg", {
|
||||
MenuLabel = "#tool.rb655_easy_animation.property_damageragdoll",
|
||||
Order = 601,
|
||||
|
||||
ClassRestrict = "prop_animatable",
|
||||
DTVariable = "BecomeRagdoll"
|
||||
} )
|
||||
219
lua/autorun/rpprops_init.lua
Normal file
219
lua/autorun/rpprops_init.lua
Normal file
@@ -0,0 +1,219 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
local cvar = CreateConVar("rpprops_hide", -1, {FCVAR_ARCHIVE, FCVAR_REPLICATED}, "Show Roleplay Props in the spawnmenu")
|
||||
|
||||
if SERVER then
|
||||
|
||||
if (cvar:GetInt() == -1) then -- Default convars don't seem to be sent to clients
|
||||
cvar:SetInt(0)
|
||||
end
|
||||
|
||||
else
|
||||
|
||||
local models = {
|
||||
["Living Room"] = {
|
||||
"models/U4Lab/tv_monitor_plasma.mdl",
|
||||
"models/gmod_tower/suitetv.mdl",
|
||||
"models/scenery/furniture/coffeetable1/vestbl.mdl",
|
||||
"models/props_interiors/chairlobby01.mdl",
|
||||
"models/props_warehouse/office_furniture_couch.mdl",
|
||||
"models/props_vtmb/armchair.mdl",
|
||||
"models/props_vtmb/sofa.mdl",
|
||||
"models/props_interiors/sofa01.mdl",
|
||||
"models/props_interiors/sofa02.mdl",
|
||||
"models/props_interiors/sofa_chair02.mdl",
|
||||
"models/props_interiors/ottoman01.mdl",
|
||||
"models/env/furniture/decosofa_wood/decosofa_wood_dou.mdl",
|
||||
"models/Highrise/lobby_chair_01.mdl",
|
||||
"models/Highrise/lobby_chair_02.mdl",
|
||||
"models/props_interiors/desk_motel.mdl",
|
||||
"models/props_furniture/piano.mdl",
|
||||
"models/props_furniture/piano_bench.mdl",
|
||||
"models/props_interiors/painting_landscape01.mdl",
|
||||
"models/props_interiors/painting_portrait01.mdl",
|
||||
"models/props_furniture/picture_frame8.mdl",
|
||||
"models/props_urban/hotel_curtain001.mdl",
|
||||
"models/props_plants/plantairport01.mdl",
|
||||
"models/Highrise/potted_plant_05.mdl",
|
||||
"models/env/decor/tall_plant_b/tall_plant_b.mdl",
|
||||
"models/env/decor/plant_decofern/plant_decofern.mdl",
|
||||
},
|
||||
["Kitchen"] = {
|
||||
"models/props_interiors/refrigerator03.mdl",
|
||||
"models/sickness/fridge_01.mdl",
|
||||
"models/sickness/stove_01.mdl",
|
||||
"models/props_interiors/sink_kitchen.mdl",
|
||||
"models/props_interiors/coffee_maker.mdl",
|
||||
"models/props_interiors/chair01.mdl",
|
||||
"models/props_interiors/chair_cafeteria.mdl",
|
||||
"models/props_interiors/dining_table_round.mdl",
|
||||
"models/props_interiors/dinning_table_oval.mdl",
|
||||
"models/props_interiors/trashcankitchen01.mdl",
|
||||
|
||||
},
|
||||
["Bathroom"] = {
|
||||
"models/env/furniture/wc_double_cupboard/wc_double_cupboard.mdl",
|
||||
"models/env/furniture/square_sink/sink_double.mdl",
|
||||
"models/env/furniture/square_sink/sink_merged_b.mdl",
|
||||
"models/env/furniture/showerbase/showerbase.mdl",
|
||||
"models/env/furniture/shower/shower.mdl",
|
||||
"models/props_interiors/bathtub01.mdl",
|
||||
"models/env/furniture/ensuite1_toilet/ensuite1_toilet.mdl",
|
||||
"models/env/furniture/ensuite1_toilet/ensuite1_toilet_b.mdl",
|
||||
"models/env/furniture/ensuite1_sink/ensuite1_sink.mdl",
|
||||
"models/props_interiors/soap_dispenser.mdl",
|
||||
"models/props_interiors/toiletpaperdispenser_residential.mdl",
|
||||
"models/props_interiors/toiletpaperroll.mdl",
|
||||
},
|
||||
["Bedroom"] = {
|
||||
"models/props_interiors/bed_motel.mdl",
|
||||
"models/props_downtown/bed_motel01.mdl",
|
||||
"models/env/furniture/bed_secondclass/beddouble_group.mdl",
|
||||
"models/env/furniture/bed_andrea/bed_andrea_1st.mdl",
|
||||
"models/props_interiors/side_table_square.mdl",
|
||||
},
|
||||
["Office"] = {
|
||||
"models/U4Lab/chair_office_a.mdl",
|
||||
"models/U4Lab/desk_office_a.mdl",
|
||||
"models/props_warehouse/office_furniture_coffee_table.mdl",
|
||||
"models/props_warehouse/office_furniture_desk.mdl",
|
||||
"models/props_warehouse/office_furniture_desk_corner.mdl",
|
||||
"models/props_office/desk_01.mdl",
|
||||
"models/props_interiors/desk_executive.mdl",
|
||||
"models/env/furniture/largedesk/largedesk.mdl",
|
||||
"models/props_office/file_cabinet_03.mdl",
|
||||
"models/Highrise/cubicle_monitor_01.mdl",
|
||||
"models/props_interiors/copymachine01.mdl",
|
||||
"models/props_interiors/printer.mdl",
|
||||
"models/props_interiors/paper_tray.mdl",
|
||||
"models/props_interiors/water_cooler.mdl",
|
||||
"models/props_interiors/corkboardverticle01.mdl",
|
||||
},
|
||||
["Outdoors"] = {
|
||||
"models/props_unique/spawn_apartment/coffeeammo.mdl",
|
||||
"models/props_downtown/sign_donotenter.mdl",
|
||||
"models/props_waterfront/awning01.mdl",
|
||||
"models/props_street/awning_department_store.mdl",
|
||||
"models/props/de_tides/planter.mdl",
|
||||
"models/props_urban/bench001.mdl",
|
||||
"models/props_interiors/table_picnic.mdl",
|
||||
"models/props_urban/plastic_chair001.mdl",
|
||||
"models/props_interiors/patio_chair2_white.mdl",
|
||||
"models/props/de_tides/patio_chair2.mdl",
|
||||
"models/props/de_tides/patio_table2.mdl",
|
||||
"models/env/furniture/pool_recliner/pool_recliner.mdl",
|
||||
"models/props/de_piranesi/pi_bench.mdl",
|
||||
"models/props/de_piranesi/pi_sundial.mdl",
|
||||
"models/props/de_inferno/bench_concrete.mdl",
|
||||
"models/props/de_inferno/fountain.mdl",
|
||||
"models/props/de_inferno/lattice.mdl",
|
||||
"models/props_unique/firepit_campground.mdl",
|
||||
"models/props_equipment/sleeping_bag1.mdl",
|
||||
"models/props_equipment/sleeping_bag2.mdl",
|
||||
"models/props_urban/outhouse001.mdl",
|
||||
"models/props_junk/trashcluster01a_corner.mdl",
|
||||
"models/trees/pi_tree1.mdl",
|
||||
"models/trees/pi_tree3.mdl",
|
||||
"models/trees/pi_tree4.mdl",
|
||||
"models/trees/pi_tree5.mdl",
|
||||
},
|
||||
["Commercial"] = {
|
||||
"models/props_equipment/phone_booth.mdl",
|
||||
"models/Highrise/trashcanashtray_01.mdl",
|
||||
"models/Highrise/trash_can_03.mdl",
|
||||
"models/props_interiors/trashcan01.mdl",
|
||||
"models/props_interiors/cashregister01.mdl",
|
||||
"models/props_interiors/magazine_rack.mdl",
|
||||
"models/props_interiors/shelvinggrocery01.mdl",
|
||||
"models/props_interiors/shelvingstore01.mdl",
|
||||
"models/props_equipment/fountain_drinks.mdl",
|
||||
"models/props_downtown/bar_long.mdl",
|
||||
"models/props_downtown/bar_long_endcorner.mdl",
|
||||
"models/scenery/structural/vesuvius/bartap.mdl",
|
||||
"models/env/furniture/bstoolred/bstoolred.mdl",
|
||||
"models/props_furniture/cafe_barstool1.mdl",
|
||||
"models/props_downtown/pooltable.mdl",
|
||||
"models/de_vegas/card_table.mdl",
|
||||
"models/props_equipment/security_desk1.mdl",
|
||||
"models/sickness/bk_booth2.mdl",
|
||||
"models/props_downtown/booth01.mdl",
|
||||
"models/props_downtown/booth02.mdl",
|
||||
"models/props_downtown/booth_table.mdl",
|
||||
"models/props_interiors/table_cafeteria.mdl",
|
||||
"models/props_warehouse/table_01.mdl",
|
||||
"models/props_interiors/chairs_airport.mdl",
|
||||
"models/props_warehouse/toolbox.mdl",
|
||||
"models/props_vtmb/turntable.mdl",
|
||||
"models/props_vehicles/ambulance.mdl",
|
||||
"models/props_unique/wheelchair01.mdl",
|
||||
"models/props_unique/hospital/exam_table.mdl",
|
||||
"models/props_unique/hospital/gurney.mdl",
|
||||
"models/props_equipment/surgicaltray_01.mdl",
|
||||
"models/props_unique/hospital/hospital_bed.mdl",
|
||||
"models/props_unique/hospital/iv_pole.mdl",
|
||||
"models/props_unique/hospital/surgery_lamp.mdl",
|
||||
"models/props_interiors/medicalcabinet02.mdl",
|
||||
},
|
||||
["Lighting"] = {
|
||||
"models/props_unique/spawn_apartment/lantern.mdl",
|
||||
"models/env/lighting/lamp_trumpet/lamp_trumpet_tall.mdl",
|
||||
"models/env/lighting/jelly_lamp/jellylamp.mdl",
|
||||
"models/env/lighting/corridor_ceil_lamp/corridor_ceil_lamp.mdl",
|
||||
"models/env/lighting/corridorlamp/corridorlamp.mdl",
|
||||
"models/props_urban/light_fixture01.mdl",
|
||||
"models/Highrise/tall_lamp_01.mdl",
|
||||
"models/U4Lab/track_lighting_a.mdl",
|
||||
"models/Highrise/sconce_01.mdl",
|
||||
"models/wilderness/lamp6.mdl",
|
||||
"models/props_interiors/lamp_table02.mdl",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
hook.Add("PopulateContent", "RoleplayProps", function(pnlContent, tree)
|
||||
|
||||
local cvar = GetConVar("rpprops_hide")
|
||||
if cvar and (cvar:GetInt() == 1) then return end -- The server doesn't want it in the client spawn menu
|
||||
|
||||
local RootNode = tree:AddNode("Roleplay Props", "icon16/rpprops.png")
|
||||
|
||||
local ViewPanel = vgui.Create("ContentContainer", pnlContent)
|
||||
ViewPanel:SetVisible(false)
|
||||
|
||||
RootNode.DoClick = function()
|
||||
|
||||
ViewPanel:Clear(true)
|
||||
|
||||
for name, tbl in SortedPairs(models) do
|
||||
|
||||
local label = vgui.Create("ContentHeader", container)
|
||||
label:SetText(name)
|
||||
|
||||
ViewPanel:Add(label)
|
||||
|
||||
for _, v in ipairs(tbl) do
|
||||
|
||||
local mdlicon = spawnmenu.GetContentType("model")
|
||||
if mdlicon then
|
||||
mdlicon(ViewPanel, {model = v})
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
pnlContent:SwitchPanel(ViewPanel)
|
||||
|
||||
end
|
||||
|
||||
end)
|
||||
|
||||
end
|
||||
321
lua/autorun/rppropsextanded_init.lua
Normal file
321
lua/autorun/rppropsextanded_init.lua
Normal file
@@ -0,0 +1,321 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
local cvar = CreateConVar("rppropsex_hide", -1, {FCVAR_ARCHIVE, FCVAR_REPLICATED}, "Show Roleplay Props Extended in the spawnmenu")
|
||||
|
||||
if SERVER then
|
||||
|
||||
if (cvar:GetInt() == -1) then -- Default convars don't seem to be sent to clients
|
||||
cvar:SetInt(0)
|
||||
end
|
||||
|
||||
else
|
||||
|
||||
local models = {
|
||||
["Living Room"] = {
|
||||
"models/U4Lab/tv_monitor_plasma.mdl",
|
||||
"models/gmod_tower/suitetv.mdl",
|
||||
"models/scenery/furniture/coffeetable1/vestbl.mdl",
|
||||
"models/props_interiors/chairlobby01.mdl",
|
||||
"models/props_warehouse/office_furniture_couch.mdl",
|
||||
"models/props_vtmb/armchair.mdl",
|
||||
"models/props_vtmb/sofa.mdl",
|
||||
"models/props_interiors/sofa01.mdl",
|
||||
"models/props_interiors/sofa02.mdl",
|
||||
"models/props_interiors/sofa_chair02.mdl",
|
||||
"models/props_interiors/ottoman01.mdl",
|
||||
"models/env/furniture/decosofa_wood/decosofa_wood_dou.mdl",
|
||||
"models/Highrise/lobby_chair_01.mdl",
|
||||
"models/Highrise/lobby_chair_02.mdl",
|
||||
"models/props_interiors/desk_motel.mdl",
|
||||
"models/props_furniture/piano.mdl",
|
||||
"models/props_furniture/piano_bench.mdl",
|
||||
"models/props_interiors/painting_landscape01.mdl",
|
||||
"models/props_interiors/painting_portrait01.mdl",
|
||||
"models/props_furniture/picture_frame8.mdl",
|
||||
"models/props_urban/hotel_curtain001.mdl",
|
||||
"models/props_plants/plantairport01.mdl",
|
||||
"models/Highrise/potted_plant_05.mdl",
|
||||
"models/env/decor/tall_plant_b/tall_plant_b.mdl",
|
||||
"models/env/decor/plant_decofern/plant_decofern.mdl",
|
||||
"models/sunabouzu/theater_table.mdl",
|
||||
"models/testmodels/apple_display.mdl",
|
||||
"models/testmodels/coffee_table_long.mdl",
|
||||
"models/testmodels/macbook_pro.mdl",
|
||||
"models/testmodels/sofa_double.mdl",
|
||||
"models/testmodels/sofa_single.mdl",
|
||||
"models/splayn/rp/lr/chair.mdl",
|
||||
"models/splayn/rp/lr/couch.mdl",
|
||||
"models/props/slow/glass_table_low/slow_glass_table_low.mdl",
|
||||
"models/sunabouzu/lobby_chair.mdl",
|
||||
"models/sunabouzu/lobby_poster.mdl",
|
||||
"models/sunabouzu/lobby_poster_small.mdl",
|
||||
"models/props/cs_office/table_coffee.mdl",
|
||||
"models/props/cs_office/sofa.mdl",
|
||||
"models/props/cs_office/sofa_chair.mdl",
|
||||
"models/props/de_tides/patio_chair.mdl",
|
||||
"models/chairs/armchair.mdl",
|
||||
"models/props/cs_militia/couch.mdl",
|
||||
"models/props/de_inferno/tableantique.mdl",
|
||||
|
||||
},
|
||||
["Kitchen"] = {
|
||||
"models/props_interiors/refrigerator03.mdl",
|
||||
"models/sickness/fridge_01.mdl",
|
||||
"models/sickness/stove_01.mdl",
|
||||
"models/props_interiors/sink_kitchen.mdl",
|
||||
"models/props_interiors/coffee_maker.mdl",
|
||||
"models/props_interiors/chair01.mdl",
|
||||
"models/props_interiors/chair_cafeteria.mdl",
|
||||
"models/props_interiors/dining_table_round.mdl",
|
||||
"models/props_interiors/dinning_table_oval.mdl",
|
||||
"models/props_interiors/trashcankitchen01.mdl",
|
||||
"models/props_unique/showercurtain01.mdl",
|
||||
"models/props/cs_office/microwave.mdl",
|
||||
},
|
||||
["Bathroom"] = {
|
||||
"models/env/furniture/wc_double_cupboard/wc_double_cupboard.mdl",
|
||||
"models/env/furniture/square_sink/sink_double.mdl",
|
||||
"models/env/furniture/square_sink/sink_merged_b.mdl",
|
||||
"models/env/furniture/showerbase/showerbase.mdl",
|
||||
"models/env/furniture/shower/shower.mdl",
|
||||
"models/props_interiors/bathtub01.mdl",
|
||||
"models/env/furniture/ensuite1_toilet/ensuite1_toilet.mdl",
|
||||
"models/env/furniture/ensuite1_toilet/ensuite1_toilet_b.mdl",
|
||||
"models/env/furniture/ensuite1_sink/ensuite1_sink.mdl",
|
||||
"models/props_interiors/soap_dispenser.mdl",
|
||||
"models/props_interiors/toiletpaperdispenser_residential.mdl",
|
||||
"models/props_interiors/toiletpaperroll.mdl",
|
||||
"models/env/furniture/ensuite1_bath/ensuite1_bath.mdl",
|
||||
"models/props_interiors/urinal01.mdl",
|
||||
},
|
||||
["Bedroom"] = {
|
||||
"models/props_interiors/bed_motel.mdl",
|
||||
"models/props_downtown/bed_motel01.mdl",
|
||||
"models/env/furniture/bed_secondclass/beddouble_group.mdl",
|
||||
"models/env/furniture/bed_andrea/bed_andrea_1st.mdl",
|
||||
"models/props_interiors/side_table_square.mdl",
|
||||
"models/env/furniture/bed_naronic/bed_naronic_1st.mdl",
|
||||
},
|
||||
["Office"] = {
|
||||
"models/U4Lab/chair_office_a.mdl",
|
||||
"models/U4Lab/desk_office_a.mdl",
|
||||
"models/props_warehouse/office_furniture_coffee_table.mdl",
|
||||
"models/props_warehouse/office_furniture_desk.mdl",
|
||||
"models/props_warehouse/office_furniture_desk_corner.mdl",
|
||||
"models/props_office/desk_01.mdl",
|
||||
"models/props_interiors/desk_executive.mdl",
|
||||
"models/env/furniture/largedesk/largedesk.mdl",
|
||||
"models/props_office/file_cabinet_03.mdl",
|
||||
"models/Highrise/cubicle_monitor_01.mdl",
|
||||
"models/props_interiors/copymachine01.mdl",
|
||||
"models/props_interiors/printer.mdl",
|
||||
"models/props_interiors/paper_tray.mdl",
|
||||
"models/props_interiors/water_cooler.mdl",
|
||||
"models/props_interiors/corkboardverticle01.mdl",
|
||||
"models/props_interiors/magazine_rack.mdl",
|
||||
"models/props/cs_office/chair_office.mdl",
|
||||
"models/props/cs_office/computer.mdl",
|
||||
"models/props_interiors/chair_office2.mdl",
|
||||
"models/props_interiors/chair_thonet.mdl",
|
||||
"models/props_interiors/closet_clothes.mdl",
|
||||
"models/props/cs_office/trash_can_p.mdl",
|
||||
"models/props/cs_office/table_meeting.mdl",
|
||||
"models/props/cs_office/file_box.mdl",
|
||||
"models/props/cs_office/offcorkboarda.mdl",
|
||||
},
|
||||
["Outdoors"] = {
|
||||
"models/props_unique/spawn_apartment/coffeeammo.mdl",
|
||||
"models/props_downtown/sign_donotenter.mdl",
|
||||
"models/props_waterfront/awning01.mdl",
|
||||
"models/props_c17/awning001a.mdl",
|
||||
"models/props_c17/awning002a.mdl",
|
||||
"models/props_street/awning_department_store.mdl",
|
||||
"models/props/de_tides/planter.mdl",
|
||||
"models/props_urban/bench001.mdl",
|
||||
"models/props_interiors/table_picnic.mdl",
|
||||
"models/props_urban/plastic_chair001.mdl",
|
||||
"models/props_interiors/patio_chair2_white.mdl",
|
||||
"models/props/de_tides/patio_chair2.mdl",
|
||||
"models/props/de_tides/patio_table2.mdl",
|
||||
"models/env/furniture/pool_recliner/pool_recliner.mdl",
|
||||
"models/props/de_piranesi/pi_bench.mdl",
|
||||
"models/props/de_piranesi/pi_sundial.mdl",
|
||||
"models/props/de_inferno/bench_concrete.mdl",
|
||||
"models/props/de_inferno/fountain.mdl",
|
||||
"models/props/de_inferno/lattice.mdl",
|
||||
"models/props_unique/firepit_campground.mdl",
|
||||
"models/props_equipment/sleeping_bag1.mdl",
|
||||
"models/props_equipment/sleeping_bag2.mdl",
|
||||
"models/props_urban/outhouse001.mdl",
|
||||
"models/props_junk/trashcluster01a_corner.mdl",
|
||||
"models/trees/pi_tree1.mdl",
|
||||
"models/trees/pi_tree3.mdl",
|
||||
"models/trees/pi_tree4.mdl",
|
||||
"models/trees/pi_tree5.mdl",
|
||||
"models/gm_forest/tree_alder.mdl",
|
||||
"models/props_foliage/r_maple1.mdl",
|
||||
"models/props_foliage/maple_001_l.mdl",
|
||||
"models/props_foliage/tree_springers_01a.mdl",
|
||||
"models/props/cs_militia/tree_large_militia.mdl",
|
||||
"models/sickness/parkinglotlight.mdl",
|
||||
"models/props_junk/dumpster.mdl",
|
||||
"models/props/de_inferno/bench_wood.mdl",
|
||||
"models/props_silo/camera.mdl",
|
||||
"models/props/cs_italy/it_mkt_table3.mdl",
|
||||
"models/props/cs_militia/table_shed.mdl",
|
||||
"models/props/cs_militia/table_kitchen.mdl",
|
||||
"models/props/cs_militia/logpile2.mdl",
|
||||
"models/props/cs_militia/bar01.mdl",
|
||||
"models/props/cs_militia/barstool01.mdl",
|
||||
"models/props/de_piranesi/pi_orrery.mdl",
|
||||
"models/props/de_tides/tides_streetlight.mdl",
|
||||
"models/natalya/furniture/patio_table.mdl",
|
||||
"models/props/de_tides/vending_cart.mdl",
|
||||
},
|
||||
["Commercial"] = {
|
||||
"models/props_equipment/phone_booth.mdl",
|
||||
"models/Highrise/trashcanashtray_01.mdl",
|
||||
"models/Highrise/trash_can_03.mdl",
|
||||
"models/props_interiors/trashcan01.mdl",
|
||||
"models/props_interiors/cashregister01.mdl",
|
||||
"models/props_interiors/magazine_rack.mdl",
|
||||
"models/props_interiors/shelvinggrocery01.mdl",
|
||||
"models/props_interiors/shelvingstore01.mdl",
|
||||
"models/props_equipment/fountain_drinks.mdl",
|
||||
"models/props_downtown/bar_long.mdl",
|
||||
"models/props_downtown/bar_long_endcorner.mdl",
|
||||
"models/scenery/structural/vesuvius/bartap.mdl",
|
||||
"models/env/furniture/bstoolred/bstoolred.mdl",
|
||||
"models/props_furniture/cafe_barstool1.mdl",
|
||||
"models/props_downtown/pooltable.mdl",
|
||||
"models/de_vegas/card_table.mdl",
|
||||
"models/props_equipment/security_desk1.mdl",
|
||||
"models/sickness/bk_booth2.mdl",
|
||||
"models/props_downtown/booth01.mdl",
|
||||
"models/props_downtown/booth02.mdl",
|
||||
"models/props_downtown/booth_table.mdl",
|
||||
"models/props_interiors/table_cafeteria.mdl",
|
||||
"models/props_warehouse/table_01.mdl",
|
||||
"models/props_interiors/chairs_airport.mdl",
|
||||
"models/props_warehouse/toolbox.mdl",
|
||||
"models/props_vtmb/turntable.mdl",
|
||||
"models/props_unique/wheelchair01.mdl",
|
||||
"models/props_unique/hospital/exam_table.mdl",
|
||||
"models/props_unique/hospital/gurney.mdl",
|
||||
"models/props_equipment/surgicaltray_01.mdl",
|
||||
"models/props_unique/hospital/hospital_bed.mdl",
|
||||
"models/props_unique/hospital/iv_pole.mdl",
|
||||
"models/props_unique/hospital/surgery_lamp.mdl",
|
||||
"models/props_interiors/medicalcabinet02.mdl",
|
||||
"models/props/slow/glass_table_high/slow_glass_table_high.mdl",
|
||||
"models/props/slow/hocker/slow_hocker.mdl",
|
||||
"models/pg_props/pg_hospital/pg_optable.mdl",
|
||||
"models/props_equipment/snack_machine.mdl",
|
||||
"models/env/decor/gents_display/gents_display.mdl",
|
||||
"models/env/decor/vous_display/vous_display.mdl",
|
||||
"models/maxib123/pooltable.mdl",
|
||||
"models/props_interiors/phone.mdl",
|
||||
"models/props_unique/coffeemachine01.mdl",
|
||||
"models/props/cs_office/tv_plasma.mdl",
|
||||
"models/props/cs_office/bookshelf1.mdl",
|
||||
"models/props/de_tides/menu_stand.mdl",
|
||||
},
|
||||
["Industrial"] = {
|
||||
"models/props_industrial/warehouse_shelf001.mdl",
|
||||
"models/props_industrial/warehouse_shelf002.mdl",
|
||||
"models/props_industrial/warehouse_shelf003.mdl",
|
||||
"models/props_industrial/warehouse_shelf004.mdl",
|
||||
"models/props/cs_assault/moneypallete.mdl",
|
||||
"models/props/cs_assault/moneypallet03.mdl",
|
||||
"models/props/cs_assault/handtruck.mdl",
|
||||
"models/props/cs_assault/forklift.mdl",
|
||||
"models/props/cs_office/paperbox_pile_01.mdl",
|
||||
"models/props/cs_office/cardboard_box03.mdl",
|
||||
"models/props/de_dust/stoneblock01a.mdl",
|
||||
},
|
||||
["Lighting"] = {
|
||||
"models/props_unique/spawn_apartment/lantern.mdl",
|
||||
"models/env/lighting/lamp_trumpet/lamp_trumpet_tall.mdl",
|
||||
"models/env/lighting/jelly_lamp/jellylamp.mdl",
|
||||
"models/env/lighting/corridor_ceil_lamp/corridor_ceil_lamp.mdl",
|
||||
"models/env/lighting/corridorlamp/corridorlamp.mdl",
|
||||
"models/props_urban/light_fixture01.mdl",
|
||||
"models/Highrise/tall_lamp_01.mdl",
|
||||
"models/U4Lab/track_lighting_a.mdl",
|
||||
"models/Highrise/sconce_01.mdl",
|
||||
"models/wilderness/lamp6.mdl",
|
||||
"models/props_interiors/lamp_table02.mdl",
|
||||
"models/env/lighting/dance_spots/dance_spots.mdl",
|
||||
"models/props/cs_assault/light_shop2.mdl",
|
||||
},
|
||||
["Paintings"] = {
|
||||
"models/props/cs_office/offinspa.mdl",
|
||||
"models/props/cs_office/offinspb.mdl",
|
||||
"models/props/cs_office/offinspc.mdl",
|
||||
"models/props/cs_office/offinspd.mdl",
|
||||
"models/props/cs_office/offinspf.mdl",
|
||||
"models/props/cs_office/offinspg.mdl",
|
||||
"models/props/cs_office/offpaintinga.mdl",
|
||||
"models/props/cs_office/offpaintingb.mdl",
|
||||
"models/props/cs_office/offpaintingd.mdl",
|
||||
"models/props/cs_office/offpaintinge.mdl",
|
||||
"models/props/cs_office/offpaintingf.mdl",
|
||||
"models/props/cs_office/offpaintingg.mdl",
|
||||
"models/props/cs_office/offpaintingh.mdl",
|
||||
"models/props/cs_office/offpaintingi.mdl",
|
||||
"models/props/cs_office/offpaintingj.mdl",
|
||||
"models/props/cs_office/offpaintingk.mdl",
|
||||
"models/props/cs_office/offpaintingl.mdl",
|
||||
"models/props/cs_office/offpaintingm.mdl",
|
||||
"models/props/cs_office/offpaintingo.mdl",
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
hook.Add("PopulateContent", "RoleplayPropsExtended", function(pnlContent, tree)
|
||||
|
||||
local cvar = GetConVar("rppropsex_hide")
|
||||
if cvar and (cvar:GetInt() == 1) then return end -- The server doesn't want it in the client spawn menu
|
||||
|
||||
local RootNode = tree:AddNode("Roleplay Props Extended", "icon16/rpprops.png")
|
||||
|
||||
local ViewPanel = vgui.Create("ContentContainer", pnlContent)
|
||||
ViewPanel:SetVisible(false)
|
||||
|
||||
RootNode.DoClick = function()
|
||||
|
||||
ViewPanel:Clear(true)
|
||||
|
||||
for name, tbl in SortedPairs(models) do
|
||||
|
||||
local label = vgui.Create("ContentHeader", container)
|
||||
label:SetText(name)
|
||||
|
||||
ViewPanel:Add(label)
|
||||
|
||||
for _, v in ipairs(tbl) do
|
||||
|
||||
local mdlicon = spawnmenu.GetContentType("model")
|
||||
if mdlicon then
|
||||
mdlicon(ViewPanel, {model = v})
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
pnlContent:SwitchPanel(ViewPanel)
|
||||
|
||||
end
|
||||
|
||||
end)
|
||||
|
||||
end
|
||||
91
lua/autorun/rscpck_globals.lua
Normal file
91
lua/autorun/rscpck_globals.lua
Normal file
@@ -0,0 +1,91 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
function VJ_Trajectory(start, goal, pitch) -- Curtsy of Dragoteryx
|
||||
local g = physenv.GetGravity():Length()
|
||||
local vec = Vector(goal.x - start.x, goal.y - start.y, 0)
|
||||
local x = vec:Length()
|
||||
local y = goal.z - start.z
|
||||
if pitch > 90 then pitch = 90 end
|
||||
if pitch < -90 then pitch = -90 end
|
||||
pitch = math.rad(pitch)
|
||||
if y < math.tan(pitch)*x then
|
||||
magnitude = math.sqrt((-g*x^2)/(2*math.pow(math.cos(pitch), 2)*(y - x*math.tan(pitch))))
|
||||
vec.z = math.tan(pitch)*x
|
||||
return vec:GetNormalized()*magnitude
|
||||
elseif y > math.tan(pitch)*x then
|
||||
magnitude = math.sqrt((g*x^2)/(2*math.pow(math.cos(pitch), 2)*(y - x*math.tan(pitch))))
|
||||
vec.z = math.tan(pitch)*x
|
||||
return vec:GetNormalized()*magnitude
|
||||
end
|
||||
end
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
function VJ_GetFitAtPos(pos) -- Curtsy of Bizz
|
||||
local stepHeight = self.loco and self.loco:GetStepHeight() or self.GetStepSize and self:GetStepSize() or 24
|
||||
local stepPos = pos + Vector(0,0,stepHeight)
|
||||
local tr = util.TraceEntity({
|
||||
start = stepPos,
|
||||
endpos = stepPos,
|
||||
filter = self,
|
||||
mask = MASK_NPCSOLID
|
||||
}, self)
|
||||
return not tr.Hit and stepPos
|
||||
end
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
function VJ_FindViablePos(curPos, fallback) -- Curtsy of Bizz
|
||||
if navmesh == nil then return curPos end
|
||||
|
||||
curPos = curPos or self:GetPos()
|
||||
|
||||
local nearestMesh = navmesh.GetNearestNavArea(curPos, false, 1024, false, true)
|
||||
local nearest = IsValid(nearestMesh) and nearestMesh:GetClosestPointOnArea(curPos)
|
||||
|
||||
local nearestPos = nearest and self:GetFitAtPos(nearest)
|
||||
|
||||
if nearestPos then -- Check if we can fit at the closest position
|
||||
return nearestPos
|
||||
else -- Check the center pos
|
||||
local center = IsValid(nearestMesh) and nearestMesh:GetCenter()
|
||||
local centerPos = center and self:GetFitAtPos(center)
|
||||
if centerPos then -- use the center position instead if we can
|
||||
return centerPos
|
||||
else
|
||||
local nearestMeshes = navmesh.Find(center or curPos, 1024, 64, 64)
|
||||
for k, v in pairs(nearestMeshes) do
|
||||
if nearestMeshes ~= nearestMesh then
|
||||
|
||||
local otherNearest = v:GetClosestPointOnArea(curPos)
|
||||
local otherNearestPos = self:GetFitAtPos(otherNearest)
|
||||
if otherNearestPos then
|
||||
return otherNearestPos
|
||||
else
|
||||
local otherCenter = v:GetCenter()
|
||||
local otherCenterPos = self:GetFitAtPos(otherCenter)
|
||||
if otherCenterPos then
|
||||
return otherCenter
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return fallback
|
||||
end
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
function VJ_IsDirt(pos)
|
||||
local tr = util.TraceLine({
|
||||
start = pos,
|
||||
endpos = pos -Vector(0,0,40),
|
||||
filter = self,
|
||||
mask = MASK_NPCWORLDSTATIC
|
||||
})
|
||||
local mat = tr.MatType
|
||||
return tr.HitWorld && (mat == MAT_SAND || mat == MAT_DIRT || mat == MAT_FOLIAGE || mat == MAT_SLOSH || mat == 85)
|
||||
end
|
||||
647
lua/autorun/rscpck_pcf_precache.lua
Normal file
647
lua/autorun/rscpck_pcf_precache.lua
Normal file
@@ -0,0 +1,647 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
-- Dark Souls --
|
||||
game.AddParticles("particles/Dark_Souls/ds3_sister_friede.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/ds_artorias_fx.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/ds_ornstein_fx.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/ds3_fx.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/abyss_watcher.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/cinder_fx_ds3.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/danksouls.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/ds3_bosssteps.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/gael.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/gael_smoke.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/gael_dirt2.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/nking_1.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/nking_2.pcf")
|
||||
game.AddParticles("particles/Dark_Souls/nking_3.pcf")
|
||||
|
||||
-- Day of Infamy --
|
||||
game.AddParticles("particles/Day_Of_Infamy/doi_destructible_fx.pcf")
|
||||
game.AddParticles("particles/Day_Of_Infamy/doi_explosion_fx.pcf")
|
||||
game.AddParticles("particles/Day_Of_Infamy/doi_explosion_fx_b.pcf")
|
||||
game.AddParticles("particles/Day_Of_Infamy/doi_explosion_fx_c.pcf")
|
||||
game.AddParticles("particles/Day_Of_Infamy/doi_explosion_fx_grenade.pcf")
|
||||
game.AddParticles("particles/Day_Of_Infamy/doi_explosion_fx_new.pcf")
|
||||
game.AddParticles("particles/Day_Of_Infamy/doi_explosions_smoke.pcf")
|
||||
game.AddParticles("particles/Day_Of_Infamy/doi_impact_fx.pcf")
|
||||
game.AddParticles("particles/Day_Of_Infamy/doi_weapon_fx.pcf")
|
||||
|
||||
-- Insurgency --
|
||||
game.AddParticles("particles/Insurgency/ammo_cache_ins.pcf")
|
||||
game.AddParticles("particles/Insurgency/blood_fx.pcf")
|
||||
game.AddParticles("particles/Insurgency/footstep_fx.pcf")
|
||||
game.AddParticles("particles/Insurgency/ins_burning_fx.pcf")
|
||||
game.AddParticles("particles/Insurgency/ins_rockettrail.pcf")
|
||||
game.AddParticles("particles/Insurgency/ins_smokegrenade.pcf")
|
||||
game.AddParticles("particles/Insurgency/weapon_fx_ins.pcf")
|
||||
game.AddParticles("particles/Insurgency/weapon_fx_ins_b.pcf")
|
||||
game.AddParticles("particles/Insurgency/world_fx_ins.pcf")
|
||||
|
||||
-- CoD --
|
||||
game.AddParticles("particles/CoD/blackops3zombies_fx.pcf")
|
||||
game.AddParticles("particles/CoD/hound.pcf")
|
||||
|
||||
-- Half-Life Alyx --
|
||||
game.AddParticles("particles/Half-Life_Alyx/hla_antlion_blue_fx.pcf")
|
||||
game.AddParticles("particles/Half-Life_Alyx/hla_antlion_orange_fx.pcf")
|
||||
game.AddParticles("particles/Half-Life_Alyx/AntlionFX.pcf")
|
||||
|
||||
-- Horror --
|
||||
game.AddParticles("particles/Horror/bloodsplosion.pcf")
|
||||
|
||||
-- Doom 3 --
|
||||
game.AddParticles("particles/DOOM/doom_fx.pcf")
|
||||
|
||||
-- Armor --
|
||||
game.AddParticles( "particles/npcarmor.pcf" )
|
||||
PrecacheParticleSystem( "npcarmor_break" )
|
||||
PrecacheParticleSystem( "npcarmor_hit" )
|
||||
PrecacheParticleSystem( "eml_generic_shock" )
|
||||
|
||||
-- Starship Troopers --
|
||||
game.AddParticles("particles/Starship_Troopers/arach_drool.pcf")
|
||||
game.AddParticles("particles/Starship_Troopers/sst_acidbug_fx.pcf")
|
||||
|
||||
-- Fallout --
|
||||
game.AddParticles("particles/Fallout/centaur_spit.pcf")
|
||||
game.AddParticles("particles/Fallout/glowingone.pcf")
|
||||
game.AddParticles("particles/Fallout/goregrenade.pcf")
|
||||
game.AddParticles("particles/Fallout/magmalurk_flame.pcf")
|
||||
game.AddParticles("particles/Fallout/fo3_radiation_shockwave.pcf")
|
||||
game.AddParticles("particles/Fallout/spore1.pcf")
|
||||
game.AddParticles("particles/Fallout/sporecarrier_glow.pcf")
|
||||
game.AddParticles("particles/Fallout/sporecarrier_radiation.pcf")
|
||||
game.AddParticles("particles/Fallout/fo3_fx.pcf")
|
||||
|
||||
-- Halo --
|
||||
game.AddParticles("particles/Halo/main_effects.pcf")
|
||||
game.AddParticles("particles/Halo/halo_beam.pcf")
|
||||
game.AddParticles("particles/FlexParticles.pcf")
|
||||
|
||||
-- Monster Hunter --
|
||||
game.AddParticles("particles/mh_scream.pcf")
|
||||
|
||||
-- Mass Effect --
|
||||
game.AddParticles("particles/Mass_Effect/thresher_fx.pcf")
|
||||
local particlename = {
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
--// Dark Souls Particle FX \\--
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- Friede Particle Effects --
|
||||
-- phase 2 --
|
||||
"ds3_friede_bf_flameblast", -- Single
|
||||
"ds3_friede_bf_scythe", -- Continuous
|
||||
"ds3_friede_bf_super", -- Single
|
||||
|
||||
-- phase 1 --
|
||||
"ds3_friede_icecast", -- Single
|
||||
"ds3_friede_icecastlarge", -- Single
|
||||
"ds3_friede_icewave_base", -- Single
|
||||
"ds3_friede_icecrystal_spawn", -- Single
|
||||
"ds3_friede_icewave_flareup", -- Single
|
||||
"ds3_friede_jump",
|
||||
"ds3_friede_leftdodge",
|
||||
"ds3_friede_rightdodge",
|
||||
"ds3_friede_leftcloak",
|
||||
"ds3_friede_rightcloak",
|
||||
"ds3_friede_scythe_charge", -- Continuous
|
||||
"ds3_friede_scythe_charged", -- Single
|
||||
"ds3_friede_scythe_hit", -- Single
|
||||
"ds3_friede_scythe_metalhit", -- Single
|
||||
"ds3_friede_scythe_idle", -- Continuous
|
||||
"ds3_friede_scythe_scrape", -- Continuous
|
||||
"ds3_friede_scythe_slam", -- Single
|
||||
"ds3_friede_scythe_swing", -- Continuous
|
||||
"ds3_friede_sprint",
|
||||
---------------------------------
|
||||
-- Shared Particle Effects --
|
||||
"dskart_death",
|
||||
"ds3_basil_breath",
|
||||
"ds3_basil_hit",
|
||||
"ds3_dw_mist",
|
||||
"ds3_dw_mist_a",
|
||||
"ds3_boss_dissolve",
|
||||
"ds3_boss_dissolve_cheap",
|
||||
"ds3_gundyr_eyes",
|
||||
"ds3_eyes_red",
|
||||
"ds3_eyes_blue",
|
||||
"ds3_eyes_gold",
|
||||
"dsorn_electric",
|
||||
"ornstein_hit",
|
||||
"ornstein_tracer",
|
||||
"ds3_bloodsword_swing_left",
|
||||
"ds3_bloodsword_swing_right",
|
||||
"ds3_bloodsword_left_em",
|
||||
"ds3_bloodsword_right_em",
|
||||
"ds3_bs_left_em_med",
|
||||
"ds3_bs_right_em_med",
|
||||
"ds3_bs_left_em_lrg",
|
||||
"ds3_bs_right_em_lrg",
|
||||
"ds3_bs_swing_left_med",
|
||||
"ds3_bs_swing_right_med",
|
||||
"ds3_bs_swing_left_lrg",
|
||||
"ds3_bs_swing_right_lrg",
|
||||
"ds3_maria_fire_impact",
|
||||
"ds3_maria_impact",
|
||||
"ds3_maria_blood",
|
||||
"ds3_flamesword_swing",
|
||||
"ds3_flamesword_swing_left",
|
||||
"ds3_flamesword_swing_right",
|
||||
---------------------------------
|
||||
-- Footstep Particle Effects --
|
||||
"ds3_bossfs_land",
|
||||
"ds3_bossfs_water",
|
||||
"ds3_bossfs_water_nowarp",
|
||||
---------------------------------
|
||||
-- Abyss Watcher Particle Effects --
|
||||
"ds3_watcher_dirt_circular",
|
||||
"ds3_watcher_dirt_kickup",
|
||||
"ds3_watcher_fire_circular",
|
||||
"ds3_watcher_fire_impact",
|
||||
"ds3_watcher_fire_pillar",
|
||||
"ds3_watcher_impact",
|
||||
"ds3_watcher_sword_flame",
|
||||
"ds3_watcher_thrust",
|
||||
---------------------------------
|
||||
-- Soul of Cinder Particle Effects --
|
||||
"ds3_cinder_bless",
|
||||
"ds3_cinder_bless_cast",
|
||||
"ds3_cinder_buffedaura",
|
||||
"ds3_cinder_buffedblast",
|
||||
"ds3_cinder_buffedsword",
|
||||
"ds3_cinder_death",
|
||||
"ds3_cinder_heal",
|
||||
"ds3_cinder_heal_aura",
|
||||
"ds3_cinder_heal_cast",
|
||||
"ds3_cinder_innerpower",
|
||||
"ds3_cinder_magicblast_trail",
|
||||
"ds3_cinder_magicbolt_hit",
|
||||
"ds3_cinder_magicbolt_trail",
|
||||
"ds3_cinder_poisonbreath",
|
||||
"ds3_poison_mist_cloud",
|
||||
"ds3_cinder_power_aura",
|
||||
"ds3_cinder_power_cast",
|
||||
"ds3_cinder_spear_bigasslightning",
|
||||
"ds3_cinder_spear_core",
|
||||
"ds3_cinder_spear_hit",
|
||||
"ds3_cinder_spear_impact",
|
||||
"ds3_cinder_spear_lightning",
|
||||
"ds3_cinder_spear_trail",
|
||||
"soc_sword_embers",
|
||||
---------------------------------
|
||||
-- Gael Particle Effects --
|
||||
"gael_sword_skulls",
|
||||
"gael_dirt_kickup",
|
||||
"gael_dirt_kickup_dir_bck",
|
||||
"gael_dirt_kickup_dir_fwd",
|
||||
"gael_dirt_kickup_dir_lft",
|
||||
"gael_dirt_kickup_dir_rit",
|
||||
"gael_dirt_land",
|
||||
"gael_smoke_impact_small",
|
||||
"gael_smoke_impact_large",
|
||||
"gael_smoke_impact_continuous",
|
||||
"gael_sword_impact_att10",
|
||||
"gael_sword_impact_large",
|
||||
"gael_sword_impact_small",
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
--// Day Of Infamy Particle FX \\--
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
"doi_artillery_explosion_OLD",
|
||||
"doi_grenade_explosionOLD",
|
||||
"doi_WParty_explosion",
|
||||
"doi_WPgrenade_explosion",
|
||||
"doi_WProcket_explosion",
|
||||
"doi_generic_crater_smoke",
|
||||
"doi_generic_crater_smoke_big",
|
||||
"doi_compB_explosionOLD",
|
||||
"doi_frag_explosionOLD",
|
||||
"doi_mortar_explosionOLD",
|
||||
"doi_flak88_explosion",
|
||||
"doi_petrol_explosion",
|
||||
"doi_petrol_leak",
|
||||
"doi_ceilingDust_large",
|
||||
"doi_ceilingDust_small",
|
||||
"doi_frag_explosion",
|
||||
"doi_grenade_explosion",
|
||||
"doi_mortar_explosion",
|
||||
"doi_splinter_explosion",
|
||||
"doi_artillery_explosion",
|
||||
"doi_compB_explosion",
|
||||
"doi_gunrun_impact",
|
||||
"doi_stuka_explosion",
|
||||
"doi_smoke_artillery",
|
||||
"doi_muzzleflash_bar_3p",
|
||||
"doi_muzzleflash_garand_3p",
|
||||
"doi_muzzleflash_ithica_3p",
|
||||
"doi_muzzleflash_k98_3p",
|
||||
"doi_muzzleflash_mg42_3p",
|
||||
"doi_muzzleflash_mp40_3p",
|
||||
"doi_muzzleflash_smoke_large_linger",
|
||||
"doi_muzzleflash_smoke_medium_linger",
|
||||
"doi_muzzleflash_smoke_medium_variant_1",
|
||||
"doi_muzzleflash_smoke_small_variant_1",
|
||||
"doi_muzzleflash_smoke_small_variant_2",
|
||||
"doi_muzzleflash_smoke_small_variant_3",
|
||||
"doi_muzzleflash_smoke_small_variant_4",
|
||||
"doi_muzzleflash_smoke_small_variant_5",
|
||||
"doi_muzzleflash_smoke_tiny",
|
||||
"doi_muzzleflash_sten_3p",
|
||||
"doi_muzzleflash_stg44_3p",
|
||||
"doi_muzzleflash_thompson_3p",
|
||||
"doi_weapon_compB_fuse",
|
||||
"doi_weapon_muzzle_smoke",
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
--// Insurgency Particle FX \\--
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
"ins_blood_dismember_limb",
|
||||
"ins_blood_impact_generic",
|
||||
"ins_blood_impact_headshot",
|
||||
"ins_blood_incapacitated",
|
||||
"ins_footstep_dirt",
|
||||
"ins_footstep_grass",
|
||||
"ins_footstep_mud",
|
||||
"ins_footstep_puddle",
|
||||
"ins_footstep_wet",
|
||||
"ins_slide_dirt",
|
||||
"ins_burning_character_large",
|
||||
"ins_burning_character",
|
||||
"ins_rockettrail",
|
||||
"ins_m203_smokegrenade",
|
||||
"ins_smokegrenade",
|
||||
"ins_weapon_at4_frontblast",
|
||||
"ins_weapon_rpg_backblast",
|
||||
"ins_weapon_rpg_frontblast",
|
||||
"ins_molotov_rag",
|
||||
"ins_molotov_lighter",
|
||||
"ins_molotov_trail",
|
||||
"ins_muzzleflash_akm_3rd",
|
||||
"ins_muzzleflash_fal_3rd",
|
||||
"ins_muzzleflash_m14_3rd",
|
||||
"ins_muzzleflash_m16_3rd",
|
||||
"ins_muzzleflash_m249_3rd",
|
||||
"ins_muzzleflash_m590_3rd",
|
||||
"ins_muzzleflash_m9_3rd",
|
||||
"ins_muzzleflash_makarov_3rd",
|
||||
"ins_muzzleflash_mp40_3rd",
|
||||
"ins_muzzleflash_mp5_3rd",
|
||||
"ins_muzzleflash_sks_3rd",
|
||||
"ins_muzzleflash_toz_3rd",
|
||||
"ins_muzzleflash_ump_3rd",
|
||||
"ins_muzzleflash_ak74_3rd",
|
||||
"ins_flame_jet",
|
||||
"ins_sprinkler",
|
||||
"ins_steam_spray",
|
||||
"ins_water_spray",
|
||||
"ins_water_spray_impact",
|
||||
"ins_water_spray_big",
|
||||
"ins_water_spray_big_impact",
|
||||
"ins_whirlwind",
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
--// Black Ops 3 Particle FX \\--
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- Cosmonaut FX --
|
||||
"bo3_astronaut_incoming",
|
||||
"bo3_astronaut_pulse",
|
||||
---------------------------------
|
||||
-- Hellhound FX --
|
||||
"bo3_hellhound_aura",
|
||||
---------------------------------
|
||||
-- RAZ Unit FX --
|
||||
"bo3_mangler_blast",
|
||||
"bo3_mangler_charge",
|
||||
"bo3_mangler_pulse",
|
||||
---------------------------------
|
||||
-- Margwa FX --
|
||||
"bo3_margwa_death",
|
||||
"bo3_margwa_slam",
|
||||
---------------------------------
|
||||
-- Nova 6 Crawler FX --
|
||||
"bo3_n6crawler_aura",
|
||||
---------------------------------
|
||||
-- Napalm Zombie FX --
|
||||
"bo3_napalm_explosion",
|
||||
"bo3_napalm_fs",
|
||||
---------------------------------
|
||||
-- Panzer FX --
|
||||
"bo3_panzer_elec_blast",
|
||||
"bo3_panzer_elec_nade",
|
||||
"bo3_panzer_engine",
|
||||
"bo3_panzer_explosion",
|
||||
"bo3_panzer_flame",
|
||||
"bo3_panzer_landing",
|
||||
---------------------------------
|
||||
-- Shrieker FX --
|
||||
"bo3_shrieker_scream",
|
||||
---------------------------------
|
||||
-- Spider FX --
|
||||
"bo3_spider_impact",
|
||||
"bo3_spider_projectile",
|
||||
"bo3_spider_spit",
|
||||
---------------------------------
|
||||
-- Thrasher FX --
|
||||
"bo3_thrasher_aura",
|
||||
"bo3_thrasher_blood",
|
||||
---------------------------------
|
||||
-- Base Zombie FX --
|
||||
"bo3_zombie_spawn",
|
||||
"bo3_zombie_eyeglow_orange",
|
||||
"bo3_zombie_eyeglow_red",
|
||||
"bo3_zombie_eyeglow_white",
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
--// Half-Life: Alyx - Antlion Particle FX \\--
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- Antlion FX Orange --
|
||||
"spit_impact_orange",
|
||||
"spit_trail_orange",
|
||||
"splat_orange",
|
||||
"splat_nophys_orange",
|
||||
---------------------------------
|
||||
-- Antlion FX Blue --
|
||||
"spit_impact_blue",
|
||||
"spit_trail_blue",
|
||||
"splat_blue",
|
||||
"splat_nophys_blue",
|
||||
---------------------------------
|
||||
-- Antlion FX --
|
||||
"AntlionFX_UnBurrow",
|
||||
"AntlionFX_Burrow",
|
||||
"AntlionFX_UndGroundMov",
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
--// Horror Particle FX \\--
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- Horror Death FX --
|
||||
"horror_bloodgibs",
|
||||
"horror_bloodsplosion",
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
--// Doom 3 Particle FX \\--
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- Shared --
|
||||
"doom_dissolve",
|
||||
"doom_dissolve_flameburst",
|
||||
"doom_hellunit_aura",
|
||||
"doom_hellunit_spawn_large",
|
||||
"doom_hellunit_spawn_medium",
|
||||
"doom_hellunit_spawn_small",
|
||||
---------------------------------
|
||||
-- BFG --
|
||||
"doom_bfg_explosion",
|
||||
"doom_bfg_explosion_hq",
|
||||
"doom_bfg_projectile",
|
||||
"doom_bfg_projectile_hq",
|
||||
---------------------------------
|
||||
-- Arch Vile --
|
||||
"doom_avile_hand",
|
||||
"doom_avile_blast",
|
||||
"doom_avile_wave",
|
||||
"doom_avile_spitfire",
|
||||
---------------------------------
|
||||
-- Caco Demon --
|
||||
"doom_caco_blast",
|
||||
"doom_caco_blaze",
|
||||
"doom_caco_nade",
|
||||
---------------------------------
|
||||
-- Cyber Demon --
|
||||
"doom_cyberdemon_breath",
|
||||
"doom_cyberdemon_jet",
|
||||
---------------------------------
|
||||
-- Hellknight --
|
||||
"doom_hknight_blast",
|
||||
"doom_hknight_pball",
|
||||
---------------------------------
|
||||
-- Imp --
|
||||
"doom_imp_fireball",
|
||||
"doom_imp_fireball_cheap",
|
||||
"doom_imp_fireblast",
|
||||
---------------------------------
|
||||
-- Lost Soul --
|
||||
"doom_lostsoul",
|
||||
"doom_lostsoul_death",
|
||||
---------------------------------
|
||||
-- Mancubus --
|
||||
"doom_mancu_blast",
|
||||
"doom_mancu_muzzle",
|
||||
"doom_mancu_nade",
|
||||
---------------------------------
|
||||
-- Revenant --
|
||||
"doom_rev_missile_blast",
|
||||
"doom_rev_missile_trail",
|
||||
"doom_rev_muzzle",
|
||||
---------------------------------
|
||||
-- Wraith --
|
||||
"doom_wraith_postdeath_mist",
|
||||
"doom_wraith_teleport",
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
--// Arachnid Remade Particle FX \\--
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- Shared FX --
|
||||
"arach_drool_lower",
|
||||
"arach_drool_upper",
|
||||
---------------------------------
|
||||
-- Acid FX --
|
||||
"acidbug_spit_impact",
|
||||
"acidbug_spit_impact_lowperf",
|
||||
"acidbug_spit_trail",
|
||||
"acidbug_splat",
|
||||
"acidbug_splat_nophys",
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
--// Fallout Particle FX \\--
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- Centaur --
|
||||
"centaur_spit",
|
||||
---------------------------------
|
||||
-- Feral Ghoul --
|
||||
"glowingone_testA",
|
||||
"glowingone_testB",
|
||||
"glowingone_testC",
|
||||
"goregrenade_splash",
|
||||
"radiation_shockwave",
|
||||
"radiation_shockwave_debris",
|
||||
"radiation_shockwave_ring",
|
||||
"radswave",
|
||||
---------------------------------
|
||||
-- Mirelurk --
|
||||
"magmalurk_flame",
|
||||
"magmalurk_flame_pilot",
|
||||
"fo3_mirelurk_charge",
|
||||
"fo3_mirelurk_pulse",
|
||||
"fo3_mirelurk_hybrid",
|
||||
---------------------------------
|
||||
-- Spore Carrier --
|
||||
"spore_splash",
|
||||
"spore_splash_02",
|
||||
"spore_splash_03",
|
||||
"spore_splash_05",
|
||||
"spore_splash_player",
|
||||
"spore_splash_player_splat",
|
||||
"spore_trail",
|
||||
"sporecarrier_glow",
|
||||
"sporecarrier_radiation",
|
||||
"sporecarrier_radiation_debris",
|
||||
"sporecarrier_radiation_ring",
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
--// Thresher Particle FX \\--
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
"tm_ground",
|
||||
"tm_ground_inf",
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
--// Halo Particle FX \\--
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- Shield FX --
|
||||
"hcea_shield_impact",
|
||||
"hcea_shield_recharged",
|
||||
"hcea_shield_enabled",
|
||||
"hcea_shield_disperse",
|
||||
---------------------------------
|
||||
-- Hunter AB FX --
|
||||
"hcea_hunter_ab_charge",
|
||||
"hcea_hunter_ab_explode",
|
||||
"hcea_hunter_ab_muzzle",
|
||||
"hcea_hunter_ab_proj",
|
||||
---------------------------------
|
||||
-- Hunter FRG FX --
|
||||
"hcea_hunter_frg_charge",
|
||||
"hcea_hunter_frg_explode",
|
||||
"hcea_hunter_frg_muzzle",
|
||||
"hcea_hunter_frg_proj",
|
||||
"hcea_hunter_frg_proj_lightning_trcr_e",
|
||||
---------------------------------
|
||||
-- Hunter Shade Cannon FX --
|
||||
"hcea_hunter_shade_cannon_trigger_muzzle",
|
||||
"hcea_hunter_shade_cannon_proj",
|
||||
"hcea_hunter_shade_cannon_explode_ground",
|
||||
"hcea_hunter_shade_cannon_explode_air",
|
||||
---------------------------------
|
||||
-- Hunter Canister FX --
|
||||
"hcea_hunter_canister_green",
|
||||
"hcea_hunter_canister_purple",
|
||||
"hcea_hunter_canister_orange",
|
||||
---------------------------------
|
||||
-- Flood FX --
|
||||
"hcea_flood_carrier_death",
|
||||
"hcea_flood_infected_death",
|
||||
"hcea_flood_runner_death",
|
||||
---------------------------------
|
||||
-- Hunter FX --
|
||||
"hcea_hunter_particle_carbine",
|
||||
"hcea_hunter_particle_carbine_impact",
|
||||
"hcea_hunter_needler_muzzle",
|
||||
"hcea_hunter_needler_proj",
|
||||
"hcea_hunter_needler_pistol_impact",
|
||||
"hcea_hunter_plasma_rifle_fire",
|
||||
"hcea_hunter_plasma_rifle_proj",
|
||||
"hcea_hunter_plasma_rifle_impact",
|
||||
"hcea_hunter_plasma_pistol_fire",
|
||||
"hcea_hunter_plasma_pistol_proj",
|
||||
"hcea_hunter_plasma_pistol_impact",
|
||||
---------------------------------
|
||||
-- Beam FX --
|
||||
"halo_beam_main",
|
||||
"halo_beam_trail_1",
|
||||
"halo_beam_trail_2",
|
||||
"halo_beam_trail_3",
|
||||
"halo_beam_trail_glow_1",
|
||||
"halo_beam_trail_glow_2",
|
||||
"halo_beam_trail_glow_3",
|
||||
---------------------------------
|
||||
-- Flood FX --
|
||||
"hcea_flood_car_death",
|
||||
"hcea_flood_car_death_core",
|
||||
"hcea_flood_car_death_dirt",
|
||||
"hcea_flood_car_death_frag",
|
||||
"hcea_flood_car_death_frag_2",
|
||||
"hcea_flood_car_death_gibs",
|
||||
"hcea_flood_car_death_smoke",
|
||||
"hcea_flood_car_death_smoke_2",
|
||||
"hcea_flood_car_death_splat",
|
||||
"hcea_flood_car_death_splat_2",
|
||||
"hcea_flood_car_death_splatter",
|
||||
"hcea_flood_car_death_swave_xy",
|
||||
"hcea_flood_car_death_swave_xz",
|
||||
"hcea_flood_inf_death",
|
||||
"hcea_flood_inf_death_core",
|
||||
"hcea_flood_inf_death_gibs",
|
||||
"hcea_flood_inf_death_largesplat",
|
||||
---------------------------------
|
||||
-- Hunter Shared FX --
|
||||
"hcea_gold_hunter_charge",
|
||||
"hcea_red_hunter_charge",
|
||||
"hcea_purple_hunter_charge",
|
||||
"hcea_hunter_charge",
|
||||
"hcea_hunter_frnade_hit",
|
||||
"hcea_hunter_frnade_nade",
|
||||
"hcea_red_hunter_nade",
|
||||
"hcea_hunter_cannister",
|
||||
"hcea_gold_hunter_cannister",
|
||||
"hcea_red_hunter_cannister",
|
||||
"hcea_purple_hunter_cannister",
|
||||
"hcea_hunter_impact_generic",
|
||||
"hcea_red_hunter_muzzle",
|
||||
"hcea_gold_hunter_muzzle",
|
||||
"hcea_red_hunter_hit",
|
||||
"hcea_gold_hunter_hit",
|
||||
---------------------------------
|
||||
-- Plasma Pistol FX --
|
||||
"hcea_t25p_charge",
|
||||
"hcea_t25p_charge_core",
|
||||
"hcea_t25p_charge_glow",
|
||||
"hcea_t25p_hit",
|
||||
"hcea_t25p_hit_blitz",
|
||||
"hcea_t25p_hit_collide",
|
||||
"hcea_t25p_hit_flicker",
|
||||
"hcea_t25p_hit_glow",
|
||||
"hcea_t25p_muzzle",
|
||||
"hcea_t25p_muzzle_charged",
|
||||
"hcea_t25p_muzzle_charged_core",
|
||||
"hcea_t25p_muzzle_core",
|
||||
"hcea_t25p_muzzle_core_2",
|
||||
"hcea_t25p_muzzle_embers",
|
||||
"hcea_t25p_muzzle_flames",
|
||||
"hcea_t25p_muzzle_glow",
|
||||
"hcea_t25p_muzzle_heat",
|
||||
"hcea_t25p_muzzle_lghtning",
|
||||
"hcea_t25p_tracer",
|
||||
"hcea_t25p_tracer_charged",
|
||||
"hcea_t25p_tracer_charged_fadeglow",
|
||||
"hcea_t25p_tracer_charged_sparks",
|
||||
"hcea_t25p_tracer_fadeglow",
|
||||
"hcea_t25p_tracer_line",
|
||||
---------------------------------
|
||||
-- Plasma Rifle FX --
|
||||
"hcea_t25r_core",
|
||||
"hcea_t25r_core_2",
|
||||
"hcea_t25r_embers",
|
||||
"hcea_t25r_flames",
|
||||
"hcea_t25r_flames_0a",
|
||||
"hcea_t25r_flames_2",
|
||||
"hcea_t25r_glow",
|
||||
"hcea_t25r_lghtning",
|
||||
"hcea_t25r_muzzle",
|
||||
"hcea_t25r_tracer",
|
||||
"hcea_t25r_tracer_fadeglow",
|
||||
"hcea_t25r_tracer_halo_nopunintended",
|
||||
"hcea_t25r_tracer_line",
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
--// Monster Hunter Particle FX \\--
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- Roar --
|
||||
"mh_monster_scream_large",
|
||||
}
|
||||
for _,v in ipairs(particlename) do PrecacheParticleSystem(v) end
|
||||
106
lua/autorun/rscpck_wpn_trails.lua
Normal file
106
lua/autorun/rscpck_wpn_trails.lua
Normal file
@@ -0,0 +1,106 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
WeaponTrail = WeaponTrail or {}
|
||||
if SERVER then
|
||||
AddCSLuaFile("effect/trail.lua")
|
||||
AddCSLuaFile("effect/trail.Bone_Set.lua")
|
||||
util.AddNetworkString("weapontrail.PlayEffect" )
|
||||
util.AddNetworkString("weapontrail.StopEffect" )
|
||||
elseif CLIENT then
|
||||
include("effect/trail.lua")
|
||||
include("effect/trail.Bone_Set.lua")
|
||||
WeaponTrail.EffectList = WeaponTrail.EffectList or {}
|
||||
|
||||
|
||||
hook.Add( "PostDrawOpaqueRenderables", "WeaponTrail.Effect", function()
|
||||
local EffectList = WeaponTrail.EffectList
|
||||
local ply = LocalPlayer()
|
||||
for v, k in pairs(EffectList) do
|
||||
if k.Owner:IsValid() then
|
||||
if k.Draw then
|
||||
k:Draw()
|
||||
if k.Draw == false then
|
||||
table.remove(WeaponTrail.EffectList, v)
|
||||
if k.EndEffect then
|
||||
k:EndEffect(ply)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
if k.DieTime - CurTime() <= 0 then
|
||||
|
||||
table.remove(WeaponTrail.EffectList, v)
|
||||
if k.EndEffect then
|
||||
k:EndEffect(ply)
|
||||
end
|
||||
end
|
||||
else
|
||||
table.remove(WeaponTrail.EffectList, v)
|
||||
end
|
||||
end
|
||||
|
||||
end)
|
||||
hook.Add("Think", "WeaponTrail.EffectThink", function()
|
||||
end)
|
||||
end
|
||||
|
||||
local meta = FindMetaTable("Entity")
|
||||
|
||||
function meta:SetWeaponTrail(mat, _time, size, flag)
|
||||
local data = {}
|
||||
data.Mat = mat
|
||||
data.Owner = self
|
||||
data.Time = _time
|
||||
data.Size = size
|
||||
data.Flag = flag
|
||||
|
||||
net.Start("weapontrail.PlayEffect")
|
||||
net.WriteTable(data)
|
||||
net.Broadcast()
|
||||
end
|
||||
function meta:StopWeaponTrail()
|
||||
local data = {}
|
||||
data.Owner = self
|
||||
net.Start("weapontrail.StopEffect")
|
||||
net.WriteTable(data)
|
||||
net.Broadcast()
|
||||
end
|
||||
net.Receive("weapontrail.PlayEffect", function(len)
|
||||
local Data = net.ReadTable()
|
||||
local effect = WeaponTrail.Eff
|
||||
if effect then
|
||||
effect.Owner = Data.Owner
|
||||
effect.Mat = Data.Mat
|
||||
effect.CustomTime = Data.Time
|
||||
effect.Size = Data.Size
|
||||
effect.Flag = Data.Flag
|
||||
effect.DieTime = Data.Time + CurTime()
|
||||
if Data.Owner:IsValid() then
|
||||
effect:InitEffect()
|
||||
end
|
||||
if Data.Time != -1 then
|
||||
WeaponTrail.EffectList[#WeaponTrail.EffectList+1] = table.Copy( effect )
|
||||
end
|
||||
end
|
||||
end)
|
||||
net.Receive("weapontrail.StopEffect", function(len)
|
||||
local Data = net.ReadTable()
|
||||
local EffectList = WeaponTrail.EffectList
|
||||
for v, k in pairs(EffectList) do
|
||||
if !Data.Other or Data.Other == false then
|
||||
if k.Owner == Data.Owner then
|
||||
table.remove(WeaponTrail.EffectList, v)
|
||||
end
|
||||
elseif Data.Other == true then
|
||||
k.EndTime = 0
|
||||
end
|
||||
end
|
||||
end)
|
||||
158
lua/autorun/sam.lua
Normal file
158
lua/autorun/sam.lua
Normal file
@@ -0,0 +1,158 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
if SAM_LOADED then return end
|
||||
|
||||
local version = tonumber("148") or 148
|
||||
|
||||
sam = {}
|
||||
sam.config = {}
|
||||
sam.language = {}
|
||||
sam.player = {}
|
||||
sam.ranks = {}
|
||||
sam.permissions = {}
|
||||
sam.author = "Srlion"
|
||||
sam.version = version
|
||||
|
||||
function sam.print(...)
|
||||
MsgC(
|
||||
Color(236, 240, 241), "(",
|
||||
Color(244, 67, 54), "SAM",
|
||||
Color(236, 240, 241), ") ",
|
||||
Color(236, 240, 241), ...
|
||||
) Msg("\n")
|
||||
end
|
||||
|
||||
local FAILED = false
|
||||
do
|
||||
local types = {
|
||||
sv_ = SERVER and include or function() end,
|
||||
cl_ = SERVER and AddCSLuaFile or include,
|
||||
sh_ = function(name)
|
||||
if SERVER then
|
||||
AddCSLuaFile(name)
|
||||
end
|
||||
return include(name)
|
||||
end
|
||||
}
|
||||
|
||||
sam.load_file = function(name, type)
|
||||
if FAILED then return end
|
||||
|
||||
if type and not type:EndsWith("_") then
|
||||
type = type .. "_"
|
||||
end
|
||||
|
||||
local func = types[type] or types[name:GetFileFromFilename():sub(1, 3)] or types["sh_"]
|
||||
if func then
|
||||
local rets = {func(name)}
|
||||
if rets[1] == false then
|
||||
FAILED = true
|
||||
sam.print("Failed to load!")
|
||||
end
|
||||
return unpack(rets)
|
||||
end
|
||||
end
|
||||
end
|
||||
local load_file = sam.load_file
|
||||
|
||||
sam.print("Loading...")
|
||||
|
||||
load_file("sam/libs/sh_types.lua")
|
||||
load_file("sam/libs/sh_pon.lua")
|
||||
load_file("sam/libs/sh_mp.lua")
|
||||
load_file("sam/libs/sh_netstream.lua")
|
||||
load_file("sam/libs/sh_async_netstream.lua")
|
||||
load_file("sam/libs/sh_globals.lua")
|
||||
load_file("sam/libs/sql/sv_init.lua")
|
||||
sam.Promise = load_file("sam/libs/sh_promises.lua")
|
||||
|
||||
load_file("sam/sh_colors.lua")
|
||||
|
||||
load_file("sam/sh_util.lua")
|
||||
load_file("sam/sh_lang.lua")
|
||||
load_file("sam/sv_sql.lua")
|
||||
load_file("sam/sh_permissions.lua")
|
||||
|
||||
load_file("sam/ranks/sh_ranks.lua")
|
||||
load_file("sam/ranks/sv_ranks.lua")
|
||||
|
||||
load_file("sam/config/sh_config.lua")
|
||||
load_file("sam/config/sv_config.lua")
|
||||
load_file("sam/config/cl_config.lua")
|
||||
|
||||
load_file("sam/player/sh_player.lua")
|
||||
load_file("sam/player/sh_nw_vars.lua")
|
||||
load_file("sam/player/sv_player.lua")
|
||||
load_file("sam/player/cl_player.lua")
|
||||
load_file("sam/player/sv_ranks.lua")
|
||||
load_file("sam/player/sv_auth.lua")
|
||||
load_file("sam/player/sv_bans.lua")
|
||||
|
||||
load_file("sam/command/sh_command.lua")
|
||||
load_file("sam/command/sv_command.lua")
|
||||
load_file("sam/command/cl_command.lua")
|
||||
|
||||
for _, f in ipairs(file.Find("sam/command/arguments/*.lua", "LUA")) do
|
||||
load_file("sam/command/arguments/" .. f, "sh")
|
||||
end
|
||||
|
||||
load_file("sam/sh_restrictions.lua")
|
||||
|
||||
load_file("sam/menu/sh_init.lua")
|
||||
load_file("sam/menu/cl_init.lua")
|
||||
|
||||
load_file("sam/sh_motd.lua")
|
||||
|
||||
local modules = file.Find("sam/modules/*.lua", "LUA")
|
||||
for _, module in ipairs(modules) do
|
||||
load_file("sam/modules/" .. module)
|
||||
end
|
||||
|
||||
load_file("sam/reports/cl_reports.lua")
|
||||
load_file("sam/reports/sv_reports.lua")
|
||||
|
||||
do
|
||||
if SERVER then
|
||||
hook.Add("SAM.LoadedConfig", "SAM.AdvertsMain", function(config)
|
||||
if not config.Adverts then
|
||||
sam.config.set("Adverts", {})
|
||||
end
|
||||
end)
|
||||
end
|
||||
load_file("sam/cl_adverts.lua")
|
||||
end
|
||||
|
||||
if not FAILED then
|
||||
sam.print("Loaded!")
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
local path = "sam/importers/"
|
||||
|
||||
concommand.Add("sam_import", function(ply, _, args)
|
||||
if IsValid(ply) then return end
|
||||
|
||||
local admin_mod = args[1]
|
||||
if not admin_mod then
|
||||
sam.print("You need to provide an admin mod to import!")
|
||||
return
|
||||
end
|
||||
|
||||
if not file.Exists(path .. admin_mod, "LUA") then
|
||||
sam.print("There is no importer for '" .. admin_mod .. "'")
|
||||
return
|
||||
end
|
||||
|
||||
CompileFile(path .. admin_mod .. "/main.lua")()
|
||||
end, nil, nil, FCVAR_PROTECTED)
|
||||
end
|
||||
|
||||
SAM_LOADED = true
|
||||
26
lua/autorun/saveents_funcs_2.lua
Normal file
26
lua/autorun/saveents_funcs_2.lua
Normal file
@@ -0,0 +1,26 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile( "autorun/client/campaignents_clientfuncs_2.lua" )
|
||||
AddCSLuaFile()
|
||||
|
||||
local aiVar = GetConVar( "ai_disabled" )
|
||||
|
||||
function saveents_EnabledAi()
|
||||
return aiVar:GetInt() == 0
|
||||
|
||||
end
|
||||
|
||||
local ignorePly = GetConVar( "ai_ignoreplayers" )
|
||||
|
||||
function saveents_IgnoringPlayers()
|
||||
return ignorePly:GetInt() == 1
|
||||
|
||||
end
|
||||
66
lua/autorun/schizo_antlion.lua
Normal file
66
lua/autorun/schizo_antlion.lua
Normal file
@@ -0,0 +1,66 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
/*--------------------------------------------------
|
||||
=============== Autorun File ===============
|
||||
*** Copyright (c) 2012-2018 by DrVrej, All rights reserved. ***
|
||||
No parts of this code or any of its contents may be reproduced, copied, modified or adapted,
|
||||
without the prior written consent of the author, unless otherwise indicated for stand-alone materials.
|
||||
--------------------------------------------------*/
|
||||
------------------ Addon Information ------------------
|
||||
local PublicAddonName = "Zombies + Enemy Aliens"
|
||||
local AddonName = "Zombies + Enemy Aliens"
|
||||
local AddonType = "SNPC"
|
||||
local AutorunFile = "autorun/schizo_antlion.lua"
|
||||
-------------------------------------------------------
|
||||
local VJExists = file.Exists("lua/autorun/vj_base_autorun.lua","GAME")
|
||||
|
||||
if VJExists == true then
|
||||
include('autorun/vj_controls.lua')
|
||||
|
||||
local vCat = "WN:Antlion Arc"
|
||||
|
||||
VJ.AddNPC("Antlion Soldier","npc_antlion_schizo_soldier",vCat)
|
||||
VJ.AddNPC("Antlion Drone","npc_antlion_schizo_drone",vCat)
|
||||
VJ.AddNPC("Antlion Fireant","npc_antlion_schizo_fireant",vCat)
|
||||
|
||||
|
||||
-- !!!!!! DON'T TOUCH ANYTHING BELOW THIS !!!!!! -------------------------------------------------------------------------------------------------------------------------
|
||||
AddCSLuaFile(AutorunFile)
|
||||
VJ.AddAddonProperty(AddonName,AddonType)
|
||||
else
|
||||
if (CLIENT) then
|
||||
chat.AddText(Color(0,200,200),PublicAddonName,
|
||||
Color(0,255,0)," was unable to install, you are missing ",
|
||||
Color(255,100,0),"VJ Base!")
|
||||
end
|
||||
timer.Simple(1,function()
|
||||
if not VJF then
|
||||
if (CLIENT) then
|
||||
VJF = vgui.Create("DFrame")
|
||||
VJF:SetTitle("ERROR!")
|
||||
VJF:SetSize(790,560)
|
||||
VJF:SetPos((ScrW()-VJF:GetWide())/2,(ScrH()-VJF:GetTall())/2)
|
||||
VJF:MakePopup()
|
||||
VJF.Paint = function()
|
||||
draw.RoundedBox(8,0,0,VJF:GetWide(),VJF:GetTall(),Color(200,0,0,150))
|
||||
end
|
||||
|
||||
local VJURL = vgui.Create("DHTML",VJF)
|
||||
VJURL:SetPos(VJF:GetWide()*0.005, VJF:GetTall()*0.03)
|
||||
VJURL:Dock(FILL)
|
||||
VJURL:SetAllowLua(true)
|
||||
VJURL:OpenURL("https://sites.google.com/site/vrejgaming/vjbasemissing")
|
||||
elseif (SERVER) then
|
||||
timer.Create("VJBASEMissing",5,0,function() print("VJ Base is Missing! Download it from the workshop!") end)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
45
lua/autorun/server/admin_functions.lua
Normal file
45
lua/autorun/server/admin_functions.lua
Normal file
@@ -0,0 +1,45 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
--[[---------------------------------------------------------
|
||||
Name: KickId2
|
||||
Desc: Allows admins to use the kickid2 command to kick people.
|
||||
-----------------------------------------------------------]]
|
||||
local function KickId( player, command, arguments )
|
||||
|
||||
if ( !player:IsAdmin() ) then return end
|
||||
|
||||
local id = arguments[1]
|
||||
local reason = arguments[2] or "Kicked"
|
||||
|
||||
RunConsoleCommand( "kickid", id, Format( "%s (%s)", reason, player:Nick() ) )
|
||||
|
||||
end
|
||||
|
||||
concommand.Add( "kickid2", KickId, nil, "", { FCVAR_DONTRECORD } )
|
||||
|
||||
|
||||
--[[---------------------------------------------------------
|
||||
Name: BanId2
|
||||
Desc: Allows admins to use the banid2 command to ban people.
|
||||
-----------------------------------------------------------]]
|
||||
local function BanID( player, command, arguments )
|
||||
|
||||
if ( !player:IsAdmin() ) then return end
|
||||
|
||||
local length = arguments[1]
|
||||
local id = arguments[2]
|
||||
|
||||
RunConsoleCommand( "banid", length, id )
|
||||
|
||||
end
|
||||
|
||||
concommand.Add( "banid2", BanID, nil, "", { FCVAR_DONTRECORD } )
|
||||
138
lua/autorun/server/advdupe2_sv_init.lua
Normal file
138
lua/autorun/server/advdupe2_sv_init.lua
Normal file
@@ -0,0 +1,138 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
AdvDupe2 = {
|
||||
Version = "1.1.0",
|
||||
Revision = 51
|
||||
}
|
||||
|
||||
AdvDupe2.DataFolder = "advdupe2" --name of the folder in data where dupes will be saved
|
||||
|
||||
function AdvDupe2.Notify(ply,msg,typ, showsvr, dur)
|
||||
net.Start("AdvDupe2Notify")
|
||||
net.WriteString(msg)
|
||||
net.WriteUInt(typ or 0, 8)
|
||||
net.WriteFloat(dur or 5)
|
||||
net.Send(ply)
|
||||
|
||||
if(showsvr==true)then
|
||||
print("[AdvDupe2Notify]\t"..ply:Nick()..": "..msg)
|
||||
end
|
||||
end
|
||||
|
||||
AddCSLuaFile( "autorun/client/advdupe2_cl_init.lua" )
|
||||
AddCSLuaFile( "advdupe2/file_browser.lua" )
|
||||
AddCSLuaFile( "advdupe2/sh_codec.lua" )
|
||||
AddCSLuaFile( "advdupe2/cl_file.lua" )
|
||||
AddCSLuaFile( "advdupe2/cl_ghost.lua" )
|
||||
|
||||
util.AddNetworkString("AdvDupe2_ReportClass")
|
||||
util.AddNetworkString("AdvDupe2_ReportModel")
|
||||
util.AddNetworkString("AdvDupe2Notify")
|
||||
util.AddNetworkString("AdvDupe2_RemoveGhosts")
|
||||
util.AddNetworkString("AdvDupe2_ResetDupeInfo")
|
||||
util.AddNetworkString("AdvDupe2_StartGhosting")
|
||||
util.AddNetworkString("AdvDupe2_InitProgressBar")
|
||||
util.AddNetworkString("AdvDupe2_DrawSelectBox")
|
||||
util.AddNetworkString("AdvDupe2_RemoveSelectBox")
|
||||
util.AddNetworkString("AdvDupe2_UpdateProgressBar")
|
||||
util.AddNetworkString("AdvDupe2_RemoveProgressBar")
|
||||
util.AddNetworkString("AdvDupe2_ResetOffsets")
|
||||
util.AddNetworkString("AdvDupe2_SetDupeInfo")
|
||||
util.AddNetworkString("AdvDupe2_ReceiveFile")
|
||||
util.AddNetworkString("AdvDupe2_CanAutoSave")
|
||||
|
||||
CreateConVar("AdvDupe2_DebugInfo", "0", {FCVAR_ARCHIVE}, "Should extra info be printed to console?", 0, 1)
|
||||
CreateConVar("AdvDupe2_SpawnRate", "1", {FCVAR_ARCHIVE})
|
||||
CreateConVar("AdvDupe2_MaxFileSize", "200", {FCVAR_ARCHIVE})
|
||||
CreateConVar("AdvDupe2_MaxEntities", "0", {FCVAR_ARCHIVE})
|
||||
CreateConVar("AdvDupe2_MaxConstraints", "0", {FCVAR_ARCHIVE})
|
||||
|
||||
CreateConVar("AdvDupe2_MaxContraptionEntities", "10", {FCVAR_ARCHIVE})
|
||||
CreateConVar("AdvDupe2_MaxContraptionConstraints", "15", {FCVAR_ARCHIVE})
|
||||
CreateConVar("AdvDupe2_MinContraptionSpawnDelay", "0.2", {FCVAR_ARCHIVE})
|
||||
CreateConVar("AdvDupe2_MinContraptionUndoDelay", "0.1", {FCVAR_ARCHIVE})
|
||||
CreateConVar("AdvDupe2_MaxContraptionUndoDelay", "60", {FCVAR_ARCHIVE})
|
||||
|
||||
CreateConVar("AdvDupe2_FileModificationDelay", "5", {FCVAR_ARCHIVE})
|
||||
CreateConVar("AdvDupe2_UpdateFilesDelay", "10", {FCVAR_ARCHIVE})
|
||||
|
||||
CreateConVar("AdvDupe2_LoadMap", "0", {FCVAR_ARCHIVE})
|
||||
CreateConVar("AdvDupe2_MapFileName", "", {FCVAR_ARCHIVE})
|
||||
|
||||
local function PasteMap()
|
||||
if(GetConVarString("AdvDupe2_LoadMap")=="0")then return end
|
||||
local filename = GetConVarString("AdvDupe2_MapFileName")
|
||||
|
||||
if(not filename or filename == "")then
|
||||
print("[AdvDupe2Notify]\tInvalid file name to loap map save.")
|
||||
return
|
||||
end
|
||||
|
||||
if(not file.Exists("advdupe2_maps/"..filename..".txt", "DATA"))then
|
||||
print("[AdvDupe2Notify]\tFile does not exist for a map save.")
|
||||
return
|
||||
end
|
||||
|
||||
local map = file.Read("advdupe2_maps/"..filename..".txt")
|
||||
local success,dupe,info,moreinfo = AdvDupe2.Decode(map)
|
||||
if not success then
|
||||
print("[AdvDupe2Notify]\tCould not open map save "..dupe)
|
||||
return
|
||||
end
|
||||
|
||||
local Tab = {Entities=dupe["Entities"], Constraints=dupe["Constraints"], HeadEnt=dupe["HeadEnt"]}
|
||||
local Entities = AdvDupe2.duplicator.Paste(nil, table.Copy(Tab.Entities), Tab.Constraints, nil, nil, Tab.HeadEnt.Pos, true)
|
||||
local maptype = GetConVarString("AdvDupe2_LoadMap")
|
||||
|
||||
if(maptype=="1")then
|
||||
local PhysObj
|
||||
for k,v in pairs(Entities) do
|
||||
if(IsValid(v))then
|
||||
for i=0, #Tab.Entities[k].PhysicsObjects do
|
||||
if(Tab.Entities[k].PhysicsObjects[i].Frozen)then
|
||||
PhysObj = v:GetPhysicsObjectNum( i )
|
||||
if IsValid(PhysObj) then
|
||||
PhysObj:EnableMotion(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
if v.CPPISetOwner then v:CPPISetOwner(game.GetWorld()) end
|
||||
end
|
||||
end
|
||||
elseif(maptype=="2")then
|
||||
local PhysObj
|
||||
for k,v in pairs(Entities) do
|
||||
if(IsValid(v))then
|
||||
for i=0, #Tab.Entities[k].PhysicsObjects do
|
||||
PhysObj = v:GetPhysicsObjectNum( i )
|
||||
if IsValid(PhysObj) then
|
||||
PhysObj:EnableMotion(true)
|
||||
end
|
||||
end
|
||||
if v.CPPISetOwner then v:CPPISetOwner(game.GetWorld()) end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
print("[AdvDupe2Notify]\tMap save pasted.")
|
||||
end
|
||||
hook.Add("InitPostEntity", "AdvDupe2_PasteMap", PasteMap)
|
||||
hook.Add("PostCleanupMap", "AdvDupe2_PasteMap", PasteMap)
|
||||
hook.Add("PlayerInitialSpawn","AdvDupe2_AddPlayerTable",function(ply)
|
||||
ply.AdvDupe2 = {}
|
||||
end)
|
||||
|
||||
include( "advdupe2/sv_clipboard.lua" )
|
||||
include( "advdupe2/sh_codec.lua" )
|
||||
include( "advdupe2/sv_misc.lua" )
|
||||
include( "advdupe2/sv_file.lua" )
|
||||
include( "advdupe2/sv_ghost.lua" )
|
||||
|
||||
26
lua/autorun/server/effect_remove_hook_d2k.lua
Normal file
26
lua/autorun/server/effect_remove_hook_d2k.lua
Normal file
@@ -0,0 +1,26 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
//Global variable to inform Export To Lua addon that the core addon is installed
|
||||
SpecialEffectsD2KIsInstalled = true
|
||||
|
||||
|
||||
//Find effects and cut the sound they're making
|
||||
local function OnEffectRemove_D2K(effect_d2k)
|
||||
|
||||
//Stop sounds
|
||||
if effect_d2k.SFX_Sound then
|
||||
effect_d2k.SFX_Sound:Stop()
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
//Add hook
|
||||
hook.Add("EntityRemoved", "EffectRemoveHook_D2K", OnEffectRemove_D2K)
|
||||
289
lua/autorun/server/morematerials.lua
Normal file
289
lua/autorun/server/morematerials.lua
Normal file
@@ -0,0 +1,289 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
// adding materials to the material toolguns list
|
||||
|
||||
list.Add( "OverrideMaterials", "models/XQM//Deg360" )
|
||||
list.Add( "OverrideMaterials", "models/XQM//LightLinesGB" )
|
||||
list.Add( "OverrideMaterials", "models/XQM//LightLinesRed" )
|
||||
list.Add( "OverrideMaterials", "models/XQM//SquaredMat" )
|
||||
list.Add( "OverrideMaterials", "models/XQM//WoodTexture_1" )
|
||||
list.Add( "OverrideMaterials", "models/airboat/airboat_blur02" )
|
||||
list.Add( "OverrideMaterials", "models/alyx/emptool_glow" )
|
||||
list.Add( "OverrideMaterials", "models/antlion/antlion_innards" )
|
||||
list.Add( "OverrideMaterials", "models/barnacle/roots" )
|
||||
list.Add( "OverrideMaterials", "models/combine_advisor/body9" )
|
||||
list.Add( "OverrideMaterials", "models/combine_advisor/mask" )
|
||||
list.Add( "OverrideMaterials", "models/combine_scanner/scanner_eye" )
|
||||
list.Add( "OverrideMaterials", "models/debug/debugwhite" )
|
||||
list.Add( "OverrideMaterials", "models/dog/eyeglass" )
|
||||
list.Add( "OverrideMaterials", "models/effects/portalrift_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/effects/slimebubble_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/effects/splode1_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/effects/splode_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/gibs/metalgibs/metal_gibs" )
|
||||
list.Add( "OverrideMaterials", "models/gibs/woodgibs/woodgibs01" )
|
||||
list.Add( "OverrideMaterials", "models/gibs/woodgibs/woodgibs02" )
|
||||
list.Add( "OverrideMaterials", "models/gibs/woodgibs/woodgibs03" )
|
||||
list.Add( "OverrideMaterials", "models/player/player_chrome1" )
|
||||
list.Add( "OverrideMaterials", "models/props_animated_breakable/smokestack/brickwall002a" )
|
||||
list.Add( "OverrideMaterials", "models/props_building_details/courtyard_template001c_bars" )
|
||||
list.Add( "OverrideMaterials", "models/props_building_details/courtyard_template001c_bars" )
|
||||
list.Add( "OverrideMaterials", "models/props_buildings/destroyedbuilldingwall01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_buildings/plasterwall021a" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/frostedglass_01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/furniturefabric001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/furniturefabric002a" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/furnituremetal001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/gate_door02a" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/metalladder001" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/metalladder002" )
|
||||
list.Add( "OverrideMaterials", "models/props_c17/metalladder003" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/canal_bridge_railing_01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/canal_bridge_railing_01b" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/canal_bridge_railing_01c" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/canalmap_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/coastmap_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/metalcrate001d" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/metalwall005b" )
|
||||
list.Add( "OverrideMaterials", "models/props_canal/rock_riverbed01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/citadel_cable" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/citadel_cable_b" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/com_shield001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/combine_interface_disp" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/combine_monitorbay_disp" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/metal_combinebridge001" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/pipes01" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/pipes03" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/prtl_sky_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/props_combine/stasisfield_beam" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/building_template010a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/building_template022j" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/composite_debris" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/concretefloor013a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/concretefloor020a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/concretewall019a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/metalwall001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterceiling008a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterwall009d" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterwall021a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterwall034a" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterwall034d" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterwall039c" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/plasterwall040c" )
|
||||
list.Add( "OverrideMaterials", "models/props_debris/tilefloor001c" )
|
||||
list.Add( "OverrideMaterials", "models/props_foliage/driftwood_01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_foliage/oak_tree01" )
|
||||
list.Add( "OverrideMaterials", "models/props_foliage/tree_deciduous_01a_trunk" )
|
||||
list.Add( "OverrideMaterials", "models/props_interiors/metalfence007a" )
|
||||
list.Add( "OverrideMaterials", "models/props_junk/plasticcrate01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_junk/plasticcrate01b" )
|
||||
list.Add( "OverrideMaterials", "models/props_junk/plasticcrate01c" )
|
||||
list.Add( "OverrideMaterials", "models/props_junk/plasticcrate01d" )
|
||||
list.Add( "OverrideMaterials", "models/props_junk/plasticcrate01e" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/Tank_Glass001" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/cornerunit_cloud" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/door_klab01" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/security_screens" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/security_screens2" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/warp_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/props_lab/xencrystal_sheet" )
|
||||
list.Add( "OverrideMaterials", "models/props_pipes/GutterMetal01a")
|
||||
list.Add( "OverrideMaterials", "models/props_pipes/destroyedpipes01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_pipes/pipemetal001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_pipes/pipeset_metal02" )
|
||||
list.Add( "OverrideMaterials", "models/props_pipes/pipesystem01a_skin1" )
|
||||
list.Add( "OverrideMaterials", "models/props_pipes/pipesystem01a_skin2" )
|
||||
list.Add( "OverrideMaterials", "models/props_vents/borealis_vent001" )
|
||||
list.Add( "OverrideMaterials", "models/props_vents/borealis_vent001b" )
|
||||
list.Add( "OverrideMaterials", "models/props_vents/borealis_vent001c" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/concretefloor010a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/concretewall064b" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/concretewall066a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/dirtwall001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/metal_tram001a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/quarryobjects01" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/rockcliff02a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/rockcliff02b" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/rockcliff02c" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/rockcliff04a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/rockgranite02a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/tugboat01" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/tugboat02" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/wood_fence01a" )
|
||||
list.Add( "OverrideMaterials", "models/props_wasteland/wood_fence01a_skin2" )
|
||||
list.Add( "OverrideMaterials", "models/shadertest/predator" )
|
||||
list.Add( "OverrideMaterials", "models/weapons/v_crossbow/rebar_glow" )
|
||||
list.Add( "OverrideMaterials", "models/weapons/v_crowbar/crowbar_cyl" )
|
||||
list.Add( "OverrideMaterials", "models/weapons/v_grenade/grenade body" )
|
||||
list.Add( "OverrideMaterials", "models/weapons/v_slam/new light1" )
|
||||
list.Add( "OverrideMaterials", "models/weapons/v_slam/new light2" )
|
||||
list.Add( "OverrideMaterials", "models/weapons/v_smg1/texture5" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/BoxFull_diffuse" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/CellShadedCamo_diffuse" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/CinderBlock_Tex" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/JetBody2TailPiece_diffuse" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/PoleX1_diffuse" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/Rails/gumball_1" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/SquaredMatInverted" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/WoodPlankTexture" )
|
||||
list.Add( "OverrideMaterials", "models/XQM/boxfull_diffuse" )
|
||||
list.Add( "OverrideMaterials", "models/dav0r/hoverball" )
|
||||
list.Add( "OverrideMaterials", "models/spawn_effect" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/Fender_chrome" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/Fender_white" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/Fender_wood" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/Future_vents" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/FuturisticTrackRamp_1-2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/OfficeWindow_1-1" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/Pro_gear_side" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/black_brushes" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/black_chrome" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/blue_steel" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/camera" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/car_tire" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/checkers_map" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/cigar" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/concrete0" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/concrete1" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/concrete2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/concrete3" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/construct/concrete_barrier00" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/construct/concrete_barrier2_00" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/construct/concrete_pipe_00" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/egg" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/gear" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/gear_top" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/grey_chrome" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/grey_steel" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/heli" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/indentTiles2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/iron_rails" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mat/mat_phx_carbonfiber" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mat/mat_phx_carbonfiber2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mat/mat_phx_metallic" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mat/mat_phx_metallic2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mat/mat_phx_plastic" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mat/mat_phx_plastic2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/metal_plate" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/metal_wheel" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/metalbox" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/metalbox2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/metalfence004a" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/middle" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/mrref2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/output_jack" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/pack2/chrome" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/pack2/interior_sides" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/pack2/train_floor" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/potato" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/pro_gear_top2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/ps_grass" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/road" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/roadside" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/scrnspace" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/side" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/simplyMetallic1" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/simplyMetallic2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/smallwheel" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/spheremappy" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/t_light" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/thruster" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/tiles2" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/top" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/torpedo" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/trains/track_beamside" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/trains/track_beamtop" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/trains/track_plate" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/trains/track_plateside" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/white_brushes" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/white_fps" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/window" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/wire/pcb_blue" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/wire/pcb_green" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/wire/pcb_red" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/wood_dome" )
|
||||
list.Add( "OverrideMaterials", "phoenix_storms/wood_side" )
|
||||
|
||||
// Checking if CSS is mounted and adding CSS textures if it is
|
||||
|
||||
function engine.IsMounted(g)
|
||||
for k,v in pairs(engine.GetGames()) do
|
||||
if (' cstrike' ) then
|
||||
return true;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if IsMounted( 'cstrike' ) and (engine.IsMounted('cstrike')) then
|
||||
|
||||
list.Add( "OverrideMaterials", "models/cs_havana/wndb" )
|
||||
list.Add( "OverrideMaterials", "models/cs_havana/wndd" )
|
||||
list.Add( "OverrideMaterials", "models/cs_italy/light_orange" )
|
||||
list.Add( "OverrideMaterials", "models/cs_italy/plaster" )
|
||||
list.Add( "OverrideMaterials", "models/cs_italy/pwtrim2" )
|
||||
list.Add( "OverrideMaterials", "models/de_cbble/wndarch" )
|
||||
list.Add( "OverrideMaterials", "models/de_chateau/ch_arch_b1" )
|
||||
list.Add( "OverrideMaterials", "models/pi_window/plaster" )
|
||||
list.Add( "OverrideMaterials", "models/pi_window/trim128" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/dollar" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/fireescapefloor" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/metal_stairs1" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/moneywrap" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/moneywrap02" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/moneytop" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_assault/pylon" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/boulder01" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/milceil001" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/militiarock" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/militiarockb" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/milwall006" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/rocks01" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/roofbeams01" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/roofbeams02" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/roofbeams03" )
|
||||
list.Add( "OverrideMaterials", "models/props/CS_militia/RoofEdges" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_office/clouds" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_office/file_cabinet2" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_office/file_cabinet3" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_office/screen" )
|
||||
list.Add( "OverrideMaterials", "models/props/cs_office/snowmana" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/de_inferno_boulder_03" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/infflra" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/infflrd" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/inftowertop" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/offwndwb_break" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/roofbits" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/tileroof01" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_inferno/woodfloor008a" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_nuke/nukconcretewalla" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_nuke/nukecardboard" )
|
||||
list.Add( "OverrideMaterials", "models/props/de_nuke/pipeset_metal" )
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
// Making sure there's no double materials in the list in case of other addons, plus sorting them
|
||||
|
||||
timer.Simple(0, function()
|
||||
local mats = list.GetForEdit("OverrideMaterials");
|
||||
local cleaner = {};
|
||||
for i, mat in pairs(mats) do
|
||||
cleaner[mat] = true;
|
||||
mats[i] = nil;
|
||||
end
|
||||
local i = 1;
|
||||
for mat in pairs(cleaner) do
|
||||
mats[i] = mat;
|
||||
i = i + 1;
|
||||
end
|
||||
table.sort(mats);
|
||||
end);
|
||||
107
lua/autorun/server/rb655_map_dupe_fix.lua
Normal file
107
lua/autorun/server/rb655_map_dupe_fix.lua
Normal file
@@ -0,0 +1,107 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
resource.AddWorkshop( "104619813" )
|
||||
|
||||
hook.Add( "EntityKeyValue", "rb655_keyval_fix", function( ent, key, val )
|
||||
|
||||
if ( ent:GetClass() == "env_headcrabcanister" ) then
|
||||
|
||||
if ( key == "HeadcrabType" ) then ent.headcrab = val end
|
||||
if ( key == "HeadcrabCount" ) then ent.count = val end
|
||||
if ( key == "FlightSpeed" ) then ent.speed = val end
|
||||
if ( key == "FlightTime" ) then ent.time = val end
|
||||
if ( key == "StartingHeight" ) then ent.height = val end
|
||||
if ( key == "Damage" ) then ent.damage = val end
|
||||
if ( key == "DamageRadius" ) then ent.radius = val end
|
||||
if ( key == "SmokeLifetime" ) then ent.duration = val end
|
||||
if ( key == "spawnflags" ) then ent.spawnflags = val end
|
||||
if ( key == "targetname" ) then ent.targetname = val end
|
||||
|
||||
elseif ( ent:GetClass() == "prop_thumper" ) then
|
||||
|
||||
if ( key == "dustscale" ) then ent.dustscale = val end
|
||||
if ( key == "targetname" ) then ent.targetname = val end
|
||||
|
||||
elseif ( ent:GetClass() == "prop_door_rotating" ) then
|
||||
|
||||
if ( !ent.rb655_dupe_data ) then ent.rb655_dupe_data = { ismapcreated = ent:CreatedByMap() } end
|
||||
|
||||
if ( key == "speed" ) then ent.rb655_dupe_data.speed = val end
|
||||
if ( key == "distance" ) then ent.rb655_dupe_data.distance = val end
|
||||
if ( key == "hardware" ) then ent.rb655_dupe_data.hardware = val end
|
||||
if ( key == "returndelay" ) then ent.rb655_dupe_data.returndelay = val end
|
||||
if ( key == "skin" ) then ent.rb655_dupe_data.skin = val end
|
||||
if ( key == "angles" ) then ent.rb655_dupe_data.initialAngles = Angle( val ) end
|
||||
if ( key == "ajarangles" ) then ent.rb655_dupe_data.ajarangles = val end
|
||||
if ( key == "spawnflags" ) then ent.rb655_dupe_data.spawnflags = val end
|
||||
if ( key == "spawnpos" ) then ent.rb655_dupe_data.spawnpos = val end
|
||||
if ( key == "targetname" ) then ent.rb655_dupe_data.targetname = val end
|
||||
--if ( key == "slavename" ) then print( "slavename", key, val ) ent.rb655_dupe_data.targetname = val end
|
||||
|
||||
function ent:PreEntityCopy()
|
||||
self.rb655_door_opened = self:GetInternalVariable( "m_eDoorState" ) != 0
|
||||
self.rb655_door_locked = self:GetInternalVariable( "m_bLocked" )
|
||||
end
|
||||
|
||||
elseif ( ent:GetClass() == "item_ammo_crate" ) then
|
||||
|
||||
if ( key == "AmmoType" ) then ent.type = val end
|
||||
|
||||
elseif ( ent:GetClass() == "item_item_crate" ) then
|
||||
|
||||
if ( key == "ItemCount" ) then ent.amount = val end
|
||||
if ( key == "ItemClass" ) then ent.class = val end
|
||||
if ( key == "CrateAppearance" ) then ent.appearance = val end
|
||||
if ( key == "targetname" ) then ent.targetname = val end
|
||||
|
||||
end
|
||||
|
||||
end )
|
||||
|
||||
-- Ehhh... We gotta copy over wire_base_entity stuff for dupes
|
||||
function rb655_hl2_CopyWireModMethods( targetEnt )
|
||||
|
||||
local oldPreFunc = targetEnt.PreEntityCopy
|
||||
function targetEnt:PreEntityCopy()
|
||||
if ( oldPreFunc ) then oldPreFunc( self ) end
|
||||
|
||||
duplicator.ClearEntityModifier( self, "WireDupeInfo" )
|
||||
|
||||
-- build the DupeInfo table and save it as an entity mod
|
||||
local DupeInfo = WireLib.BuildDupeInfo( self )
|
||||
if ( DupeInfo ) then
|
||||
duplicator.StoreEntityModifier( self, "WireDupeInfo", DupeInfo )
|
||||
end
|
||||
end
|
||||
|
||||
local function EntityLookup( createdEntities )
|
||||
return function( id, default )
|
||||
if ( id == nil ) then return default end
|
||||
if ( id == 0 ) then return game.GetWorld() end
|
||||
local ent = createdEntities[ id ]
|
||||
if ( IsValid( ent ) ) then return ent else return default end
|
||||
end
|
||||
end
|
||||
|
||||
local oldPostFunc = targetEnt.PostEntityPaste
|
||||
function targetEnt:PostEntityPaste( player, ent, createdEntities )
|
||||
-- We manually apply the entity mod here rather than using a
|
||||
-- duplicator.RegisterEntityModifier because we need access to the
|
||||
-- CreatedEntities table.
|
||||
if ( ent.EntityMods and ent.EntityMods.WireDupeInfo ) then
|
||||
WireLib.ApplyDupeInfo( player, ent, ent.EntityMods.WireDupeInfo, EntityLookup( createdEntities ) )
|
||||
end
|
||||
|
||||
if ( oldPostFunc ) then oldPostFunc( self, player, ent, createdEntities ) end
|
||||
end
|
||||
|
||||
end
|
||||
129
lua/autorun/server/sensorbones/css.lua
Normal file
129
lua/autorun/server/sensorbones/css.lua
Normal file
@@ -0,0 +1,129 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
--
|
||||
-- These are the physics bone numbers
|
||||
--
|
||||
local PLVS = 0
|
||||
local SPNE = 1
|
||||
local TRSO = 2
|
||||
local RSLD = 3
|
||||
local LSLD = 4
|
||||
local LARM = 5
|
||||
local LWST = 6
|
||||
local LHND = 7
|
||||
local RARM = 8
|
||||
local RWST = 9
|
||||
local RHND = 10
|
||||
local RTHY = 11
|
||||
local RCLF = 12
|
||||
local LTHY = 13
|
||||
local LCLF = 14
|
||||
local HEAD = 15
|
||||
|
||||
local Builder =
|
||||
{
|
||||
PrePosition = function( self, sensor )
|
||||
|
||||
local spinestretch = ( sensor[SENSORBONE.SHOULDER] - sensor[SENSORBONE.SPINE] ) * 1.0
|
||||
|
||||
sensor[SENSORBONE.SHOULDER]:Add( spinestretch * 0.7 )
|
||||
sensor[SENSORBONE.SHOULDER_RIGHT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.SHOULDER_LEFT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.ELBOW_LEFT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.ELBOW_RIGHT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.WRIST_LEFT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.WRIST_RIGHT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.HAND_LEFT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.HAND_RIGHT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.HEAD]:Add( spinestretch * 0.5 )
|
||||
|
||||
sensor[SENSORBONE.HIP_LEFT]:Add( spinestretch * 0.2 )
|
||||
sensor[SENSORBONE.HIP_RIGHT]:Add( spinestretch * 0.2 )
|
||||
-- sensor[SENSORBONE.HIP_RIGHT]:Add( spinestretch * 0.3 )
|
||||
|
||||
end,
|
||||
|
||||
--
|
||||
-- Which on the sensor should we use for which ones on our model
|
||||
--
|
||||
PositionTable =
|
||||
{
|
||||
[PLVS] = SENSORBONE.HIP,
|
||||
[TRSO] = SENSORBONE.SPINE,
|
||||
[RSLD] = SENSORBONE.SHOULDER_RIGHT,
|
||||
[LSLD] = SENSORBONE.SHOULDER_LEFT,
|
||||
[LARM] = SENSORBONE.ELBOW_LEFT,
|
||||
[LHND] = SENSORBONE.WRIST_LEFT,
|
||||
[RARM] = SENSORBONE.ELBOW_RIGHT,
|
||||
[RHND] = SENSORBONE.WRIST_RIGHT,
|
||||
[LTHY] = SENSORBONE.HIP_LEFT,
|
||||
[RTHY] = SENSORBONE.HIP_RIGHT,
|
||||
[RCLF] = SENSORBONE.KNEE_RIGHT,
|
||||
[LCLF] = SENSORBONE.KNEE_LEFT,
|
||||
[HEAD] = SENSORBONE.HEAD,
|
||||
[SPNE] = SENSORBONE.SPINE,
|
||||
},
|
||||
|
||||
--
|
||||
-- Which bones should we use to determine our bone angles
|
||||
--
|
||||
AnglesTable =
|
||||
{
|
||||
[PLVS] = { from = LTHY, to = RTHY, up = "hips_fwd" },
|
||||
[SPNE] = { from_sensor = SENSORBONE.HEAD, to_sensor = SENSORBONE.SPINE, up = "chest_rgt" },
|
||||
[TRSO] = { from_sensor = SENSORBONE.HEAD, to_sensor = SENSORBONE.SPINE, up = "chest_rgt" },
|
||||
[HEAD] = { from_sensor = SENSORBONE.HEAD, to_sensor = SENSORBONE.SHOULDER, up = "chest_lft" },
|
||||
[RSLD] = { from = RSLD, to = LSLD, up = "chest_bck" },
|
||||
[LSLD] = { from = LSLD, to = RSLD, up = "chest_fwd" },
|
||||
[RARM] = { from = RARM, to = RSLD, up = "chest_up" },
|
||||
[LARM] = { from = LARM, to = LSLD, up = "chest_dn" },
|
||||
[RWST] = { from = RHND, to = RARM, up = "chest_up" },
|
||||
[LWST] = { from = LHND, to = LARM, up = "chest_dn" },
|
||||
[RTHY] = { from = RCLF, to = RTHY, up_up = SPNE },
|
||||
[RCLF] = { from_sensor = SENSORBONE.ANKLE_RIGHT, to_sensor = SENSORBONE.KNEE_RIGHT, up_up = RTHY },
|
||||
[LTHY] = { from = LCLF, to = LTHY, up_up = SPNE },
|
||||
[LCLF] = { from_sensor = SENSORBONE.ANKLE_LEFT, to_sensor = SENSORBONE.KNEE_LEFT, up_up = LTHY },
|
||||
[RHND] = { from_sensor = SENSORBONE.HAND_RIGHT, to_sensor = SENSORBONE.WRIST_RIGHT, up_lft = RARM },
|
||||
[LHND] = { from_sensor = SENSORBONE.HAND_LEFT, to_sensor = SENSORBONE.WRIST_LEFT, up_rgt = LARM },
|
||||
[LWST] = { from = LHND, to = LARM, up = "chest_dn" },
|
||||
},
|
||||
|
||||
--
|
||||
-- Any polishing that can't be done with the above tables
|
||||
--
|
||||
Complete = function( self, player, sensor, rotation, pos, ang )
|
||||
|
||||
pos[SPNE] = LerpVector( 0.45, pos[SPNE], pos[HEAD] )
|
||||
pos[RWST] = pos[RARM]
|
||||
pos[LWST] = pos[LARM]
|
||||
|
||||
end,
|
||||
|
||||
-- We're used as a default - no need to return true to anything here.
|
||||
IsApplicable = function( self, ent )
|
||||
|
||||
local mdl = ent:GetModel()
|
||||
|
||||
if ( mdl:EndsWith( "models/player/ct_gign.mdl" ) ) then return true end
|
||||
if ( mdl:EndsWith( "models/player/ct_sas.mdl" ) ) then return true end
|
||||
if ( mdl:EndsWith( "models/player/ct_urban.mdl" ) ) then return true end
|
||||
if ( mdl:EndsWith( "models//player/ct_gsg9.mdl" ) ) then return true end
|
||||
if ( mdl:EndsWith( "models/player/t_guerilla.mdl" ) ) then return true end
|
||||
if ( mdl:EndsWith( "models/player/t_leet.mdl" ) ) then return true end
|
||||
if ( mdl:EndsWith( "models/player/t_phoenix.mdl" ) ) then return true end
|
||||
if ( mdl:EndsWith( "models//player/t_arctic.mdl" ) ) then return true end
|
||||
|
||||
return false
|
||||
|
||||
end,
|
||||
}
|
||||
|
||||
list.Set( "SkeletonConvertor", "CounterStrikeSource", Builder )
|
||||
114
lua/autorun/server/sensorbones/eli.lua
Normal file
114
lua/autorun/server/sensorbones/eli.lua
Normal file
@@ -0,0 +1,114 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
--
|
||||
-- These are the physics bone numbers
|
||||
--
|
||||
local PLVS = 0
|
||||
local LTHY = 1
|
||||
local SPNE = 2
|
||||
local RSLD = 3
|
||||
local RARM = 4
|
||||
local LSLD = 5
|
||||
local LARM = 6
|
||||
local LHND = 7
|
||||
local HEAD = 8
|
||||
local RHND = 9
|
||||
local RTHY = 10
|
||||
local RCLF = 11
|
||||
local LCLF = 12
|
||||
local RFOT = 13
|
||||
|
||||
local Builder =
|
||||
{
|
||||
PrePosition = function( self, sensor )
|
||||
|
||||
local spinestretch = ( sensor[SENSORBONE.SHOULDER] - sensor[SENSORBONE.SPINE] ) * 0.7
|
||||
|
||||
sensor[SENSORBONE.SHOULDER]:Add( spinestretch * 0.7 )
|
||||
sensor[SENSORBONE.SHOULDER_RIGHT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.SHOULDER_LEFT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.ELBOW_LEFT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.ELBOW_RIGHT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.WRIST_LEFT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.WRIST_RIGHT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.HAND_LEFT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.HAND_RIGHT]:Add( spinestretch )
|
||||
sensor[SENSORBONE.HEAD]:Add( spinestretch * 0.5 )
|
||||
|
||||
sensor[SENSORBONE.HIP_LEFT]:Add( spinestretch * 0.3 )
|
||||
sensor[SENSORBONE.HIP_RIGHT]:Add( spinestretch * 0.3 )
|
||||
|
||||
sensor[SENSORBONE.KNEE_RIGHT]:Add( ( sensor[SENSORBONE.HIP_RIGHT] - sensor[SENSORBONE.KNEE_RIGHT] ) * 0.2 )
|
||||
sensor[SENSORBONE.KNEE_LEFT]:Add( ( sensor[SENSORBONE.HIP_LEFT] - sensor[SENSORBONE.KNEE_LEFT] ) * 0.2 )
|
||||
|
||||
end,
|
||||
--
|
||||
-- Which on the sensor should we use for which ones on our model
|
||||
--
|
||||
PositionTable =
|
||||
{
|
||||
[PLVS] = SENSORBONE.HIP,
|
||||
[RSLD] = SENSORBONE.SHOULDER_RIGHT,
|
||||
[LSLD] = SENSORBONE.SHOULDER_LEFT,
|
||||
[LARM] = SENSORBONE.ELBOW_LEFT,
|
||||
[LHND] = SENSORBONE.WRIST_LEFT,
|
||||
[RARM] = SENSORBONE.ELBOW_RIGHT,
|
||||
[RHND] = SENSORBONE.WRIST_RIGHT,
|
||||
[LTHY] = SENSORBONE.HIP_LEFT,
|
||||
[RTHY] = SENSORBONE.HIP_RIGHT,
|
||||
[RCLF] = SENSORBONE.KNEE_RIGHT,
|
||||
[LCLF] = SENSORBONE.KNEE_LEFT,
|
||||
[RFOT] = SENSORBONE.ANKLE_RIGHT,
|
||||
[HEAD] = SENSORBONE.HEAD,
|
||||
[SPNE] = SENSORBONE.SPINE,
|
||||
},
|
||||
|
||||
--
|
||||
-- Which bones should we use to determine our bone angles
|
||||
--
|
||||
AnglesTable =
|
||||
{
|
||||
[PLVS] = { from = LTHY, to = RTHY, up = "hips_fwd" },
|
||||
[SPNE] = { from = HEAD, to = SPNE, up = "chest_rgt" },
|
||||
[HEAD] = { from_sensor = SENSORBONE.HEAD, to_sensor = SENSORBONE.SPINE, up = "chest_lft" },
|
||||
[RSLD] = { from = RARM, to = RSLD, up = "chest_up" },
|
||||
[RARM] = { from = RHND, to = RARM, up_up = RSLD },
|
||||
[LSLD] = { from = LARM, to = LSLD, up = "chest_dn" },
|
||||
[LARM] = { from = LHND, to = LARM, up_up = LSLD },
|
||||
[RTHY] = { from = RCLF, to = RTHY, up_up = SPNE },
|
||||
[RCLF] = { from = RFOT, to = RCLF, up_up = RTHY },
|
||||
[LTHY] = { from = LCLF, to = LTHY, up_up = SPNE },
|
||||
[LCLF] = { from_sensor = SENSORBONE.ANKLE_LEFT, to = LCLF, up_up = LTHY },
|
||||
[RHND] = { from_sensor = SENSORBONE.HAND_RIGHT, to_sensor = SENSORBONE.WRIST_RIGHT, up_lft = RARM },
|
||||
[LHND] = { from_sensor = SENSORBONE.HAND_LEFT, to_sensor = SENSORBONE.WRIST_LEFT, up_rgt = LARM }
|
||||
},
|
||||
|
||||
--
|
||||
-- Any polishing that can't be done with the above tables
|
||||
--
|
||||
Complete = function( self, player, sensor, rotation, pos, ang )
|
||||
|
||||
pos[SPNE] = LerpVector( 0.4, pos[SPNE], pos[HEAD] )
|
||||
|
||||
-- Feet are insanely spazzy, so we lock the feet to the angle of the calf
|
||||
ang[RFOT] = ang[RCLF]:Right():AngleEx( ang[RCLF]:Up() ) + Angle( 20, 0, 0 )
|
||||
|
||||
end,
|
||||
|
||||
-- Should this entity use this builder?
|
||||
IsApplicable = function( self, ent )
|
||||
|
||||
return ent:GetModel():EndsWith( "models/eli.mdl" )
|
||||
|
||||
end,
|
||||
}
|
||||
|
||||
list.Set( "SkeletonConvertor", "Eli", Builder )
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user