[QUOTE=code_gs;52826419]That's what I was thinking. I guessed it would have been Lua code since he said "my entity," but the engine probably sets it in the spawn method and not the constructor.[/QUOTE]
So it actually worked, thank you! Although my issue is that the model is placed backwards on the scanner. I don't suppose there's any fix for that?
[QUOTE=pilot;52827857]So it actually worked, thank you! Although my issue is that the model is placed backwards on the scanner. I don't suppose there's any fix for that?[/QUOTE]
What do you mean "backwards?"
[QUOTE=code_gs;52827861]What do you mean "backwards?"[/QUOTE]
Like when the scanner goes forwards, the model is facing 180 degrees the wrong way.
[QUOTE=pilot;52827870]Like when the scanner goes forwards, the model is facing 180 degrees the wrong way.[/QUOTE]
Could rotate it on every client with [img]http://wiki.garrysmod.com/favicon.ico[/img] [url=http://wiki.garrysmod.com/page/Entity/SetRenderAngles]Entity:SetRenderAngles[/url].
[QUOTE=code_gs;52827893]Could rotate it on every client with [img]http://wiki.garrysmod.com/favicon.ico[/img] [url=http://wiki.garrysmod.com/page/Entity/SetRenderAngles]Entity:SetRenderAngles[/url].[/QUOTE]
Sorry for the beginner question, I'm still transitioning from complete beginner to sort of intermediate coder. How would I call on that on every client if running this on a shared file?
[QUOTE=pilot;52828051]Sorry for the beginner question, I'm still transitioning from complete beginner to sort of intermediate coder. How would I call on that on every client if running this on a shared file?[/QUOTE]
You would have to network the entity to the client after spawning it. From there, your client code would look something like:
[code]local aRot = Angle(0, 180, 0)
net.Receive("RotateScanner", function()
local pEntity = net.ReadEntity()
if (pEntity:IsValid()) then
pEntity.RenderOverride = function(self)
self:SetRenderAngles(aRot)
self:DrawModel()
end
end
end)[/code]
[QUOTE=code_gs;52828073]You would have to network the entity to the client after spawning it. From there, your client code would look something like:
[code]local aRot = Angle(0, 180, 0)
net.Receive("RotateScanner", function()
local pEntity = net.ReadEntity()
if (pEntity:IsValid()) then
pEntity.RenderOverride = function(self)
self:SetRenderAngles(aRot)
self:DrawModel()
end
end
end)[/code][/QUOTE]
Didn't exactly work.
Serverside after I spawn the entity I do:
[CODE]
if (SERVER) then
local entity = ents.Create("npc_cscanner")
entity:SetPos(client:GetPos())
entity:SetAngles(client:GetAngles())
entity:SetColor(client:GetColor())
entity:SetModel("models/shield_scanner.mdl")
entity:Spawn()
entity:Activate()
net.Start("nut_rotateEyebot")
net.WriteEntity(entity)
net.Send(entity)
end
[/CODE]
And then after all that clientside I do:
[CODE]
if (CLIENT) then
local aRot = Angle(0, 180, 0)
net.Receive("nut_rotateEyebot", function()
local pEntity = net.ReadEntity()
if (pEntity:IsValid()) then
pEntity.RenderOverride = function(self)
self:SetRenderAngles(aRot)
self:DrawModel()
end
end
end)
end
[/CODE]
[img]http://wiki.garrysmod.com/favicon.ico[/img] [url=http://wiki.garrysmod.com/page/net/Broadcast]net.Broadcast[/url] to send the net message to every player.
Also, are you doing anything to the entity outside of the code you've given us? I don't experience the npc being backwards (and I use the same code as you've provided), but I do experience animation problems (particularly the "open idle" animation being its idle animation)
I don't see why you don't just use npc_clawscanner
[QUOTE=Sm63;52829007]Also, are you doing anything to the entity outside of the code you've given us? I don't experience the npc being backwards (and I use the same code as you've provided), but I do experience animation problems (particularly the "open idle" animation being its idle animation)
I don't see why you don't just use npc_clawscanner[/QUOTE]
I've lied to all of you :worried:. I was actually creating an eyebot by editing Nutscript's HL2RP scanner script. I'll show you what I got:
[url]https://pastebin.com/WEfEqfeW[/url]
Everything works fine, it's only the orientation of the model. Which could just be the problem of the model itself, but I need to account for that and fix it. I'll try using net.Broadcast and report back.
net.Broadcast does nothing, but I could just be doing it all wrong.
Anyone know how a hack to get Deploy() to be called even when the SWEP/TOOL is deployed for the very first time (blame the prediction, i know) ?
Also, anyone already had rendering bugs with TOOL:DrawToolScreen ?
Some materials refuse to draw (always the same ones, .png, loaded with Material(), not any other flag) but some others always draws, [reloading the map]/[re-loading the materials] fixes the problem
Hello, i am having a problem with my code. net.SendToServer and net.Receive doesn't work for me. Could anyone help me?
INIT.LUA
[CODE]AddCSLuaFile("cl_init.lua");
util.AddNetworkString("druglab_toserver")
include("shared.lua")
DEFINE_BASECLASS("lab_base")
ENT.SeizeReward = 350
function ENT:Initialize()
BaseClass.Initialize(self)
self.SID = self:Getowning_ent().SID
end
function ENT:Use( ply, caller )
umsg.Start( "DrawTheMenu", ply )
umsg.Short( "1" )
umsg.End()
end
net.Receive( "druglab_toserver", ENT:createItem )
function ENT:createItem()
local drugType = net.ReadString()
local drugPos = self:GetPos()
local drug = ents.Create(drugType)
drug:SetPos(Vector(drugPos.x, drugPos.y, drugPos.z + 35))
drug.nodupe = true
drug:Spawn()
end
[/CODE]
CL_INIT
[CODE]include("shared.lua")
function ENT:Draw()
self.Entity:DrawModel()
local dis = 512
hook.Add( "PreDrawHalos", "AddHalos", function()
--cache a trace
local tr = LocalPlayer():GetEyeTrace()
--make sure the trace hit an entity, make sure that it didn't hit the world, then we get teh squared distance which is way faster than getting the regular distance :D
if (tr.Entity and tr.HitNonWorld and IsValid(tr.Entity) and LocalPlayer():GetPos():DistToSqr(tr.Entity:GetPos()) <= (dis * dis)) then
halo.Add({self.Entity}, Color( 255, 0, 0 ))
end
end)
end
local function DrawTheMenu()
if ( !frame ) then
local frame = vgui.Create( "DFrame" )
frame:SetSize( 280, 280 )
frame:Center()
frame:SetVisible( true )
frame:MakePopup()
frame:SetTitle( "Drug Lab" )
frame:SetDeleteOnClose( true )
buttonLSD = vgui.Create( "DButton", frame )
buttonLSD:SetText( "LSD" )
buttonLSD:SetSize( 110, 50 )
buttonLSD:SetPos( 20, 45 )
buttonLSD.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString( "durgz_lsd" )
net.SendToServer()
end
buttonHeroin = vgui.Create( "DButton", frame )
buttonHeroin:SetText( "Heroin" )
buttonHeroin:SetSize( 110, 50 )
buttonHeroin:SetPos( 20, 100 )
buttonHeroin.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_heroin")
net.SendToServer()
end
buttonMeth = vgui.Create( "DButton", frame )
buttonMeth:SetText( "Meth" )
buttonMeth:SetSize( 110, 50 )
buttonMeth:SetPos( 20, 155 )
buttonMeth.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_meth")
net.SendToServer()
end
buttonCocaine = vgui.Create( "DButton", frame )
buttonCocaine:SetText( "Cocaine" )
buttonCocaine:SetSize( 110, 50 )
buttonCocaine:SetPos( 20, 210 )
buttonCocaine.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_cocaine")
net.SendToServer()
end
buttonPCP = vgui.Create( "DButton", frame )
buttonPCP:SetText( "PCP" )
buttonPCP:SetSize( 110, 50 )
buttonPCP:SetPos( 150, 45 )
buttonPCP.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_pcp")
net.SendToServer()
end
buttonMushroom = vgui.Create( "DButton", frame )
buttonMushroom:SetText( "Mushroom" )
buttonMushroom:SetSize( 110, 50 )
buttonMushroom:SetPos( 150, 100 )
buttonMushroom.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_mushroom")
net.SendToServer()
end
buttonWeed = vgui.Create( "DButton", frame )
buttonWeed:SetText( "Weed" )
buttonWeed:SetSize( 110, 50 )
buttonWeed:SetPos( 150, 155 )
buttonWeed.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_weed")
net.SendToServer()
end
buttonCigarettes = vgui.Create( "DButton", frame )
buttonCigarettes:SetText( "Cigarettes" )
buttonCigarettes:SetSize( 110, 50 )
buttonCigarettes:SetPos( 150, 210 )
buttonCigarettes.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_cigarette")
net.SendToServer()
end
end
end
usermessage.Hook( "DrawTheMenu", DrawTheMenu )
[/CODE]
SHARED.LUA
[CODE]ENT.Base = "lab_base"
ENT.PrintName = "Drug Lab"
function ENT:initVars()
self.model = "models/props_lab/crematorcase.mdl"
self.initialPrice = 100
self.labPhrase = DarkRP.getPhrase("drug_lab")
self.itemPhrase = DarkRP.getPhrase("drugs")
self.noIncome = true
self.camMul = -39
end
[/CODE]
[lua]
net.Receive( "druglab_toserver", receiveMessage )
drugType = net.ReadString()
print( "SENT TO SERVER!" )
ENT:createItem()
end )
[/lua]
you what
edit : holy shit the facepunch lua tag is total shit when editing
I fixed it now but it still doesn't work. Can someone help me?
[QUOTE=buu342;52820389]Is [url=https://wiki.garrysmod.com/page/File_Based_Storage]this guide[/url] outdated or am I just disabled?
I'm getting this error, despite literally not changing anything in the page's code:
[code]
[ERROR] addons/monster mash/lua/autorun/medals_data.lua:12: attempt to index a nil value
1. LoadPlayerData - addons/monster mash/lua/autorun/medals_data.lua:12
2. unknown - addons/monster mash/lua/autorun/medals_data.lua:17
[/code][/QUOTE]
Hope it's not too late to reply, I couldn't see anyone help you..
I seems that the code in that page is broken. These two lines are trying to put data in a table that hasn't been created:[lua] PlayerData[id].playtime = args[2]
PlayerData[id].deaths = args[3][/lua]
You need to create the table before them, like so:[lua] PlayerData[id] = {}
PlayerData[id].playtime = args[2]
PlayerData[id].deaths = args[3][/lua]
[QUOTE=m0uka;52830169]I fixed it now but it still doesn't work. Can someone help me?[/QUOTE]
[code]net.Receive( "druglab_toserver", ENT:createItem )[/code]
Is illegal.
[QUOTE=Meninist;51816981][CODE]AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
include("shared.lua")
function ENT:Initialize()
self:SetModel("models/hunter/blocks/cube025x025x025.mdl")
self:PhysicsInit(SOLID_VPHYSICS)
self:SetMoveType(MOVETYPE_VPHYSICS)
self:SetSolid(SOLID_VPHYSICS)
self:SetColor(Color(90,90,90))
local phys = self.GetPhysicsObject()
if phys:IsValid() then
phys:Wake()
end
end
function ENT:Use(a , c)
c:SetHealth(c:Health() + 1)
if c:Health() >= 101 then
c:SetHealth(1)
c:PrintMessage(HUD_PRINTTALK,"How dare you, "..c:Nick()" abuse a power granted by the gods!")
end
end[/CODE]
I am using this code but receiving this error.
[CODE][ERROR] lua/entities/testent/init.lua:15: Tried to use a NULL entity!
1. GetPhysicsObject - [C]:-1
2. unknown - lua/entities/testent/init.lua:15
3. Spawn - [C]:-1
4. SpawnFunction - gamemodes/base/entities/entities/base_entity/init.lua:70
5. Spawn_SENT - gamemodes/sandbox/gamemode/commands.lua:651
6. unknown - gamemodes/sandbox/gamemode/commands.lua:716
7. unknown - lua/includes/modules/concommand.lua:54[/CODE]
Any help is appreciated![/QUOTE]
You have
[CODE]
function ENT:Use(a , c)
[/CODE]
You never use a just c, remove a.
[QUOTE=water1108;52832118]You have
[CODE]
function ENT:Use(a , c)
[/CODE]
You never use a just c, remove a.[/QUOTE]
That is not how any language works.
[QUOTE=G4MB!T;52832344]That is not how any language works.[/QUOTE]
To be fair python kind of works that way, as long as you specify the argument itself
[QUOTE=water1108;52832118]You have
[CODE]
function ENT:Use(a , c)
[/CODE]
You never use a just c, remove a.[/QUOTE]
This isn't even related to the error, which is on this line [code]local phys = self.GetPhysicsObject()[/code]
You're calling a method as a variable. When you do this, the method won't have a self variable and will error out. If you wanted to, you could just do self.GetPhysicsObject(self), but that isn't good practice. Use [code]local phys = self:GetPhysicsObject()[/code]
Also, you'll run into a problem later with [code]c:PrintMessage(HUD_PRINTTALK,"How dare you, "..c:Nick()" abuse a power granted by the gods!")[/code]
You're not concatenating the first half of the string with the second half. It should be
[code]c:PrintMessage(HUD_PRINTTALK,"How dare you, "..c:Nick() .." abuse a power granted by the gods!")[/code]
How do you override functions in a gamemode when you're using another gamemode as a base?
I have a gamemode that uses sandbox as a base GM:PlayerSpawnSWEP in my gamemode isn't being called.
[code]GM.Name = "Fight to Survive Classic"
GM.Author = "Burger"
GM.Email = "N/A"
GM.Website = "N/A"
GM.Version = "1.0.0"
DeriveGamemode( "sandbox" )
DEFINE_BASECLASS( "gamemode_sandbox" )
AddCSLuaFile( "cl_init.lua" )
function GM:PlayerSpawnSWEP( ply, wname, wtable )
print("call me maybe")
return false
end[/code]
[QUOTE=ROFLBURGER;52835887]How do you override functions in a gamemode when you're using another gamemode as a base?
I have a gamemode that uses sandbox as a base GM:PlayerSpawnSWEP in my gamemode isn't being called.
[code]GM.Name = "Fight to Survive Classic"
GM.Author = "Burger"
GM.Email = "N/A"
GM.Website = "N/A"
GM.Version = "1.0.0"
DeriveGamemode( "sandbox" )
DEFINE_BASECLASS( "gamemode_sandbox" )
AddCSLuaFile( "cl_init.lua" )
function GM:PlayerSpawnSWEP( ply, wname, wtable )
print("call me maybe")
return false
end[/code][/QUOTE]
I believe it's this:
[CODE]
function GM.BaseClass:PlayerSpawnSWEP(ply, name, tbl)
print("call me maybe")
return false
end
[/CODE]
Untested, but this should overwrite the function directly in the base gamemode.
[QUOTE=ROFLBURGER;52835887]How do you override functions in a gamemode when you're using another gamemode as a base?
I have a gamemode that uses sandbox as a base GM:PlayerSpawnSWEP in my gamemode isn't being called.
[code]GM.Name = "Fight to Survive Classic"
GM.Author = "Burger"
GM.Email = "N/A"
GM.Website = "N/A"
GM.Version = "1.0.0"
DeriveGamemode( "sandbox" )
DEFINE_BASECLASS( "gamemode_sandbox" )
AddCSLuaFile( "cl_init.lua" )
function GM:PlayerSpawnSWEP( ply, wname, wtable )
print("call me maybe")
return false
end[/code][/QUOTE]
Use hooks.
[QUOTE=G4MB!T;52835971]Use hooks.[/QUOTE]
Darn, thought there was a way without using hooks. Using hooks in a gamemode seemed a little unnecessary to me but oh well.
If you want to override it completely then just do what you were doing before. If you need to override it but still call the base function, override it completely and call the base function (Requires use of DeriveGamemode("sandbox") in your case, then use `self.BaseClass.func(...)`).
The fact that yours was not being called might suggest a hook for the same function returning false, which means no other hooks or functions in the chain will be called.
[QUOTE=G4MB!T;52836027]If you want to override it completely then just do what you were doing before. If you need to override it but still call the base function, override it completely and call the base function (Requires use of DeriveGamemode("sandbox") in your case, then use `self.BaseClass.func(...)`).
The fact that yours was not being called might suggest a hook for the same function returning false, which means no other hooks or functions in the chain will be called.[/QUOTE]
Or even returns true. Any return value besides nil or no value will prevent the rest of the hooks and the gamemode function from being called.
I have an entity in another file
[CODE]
barrel=ents.Create("prop_physics")
barrel:SetModel("models/props_c17/oildrum001.mdl")
barrel:SetPos(Vector(0,0,0))
barrel:Spawn()
[/CODE]
How do you check if an entity exists? Doing barrel:IsValid() outside where I created the entity doesn't work.
Hello, i am still having a problem with my code. net.SendToServer and net.Receive doesn't work for me. Could anyone help me?
INIT.LUA
[CODE]
AddCSLuaFile("cl_init.lua");
util.AddNetworkString("druglab_toserver")
include("shared.lua")
DEFINE_BASECLASS("lab_base")
ENT.SeizeReward = 350
function ENT:Initialize()
BaseClass.Initialize(self)
self.SID = self:Getowning_ent().SID
end
function ENT:Use( ply, caller )
umsg.Start( "DrawTheMenu", ply )
umsg.Short( "1" )
umsg.End()
end
net.Receive( "druglab_toserver", ENT:createItem )
function ENT:createItem()
local drugType = net.ReadString()
local drugPos = self:GetPos()
local drug = ents.Create(drugType)
drug:SetPos(Vector(drugPos.x, drugPos.y, drugPos.z + 35))
drug.nodupe = true
drug:Spawn()
end
[/CODE]
CL_INIT
[CODE]
include("shared.lua")
function ENT:Draw()
self.Entity:DrawModel()
local dis = 512
hook.Add( "PreDrawHalos", "AddHalos", function()
--cache a trace
local tr = LocalPlayer():GetEyeTrace()
--make sure the trace hit an entity, make sure that it didn't hit the world, then we get teh squared distance which is way faster than getting the regular distance :D
if (tr.Entity and tr.HitNonWorld and IsValid(tr.Entity) and LocalPlayer():GetPos():DistToSqr(tr.Entity:GetPos()) <= (dis * dis)) then
halo.Add({self.Entity}, Color( 255, 0, 0 ))
end
end)
end
local function DrawTheMenu()
if ( !frame ) then
local frame = vgui.Create( "DFrame" )
frame:SetSize( 280, 280 )
frame:Center()
frame:SetVisible( true )
frame:MakePopup()
frame:SetTitle( "Drug Lab" )
frame:SetDeleteOnClose( true )
buttonLSD = vgui.Create( "DButton", frame )
buttonLSD:SetText( "LSD" )
buttonLSD:SetSize( 110, 50 )
buttonLSD:SetPos( 20, 45 )
buttonLSD.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString( "durgz_lsd" )
net.SendToServer()
end
buttonHeroin = vgui.Create( "DButton", frame )
buttonHeroin:SetText( "Heroin" )
buttonHeroin:SetSize( 110, 50 )
buttonHeroin:SetPos( 20, 100 )
buttonHeroin.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_heroin")
net.SendToServer()
end
buttonMeth = vgui.Create( "DButton", frame )
buttonMeth:SetText( "Meth" )
buttonMeth:SetSize( 110, 50 )
buttonMeth:SetPos( 20, 155 )
buttonMeth.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_meth")
net.SendToServer()
end
buttonCocaine = vgui.Create( "DButton", frame )
buttonCocaine:SetText( "Cocaine" )
buttonCocaine:SetSize( 110, 50 )
buttonCocaine:SetPos( 20, 210 )
buttonCocaine.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_cocaine")
net.SendToServer()
end
buttonPCP = vgui.Create( "DButton", frame )
buttonPCP:SetText( "PCP" )
buttonPCP:SetSize( 110, 50 )
buttonPCP:SetPos( 150, 45 )
buttonPCP.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_pcp")
net.SendToServer()
end
buttonMushroom = vgui.Create( "DButton", frame )
buttonMushroom:SetText( "Mushroom" )
buttonMushroom:SetSize( 110, 50 )
buttonMushroom:SetPos( 150, 100 )
buttonMushroom.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_mushroom")
net.SendToServer()
end
buttonWeed = vgui.Create( "DButton", frame )
buttonWeed:SetText( "Weed" )
buttonWeed:SetSize( 110, 50 )
buttonWeed:SetPos( 150, 155 )
buttonWeed.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_weed")
net.SendToServer()
end
buttonCigarettes = vgui.Create( "DButton", frame )
buttonCigarettes:SetText( "Cigarettes" )
buttonCigarettes:SetSize( 110, 50 )
buttonCigarettes:SetPos( 150, 210 )
buttonCigarettes.DoClick = function()
net.Start( "druglab_toserver" )
net.WriteString("durgz_cigarette")
net.SendToServer()
end
end
end
usermessage.Hook( "DrawTheMenu", DrawTheMenu )
[/CODE]
SHARED.LUA
[CODE]
ENT.Base = "lab_base"
ENT.PrintName = "Drug Lab"
function ENT:initVars()
self.model = "models/props_lab/crematorcase.mdl"
self.initialPrice = 100
self.labPhrase = DarkRP.getPhrase("drug_lab")
self.itemPhrase = DarkRP.getPhrase("drugs")
self.noIncome = true
self.camMul = -39
end
[/CODE]
[QUOTE=m0uka;52837177]Long code
[/QUOTE]
Do you realize just how exploitable that is?
Another thing. I'm sure you can use a table to create those buttons instead of repeating the code a bajillion times. Just create a local variable that does
[CODE]
var = var + 55[/CODE]
after each iteration.
As for your problem.
[CODE]net.Receive( "druglab_toserver", function( )
local drugType = net.ReadString()
local drugPos = self:GetPos()
local drug = ents.Create(drugType)
drug:SetPos(Vector(drugPos.x, drugPos.y, drugPos.z + 35))
drug.nodupe = true
drug:Spawn()
end)[/CODE]
instead of
[CODE]net.Receive( "druglab_toserver", ENT:createItem )
function ENT:createItem()
local drugType = net.ReadString()
local drugPos = self:GetPos()
local drug = ents.Create(drugType)
drug:SetPos(Vector(drugPos.x, drugPos.y, drugPos.z + 35))
drug.nodupe = true
drug:Spawn()
end[/CODE]
After this, secure the net message. Someone can spawn ANY entity they want with that code.
[QUOTE=MelonShooter;52837209]Do you realize just how exploitable that is?
Another thing. I'm sure you can use a table to create those buttons instead of repeating the code a bajillion times. Just create a local variable that does
[CODE]
var = var + 55[/CODE]
after each iteration.
As for your problem.
[CODE]net.Receive( "druglab_toserver", function( )
local drugType = net.ReadString()
local drugPos = self:GetPos()
local drug = ents.Create(drugType)
drug:SetPos(Vector(drugPos.x, drugPos.y, drugPos.z + 35))
drug.nodupe = true
drug:Spawn()
end)[/CODE]
instead of
[CODE]net.Receive( "druglab_toserver", ENT:createItem )
function ENT:createItem()
local drugType = net.ReadString()
local drugPos = self:GetPos()
local drug = ents.Create(drugType)
drug:SetPos(Vector(drugPos.x, drugPos.y, drugPos.z + 35))
drug.nodupe = true
drug:Spawn()
end[/CODE]
After this, secure the net message. Someone can spawn ANY entity they want with that code.[/QUOTE]
Well, it doesn't work. I did this before and nothing.
Sorry, you need to Log In to post a reply to this thread.