• NEED HELP! Newbie Scripter here
    11 replies, posted
Alright I'm fairly new to Lua and coding in general. I've had a stab at it before but never really got engaged until now. I'm working on a STool with the following functions: Right Click: Gets the material path of target entity. Left Click: Sets this material on other target entities, rather like the materials STool. Reload: Resets the new overrides to default. I'm having a lot of trouble around the "getting the material path" part, as you might expect. I've looked at [url]http://wiki.garrysmod.com/?title=Entity.GetMaterial[/url] but can't understand it. Here's my code (edits of the default material.lua file) [lua] TOOL.Category = "Render" TOOL.Name = "#Velikoth's Material Grabber" TOOL.Command = nil TOOL.ConfigName = "" TOOL.ClientConVar["entmat"] = "debug/env_cubemap_model" local function SetMaterial( Player, Entity, Data ) Entity:SetMaterial( Data.MaterialOverride ) if ( SERVER ) then duplicator.StoreEntityModifier( Entity, "material", Data ) end return true end duplicator.RegisterEntityModifier( "material", SetMaterial ) function TOOL:LeftClick( trace ) if !( trace.Entity && // Hit an entity trace.Entity:IsValid() && // And the entity is valid trace.Entity:EntIndex() != 0 // And isn't worldspawn ) then return end local mat = self:GetClientInfo( "entmat" ) SetMaterial( self:GetOwner(), trace.Entity, { MaterialOverride = mat } ) return true end function TOOL:RightClick(trace) if( !CLIENT ) then return end if !( trace.Entity && // Hit an entity trace.Entity:IsValid() && // And the entity is valid trace.Entity:EntIndex() != 0 // And isn't worldspawn ) then return end entmat = ent:GetMaterial() end function TOOL:Reload( trace ) if !( trace.Entity && // Hit an entity trace.Entity:IsValid() && // And the entity is valid trace.Entity:EntIndex() != 0 // And isn't worldspawn ) then return end SetMaterial( self:GetOwner(), trace.Entity, { MaterialOverride = "" } ) return true end[/lua] I've been told its a logic error but I don't know what the hell that means. I'm guessing the problem comes from not using the Entity:GetMaterial() properly, but the gmod lua wiki has really bad documentation on learning to use these commands! Especially for a noob like me :( Please help me, guys.
Bump
[QUOTE=Velikoth;24896311]Bump[/QUOTE] [lua] TOOL.Category = "Render" TOOL.Name = "#Velikoth's Material Grabber" TOOL.Command = nil TOOL.ConfigName = "" TOOL.ClientConVar["entmat"] = "debug/env_cubemap_model" local function SetMaterial( Player, Entity, Data ) Entity:SetMaterial( Data.MaterialOverride ) if ( SERVER ) then duplicator.StoreEntityModifier( Entity, "material", Data ) end return true end duplicator.RegisterEntityModifier( "material", SetMaterial ) function TOOL:LeftClick( trace ) if !( trace.Entity && // Hit an entity trace.Entity:IsValid() && // And the entity is valid trace.Entity:EntIndex() != 0 // And isn't worldspawn ) then return end local mat = self:GetClientInfo( "entmat" ) SetMaterial( self:GetOwner(), trace.Entity, { MaterialOverride = mat } ) return true end function TOOL:RightClick(trace) if( !CLIENT ) then return end if !( trace.Entity && // Hit an entity trace.Entity:IsValid() && // And the entity is valid trace.Entity:EntIndex() != 0 // And isn't worldspawn ) then return end print(trace.Entity:GetMaterial()) end function TOOL:Reload( trace ) if !( trace.Entity && // Hit an entity trace.Entity:IsValid() && // And the entity is valid trace.Entity:EntIndex() != 0 // And isn't worldspawn ) then return end SetMaterial( self:GetOwner(), trace.Entity, { MaterialOverride = "" } ) return true end[/lua]
Doesn't work. And I don't want to print it to console, I want to be able to set that object's material on other entities.
Well explain more of what you want instead of [QUOTE]Right Click: Gets the material path of target entity.[/QUOTE] Explain what you want it to do and i will fix it.
[QUOTE=Cubar;24918448]Well explain more of what you want instead of Explain what you want it to do and i will fix it.[/QUOTE] Okay, using my mighty technical terminology: Right Click would get the material path of the target entity and store that so it can be applied to other entities with Left Click. EG: Right clicks on a Door and gets that door's material path. Left clicks on a bench and sets the bench's material as that of the door targetted with Right Click.
[lua]TOOL.Category = "Render" TOOL.Name = "#Velikoth's Material Grabber" TOOL.Command = nil TOOL.ConfigName = "" local default = "debug/env_cubemap_model" local mat = mat or default function TOOL:LeftClick( trace ) if !( trace.Entity && // Hit an entity trace.Entity:IsValid() && // And the entity is valid trace.Entity:EntIndex() != 0 // And isn't worldspawn ) then return end trace.Entity:SetMaterial( mat ) return true end function TOOL:RightClick(trace) if( !CLIENT ) then return end if !( trace.Entity && // Hit an entity trace.Entity:IsValid() && // And the entity is valid trace.Entity:EntIndex() != 0 // And isn't worldspawn ) then return end self.Owner:ChatPrint("Got Material ".. mat) mat = trace.Entity:GetMaterial() end function TOOL:Reload( trace ) if !( trace.Entity && // Hit an entity trace.Entity:IsValid() && // And the entity is valid trace.Entity:EntIndex() != 0 // And isn't worldspawn ) then return end trace.Entity:SetMaterial( mat ) return true end[/lua]
Isn't working. Right click doesn't do anything and Left click sets the material as cubemap.
[QUOTE=Velikoth;24924750]Isn't working. Right click doesn't do anything and Left click sets the material as cubemap.[/QUOTE] Because there is no material set on the door ect the GetMaterial gets the material from the .vtf not the model material that's all ready on there.
:GetMaterial() is used for getting the material previously set using :SetMaterial(). It doesn't get the true material of the model, it gets the material [b]override[/b].
Oh, I see. So it isn't possible?
Well not unless the material is set first.
Sorry, you need to Log In to post a reply to this thread.