Page 27 of 35

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Wed Jun 14, 2017 12:01 am
by waduk
Nexela wrote:It is possibly from removing the entities from blueprints for entities that are no longer valid
You probably right, after i clean-up some blueprint, the message didn't pop-up.
But that's strange because AFAIK, i never use Creative Mode entities in any of my blueprint.
Probably blueprint that comes from other players.

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Wed Jun 14, 2017 1:32 am
by Mooncat
Thanks Nexela! That's why it only happens in 0.15!
I wish the popup can be more informative about where the entities are used. :)

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Thu Jun 15, 2017 8:52 am
by tzwaan
Hey, I was thinking it would be really nice to have a randomized matter source capable of generating a random input of different specified items. Currently I'm having to do something like this to get the same result: Image

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Fri Jun 16, 2017 6:19 am
by Mooncat
tzwaan wrote:Hey, I was thinking it would be really nice to have a randomized matter source capable of generating a random input of different specified items. Currently I'm having to do something like this to get the same result: Image
Nice! But why do you need that? :)

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Tue Jun 20, 2017 2:22 pm
by Mooncat
The old beacon doesn't look bad in modern Factorio. :P
Old beacons

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Sun Jun 25, 2017 5:50 am
by Optera
As soon as CM is enabled it adds a constant UPS drain of 0.15 to 0.20.
2017-06-25-07-39-42-4022404.jpg
2017-06-25-07-39-42-4022404.jpg (592.51 KiB) Viewed 15318 times
You never seem to unregister from on_tick when it's not needed.
A better way is to globally store the entities requiring on_tick update and only register to on_tick when such an entity exists.

The naive approach is to add something like this to on tick

Code: Select all

if #global.creative_chests >= 1 then 
  script.on_event(defines.events.on_tick, events.on_tick)
else 
  script.on_event(defines.events.on_tick, nil)
end
The best performance can be achieved by adding subscription to on_built and unsubcribing in on_removed/destroyed.

Code: Select all

function on_created_entity(event)
  global.entities[#global.entities+1] = event.created_entity]
  if #global.entities == 1 then 
    script.on_event(defines.events.on_tick, events.on_tick)
  end
end

Code: Select all

function on_removed_entity(event)
  for i=#global.entities, -1, 1 do
    if global.entities[i].unit_number == event.entity.unit_number then
      table.remove(global.entities, i)
    end
  end
  if #global.entities == 0 then 
    script.on_event(defines.events.on_tick, nil)
  end
end
If you optimize even further you can also unsubscribe from any event except on_built after the last entity was removed.
I recently did this for LTN, Loader Redux and Inventory Sensor to improve their performance for my huge train base where on_train_changed_state fires almost every second.
While a single mod is not even noticeable, when several mods needlessly fire for events it quickly becomes noticeable micro stutter.

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Mon Jun 26, 2017 3:03 am
by Mooncat
Thanks for pointing that out. CM was my first mod, and it was even my first project to write in Lua, so it started quite dirty. :P
I have a plan to rewrite the whole thing so I can make it cleaner. But I can't tell when it can be started and finished.

For now, I'm afraid there are not much I can do. Not only entities use on_tick, but some cheats also use it (auto-trash, auto-request, instant blueprint/deconstruct...). Whenever a player turns on any of those cheats, on_tick is used. So in the end, on_tick is really necessary for about 99% of the time when CM is enabled.
And for the other events, don't forget the event log system. It will be messy if I add checking all over the place.

On the other hand, I can narrow down the issue and put a hot-fix there. I have done that before (commenting out parts of events.on_tick() and found the main cause), but I forgot why I reverted it. :shock:

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Mon Jun 26, 2017 4:18 am
by Optera
Mooncat wrote:Thanks for pointing that out. CM was my first mod, and it was even my first project to write in Lua, so it started quite dirty. :P
I have a plan to rewrite the whole thing so I can make it cleaner. But I can't tell when it can be started and finished.
You started with something a lot bigger and more complex than me. ;)
Here's hoping you will get through refactoring without much headache. Let me know if I can help you.
For now, I'm afraid there are not much I can do. Not only entities use on_tick, but some cheats also use it (auto-trash, auto-request, instant blueprint/deconstruct...). Whenever a player turns on any of those cheats, on_tick is used. So in the end, on_tick is really necessary for about 99% of the time when CM is enabled.
And for the other events, don't forget the event log system. It will be messy if I add checking all over the place.
In that case perhaps a global counter for on_tick subscribers could work.
For every cheat enabled or entity built requiring on_tick updates increase by 1 for every cheat disabled or entity removed decrease.
The checks only need to be at 3 spots. Where settings change, when entities are built and when entities are removed.

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Mon Jul 03, 2017 7:00 pm
by Kormer
I'm getting an error when trying to load a save game. The save itself is 360MB, so I'm not sure I can upload it to the forums. Have you seen this error? Anything else that would help you track it down?

