Added Modules to be converted

This commit is contained in:
Cooldude2606
2018-06-24 19:14:28 +01:00
parent 593d484f37
commit f73f1011d4
39 changed files with 3853 additions and 0 deletions

View File

@@ -0,0 +1,177 @@
--[[
Explosive Gaming
This file can be used with permission but this and the credit below must remain in the file.
Contact a member of management on our discord to seek permission to use our code.
Any changes that you may make to the code are yours but that does not make the script yours.
Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
Admin = Admin or {}
local get_player_info = get_player_info or function(player,frame)
frame.add{
type='label',
caption={'admin-commands.no-info-file'}
}
end
local function _players(_player,root_frame,state)
local players = {'Select Player'}
local _players = state and game.players or game.connected_players
for _,player in pairs(_players) do
if player.name ~= _player.name then
if Admin.is_banned and Admin.is_banned(player) then else
table.insert(players,player.name)
end
end
end
return players
end
local online_check = Gui.inputs.add_checkbox('online-check-admin-commands',false,'Show Offline',false,function(player,element)
element.parent['player-drop-down-admin-commands'].items = _players(player,element.parent,true)
element.parent['player-drop-down-admin-commands'].selected_index = 1
end,function(player,element)
element.parent['player-drop-down-admin-commands'].items = _players(player,element.parent,false)
element.parent['player-drop-down-admin-commands'].selected_index = 1
end)
local player_drop_down = Gui.inputs.add_drop_down('player-drop-down-admin-commands',_players,1,function(player,selected,items,element)
element.parent.parent.player.caption = selected
local player_info_flow = element.parent.parent.info_flow
player_info_flow.clear()
if selected == 'Select Player' then return
else get_player_info(selected,player_info_flow,true) end
local rank = Ranking.get_rank(player)
local _rank = Ranking.get_rank(selected)
if rank.power >= _rank.power then element.parent.warning.caption = {'admin-commands.warning'}
else element.parent.warning.caption = '' end
end)
local reason_input = Gui.inputs.add_text('reason-input-admin-commands',false,'Enter Reason',function(player,text,element)
if string.len(text) < 20 or text == 'Enter Reason' then
element.parent.warning.caption = {'admin-commands.short-reason'}
else
element.parent.warning.caption = ''
end
end)
local function _actions(player)
return {
'Select Action',
'GoTo',
'Bring',
'Jail',
'Kick',
'Temp Ban',
'Ban'
}
end
local action_drop_down = Gui.inputs.add_drop_down('action-drop-down-rank-change',_actions,1,function(player,selected,items,element)
element.parent.parent.action.caption = selected
if selected == 'Jail' or selected == 'Kick' or selected == 'Ban' or selected == 'Temp Ban' then
element.parent['reason-input-admin-commands'].style.visible = true
else
element.parent['reason-input-admin-commands'].style.visible = false
end
end)
local take_action = Gui.inputs.add{
type='button',
name='admin-commands-take',
caption={'admin-commands.take-action'}
}:on_event('click',function(event)
local dropdowns = event.element.parent
local rank = Ranking.get_rank(event.player_index)
local _action= dropdowns.parent.action.caption ~= 'Select Action' and dropdowns.parent.action.caption or nil
local _player = Game.get_player(dropdowns.parent.player.caption)
if not _player or not _action then dropdowns.warning.caption = {'admin-commands.invalid'} return end
local _rank = Ranking.get_rank(_player)
if rank.power >= _rank.power then dropdowns.warning.caption = {'admin-commands.rank-high'} return end
local _reason = dropdowns['reason-input-admin-commands'] and dropdowns['reason-input-admin-commands'].text
if (_action == 'Jail' or _action == 'Kick' or _action == 'Ban' or _action == 'Temp Ban') and (_reason == 'Enter Reason' or string.len(_reason) < 20) then return end
Admin.take_action(_action,_player,event.player_index,_reason)
Gui.center.clear(event)
end)
Admin.center = Gui.center.add{
name='admin-commands',
caption='utility/danger_icon',
tooltip={'admin-commands.tooltip'},
open=function(event,pre_select_player,pre_select_action)
local _player = Game.get_player(pre_select_player)
local player = Game.get_player(event)
local _center = Gui._get_data('center')['admin-commands']
local center_flow = Gui.center.get_flow(player)
if center_flow[_center.name] then Gui.center.clear(player) return end
local center_frame = center_flow.add{
name=_center.name,
type='frame',
direction='vertical',
style=mod_gui.frame_style
}
-- only edit i made was passing diffrent arguments to the draw function
local success, err = pcall(_center.draw,center_frame,_player,pre_select_action)
if not success then error(err) end
player.opened=center_frame
end,
draw=function(frame,pre_select_player,pre_select_action)
frame.caption={'admin-commands.name'}
local frame = frame.add{
type='flow',
direction='horizontal'
}
local dropdowns = frame.add{
type='flow',
direction='vertical'
}
local player_info_flow = frame.add{
name='info_flow',
type='flow',
direction='vertical'
}
player_info_flow.style.height = 280
player_info_flow.style.width = 200
local label = dropdowns.add{
type='label',
caption={'admin-commands.message'}
}
label.style.single_line = false
label.style.width = 200
online_check:draw(dropdowns)
local _drop = player_drop_down:draw(dropdowns)
if pre_select_player then Gui.set_dropdown_index(_drop,pre_select_player.name) end
local _drop = action_drop_down:draw(dropdowns)
Gui.set_dropdown_index(_drop,pre_select_action)
local _text = reason_input:draw(dropdowns)
if pre_select_action == 'Jail' or pre_select_action == 'Kick' or pre_select_action == 'Ban' then
_text.style.visible = true else _text.style.visible = false
end
if pre_select_player then get_player_info(pre_select_player,player_info_flow,true) end
_text.style.width = 200
local label = dropdowns.add{
name='warning',
type='label',
caption='',
style='bold_red_label'
}
label.style.single_line = false
label.style.width = 200
take_action:draw(dropdowns)
local _caption = pre_select_player and pre_select_player.name or ''
frame.add{
name='player',
type='label',
caption=_caption
}.style.visible = false
local _caption = pre_select_action or ''
frame.add{
name='action',
type='label',
caption=_caption
}.style.visible = false
end
}

View File

@@ -0,0 +1,99 @@
--[[
Explosive Gaming
This file can be used with permission but this and the credit below must remain in the file.
Contact a member of management on our discord to seek permission to use our code.
Any changes that you may make to the code are yours but that does not make the script yours.
Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
local function _ranks(player)
local ranks = {'Select Rank'}
local _rank = Ranking.get_rank(player)
for _,rank in pairs(Ranking._ranks()) do
if rank.power >= _rank.power then
table.insert(ranks,rank.name)
end
end
return ranks
end
local rank_drop_down = Gui.inputs.add_drop_down('rank-drop-down-annoncements',_ranks,1,function(player,selected,items,element)
element.parent.rank.caption = selected
if selected == 'Select Rank' then element.parent['send-annoncement'].style.visible = false
else element.parent['send-annoncement'].style.visible = true end
end)
local send_popup = Gui.inputs.add{
type='button',
name='send-annoncement',
caption='utility/export_slot'
}:on_event('click',function(event)
local meta_data = Ranking._presets().meta
local default = Ranking.get_rank(meta_data.default)
local player = Game.get_player(event)
local rank = Ranking.get_rank(player)
local _rank = Ranking.get_rank(event.element.parent.rank.caption); if not _rank then return end
local sent_by = {'announcements.sent-by',player.name,rank.name}
local rank_name = _rank.name..'s'; if rank_name == default.name..'s' then rank_name = 'Everyone' end
local sent_to = {'announcements.sent-to',rank_name}
local message = event.element.parent.parent.message.text
for power,__rank in pairs(Ranking._ranks()) do
if power <= _rank.power then
Gui.popup.open('announcements',{sent_by=sent_by,sent_to=sent_to,message=message},__rank:get_players(true))
event.element.parent.parent.message.text = ''
end
end
end)
Gui.popup.add{
name='announcements',
caption={'announcements.name'},
draw=function(frame,data)
frame.style.right_padding = 5
frame.style.bottom_padding = 5
frame.add{type='label',caption=data.sent_by,style='caption_label'}
frame.add{type='label',caption=data.sent_to,style='caption_label'}
local text_box = frame.add{type='text-box'}
text_box.text = data.message
text_box.style.width = 400
text_box.read_only = true
text_box.word_wrap = true
text_box.selectable = true
end
}:add_left{
caption='item/programmable-speaker',
tooltip={'announcements.tooltip'},
draw=function(frame)
frame.caption = {'announcements.name'}
local frame = frame.add{
type='flow',
direction='vertical'
}
local text_box = frame.add{
type='text-box',
name='message'
}
text_box.style.width = 400
text_box.style.minimal_height = 100
text_box.read_only = false
text_box.word_wrap = true
text_box.selectable = true
local flow = frame.add{type='flow'}
flow.add{
type='label',
caption={'announcements.select-rank'}
}
rank_drop_down:draw(flow)
local btn = send_popup:draw(flow)
btn.style.visible = false
btn.style.height = 25
btn.style.width = 25
flow.add{
type='label',
name='rank',
caption=''
}.style.visible = false
end
}

View File

@@ -0,0 +1,182 @@
--[[
Explosive Gaming
This file can be used with permission but this and the credit below must remain in the file.
Contact a member of management on our discord to seek permission to use our code.
Any changes that you may make to the code are yours but that does not make the script yours.
Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
--{type='slider',object='',key='',name='',min=x,max=y}
--{type='function',object='',key='',name='',param={}}
local basic_settings = {
{type='slider',object='force',key='manual_mining_speed_modifier',name='mining-speed',min=0,max=10},
{type='slider',object='force',key='manual_crafting_speed_modifier',name='craft-speed',min=0,max=10},
{type='slider',object='force',key='character_running_speed_modifier',name='running-speed',min=0,max=10},
{type='slider',object='force',key='character_build_distance_bonus',name='build-distance',min=0,max=50},
{type='slider',object='force',key='character_reach_distance_bonus',name='reach-distance',min=0,max=50},
{type='slider',object='force',key='worker_robots_speed_modifier',name='bot-speed',min=0,max=10},
{type='slider',object='force',key='laboratory_speed_modifier',name='lab-speed',min=0,max=10},
{type='slider',object='force',key='stack_inserter_capacity_bonus',name='stack-bonus',min=1,max=30}
}
local advanced_settings = {
{type='slider',object='force',key='quickbar_count',name='quickbar-count',min=1,max=5},
{type='slider',object='force',key='character_inventory_slots_bonus',name='inventory-size',min=0,max=1000},
{type='slider',object='force',key='mining_drill_productivity_bonus',name='mining-prod',min=0,max=10},
{type='slider',object='game',key='speed',name='game-speed',min=0.01,max=5},
{type='function',object='game',key='server_save',name='save'},
{type='function',object='force',key='reset_technology_effects',name='reload-effects'},
{type='function',object='enemy',key='kill_all_units',name='kill-biters'},
{type='function',object='force',key='rechart',name='reload-map'},
{type='function',object='game',key='force_crc',name='crc'},
{type='function',object='force',key='reset',name='reset-force'}
}
local personal_settings = {
{type='slider',object='player',key='character_mining_speed_modifier',name='mining-speed',min=0,max=10},
{type='slider',object='player',key='character_crafting_speed_modifier',name='craft-speed',min=0,max=10},
{type='slider',object='player',key='character_running_speed_modifier',name='running-speed',min=0,max=10},
{type='slider',object='player',key='character_build_distance_bonus',name='build-distance',min=0,max=50},
{type='slider',object='player',key='character_reach_distance_bonus',name='reach-distance',min=0,max=50},
{type='slider',object='player',key='character_inventory_slots_bonus',name='inventory-size',min=0,max=1000},
{type='slider',object='player',key='quickbar_count_bonus',name='quickbar-count',min=0,max=5}
}
local _root_list = {basic_settings=basic_settings,advanced_settings=advanced_settings,personal_settings=personal_settings}
local function _get_data(root_frame)
local object = root_frame.name
local key = root_frame.setting_name.caption
for _,setting in pairs(_root_list[object]) do
if key == setting.key then return setting end
end
end
local function _object_list(player) return {game=game,player=player,force=player.force,enemy=game.forces['enemy']} end
for name,group in pairs(_root_list) do
for key,setting in pairs(group) do
local _added = nil
if setting.type == 'slider' then
_added = Gui.inputs.add_slider('game-settings-'..setting.name,'horizontal',setting.min,setting.max,
function(player,root_frame)
local data = _get_data(root_frame)
local objects = _object_list(player)
local object = objects[data.object]
return object[data.key] or 1
end,
function(player,value,percent,element)
local data = _get_data(element.parent)
local objects = _object_list(player)
local object = objects[data.object]
local _caption = string.format('%.2f',value); if value > 2 then _caption = string.format('%.2f',math.floor(value)) end
object[data.key] = tonumber(_caption)
element.parent.counter.caption = _caption
end
)
elseif setting.type == 'function' then
_added = Gui.inputs.add_checkbox('game-settings-'..setting.name,true,nil,false,function(player,element)
local data = _get_data(element.parent.parent)
local objects = _object_list(player)
local object = objects[data.object]
pcall(object[data.key],unpack(data.params))
Server.new_thread{
timeout=60,
data=element
}:on_event('timeout',function(self)
if self.data and self.data.valid then
element.parent.parent['game-settings-are-you-sure'].state = false
self.data.parent.style.visible = false
self.data.state = false
end
end):open()
end)
if not setting.params then setting.params = {} end
end
setting._loaded = _added
setting._group = name
end
end
local are_you_sure = Gui.inputs.add_checkbox('game-settings-are-you-sure',true,nil,false,function(player,element)
element.parent.sure.style.visible = true
Server.new_thread{
timeout=600,
data=element
}:on_event('timeout',function(self)
if self.data and self.data.valid then
self.data.state = false
self.data.parent.sure.style.visible = false
end
end):open()
end)
local function _draw_setting(frame,setting)
local frame = frame.add{type='flow'}
local frame = frame.add{
type='flow',
name=setting._group
}
frame.add{
type='label',
caption={'game-settings.effect-'..setting.name},
style='caption_label'
}
frame.add{
type='label',
caption=setting.key,
name='setting_name'
}.style.visible = false
if setting.type == 'slider' then
local slider = setting._loaded:draw(frame)
slider.style.width = 300
local _caption = string.format('%.2f',slider.slider_value); if slider.slider_value > 2 then _caption = tostring(math.floor(slider.slider_value)) end
frame.add{
type='label',
name='counter',
caption=_caption
}
elseif setting.type == 'function' then
are_you_sure:draw(frame)
local flow = frame.add{type='flow',name='sure'}
flow.style.visible = false
flow.add{
type='label',
caption={'game-settings.sure'},
style='bold_red_label'
}
setting._loaded:draw(flow)
end
end
Gui.center.add{
name='game-settings',
caption='utility/no_building_material_icon',
tooltip={'game-settings.tooltip'}
}:add_tab('basic',{'game-settings.basic-name'},{'game-settings.basic-name'},function(frame)
frame.add{
type='label',
caption={'game-settings.basic-message'}
}.style.single_line = false
for _,setting in pairs(basic_settings) do
_draw_setting(frame,setting)
end
end):add_tab('advanced',{'game-settings.advanced-name'},{'game-settings.advanced-tooltip'},function(frame)
frame.add{
type='label',
caption={'game-settings.advanced-message'}
}.style.single_line = false
for _,setting in pairs(advanced_settings) do
_draw_setting(frame,setting)
end
end):add_tab('personal',{'game-settings.personal-name'},{'game-settings.personal-tooltip'},function(frame)
frame.add{
type='label',
caption={'game-settings.personal-message'}
}.style.single_line = false
for _,setting in pairs(personal_settings) do
_draw_setting(frame,setting)
end
end)

View File

@@ -0,0 +1,115 @@
--[[
Explosive Gaming
This file can be used with permission but this and the credit below must remain in the file.
Contact a member of management on our discord to seek permission to use our code.
Any changes that you may make to the code are yours but that does not make the script yours.
Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
local function _global(reset)
global.addons = not reset and global.addons or {}
global.addons.player_list = not reset and global.addons.player_list or {update=0,delay=10,intervial=54000}
return global.addons.player_list
end
local get_player_info = get_player_info or function(player,frame)
frame.add{
type='label',
caption={'player-list.no-info-file'}
}
end
local function update()
Gui.left.update('player-list')
end
local function queue_update(tick)
local data = _global()
local tick = is_type(tick,'table') and tick.tick or is_type(tick,'number') and tick or game.tick
if tick + data.delay > data.update - data.intervial then
data.update = tick + data.delay
end
end
local back_btn = Gui.inputs.add{
type='button',
caption='utility/enter',
name='player-list-back'
}:on_event('click',function(event)
event.element.parent.parent.scroll.style.visible = true
event.element.parent.destroy()
end)
Gui.left.add{
name='player-list',
caption='entity/player',
tooltip={'player-list.tooltip'},
draw=function(frame)
frame.caption = ''
local player_list = frame.add{
name='scroll',
type = 'scroll-pane',
direction = 'vertical',
vertical_scroll_policy='auto',
horizontal_scroll_policy='never'
}
player_list.vertical_scroll_policy = 'auto'
player_list.style.maximal_height=195
for _,rank in pairs(Ranking._ranks()) do
for _,player in pairs(rank:get_players(true)) do
local flow = player_list.add{type='flow'}
if rank.short_hand == '' then
flow.add{
type='label',
name=player.name,
style='caption_label',
caption={'player-list.format-nil',tick_to_display_format(player.online_time),player.name}
}.style.font_color = rank.colour
else
flow.add{
type='label',
name=player.name,
style='caption_label',
caption={'player-list.format',tick_to_display_format(player.online_time),player.name,rank.short_hand}
}.style.font_color = rank.colour
end
if Admin.report_btn then
if not rank:allowed('no-report') and player.index ~= frame.player_index then
local btn = Admin.report_btn:draw(flow)
btn.style.height = 20
btn.style.width = 20
end
end
end
end
end,
open_on_join=true
}
Event.register(defines.events.on_tick,function(event)
local data = _global()
if event.tick > data.update then
update()
data.update = event.tick + data.intervial
end
end)
Event.register(defines.events.on_gui_click,function(event)
if event.element and event.element.valid
and event.element.parent and event.element.parent.parent and event.element.parent.parent.parent
and event.element.parent.parent.parent.name == 'player-list' then else return end
if event.button == defines.mouse_button_type.right then else return end
local player_list = event.element.parent.parent.parent
player_list.scroll.style.visible = false
local flow = player_list.add{type='flow',direction='vertical'}
back_btn:draw(flow)
get_player_info(event.element.name,flow,true)
if Game.get_player(event.element.name) and event.player_index == Game.get_player(event.element.name).index then return end
if Admin and Admin.allowed(event.player_index) then Admin.btn_flow(flow).caption = event.element.name end
end)
Event.register(defines.events.on_player_joined_game,queue_update)
Event.register(defines.events.on_player_left_game,queue_update)
Event.register(defines.events.rank_change,queue_update)

View File

@@ -0,0 +1,260 @@
--[[
Explosive Gaming
This file can be used with permission but this and the credit below must remain in the file.
Contact a member of management on our discord to seek permission to use our code.
Any changes that you may make to the code are yours but that does not make the script yours.
Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
local poll_time_out = 90 -- In seconds
local function _polls(reset)
global.addons = not reset and global.addons or {}
global.addons.polls = not reset and global.addons.polls or {active={},old={}}
return global.addons.polls
end
function _poll_end(self)
local uuid = self.data.poll_uuid
local poll = _polls().active[uuid]
if not poll then return end
local highest = {nil,-1}
local _votes = {}
for index,answer in pairs(poll.answers) do
local _result = poll.votes[index] or 0
if _result > highest[2] then highest = {answer,_result} end
_votes[answer] = _result
end
local uuid = poll.uuid
poll.uuid = nil
poll.votes = _votes
poll.answers = nil
poll.voted = nil
table.insert(_polls().old,poll)
_polls().active[uuid] = nil
game.print({'polls.end',poll.question},defines.text_color.info)
game.print({'polls.winner',highest[1]},defines.text_color.info)
end
local function _poll_data(question,answers)
local poll = {
uuid=Server.new_uuid(),
question=question,
answers=answers or {'None'},
votes={},
voted={}
}
Server.new_thread{
data={poll_uuid=poll.uuid},
timeout=poll_time_out*60
}:on_event('timeout',_poll_end):open()
-- This time out is known to cause desyncs and so I have moved it to a hard coded function
_polls().active[poll.uuid]=poll
return poll.uuid
end
local function draw_poll(frame)
frame.clear()
local index = tonumber(frame.parent.current_index.caption)
local poll = _polls().old[index]
if not poll then
frame.add{
type='label',
caption={'polls.no-poll'}
}
return
end
frame.add{
type='label',
caption='Question: '..poll.question
}
for answer,votes in pairs(poll.votes) do
frame.add{
type='label',
caption=answer..') '..votes
}
end
end
local function _opptions(player,root_frame)
local opptions = {'Please Select An Opption'}
local uuid = root_frame.name
local poll = _polls().active[uuid]
if not poll then return {'Invalid Poll'} end
for _,answer in pairs(poll.answers) do
table.insert(opptions,answer)
end
return opptions
end
local opption_drop_down = Gui.inputs.add_drop_down('opption-drop-down-polls',_opptions,1,function(player,selected,items,element)
local uuid = element.parent.name
local poll = _polls().active[uuid]
if not poll then return end
if poll.voted[player.index] and poll.voted[player.index] > 1 then
local old_vote = poll.voted[player.index]
poll.votes[old_vote-1] = poll.votes[old_vote-1] and poll.votes[old_vote-1]-1 or 0
end
if element.selected_index > 1 then
poll.votes[element.selected_index-1] = poll.votes[element.selected_index-1] and poll.votes[element.selected_index-1]+1 or 1
end
poll.voted[player.index]=element.selected_index
element.parent.answer.caption = 'Your Answer: '..selected
end)
local prev = Gui.inputs.add{
type='button',
name='prev-poll',
caption='utility/hint_arrow_left'
}:on_event('click',function(event)
local parent = event.element.parent
local index = parent.parent.current_index.caption
local _index = tonumber(index)-1
if _index < 1 then _index = #_polls().old end
parent.parent.current_index.caption = _index
parent.parent.title.title.caption = 'Viewing Poll: '.._index
draw_poll(parent.parent.poll_area)
end)
local next = Gui.inputs.add{
type='button',
name='next-poll',
caption='utility/hint_arrow_right'
}:on_event('click',function(event)
local parent = event.element.parent
local index = parent.parent.current_index.caption
local _index = tonumber(index)+1
if _index > #_polls().old then _index = 1 end
parent.parent.current_index.caption = _index
parent.parent.title.title.caption = 'Viewing Poll: '.._index
draw_poll(parent.parent.poll_area)
end)
local poll_question_input = Gui.inputs.add_text('poll-question-input',true,'Question',function(player,text,element)
local options = element.parent.options
if not options.question then options.add{type='label',name='question',caption=''}
else options.question.caption = text end
end)
local _self_referace_poll_option_input = nil
local poll_option_input = Gui.inputs.add_text('poll-option-input',true,'Enter Option',function(player,text,element)
local options = element.parent.parent.parent.options
if not options[element.parent.name] then options.add{type='label',name=element.parent.name,caption=text}
else options[element.parent.name].caption = text end
if options.last.caption == element.parent.name then
options.last.caption = tonumber(options.last.caption)+1
_self_referace_poll_option_input:draw(element.parent.parent.add{type='flow',name=options.last.caption}).style.minimal_width = 200
end
end)
_self_referace_poll_option_input = poll_option_input
local function poll_assembler(frame)
frame.clear()
local options = frame.add{type='flow',name='options'}
options.style.visible = false
options.add{type='label',name='last',caption='2'}
poll_question_input:draw(frame).style.minimal_width = 200
local flow = frame.add{type='flow',direction='vertical'}
poll_option_input:draw(flow.add{type='flow',name='1'}).style.minimal_width = 200
poll_option_input:draw(flow.add{type='flow',name='2'}).style.minimal_width = 200
end
local create_poll = Gui.inputs.add{
type='button',
name='create-poll',
caption='utility/add'
}:on_event('click',function(event)
local parent = event.element.parent
if event.element.sprite == 'utility/enter' then
local inputs = parent.parent.poll_area.options
if not inputs then
event.element.sprite = 'utility/add'
draw_poll(parent.parent.poll_area)
return
end
local options = {}
for _,option in pairs(inputs.children) do
if option.name ~= 'question' and option.name ~= 'last' then
if option.caption ~= 'Enter Option' and option.caption ~= '' then table.insert(options,option.caption) end
end
end
if not inputs.question or #options == 0 then
event.element.sprite = 'utility/add'
draw_poll(parent.parent.poll_area)
return
end
local uuid = _poll_data(inputs.question.caption,options)
Gui.popup.open('polls',{uuid=uuid})
event.element.sprite = 'utility/add'
draw_poll(parent.parent.poll_area)
else
event.element.sprite = 'utility/enter'
poll_assembler(parent.parent.poll_area)
end
end)
Gui.popup.add{
name='polls',
caption={'polls.name'},
draw=function(frame,data)
frame.style.right_padding = 5
frame.style.bottom_padding = 5
local uuid = data.uuid
local poll = _polls().active[uuid]
if not poll then return end
local flow = frame.add{
type='flow',
name=uuid,
direction='vertical'
}
flow.add{type='label',caption={'polls.time-left',poll_time_out}}
flow.add{type='label',caption='Question: '..poll.question}
flow.add{type='label',name='answer',caption='Your Answer: None'}
opption_drop_down:draw(flow)
end
}:add_left{
caption='utility/item_editor_icon',
tooltip={'polls.tooltip'},
draw=function(frame)
frame.caption={'polls.name'}
frame.add{
type='label',
name='current_index',
caption=1
}.style.visible = false
local title = frame.add{
type='flow',
name='title'
}
local btn = prev:draw(title)
btn.style.width = 20
btn.style.height = 20
title.add{
type='label',
name='title',
caption='Viewing Poll: 1',
style='caption_label'
}
local btn = next:draw(title)
btn.style.width = 20
btn.style.height = 20
if Ranking.get_rank(frame.player_index):allowed('create-poll') then
local btn = create_poll:draw(title)
btn.style.width = 20
btn.style.height = 20
end
local flow = frame.add{
type='flow',
name='poll_area',
direction='vertical'
}
draw_poll(flow)
end,
can_open=function(player)
if #_polls().old > 0 then return true
elseif Ranking.get_rank(player):allowed('create-poll') then return true
else return {'polls.no-poll'} end
end
}

View File

@@ -0,0 +1,132 @@
--[[
Explosive Gaming
This file can be used with permission but this and the credit below must remain in the file.
Contact a member of management on our discord to seek permission to use our code.
Any changes that you may make to the code are yours but that does not make the script yours.
Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
local get_player_info = get_player_info or function(player,frame)
frame.add{
type='label',
caption={'rank-changer.no-info-file'}
}
end
local function _players(_player,root_frame,state)
local players = {'Select Player'}
local _players = state and game.players or game.connected_players
for _,player in pairs(_players) do
if player.name ~= _player.name then
if Admin.is_banned and Admin.is_banned(player) then else
table.insert(players,player.name)
end
end
end
return players
end
local online_check = Gui.inputs.add_checkbox('online-check-rank-change',false,'Show Offline',false,function(player,element)
element.parent['player-drop-down-rank-change'].items = _players(player,element.parent,true)
element.parent['player-drop-down-rank-change'].selected_index = 1
end,function(player,element)
element.parent['player-drop-down-rank-change'].items = _players(player,element.parent,false)
element.parent['player-drop-down-rank-change'].selected_index = 1
end)
local player_drop_down = Gui.inputs.add_drop_down('player-drop-down-rank-change',_players,1,function(player,selected,items,element)
element.parent.parent.player.caption = selected
local player_info_flow = element.parent.parent.info_flow
player_info_flow.clear()
if selected == 'Select Player' then return
else get_player_info(selected,player_info_flow,true) end
local rank = Ranking.get_rank(player)
local _rank = Ranking.get_rank(selected)
if rank.power >= _rank.power then element.parent.warning.caption = {'rank-changer.warning'}
else element.parent.warning.caption = '' end
end)
local function _ranks(player)
local ranks = {'Select Rank'}
local _rank = Ranking.get_rank(player)
for _,rank in pairs(Ranking._ranks()) do
if rank.power > _rank.power then
table.insert(ranks,rank.name)
end
end
return ranks
end
local rank_drop_down = Gui.inputs.add_drop_down('rank-drop-down-rank-change',_ranks,1,function(player,selected,items,element)
element.parent.parent.rank.caption = selected
end)
local set_rank = Gui.inputs.add{
type='button',
name='rank-change-set',
caption={'rank-changer.set-rank'}
}:on_event('click',function(event)
local dropdowns = event.element.parent
local rank = Ranking.get_rank(event.player_index)
local _rank = Ranking.get_rank(dropdowns.parent.rank.caption)
local _player = Game.get_player(dropdowns.parent.player.caption)
if not _player or not _rank then dropdowns.warning.caption = {'rank-changer.invalid'} return end
local __rank = Ranking.get_rank(_player)
if rank.power >= __rank.power then dropdowns.warning.caption = {'rank-changer.rank-high'} return end
Ranking.give_rank(_player,_rank,event)
Gui.center.clear(event)
end)
Gui.center.add{
name='rank-changer',
caption='utility/circuit_network_panel',
tooltip={'rank-changer.tooltip'},
draw=function(self,frame)
frame.caption={'rank-changer.name'}
local frame = frame.add{
type='flow',
direction='horizontal'
}
local dropdowns = frame.add{
type='flow',
direction='vertical'
}
local player_info_flow = frame.add{
name='info_flow',
type='flow',
direction='vertical'
}
player_info_flow.style.height = 200
player_info_flow.style.width = 200
local label = dropdowns.add{
type='label',
caption={'rank-changer.message'}
}
label.style.single_line = false
label.style.width = 200
online_check:draw(dropdowns)
player_drop_down:draw(dropdowns)
rank_drop_down:draw(dropdowns)
local label = dropdowns.add{
name='warning',
type='label',
caption='',
style='bold_red_label'
}
label.style.single_line = false
label.style.width = 200
set_rank:draw(dropdowns)
frame.add{
name='player',
type='label',
caption='///'
}.style.visible = false
frame.add{
name='rank',
type='label',
caption='///'
}.style.visible = false
end
}

View File

@@ -0,0 +1,132 @@
--[[
Explosive Gaming
This file can be used with permission but this and the credit below must remain in the file.
Contact a member of management on our discord to seek permission to use our code.
Any changes that you may make to the code are yours but that does not make the script yours.
Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
local function format_label(label)
label.style.maximal_width = 480
label.style.single_line = false
end
Gui.center.add{
name='readme',
caption='utility/questionmark',
tooltip={'readme.tooltip'}
}:add_tab('guildlines',{'readme.guildlines-name'},{'readme.guildlines-tooltip'},function(frame)
for i = 1,10 do
local style=nil; if i == 1 then style = 'caption_label' end
format_label(frame.add{
type='label',
caption={'readme.guildlines-line'..tostring(i)},
style=style
})
end
end):add_tab('chat',{'readme.chat-name'},{'readme.chat-tooltip'},function(frame)
format_label(frame.add{
type='label',
caption={'readme.chat-singleline'}
})
end):add_tab('commands',{'readme.commands-name'},{'readme.commands-tooltip'},function(frame)
format_label(frame.add{
type='label',
caption={'readme.commands-singleline'}
})
Gui.bar(frame,480)
local table = frame.add{name='command_table',type='table',column_count=2}
table.add{
type='label',
caption={'readme.commands-col1'},
style='caption_label'
}
table.add{
type='label',
caption={'readme.commands-col2'},
style='caption_label'
}
table.style.width = 480
table.draw_vertical_lines = true
table.draw_horizontal_line_after_headers = true
for _,command in pairs(commands.get_commands(frame.player_index)) do
table.add{
type='label',
caption='/'..command.name
}
local discription = table.add{
type='label',
caption=command.description,
}
discription.style.maximal_width = 400
discription.style.single_line = false
end
end):add_tab('links',{'readme.links-name'},{'readme.links-tooltip'},function(frame)
local links={
'https://discord.explosivegaming.nl',
'https://explosivegaming.nl',
'http://steamcommunity.com/groups/tntexplosivegaming',
'https://www.patreon.com/badgamernl',
'https://wiki.explosivegaming.nl/'
}
local function format(text_box)
text_box.style.minimal_width=400
text_box.read_only = true
text_box.word_wrap = true
text_box.selectable = true
end
for i,link in pairs(links) do
frame.add{
type="label",
caption={'readme.links-cap'..tostring(i)},
style='caption_label'
}
format(frame.add{
type='text-box',
text=link
})
end
end):add_tab('servers',{'readme.servers-name'},{'readme.servers-tooltip'},function(frame)
format_label(frame.add{
type='label',
caption={'readme.servers-singleline'}
})
Gui.bar(frame,480)
for i = 1,6 do
frame.add{
type='label',
caption={'readme.servers-format',tostring(i),{'readme.servers-cap'..tostring(i)}},
style='caption_label'
}
format_label(frame.add{
type='label',
caption={'readme.servers-des'..tostring(i)}
})
end
end):add_tab('rules',{'readme.rules-name'},{'readme.rules-tooltip'},function(frame)
format_label(frame.add{
type='label',
caption={'readme.rules-singleline'}
})
Gui.bar(frame,480)
for i = 1,20 do
format_label(frame.add{
type='label',
caption={'readme.rules-format',i,{'readme.rules-rule'..tostring(i)}}
})
end
end)
Sync.add_to_gui(Gui.inputs.add_button('readme-sync-guildlines','View Guildlines','View the guildlines in the readme',function(player,element)
Gui.center.open_tab(player,'readme','guildlines')
end))
Sync.add_to_gui(Gui.inputs.add_button('readme-sync-links','View Other Links','View the links in the readme',function(player,element)
Gui.center.open_tab(player,'readme','links')
end))
Sync.add_to_gui(Gui.inputs.add_button('readme-sync-rules','View All Rules','View the all rules in the readme',function(player,element)
Gui.center.open_tab(player,'readme','rules')
end))

View File

@@ -0,0 +1,53 @@
--[[
Explosive Gaming
This file can be used with permission but this and the credit below must remain in the file.
Contact a member of management on our discord to seek permission to use our code.
Any changes that you may make to the code are yours but that does not make the script yours.
Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
local confirm_report = Gui.inputs.add{
type='button',
name='admin-report-confirm',
caption='utility/spawn_flag',
tooltip={'reports.name'}
}:on_event('click',function(event)
local parent = event.element.parent
local player = Game.get_player(parent.player.caption)
local reason = parent.reason.text
Admin.report(player,event.player_index,reason)
Gui.center.clear(event.player_index)
end)
Admin.report_btn = Gui.inputs.add{
type='button',
name='admin-report',
caption='utility/spawn_flag',
tooltip={'reports.name'}
}:on_event('click',function(event)
local parent = event.element.parent
local player = Game.get_player(parent.children[1].name)
if not player then return end
local _player = Game.get_player(event)
Gui.center.clear(_player)
local frame = Gui.center.get_flow(_player).add{
type='frame',
name='report-gui'
}
_player.opened=frame
frame.caption={'reports.name'}
frame.add{
type='textfield',
name='reason'
}.style.width = 300
local btn = confirm_report:draw(frame)
btn.style.height = 30
btn.style.width = 30
frame.add{
type='label',
name='player',
caption=player.name
}.style.visible = false
end)

View File

@@ -0,0 +1,104 @@
--[[
Explosive Gaming
This file can be used with permission but this and the credit below must remain in the file.
Contact a member of management on our discord to seek permission to use our code.
Any changes that you may make to the code are yours but that does not make the script yours.
Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
local function _global(reset)
global.addons = not reset and global.addons or {}
global.addons.rockets = not reset and global.addons.rockets or {update=0,first=0,_last=0,last=0,fastest=0,milestones={m1=0,m2=0,m5=0,m10=0,m20=0,m50=0,m100=0,m200=0,m500=0,m1000=0,m2000=0,m5000=0}}
return global.addons.rockets
end
Gui.left.add{
name='rockets',
caption='item/rocket-silo',
tooltip={'rockets.tooltip'},
draw=function(frame)
frame.caption = {'rockets.name'}
local player = Game.get_player(frame.player_index)
local data = _global()
local satellites = player.force.get_item_launched('satellite')
local time = {'rockets.nan'}
if satellites == 1 then time = tick_to_display_format(game.tick)
elseif satellites > 1 then time = tick_to_display_format((game.tick-data.first)/satellites) end
if satellites ~= data.update then
data.update = satellites
if data.first == 0 then data.first = game.tick end
data._last = data.last
data.last = game.tick
if data.last-data._last < data.fastest or data.fastest == 0 then data.fastest = data.last-data._last end
end
frame.add{
type='label',
caption={'rockets.sent',satellites}
}
frame.add{
type='label',
caption={'rockets.first',tick_to_display_format(data.first)}
}
frame.add{
type='label',
caption={'rockets.last',tick_to_display_format(data.last-data._last)}
}
frame.add{
type='label',
caption={'rockets.time',time}
}
frame.add{
type='label',
caption={'rockets.fastest',tick_to_display_format(data.fastest)}
}
frame.add{
type='label',
caption={'rockets.milestones'},
style='caption_label'
}
local milestones = frame.add{
type='flow',
direction='vertical'
}
for milestone,time in pairs(data.milestones) do
local milestone = tonumber(milestone:match('%d+'))
if time == 0 and satellites == milestone then
data.milestones['m'..milestone] = data.last
time = data.last
Gui.left.open('rockets')
end
local _time = {'rockets.nan'}
if time > 0 then _time = tick_to_display_format(time) end
milestones.add{
type='label',
caption={'rockets.format',tostring(milestone),_time}
}
if time == 0 then break end
end
end,
can_open=function(player)
if player.force.get_item_launched('satellite') > 0 then return true
else return {'rockets.none'} end
end
}
Event.register(defines.events.on_rocket_launched,function(event) Gui.left.update('rockets') end)
Sync.add_update('rockets',function()
local _return = {}
local data = _global()
local satellites = game.forces.player.get_item_launched('satellite')
local time = {'rockets.nan'}
if satellites == 1 then time = tick_to_display_format(game.tick)
elseif satellites > 1 then time = tick_to_display_format((game.tick-data.first)/satellites) end
_return.total = satellites
_return.first = Sync.tick_format(data.first)
_return.last = Sync.tick_format(data.last-data._last)
_return.time = Sync.tick_format(time)
_return.fastest = Sync.tick_format(data.fastest)
_return.milestones = {}
for milestone,time in pairs(data.milestones) do
_return.milestones[milestone] = Sync.tick_format(time)
end
return _return
end)

View File

@@ -0,0 +1,102 @@
--[[
Explosive Gaming
This file can be used with permission but this and the credit below must remain in the file.
Contact a member of management on our discord to seek permission to use our code.
Any changes that you may make to the code are yours but that does not make the script yours.
Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
local science_packs = {
'science-pack-1',
'science-pack-2',
'science-pack-3',
'military-science-pack',
'production-science-pack',
'high-tech-science-pack',
'space-science-pack'
}
local function _global(reset)
global.addons = not reset and global.addons or {}
global.addons.science = not reset and global.addons.science or {_base={update=0,_update=0,made={0,0,0,0,0,0,0},_made={0,0,0,0,0,0,0}}}
return global.addons.science
end
Gui.left.add{
name='science',
caption='item/lab',
tooltip={'science.tooltip'},
draw=function(frame)
local data = _global()
local player = Game.get_player(frame.player_index)
if not data[player.force.name] then
data[player.force.name] = table.deepcopy(data._base)
end
data = data[player.force.name]
frame.caption = {'science.name'}
frame.add{
type='label',
caption={'science.total'},
style='caption_label'
}
local totals = frame.add{
type='flow',
direction='vertical'
}
frame.add{
type='label',
caption={'science.time'},
style='caption_label'
}
local times = frame.add{
type='flow',
direction='vertical'
}
if data.update < game.tick-100 then
data._update = data.update
data._made = table.deepcopy(data.made)
for i,name in pairs(science_packs) do
data.made[i] = player.force.item_production_statistics.get_input_count(name)
end
data.update = game.tick
end
for i,name in pairs(science_packs) do
local made = data.made[i]
if made > 0 then
totals.add{
type='label',
caption={'science.format',{'science.'..name},made}
}
local _made = string.format('%.2f',(made-data._made[i])/((data.update-data._update)/(3600*game.speed)))
times.add{
type='label',
caption={'science.format',{'science.'..name},_made}
}
end
end
end,
can_open=function(player)
if player.force.item_production_statistics.get_input_count('science-pack-1') > 0 then return true
else return {'science.none'} end
end
}
Event.register(defines.events.on_research_finished,function(event) Gui.left.update('science') end)
Sync.add_update('science',function()
local _return = {}
local _data = _global()
for force_name,data in pairs(_data) do
if force_name ~= '_base' then
_return[force_name] = {totals={},times={}}
for i,name in pairs(science_packs) do
local made = data.made[i]
_return[force_name].totals[name] = made
local _made = string.format('%.2f',(made-data._made[i])/((data.update-data._update)/(3600*game.speed)))
_return[force_name].times[name] = _made
end
end
end
return _return
end)

View File

@@ -0,0 +1,193 @@
--[[
Explosive Gaming
This file can be used with permission but this and the credit below must remain in the file.
Contact a member of management on our discord to seek permission to use our code.
Any changes that you may make to the code are yours but that does not make the script yours.
Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
local function _global(reset)
global.addons = not reset and global.addons or {}
global.addons.tasklist = not reset and global.addons.tasklist or {tasks={},_edit={},_base={_edit=false,_tasks={},_editing={}}}
return global.addons.tasklist
end
local edit = Gui.inputs.add{
name='tasklist-edit',
type='button',
caption='utility/rename_icon_normal'
}:on_event('click',function(event)
local text_flow = event.element.parent.parent.text_flow
local data = _global()._edit[event.player_index]
if not data._edit then data._tasks = table.deepcopy(_global().tasks) end
if text_flow.input.type == 'label' then
data._editing[tonumber(text_flow.parent.name)]=true
Gui.left.update('tasklist',event.player_index)
elseif text_flow.input.type == 'textfield' then
local text = text_flow.input.text
data._editing[tonumber(text_flow.parent.name)]=false
data._tasks[tonumber(text_flow.parent.name)]=text
Gui.left.update('tasklist',event.player_index)
end
end)
local function _edit(frame)
local element = edit:draw(frame)
element.style.height = 20
element.style.width = 20
local text_flow = element.parent.parent.text_flow
local data = _global()._edit[frame.player_index]
data._tasks[text_flow.parent.name]=text
if data._editing[tonumber(text_flow.parent.name)] then
element.style.height = 30
element.style.width = 30
local text = text_flow.input.caption
text_flow.clear()
local _text = text_flow.add{
name='input',
type='textfield',
text=text
}
_text.style.width = 200
element.sprite = 'utility/enter'
end
end
local remove = Gui.inputs.add{
name='tasklist-remove',
type='button',
caption='utility/remove'
}:on_event('click',function(event)
local frame = event.element.parent.parent
local data = _global()._edit[event.player_index]
if data._edit then
table.remove(data._tasks,tonumber(frame.name))
table.remove(data._editing,tonumber(frame.name))
else
table.remove(_global().tasks,tonumber(frame.name))
Gui.left.update('tasklist')
end
Gui.left.update('tasklist',event.player_index)
end)
local add = Gui.inputs.add{
name='tasklist-add',
type='button',
caption='utility/add'
}:on_event('click',function(event)
local frame = event.element.parent.parent
local data = _global()._edit[event.player_index]
if data._edit then
table.insert(data._tasks,tonumber(frame.name)+1,'New Value')
table.insert(data._editing,tonumber(frame.name)+1,true)
else
data._tasks = table.deepcopy(_global().tasks)
table.insert(data._tasks,tonumber(frame.name)+1,'New Value')
table.insert(data._editing,tonumber(frame.name)+1,true)
end
Gui.left.update('tasklist',event.player_index)
end)
local function _tasks(player)
local player = Game.get_player(player)
local data = _global()._edit[player.index]
if not data then return _global().tasks end
local _edit = false
for _,v in pairs(data._editing) do
if v == true then
_edit = true
break
end
end
if data._edit and not _edit then
_global().tasks = table.deepcopy(data._tasks)
_global()._edit[player.index] = table.deepcopy(_global()._base)
Gui.left.update('tasklist')
return _global().tasks
elseif not data._edit and _edit then
data._edit = true
for key,_ in pairs(data._tasks) do if not data._editing[key] then data._editing[key] = false end end
return data._tasks
elseif _edit then return data._tasks
else return _global().tasks
end
end
Gui.left.add{
name='tasklist',
caption='utility/not_enough_repair_packs_icon',
tooltip={'tasklist.tooltip'},
draw=function(frame)
frame.caption = ''
local title = frame.add{
type='flow',
direction='horizontal'
}
title.add{
type='label',
caption={'tasklist.name'},
style='caption_label'
}
local data = _global()
local player = Game.get_player(frame.player_index)
local rank = Ranking.get_rank(player)
if rank:allowed('edit-tasklist') then
if not data._edit[player.index] then data._edit[player.index] = table.deepcopy(data._base) end
end
for i,task in pairs(_tasks(player)) do
local flow = frame.add{
name=i,
type='flow',
direction='horizontal'
}
local text_flow = flow.add{
name='text_flow',
type='flow',
direction='horizontal'
}
text_flow.add{
name='input',
type='label',
caption=task
}
local button_flow = flow.add{
type='flow',
direction='horizontal'
}
if rank:allowed('edit-tasklist') then
_edit(button_flow)
if data._edit[player.index]._editing[i] then
local element = remove:draw(button_flow)
element.style.height = 30
element.style.width = 30
local _element = add:draw(button_flow)
_element.style.height = 30
_element.style.width = 30
end
end
end
if rank:allowed('edit-tasklist') then
local flow = title.add{
name=#_tasks(player),
type='flow',
direction='horizontal'
}
local button_flow = flow.add{
type='flow',
direction='horizontal'
}
local element = add:draw(button_flow)
element.style.height = 20
element.style.width = 20
end
if #_tasks(player) == 0 and not rank:allowed('edit-tasklist') then frame.style.visible = false end
end,
can_open=function(player)
local rank = Ranking.get_rank(player)
if rank:allowed('edit-tasklist') or #_global().tasks > 0 then return true
else return {'tasklist.none'} end
end,
open_on_join=true
}

View File

@@ -0,0 +1,237 @@
--[[
Explosive Gaming
This file can be used with permission but this and the credit below must remain in the file.
Contact a member of management on our discord to seek permission to use our code.
Any changes that you may make to the code are yours but that does not make the script yours.
Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
local warp_tiles = {
{-3,-2},{-3,-1},{-3,0},{-3,1},{-3,2},{3,-2},{3,-1},{3,0},{3,1},{3,2},
{-2,-3},{-1,-3},{0,-3},{1,-3},{2,-3},{-2,3},{-1,3},{0,3},{1,3},{2,3}
}
local warp_entities = {
{'small-lamp',-3,-2},{'small-lamp',-3,2},{'small-lamp',3,-2},{'small-lamp',3,2},
{'small-lamp',-2,-3},{'small-lamp',2,-3},{'small-lamp',-2,3},{'small-lamp',2,3},
{'small-electric-pole',-3,-3},{'small-electric-pole',3,3},{'small-electric-pole',-3,3},{'small-electric-pole',3,-3}
}
local warp_radius = 4
local spawn_warp_scale = 5
local warp_tile = 'tutorial-grid'
local warp_limit = 60
local warp_item = 'discharge-defense-equipment'
local global_offset = {x=0,y=0}
local function _warps(reset)
global.addons = not reset and global.addons or {}
global.addons.warps = not reset and global.addons.warps or {warps={},cooldowns={}}
return global.addons.warps
end
local function remove_warp_point(name)
local warp = _warps().warps[name]
if not warp then return end
local surface = warp.surface
local offset = warp.position
local tiles = {}
local tiles = {}
for x = -warp_radius-2, warp_radius+2 do
for y = -warp_radius-2, warp_radius+2 do
if x^2+y^2 < (warp_radius+1)^2 then
table.insert(tiles,{name=warp.old_tile,position={x+offset.x,y+offset.y}})
local entities = surface.find_entities_filtered{area={{x+offset.x-1,y+offset.y-1},{x+offset.x,y+offset.y}}}
for _,entity in pairs(entities) do if entity.name ~= 'player' then entity.destroy() end end
end
end
end
surface.set_tiles(tiles)
if warp.tag.valid then warp.tag.destroy() end
_warps().warps[name] = nil
Gui.left.update('warp-list')
end
local function make_warp_point(position,surface,force,name)
local warp = _warps().warps[name]
if warp then return end; warp = nil
local offset = {x=math.floor(position.x),y=math.floor(position.y)}
local old_tile = surface.get_tile(offset).name
local base_tiles = {}
local tiles = {}
-- this makes a base plate to make the warp point
for x = -warp_radius-2, warp_radius+2 do
for y = -warp_radius-2, warp_radius+2 do
if x^2+y^2 < warp_radius^2 then
table.insert(base_tiles,{name=warp_tile,position={x+offset.x,y+offset.y}})
end
end
end
surface.set_tiles(base_tiles)
-- this adds the patern and entities
for _,position in pairs(warp_tiles) do
table.insert(tiles,{name=warp_tile,position={position[1]+offset.x+global_offset.x,position[2]+offset.y+global_offset.y}})
end
surface.set_tiles(tiles)
for _,entity in pairs(warp_entities) do
local entity = surface.create_entity{name=entity[1],position={entity[2]+offset.x+global_offset.x,entity[3]+offset.y+global_offset.y},force='neutral'}
entity.destructible = false; entity.health = 0; entity.minable = false; entity.rotatable = false
end
local tag = force.add_chart_tag(surface,{
position={offset.x+0.5,offset.y+0.5},
text='Warp: '..name,
icon={type='item',name=warp_item}
})
_warps().warps[name] = {tag=tag,surface=surface,position=tag.position,old_tile=old_tile}
local _temp = {Spawn=_warps().warps.Spawn}
_warps().warps.Spawn = nil
for name,data in pairs(table.keysort(_warps().warps)) do _temp[name] = data end
_warps().warps = _temp
Gui.left.update('warp-list')
end
commands.add_command('make-warp', 'Make a warp point at your location', {'name',true}, function(event,args)
if not game.player then return end
local position = game.player.position
local name = args.name
if game.player.gui.top[name] then player_return({'warp-system.name-used'},defines.text_color.med) return commands.error end
if _warps().warps[name] then player_return({'warp-system.name-used'},defines.text_color.med) return commands.error end
if position.x^2 + position.y^2 < 100 then player_return({'warp-system.too-close'},defines.text_color.med) return commands.error end
-- to do add a test for all warps
make_warp_point(position,game.player.surface,game.player.force,name)
end)
local remove_warp = Gui.inputs.add{
type='button',
name='remove-warp-point',
caption='utility/remove',
tooltip={'warp-system.remove-tooltip'}
}:on_event('click',function(event)
local name = event.element.parent.name
remove_warp_point(name)
end)
local go_to_warp = Gui.inputs.add{
type='button',
name='go-to-warp-point',
caption='utility/export_slot',
tooltip={'warp-system.go-to-tooltip'}
}:on_event('click',function(event)
local player = Game.get_player(event)
local cooldown = _warps().cooldowns[event.player_index] or 0
local warp = _warps().warps[event.element.parent.name]
if cooldown > 0 then player_return({'warp-system.cooldown',cooldown},nil,event) return end
if player.vehicle then player.vehicle.set_driver(nil) end
if player.vehicle then player.vehicle.set_passenger(nil) end
if player.vehicle then return end
player.teleport(warp.surface.find_non_colliding_position('player',warp.position,32,1),warp.surface)
if not Ranking.get_rank(player):allowed('always-warp') then
event.element.parent.parent.parent.parent.style.visible = false
_warps().cooldowns[event.player_index] = warp_limit
end
end)
Gui.left.add{
name='warp-list',
caption='item/'..warp_item,
tooltip={'warp-system.tooltip'},
draw=function(frame)
local player = Game.get_player(frame.player_index)
frame.caption={'warp-system.name'}
local warp_list = frame.add{
type='scroll-pane',
direction='vertical',
vertical_scroll_policy='auto',
horizontal_scroll_policy='never'
}
warp_list.vertical_scroll_policy = 'auto'
warp_list.style.maximal_height = 150
local table = warp_list.add{
type='table',
column_count=2
}
for name,warp in pairs(_warps().warps) do
if not warp.tag or not warp.tag.valid then
player.force.add_chart_tag(warp.surface,{
position=warp.position,
text='Warp: '..name,
icon={type='item',name=warp_item}
})
end
table.add{
type='label',
caption=name,
style='caption_label'
}
local _flow = table.add{
type='flow',
name=name
}
local btn = go_to_warp:draw(_flow)
btn.style.height = 20
btn.style.width = 20
if Ranking.get_rank(player):allowed('make-warp') and name ~= 'Spawn' then
local btn = remove_warp:draw(_flow)
btn.style.height = 20
btn.style.width = 20
end
end
local cooldown = _warps().cooldowns[player.index] or 0
if cooldown > 0 then frame.style.visible = false return
elseif Ranking.get_rank(player):allowed('always-warp') then return
elseif player.surface.get_tile(player.position).name == warp_tile
and player.surface.name == 'nauvis'
then return
elseif player.position.x^2+player.position.y^2 < (warp_radius*spawn_warp_scale)^2 then return
else frame.style.visible = false end
end,
can_open=function(player)
local cooldown = _warps().cooldowns[player.index] or 0
if Ranking.get_rank(player):allowed('always-warp') then return true
elseif player.surface.get_tile(player.position).name == warp_tile
and player.surface.name == 'nauvis'
then return true
elseif player.position.x^2+player.position.y^2 < (warp_radius*spawn_warp_scale)^2 then return true
elseif cooldown > 0 then return {'warp-system.cooldown',cooldown}
else return {'warp-system.not-on-warp'} end
end,
open_on_join=true
}
Event.register(defines.events.on_tick,function(event)
if not (event.tick % 60 == 0) then return end
for index,time in pairs(_warps().cooldowns) do
if time > 0 then
_warps().cooldowns[index] = time-1
if _warps().cooldowns[index] == 0 then player_return({'warp-system.cooldown-zero'},defines.text_color.low,index) end
end
end
end)
Event.register(defines.events.on_player_changed_position, function(event)
local player = Game.get_player(event)
local cooldown = _warps().cooldowns[player.index] or 0
local tile = player.surface.get_tile(player.position).name
if not Ranking.get_rank(player):allowed('always-warp') and cooldown == 0 then
if tile == warp_tile and player.surface.name == 'nauvis' then
mod_gui.get_frame_flow(player)['warp-list'].style.visible = true
elseif player.position.x^2+player.position.y^2 < (warp_radius*spawn_warp_scale)^2 then
mod_gui.get_frame_flow(player)['warp-list'].style.visible = true
else mod_gui.get_frame_flow(player)['warp-list'].style.visible = false end
end
end)
Event.register(defines.events.on_player_created, function(event)
if event.player_index == 1 then
local player = Game.get_player(event)
player.force.chart(player.surface, {{player.position.x - 20, player.position.y - 20}, {player.position.x + 20, player.position.y + 20}})
local tag = player.force.add_chart_tag(player.surface,{
position={0,0},
text='Warp: Spawn',
icon={type='item',name=warp_item}
})
_warps().warps['Spawn'] = {tag=tag,surface=player.surface,position={0,0}}
end
end)