All pastes #458341 Raw Edit

Stuff

public text v1 · immutable
#458341 ·published 2007-04-25 20:40 UTC
rendered paste body
AddCSLuaFile( "cl_init.lua" )
AddCSLuaFile( "shared.lua" )

include('shared.lua')

ENT.WireDebugName = "Pod Controller"

local MODEL = Model("models/jaanus/wiretool/wiretool_siren.mdl")

-- Number of pods (Used for creating an uniqe name)
-- wire_pod_count = 0

function ENT:Initialize()
	self.Entity:SetModel( MODEL )
	self.Entity:PhysicsInit( SOLID_VPHYSICS )
	self.Entity:SetMoveType( MOVETYPE_VPHYSICS )
	self.Entity:SetSolid( SOLID_VPHYSICS )
	
	--[[
	-- Set the name of self (To let us have several controllers)
	-- Note: Player:GetVehicle does actually work on pods. (&/(%&/(/&%)(/( wiki)
	self.Tname = "wpod"..wire_pod_count
	wire_pod_count = wire_pod_count + 1
	self.Entity:SetName(self.Tname)
	
	]]
	
	-- Output keys. Format: keys["name"] = IN_*
	keys = { }
	keys["W"] = IN_FORWARD
	keys["A"] = IN_MOVELEFT
	keys["S"] = IN_BACK
	keys["D"] = IN_MOVERIGHT
	keys["Mouse1"] = IN_ATTACK
	keys["R"] = IN_RELOAD
	keys["Space"] = IN_JUMP
	keys["Ctrl"] = IN_DUCK
	keys["Mouse2"] = IN_ATTACK2
	keys["Shift"] = IN_SPEED
	keys["Alt"] = IN_WALK
	
	-- Invert the table to use it with Wire_CreateOutputs
	local outputs = { }
	local n = 1
	
	for k, v in pairs( keys ) do
		outputs[n] = k
		n = n + 1
	end
	
	-- <angle>
	outputs[n] = "X"
	n = n + 1
	outputs[n] = "Y"
	n = n + 1
	outputs[n] = "Z"
	-- </angle>
	
	-- Create outputs
	self.Outputs = Wire_CreateOutputs( self.Entity, outputs )
	self:SetOverlayText( "Pod Controller" )
end

-- Link to pod
function ENT:Setup( pod )
	-- print("Setting up... ".."\"PlayerOn "..self.Tname..",start,1,0,-1\"")
	-- print_r(pod)
	-- 
	self.Pod = pod
	self.TTLFP = CurTime()
end

-- No inputs
function ENT:TriggerInput(iname, value)

end

function ENT:ShowOutput(value)
	if (value ~= self.PrevOutput) then
		self:SetOverlayText( "Pod Controller" )
		self.PrevOutput = value
	end
end

function ENT:OnRestore()
	keys = { }
	keys["W"] = IN_FORWARD
	keys["A"] = IN_MOVELEFT
	keys["S"] = IN_BACK
	keys["D"] = IN_MOVERIGHT
	keys["Mouse1"] = IN_ATTACK
	keys["R"] = IN_RELOAD
	keys["Space"] = IN_JUMP
	keys["Ctrl"] = IN_DUCK
	keys["Mouse2"] = IN_ATTACK2
	keys["Shift"] = IN_SPEED
	keys["Alt"] = IN_WALK
	
    self.BaseClass.OnRestore(self)
end

--[[
-- Gets called when the SENT get an input (i.e. from the pod)
function ENT:AcceptInput( name, activator, caller )
	-- print("Name = "..tostring(name))
	if not activator:IsPlayer() then return end
	if name == "start" then
		self.Cply = activator
		-- print("Activator: "..activator:GetClass().." Caller: "..caller:GetClass())
	elseif name == "stop" then
		self.Cply = nil
	end
	return true
end
]]

-- Called every 0.01 seconds, check for key down
function ENT:Think()
	-- Check that we have a pod
	if self.Pod then
		-- Check if we should look for player entering/exiting the vehicle TTLFP = TimeToLookForPod
		if self.TTLFP < CurTime() then
			-- Check if the old player is still in our vehicle
			if !(self.Ply and self.Ply:GetVehicle() == self.Pod) then
				-- Get all players
				local plys = player.GetAll()
				self.Ply = nil
				-- Loop through all players and check if their vehicle is our vehicle
				for k,v in pairs(plys) do
					if v:GetVehicle() == self.Pod then self.Ply = v end
				end
			end
			-- Look for players again in 1/10 second
			self.TTLFP = CurTime() + 0.1
		end
		
		if self.Ply then
			-- Loop through all the keys, and check if they was pressed last frame
			for k, v in pairs( keys )  do
				--[[
				if self.Ply:KeyDownLast( v ) then Wire_TriggerOutput( self.Entity, k, 1 )-- ; print( "Pressed: "..k..":"..v )
				else Wire_TriggerOutput( self.Entity, k, 0 ) end
				]]
				-- Optimising Optimising Optimising...
				--print("SPAM!")
				if self.Ply:KeyDownLast( v ) then Wire_TriggerOutput( self.Entity, k, 1 )
				else Wire_TriggerOutput( self.Entity, k, 0 ) end
				
				local tmp = self.Ply:GetEyeTrace().HitPos
				Wire_TriggerOutput( self.Entity, "X", tmp.x )
				Wire_TriggerOutput( self.Entity, "Y", tmp.y )
				Wire_TriggerOutput( self.Entity, "Z", tmp.z )
			end
		end
	end
	self.Entity:NextThink(CurTime() + 0.01)
	return true
end


//Duplicator support to save pod link (TAD2020)
function ENT:BuildDupeInfo()
	local info = self.BaseClass.BuildDupeInfo(self) or {}

	if (self.Pod) and (self.Pod:IsValid()) then
	    info.pod = self.Pod:EntIndex()
	end

	return info
end

function ENT:ApplyDupeInfo(ply, ent, info, GetEntByID)
	self.BaseClass.ApplyDupeInfo(self, ply, ent, info, GetEntByID)

	if (info.pod) then
		self.Pod = GetEntByID(info.pod)
		if (!self.Pod) then
			self.Pod = ents.GetByIndex(info.pod)
		end
	end
end