"Attempt to remote call outside of an event. Stack Traceback: __creative-mode__/control.lua:73:in main chunk"

Edit: Just realized there was an auto-patch and this is almost certainly the cause:

"Fixed that mods could do remote calls outside of events when the game isn't in a valid state. more"

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Mon Jul 03, 2017 8:22 pm
by Mooncat
Kormer wrote:I'm getting an error when trying to load a save game. The save itself is 360MB, so I'm not sure I can upload it to the forums. Have you seen this error? Anything else that would help you track it down?

"Attempt to remote call outside of an event. Stack Traceback: __creative-mode__/control.lua:73:in main chunk"

Edit: Just realized there was an auto-patch and this is almost certainly the cause:

"Fixed that mods could do remote calls outside of events when the game isn't in a valid state. more"
Thanks for the report. I will fix it ASAP.

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Mon Jul 03, 2017 8:32 pm
by Mooncat
I have to take a sleep first. Before I can upload a new version, here is a quick fix:

Code: Select all

require("defines")
require("util")

require("scripts.autofill-requester-chest")
require("scripts.cheats")
require("scripts.configurable-super-boiler")
require("scripts.creative-cargo-wagon")
require("scripts.creative-chest")
require("scripts.creative-chest-util")
require("scripts.creative-lab")
require("scripts.creative-provider-chest")
require("scripts.duplicating-cargo-wagon")
require("scripts.duplicating-chest")
require("scripts.duplicating-chest-util")
require("scripts.duplicating-provider-chest")
require("scripts.duplicator")
require("scripts.energy-source")
require("scripts.energy-void")
require("scripts.equipments")
require("scripts.events")
require("scripts.fluid-providers-util")
require("scripts.fluid-source")
require("scripts.fluid-void")
require("scripts.global-util")
require("scripts.gui")
require("scripts.gui-entity")
require("scripts.gui-menu-admin")
require("scripts.gui-menu-cheats")
require("scripts.gui-menu-magicwand")
require("scripts.gui-menu-modding")
require("scripts.gui-menu") -- It has to be loaded after the submenus.
require("scripts.item-providers-util")
require("scripts.item-source")
require("scripts.item-void")
require("scripts.magic-wand-creator")
require("scripts.magic-wand-healer")
require("scripts.magic-wand-modifier")
require("scripts.mod-compatibler")
require("scripts.passive-energy-source")
require("scripts.passive-energy-void")
require("scripts.remote-interface")
require("scripts.rights")
require("scripts.super-beacon")
require("scripts.super-boiler")
require("scripts.super-cooler")
require("scripts.super-radar")
require("scripts.super-roboport")
require("scripts.util")
require("scripts.void-cargo-wagon")
require("scripts.void-chest-util")
require("scripts.void-requester-chest")
require("scripts.void-storage-chest")

-- Registers callback for each events.
script.on_init(events.on_init)
script.on_load(events.on_load)
script.on_configuration_changed(events.on_configuration_changed)

-- The on_tick event is called very frequently, it is better to NOT do a name check in the generic event handler.
script.on_event(defines.events.on_tick, events.on_tick)
-- Other events.
local events_except_on_tick = {}
for _, event in pairs(defines.events) do
	if event ~= defines.events.on_tick then
		table.insert(events_except_on_tick, event)
	end
end
script.on_event(events_except_on_tick, events.on_event)

-- Create interface for lua command.
remote.add_interface(creative_mode_defines.names.interface,		remote_interface.remote_functions)
-- Exclude the alien attractors from keep last item.
--[[
remote.call("creative-mode", "exclude_from_keep_last_item", creative_mode_defines.names.items.alien_attractor_small)
remote.call("creative-mode", "exclude_from_keep_last_item", creative_mode_defines.names.items.alien_attractor_medium)
remote.call("creative-mode", "exclude_from_keep_last_item", creative_mode_defines.names.items.alien_attractor_large)
-- Also run the examples, after our interface is ready for that.
-- Example: register the remote function register_by_remote_function_example_1 to the modding UI.
remote.call("creative-mode", "register_remote_function_to_modding_ui",
	"creative-mode", --  Interface name
	"register_by_remote_function_example_1" -- Function name
)
--]]

--[[
-- Demo for subscribing and using the custom events.
script.on_event(remote.call("creative-mode", "on_enabled"), function(event)
	game.print("Test: Creative Mode enabled!")
end)
script.on_event(remote.call("creative-mode", "on_disabled"), function(event)
	game.print("Test: Creative Mode disabled!")
end)
--]]

--[[
-- Demo for excluding an item from the keep-last-item personal cheat.
remote.call("creative-mode", "exclude_from_keep_last_item", "assembling-machine-2")
--]]

