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:

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:

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.
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 (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.
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.

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.

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:

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:

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.