mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
647 lines
32 KiB
Lua
647 lines
32 KiB
Lua
--[[
|
|
| 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" )
|