--[[
-- Demo for excluding an entity from the instant-blueprint personal cheat.
remote.call("creative-mode", "exclude_from_instant_blueprint", "assembling-machine-3")
--]]

--[[
-- Demo for excluding an entity from the instant-deconstruction personal cheat.
remote.call("creative-mode", "exclude_from_instant_deconstruction", "oil-refinery")
--]]
Use this to replace control.lua.
There are some side effects but you probably won't notice. ;)

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Mon Jul 03, 2017 11:55 pm
by mickael9
Here's a zip with the change

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Wed Jul 05, 2017 5:12 am
by Optera
0.15.27 broke CM ... again.

Code: Select all

Error AppManagerStates.cpp:1142: Attempt to remote call outside of an event.
stack traceback:
	__creative-mode__/control.lua:73: in main chunk
FactorioBot wrote: Fixed that mods could do remote calls outside of events when the game isn't in a valid state. (50509)
Looks like you have to move registering remote calls into on_load, on_init and on_configuration_changed.

PS:
How do you check if creative mode is loaded with the correct version to set up "exclude_from_instant_blueprint" remote calls in on_load when game.active_mods doesn't exist?

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Wed Jul 05, 2017 5:39 am
by hi_impact
Looks like it's acting up again.

Attempt to remote call outside of an event.

__creative-mode__/control.lua:73: in main chunk

I just updated to 15.27

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Wed Jul 05, 2017 7:20 am
by Nexela
Optera wrote: PS:
How do you check if creative mode is loaded with the correct version to set up "exclude_from_instant_blueprint" remote calls in on_load when game.active_mods doesn't exist?
You would use on_init and on_configuration_changed since the data is stored in creative modes global

Code: Select all

If remote.interfaces["creative-mode"] and remote.interfaces["creative_mode"].exclude_from_instant_blueprint then remote.call(....) end

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Wed Jul 05, 2017 3:10 pm
by tzwaan
Mooncat wrote:
tzwaan wrote:Hey, I was thinking it would be really nice to have a randomized matter source capable of generating a random input of different specified items. Currently I'm having to do something like this to get the same result: Image
Nice! But why do you need that? :)
I needed this when I was building the black magic splitter sorters. Basically to simulate arbitrary inputs.

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Wed Jul 05, 2017 5:22 pm
by Mooncat
Optera wrote:0.15.27 broke CM ... again.

Code: Select all

Error AppManagerStates.cpp:1142: Attempt to remote call outside of an event.
stack traceback:
	__creative-mode__/control.lua:73: in main chunk
FactorioBot wrote: Fixed that mods could do remote calls outside of events when the game isn't in a valid state. (50509)
Looks like you have to move registering remote calls into on_load, on_init and on_configuration_changed.

PS:
How do you check if creative mode is loaded with the correct version to set up "exclude_from_instant_blueprint" remote calls in on_load when game.active_mods doesn't exist?
hi_impact wrote:Looks like it's acting up again.

Attempt to remote call outside of an event.

__creative-mode__/control.lua:73: in main chunk

I just updated to 15.27
Please use mickael9's fix first: viewtopic.php?f=97&t=28005&start=520#p294085
I'm working on the color picker mods now.
tzwaan wrote:
Mooncat wrote:
tzwaan wrote:Hey, I was thinking it would be really nice to have a randomized matter source capable of generating a random input of different specified items. Currently I'm having to do something like this to get the same result: Image
Nice! But why do you need that? :)
I needed this when I was building the black magic splitter sorters. Basically to simulate arbitrary inputs.
Added to the todo list, but I can't promise when it will be implemented.
For now, I think it may have performance issue because it will require the random number generator work twice in every tick. Need some tests first.

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Wed Jul 05, 2017 8:00 pm
by ichVII
I get a crash on load using your mod and a few others. The message displayed is:
Attempt to remote call outside of an event.
stack traceback:
__creative-mode__/control.lua:73: in main chunk

Looks like it is caused by creative mod on first view.

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Wed Jul 05, 2017 8:31 pm
by Odhrean
ichVII wrote:I get a crash on load using your mod and a few others. The message displayed is:
Attempt to remote call outside of an event.
stack traceback:
__creative-mode__/control.lua:73: in main chunk

Looks like it is caused by creative mod on first view.
Same error here.
I commented all "remote.call" in control.lua out and can run it now.

Re: [MOD 0.15.13+] Creative Mode 0.3.7 - Old mystery solved!

Posted: Wed Jul 05, 2017 8:33 pm
by dgw
@ everyone posting about the crash with Factorio 0.15.27: It's known. Mooncat said it'll be fixed soon. Meanwhile, there's a fixed ZIP using hotfix code Mooncat posted HERE. Or manually replace creative-mode's control.lua if you'd rather go that route.

Sincerely, a thread subscriber who's seen all of this multiple times today.