math3d = require("math3d") require("logic.mtMgr") require("logic.util") require("logic.timer") require("logic.simpleNoise") require("logic.heliBase") require("logic.heliAttack") require("logic.heliPad") require("logic.heliController") require("logic.gui.remoteGui") require("logic.gui.gaugeGui") Entity = require("stdlib.entity.entity") mod_gui = require("mod-gui") function playerIsInHeli(p) return p.driving and string.find(heliBaseEntityNames, p.vehicle.name .. ",", 1, true) end function OnLoad(e) if global.helis then for _, heli in pairs(global.helis) do if not heli.type or heli.type == "heliAttack" then setmetatable(heli, {__index = heliAttack}) end end end setMetatablesInGlobal("remoteGuis", {__index = remoteGui}) setMetatablesInGlobal("heliPads", {__index = heliPad}) setMetatablesInGlobal("heliControllers", {__index = heliController}) --restore gui metatables if global.remoteGuis then for _,remotegui in pairs(global.remoteGuis) do for _,gui in pairs(remotegui.guis) do if gui.prefix then local n = string.gsub(gui.prefix, "heli_(%a+)_.*", "%1") if _G[n] then setmetatable(gui, {__index = _G[n]}) end end end end end callInGlobal("helis", "OnLoad") mtMgr.OnLoad() end function OnConfigChanged(e) if global.helis then for k, curHeli in pairs(global.helis) do if not curHeli.curState then if curHeli.goUp then curHeli:changeState(curHeli.engineStarting) else curHeli:changeState(curHeli.descend) end end if not curHeli.surface then curHeli.surface = curHeli.baseEnt.surface end if not curHeli.type then curHeli.type = "heliAttack" end if curHeli.hasLandedCollider and not curHeli.childs.collisionEnt.valid then curHeli:setCollider("landed") end if not curHeli.deactivatedInserters then curHeli.deactivatedInserters = {} end curHeli:reassignCurState() end end if global.heliPads then for k, curPad in pairs(global.heliPads) do if not curPad.surface then curPad.surface = curPad.baseEnt.surface end end end for k, p in pairs(game.players) do local flow = mod_gui.get_button_flow(p) if flow.heli_remote_btn and flow.heli_remote_btn.valid then flow.heli_remote_btn.destroy() end OnArmorInventoryChanged({player_index = p.index}) reSetGaugeGui(p) end if global.heliControllers then for k, curController in pairs(global.heliControllers) do if not curController.heli.remoteController then curController.heli.remoteController = curController end end end --fixing left open guis when saved if global.remoteGuis then global.remoteGuis = {} for _,p in pairs(game.players) do local flow = mod_gui.get_frame_flow(p) if flow["heli_heliSelectionGui_rootFrame"] then flow["heli_heliSelectionGui_rootFrame"].destroy() end end end end function OnTick(e) checkAndTickInGlobal("helis") checkAndTickInGlobal("remoteGuis") checkAndTickInGlobal("heliControllers") OnTimerTick() end function OnBuilt(e) local ent = e.created_entity if ent.name == "heli-placement-entity-_-" then local newHeli = insertInGlobal("helis", heliAttack.new(ent)) if global.remoteGuis then for _,rg in pairs(global.remoteGuis) do rg:OnHeliBuilt(newHeli) end end elseif ent.name == "heli-pad-placement-entity" then local newPad = insertInGlobal("heliPads", heliPad.new(ent)) callInGlobal("remoteGuis", "OnHeliPadBuilt", newPad) elseif ent.type == "inserter" then ent.active = true end end function OnRemoved(e) local ent = e.entity if ent.valid then local entName = ent.name if string.find(heliEntityNames, entName .. ",", 1, true) then for i,val in ipairs(global.helis) do if val:isBaseOrChild(ent) then val:destroy() table.remove(global.helis, i) if global.remoteGuis then for _,rg in pairs(global.remoteGuis) do rg:OnHeliRemoved(val) end end end end end if entName == "heli-pad-entity" then local i = getHeliPadIndexFromBaseEntity(ent) if i then global.heliPads[i]:destroy() callInGlobal("remoteGuis", "OnHeliPadRemoved", global.heliPads[i]) table.remove(global.heliPads, i) end end end end function OnHeliUp(e) local p = game.players[e.player_index] if playerIsInHeli(p) then getHeliFromBaseEntity(p.vehicle):OnUp() end end function OnHeliDown(e) local p = game.players[e.player_index] if playerIsInHeli(p) then getHeliFromBaseEntity(p.vehicle):OnDown() end end function OnHeliIncreaseMaxHeight(e) local p = game.players[e.player_index] if playerIsInHeli(p) then getHeliFromBaseEntity(p.vehicle):OnIncreaseMaxHeight() end end function OnHeliDecreaseMaxHeight(e) local p = game.players[e.player_index] if playerIsInHeli(p) then getHeliFromBaseEntity(p.vehicle):OnDecreaseMaxHeight() end end function OnHeliToggleFloodlight(e) local p = game.players[e.player_index] if playerIsInHeli(p) then getHeliFromBaseEntity(p.vehicle):OnToggleFloodlight() end end function OnHeliFollow(e) local p = game.players[e.player_index] if playerHasEquipment(p, "heli-remote-equipment") then local heli, dist = findNearestAvailableHeli(p.position, p.force, p) if heli then assignHeliController(p, heli, p, true) p.add_custom_alert(heli.baseEnt, {type = "item", name = "heli-item"}, {"heli-alert-follow", chopDecimal(dist)}, true) end end end function OnRemoteOpen(e) local p = game.players[e.player_index] if playerHasEquipment(p, "heli-remote-equipment") then toggleRemoteGui(p) end end function OnPlacedEquipment(e) if e.equipment.name == "heli-remote-equipment" then local p = game.players[e.player_index] setRemoteBtn(p, true) end end function OnRemovedEquipment(e) if e.equipment == "heli-remote-equipment" then local p = game.players[e.player_index] if not equipmentGridHasItem(e.grid, "heli-remote-equipment") then setRemoteBtn(p, false) end end end function OnArmorInventoryChanged(e) local p = game.players[e.player_index] if playerHasEquipment(p, "heli-remote-equipment") then setRemoteBtn(p, true) else setRemoteBtn(p, false) end end function OnGuiClick(e) local name = e.element.name if name:match("^heli_") then local p = game.players[e.player_index] if name == "heli_remote_btn" then toggleRemoteGui(p) elseif gaugeGui.hasMyPrefix(name) then local i = searchIndexInTable(global.gaugeGuis, p, "player") if i then global.gaugeGuis[i]:OnGuiClick(e) end elseif remoteGui.hasMyPrefix(name) then local i = searchIndexInTable(global.remoteGuis, p, "player") if i then global.remoteGuis[i]:OnGuiClick(e) end end end end function OnGuiTextChanged(e) local name = e.element.name if name:match("^heli_") then local p = game.players[e.player_index] local i = searchIndexInTable(global.remoteGuis, p, "player") if i then global.remoteGuis[i]:OnGuiTextChanged(e) end end end function OnPlayerChangedForce(e) local p = game.players[e.player_index] callInGlobal("remoteGuis", "OnPlayerChangedForce", p) end function OnPlayerDied(e) local p = game.players[e.player_index] setRemoteBtn(p, false) callInGlobal("remoteGuis", "OnPlayerDied", p) end function OnPlayerLeft(e) local p = game.players[e.player_index] local i = searchIndexInTable(global.remoteGuis, p, "player") if i then global.remoteGuis[i]:destroy() table.remove(global.remoteGuis, i) end callInGlobal("remoteGuis", "OnPlayerLeft", p) end function OnPlayerRespawned(e) callInGlobal("remoteGuis", "OnPlayerRespawned", game.players[e.player_index]) end function OnDrivingStateChanged(e) local p = game.players[e.player_index] local ent = e.entity if ent then local entName = ent.name if string.find(heliEntityNames, entName .. ",", 1, true) then local heli for i, curHeli in ipairs(global.helis) do if curHeli:isBaseOrChild(ent) then heli = curHeli break end end reSetGaugeGui(p) if not p.driving then heli:OnPlayerEjected(p) end end end end function OnPlayerJoined(e) OnArmorInventoryChanged(e) end function OnPlayerCreated(e) OnArmorInventoryChanged(e) end function OnRuntimeSettingsChanged(e) local name = e.setting if name:match("^heli-") then local p = game.players[e.player_index] if e.setting_type == "runtime-per-user" then local val = p.mod_settings[name].value if name == "heli-gaugeGui-show" then reSetGaugeGui(p) end --elseif e.setting_type == "runtime-global" then -- local val = settings.global[name] end end end script.on_event(defines.events.on_built_entity, OnBuilt) script.on_event(defines.events.on_robot_built_entity, OnBuilt) script.on_load(OnLoad) script.on_configuration_changed(OnConfigChanged) script.on_event(defines.events.on_tick, OnTick) script.on_event(defines.events.on_player_mined_entity, OnRemoved) script.on_event(defines.events.on_robot_mined_entity, OnRemoved) script.on_event(defines.events.on_entity_died, OnRemoved) script.on_event("heli-up", OnHeliUp) script.on_event("heli-down", OnHeliDown) script.on_event("heli-zaa-height-increase", OnHeliIncreaseMaxHeight) script.on_event("heli-zab-height-decrease", OnHeliDecreaseMaxHeight) script.on_event("heli-zba-toogle-floodlight", OnHeliToggleFloodlight) script.on_event("heli-zca-remote-heli-follow", OnHeliFollow) script.on_event("heli-zcb-remote-open", OnRemoteOpen) script.on_event(defines.events.on_player_placed_equipment, OnPlacedEquipment) script.on_event(defines.events.on_player_removed_equipment, OnRemovedEquipment) script.on_event(defines.events.on_gui_click, OnGuiClick) script.on_event(defines.events.on_gui_text_changed, OnGuiTextChanged) script.on_event(defines.events.on_player_changed_force, OnPlayerChangedForce) script.on_event(defines.events.on_player_died, OnPlayerDied) script.on_event(defines.events.on_player_left_game, OnPlayerLeft) script.on_event(defines.events.on_player_respawned, OnPlayerRespawned) script.on_event(defines.events.on_player_joined_game, OnPlayerJoined) script.on_event(defines.events.on_player_created, OnPlayerCreated) script.on_event(defines.events.on_player_armor_inventory_changed, OnArmorInventoryChanged) script.on_event(defines.events.on_player_driving_changed_state, OnDrivingStateChanged) script.on_event(defines.events.on_runtime_mod_setting_changed, OnRuntimeSettingsChanged)