Code: Select all
local create = game.players[#].surface.create_entity
local producer = create{name = "powerproducer", position =
tarpos, force = entity.force}
struct.producer = producer
local consumer = create{name = "powerconsumer", position =
srcpos, force = entity.force}
struct.consumer = consumer
local consumer_pole = create{name = "transformator-connection".."_src_"..entity.direction,
position = srcconpos, force = entity.force}
struct.consumer_pole = consumer_pole
local producer_pole = create{name = "transformator-connection".."_tar_"..entity.direction,
position = tarconpos, force = entity.force}
struct.producer_pole = producer_pole
struct.lastdraw = 0
table.insert(global.transformators, struct)
Code: Select all
local create = game.players.surface.create_entity
local producer = create{name = "powerproducer", position =
tarpos, force = entity.force}
struct.producer = producer
local consumer = create{name = "powerconsumer", position =
srcpos, force = entity.force}
struct.consumer = consumer
local consumer_pole = create{name = "transformator-connection".."_src_"..entity.direction,
position = srcconpos, force = entity.force}
struct.consumer_pole = consumer_pole
local producer_pole = create{name = "transformator-connection".."_tar_"..entity.direction,
position = tarconpos, force = entity.force}
struct.producer_pole = producer_pole
struct.lastdraw = 0
table.insert(global.transformators, struct)
Removed game.get_player() and game.get_surface(): game.players[] and game.surfaces[] can be used instead.
Changed game.players, game.surfaces, game.entity_prototypes, game.item_prototypes, game.fluid_prototypes, force.recipes, force,technologies to use custom access + iterator objects for improved performance.
Changed game.players[] to work with both the player index and the player name.
Added on_gui_text_changed and on_gui_checked_state_changed events.
Changed "defines" so they're available by default and removed the defines.lua file.
game.player has been removed (use game.players[#] and associated event.player_index during events).
game.local_player has been renamed to game.player and now works through remote calls.
here is the total lua:
Changed game.players, game.surfaces, game.entity_prototypes, game.item_prototypes, game.fluid_prototypes, force.recipes, force,technologies to use custom access + iterator objects for improved performance.
Changed game.players[] to work with both the player index and the player name.
Added on_gui_text_changed and on_gui_checked_state_changed events.
Changed "defines" so they're available by default and removed the defines.lua file.
game.player has been removed (use game.players[#] and associated event.player_index during events).
game.local_player has been renamed to game.player and now works through remote calls.
Code: Select all
--[[
global.transformators <- list of transformators
transformator:
trafo -- the transformator itself
producer -- the power producing part
consumer -- the power consuming part
direction -- direction when first placed
all local functions are prefixed with "Transformator"
--]]
-- Make sure our functions get called for specific events.
-- A robot built one.
script.on_event(defines.events.on_robot_built_entity, function(event) OnBuilt(event.created_entity) end)
-- A player built one.
script.on_event(defines.events.on_built_entity, function(event) OnBuilt(event.created_entity) end)
-- A player removed one.
script.on_event(defines.events.on_preplayer_mined_item, function(event) OnRemoved(event.entity) end)
-- A robot removed one.
script.on_event(defines.events.on_robot_pre_mined, function(event) OnRemoved(event.entity) end)
-- It died.
script.on_event(defines.events.on_entity_died, function(event) OnRemoved(event.entity) end)
local function TransformatorIsTransformator(entity)
if entity.name == "transformator" then
return true
else
return false
end
end
local function TransformatorGetSourcePosition(direction)
if direction == 0 then return {x = 0, y = 1} -- north
elseif direction == 2 then return {x = -1, y = 0} -- ost
elseif direction == 4 then return {x = 0, y = -1} -- south
else return {x = 1, y = 0} -- west
end
end
local function TransformatorGetTargetPosition(direction)
if direction == 0 then return {x = 0, y = -1} -- north
elseif direction == 2 then return {x = 1, y = 00} -- ost
elseif direction == 4 then return {x = 0, y = 1} -- south
else return {x = -1, y = 0} -- west
end
end
function OnBuilt(entity)
--game.createentity{name = "pole-light", position = entity.position, force = entity.force}
if TransformatorIsTransformator(entity) then
local struct = {trafo = entity}
struct.direction = entity.direction
local srcpos = TransformatorGetSourcePosition(struct.direction)
local tarpos = TransformatorGetTargetPosition(struct.direction)
local srcconpos = {x = srcpos.x, y = srcpos.y}
local tarconpos = {x = tarpos.x, y = tarpos.y}
srcconpos.x = 2 * srcconpos.x + entity.position.x
srcconpos.y = 2 * srcconpos.y + entity.position.y
tarconpos.x = 2 * tarconpos.x + entity.position.x
tarconpos.y = 2 * tarconpos.y + entity.position.y
srcpos.x = srcpos.x + entity.position.x
srcpos.y = srcpos.y + entity.position.y
tarpos.x = tarpos.x + entity.position.x
tarpos.y = tarpos.y + entity.position.y
local create = game.players.surface.create_entity
local producer = create{name = "powerproducer", position =
tarpos, force = entity.force}
struct.producer = producer
local consumer = create{name = "powerconsumer", position =
srcpos, force = entity.force}
struct.consumer = consumer
local consumer_pole = create{name = "transformator-connection".."_src_"..entity.direction,
position = srcconpos, force = entity.force}
struct.consumer_pole = consumer_pole
local producer_pole = create{name = "transformator-connection".."_tar_"..entity.direction,
position = tarconpos, force = entity.force}
struct.producer_pole = producer_pole
struct.lastdraw = 0
table.insert(global.transformators, struct)
end
end
function OnRemoved(entity)
if TransformatorIsTransformator(entity) then
local found_struct
local index
for key, struct in pairs(global.transformators) do
if struct.trafo == entity then
found_struct = struct
index = key
break
end
end
table.remove(global.transformators, index)
found_struct.producer.destroy()
found_struct.producer = nil
found_struct.consumer.destroy()
found_struct.consumer = nil
found_struct.producer_pole.destroy()
found_struct.producer_pole = nil
found_struct.consumer_pole.destroy()
found_struct.consumer_pole = nil
end
end
script.on_init(function(event)
if global.transformators == nil then
global.transformators = {}
end
end)
script.on_event(defines.events.on_player_rotated_entity, function(event)
local entity = event.entity;
if TransformatorIsTransformator(entity) then
for key, struct in pairs(global.transformators) do
if struct.trafo == entity then
entity.direction = struct.direction
break
end
end
end
end)
script.on_event(defines.events.on_tick, function(event)
--if (game.tick % 18 ~= 0)
--then
-- return
--end
local efficiency = 0.98 -- efficiency of 98% (realistic for grid transformers)
local max_amount = 20 -- 360
for key, struct in pairs(global.transformators) do
--local newbox = {type = "water", amount = 10, temperature = 25}
--struct.producer.fluidbox[1] = newbox
local target_amount = 0
if struct.producer.fluidbox[1] ~= nil then
target_amount = struct.producer.fluidbox[1].amount
end
local source_energy = struct.consumer.energy -- we can take so much energy from the source
local target_energy = (max_amount - target_amount) * 10.0 * 1e3 / efficiency -- so much more energy can be stored
local energy_to_move
if source_energy > target_energy then
energy_to_move = target_energy
else
energy_to_move = source_energy
end
if struct.lastdraw == nil then
struct.lastdraw = 0
end
if energy_to_move > struct.lastdraw then
energy_to_move = energy_to_move * 0.05 + 0.95 * struct.lastdraw
end
--game.players[#].print(tostring(source_energy).." and "..tostring(target_amount))
--energy_to_move = 0
struct.lastdraw = energy_to_move
if energy_to_move ~= 0 then
local liquid_amount = energy_to_move / 10.0 / 1e3
--if target_amount ~= 0 then
-- game.players[#].print(target_amount)
--end
local new_amount = target_amount + liquid_amount * efficiency
if new_amount > max_amount then
new_amount = max_amount -- if rounding gone wrong
end
struct.producer.fluidbox[1] = {type="water", amount=new_amount, temperature=25}
struct.consumer.energy = struct.consumer.energy - energy_to_move
end
end
end)