Adding light output to entities

Place to get help with not working mods / modding interface.
Post Reply
zackboe
Manual Inserter
Manual Inserter
Posts: 1
Joined: Sun Nov 09, 2014 10:02 am
Contact:

Adding light output to entities

Post by zackboe »

I'm not sure if this is a bug, or I'm simply going about this the wrong way.

I'd like to add a light output to electric poles, and am attempting to do so using the following code:

Code: Select all

data.raw["electric-pole"]["small-electric-pole"].light = { intensity = 0.9, size = 5 }
The mod loads fine and produces no errors, but light does not emit from the object.

There's a couple threads here and here on the subject, but are quite a few months old.

Any ideas?

cartmen180
Filter Inserter
Filter Inserter
Posts: 358
Joined: Fri Jul 25, 2014 2:53 pm
Contact:

Re: Adding light output to entities

Post by cartmen180 »

light is not a property of the electric pole, so you will have to do some lua magic to make it work
Check out my mods

User avatar
L0771
Filter Inserter
Filter Inserter
Posts: 516
Joined: Tue Jan 14, 2014 1:51 pm
Contact:

Re: Adding light output to entities

Post by L0771 »

Hi, maybe with something like this
-

Code: Select all

game.oninit(function()
		glob.build = {}
end)
game.onevent(defines.events.onbuiltentity, function(event)
	if event.createdentity.name == "burner-mining-drill" then
		local newdrill = event.createdentity
		local newlight = game.createentity{name="small-lamp", position = newdrill.position, force=game.forces.player}
		
		table.insert(glob.build,{drill,light})
		i = 0
		for k,v in pairs(glob.build) do
			i = i + 1
		end
		
		glob.build[i].drill = newdrill
		glob.build[i].light = newlight
	end
end)
game.onevent(defines.events.onpreplayermineditem, function(event)
	if (event.entity.name == "burner-mining-drill") then
		for k,v in pairs(glob.build) do
			if (event.entity.equals(v.drill)) then
				v.light.destroy()
			end
		end
	end
end)
Where you build a burner mining drill, automatically create a light, and when you destroy this mining drill, automatically destroy that light.
You can make a light entity with transparent picture, light see from main entity...

i'm new here too, maybe can write a better code
Last edited by L0771 on Tue Nov 11, 2014 3:13 pm, edited 1 time in total.

User avatar
rk84
Filter Inserter
Filter Inserter
Posts: 556
Joined: Wed Feb 13, 2013 9:15 am
Contact:

Re: Adding light output to entities

Post by rk84 »

@ L0771 I would like to point some things in your code.

Code: Select all

table.insert(glob.build,{drill,light}) -- inserting array of 2 values (nils?) in glob.build, that are not used anywhere. Could use empty table here.
You don't have to measure length of array

Code: Select all

i = 0
for k,v in pairs(glob.build) do -- could be ipairs or should I say should be.
  i = i + 1
end
-- You use table.insert to build array. You can get length of array with # operator.
-- i = #glob.build
You could also use table.remote to keep your array tidy, but because order does not matter you could check for "empty" element before inserting tables in end of array.
Test mode
Searching Flashlight
[WIP]Fluid handling expansion
[WIP]PvP gamescript
[WIP]Rocket Express
Autofill: The torch has been pass to Nexela

User avatar
L0771
Filter Inserter
Filter Inserter
Posts: 516
Joined: Tue Jan 14, 2014 1:51 pm
Contact:

Re: Adding light output to entities

Post by L0771 »

Thanks, I am using a similar code in my mod, it is helpful

Code: Select all

		local toadd = 0
		for k,v in ipairs(glob.build)
			if toadd == 0 and glob.build[k] == nil then
				toadd = k
			end
		end
		if toadd == 0 then
			toadd = #glob.build + 1
		end
		local newlight = game.createentity{name="small-lamp", position = newdrill.position, force=game.forces.player}
		glob.build[toadd] = {}
		glob.build[toadd].drill = event.createdentity
		glob.build[toadd].light = newlight
this is fine?

ipairs is only for table's order? or has another utility?

User avatar
rk84
Filter Inserter
Filter Inserter
Posts: 556
Joined: Wed Feb 13, 2013 9:15 am
Contact:

Re: Adding light output to entities

Post by rk84 »

At first, I was going to add couple minor changes, but in the end I desided to go through all of it and quick test it. :)

Code: Select all

require "defines"

game.oninit(function()
      glob.build = {}
end)

game.onevent(defines.events.onbuiltentity, function(event)
  if event.createdentity.name == "burner-mining-drill" then
    local build = glob.build -- to reduce global access time
    local newlight = game.createentity{name="small-lamp", position = event.createdentity.position, force=game.forces.player}
    for i=1, #build do
      if not build[i].drill.valid then -- Recycling old table 
        build[i].drill = event.createdentity
        build[i].light = newlight
        return
      end
    end
    
    --Creating new table
    build[#build + 1] = {drill = event.createdentity, light = newlight} -- equivalent to {["drill"] = event.createdentity, ["light"] = newlight}
  end
end)

game.onevent(defines.events.onpreplayermineditem, function(event)
  if (event.entity.name == "burner-mining-drill") then
    local build = glob.build
    for i=1, #build do
      if build[i].drill.valid and event.entity.equals(build[i].drill) and build[i].light.valid then
        build[i].light.destroy()
      end
    end
  end
end)
L0771 wrote:ipairs is only for table's order? or has another utility?
Its up to you which you use, but you should be aware that Lua table have 2 parts. Hash table and array. ipairs only access array part and pairs can access both. (Note: negative numbers and zero key belongs in hash table)
I would use table.insert, table.remove and ipairs together as they all access only array part. But lately I have not used ipairs with arrays, because plain "for i=1, #table do" is faster option.
Test mode
Searching Flashlight
[WIP]Fluid handling expansion
[WIP]PvP gamescript
[WIP]Rocket Express
Autofill: The torch has been pass to Nexela

User avatar
L0771
Filter Inserter
Filter Inserter
Posts: 516
Joined: Tue Jan 14, 2014 1:51 pm
Contact:

Re: Adding light output to entities

Post by L0771 »

That's really helpful, thanks you, i'll rewrite all the code again.

Here you don't use remove?
this is build = { nil, nil } ? or by defaul remove the array?

Code: Select all

    local build = glob.build
    for i=1, #build do
      if build[i].drill.valid and event.entity.equals(build[i].drill) and build[i].light.valid then
        build[i].light.destroy()
      end
    end

User avatar
rk84
Filter Inserter
Filter Inserter
Posts: 556
Joined: Wed Feb 13, 2013 9:15 am
Contact:

Re: Adding light output to entities

Post by rk84 »

yea I did not implement anything to cut down array size. Array grows when it is full of valid entities and never goes down. This is because I wanted to re-use those tables in array. Counter could be added to keep count of mined entities and it could be compared against array length to see if array needs cutting.
L0771 wrote: this is build = { nil, nil } ? or by defaul remove the array?
Im sure about the question here, but everytime you use { } you create a new table. Sure it replaces old one, but you also do it like this

Code: Select all

build[1]=nil
build[2]=nil
Im glad if I have been helpful.
Test mode
Searching Flashlight
[WIP]Fluid handling expansion
[WIP]PvP gamescript
[WIP]Rocket Express
Autofill: The torch has been pass to Nexela

Post Reply

Return to “Modding help”