Diff
checker
Texto
Texto
Imagens
Documentos
Excel
Pastas
Legal
Enterprise
Aplicativo para desktop
Preços
Fazer login
Baixar o Diffchecker Desktop
Comparar texto
Encontre a diferença entre dois arquivos de texto
Ferramentas
Histórico
Editor live
Recolher inalteradas
Sem quebra de linha
Layout
Dividido
Unificado
Nível de detalhe
Inteligente
Palavra
Caractere
Realce de sintaxe
Escolher sintaxe
Ignorar
Transformar texto
Ir à primeira mudança
Editar entrada
Diffchecker Desktop
A maneira mais segura de usar o Diffchecker. Obtenha o aplicativo Diffchecker Desktop: seus diffs nunca saem do seu computador!
Obter Desktop
researchstation.lua (AutoResearch)
Criado
há 8 anos
O diff nunca expira
Limpar
Exportar
Compartilhar
Explicar
6 remoções
Linhas
Total
Removido
Caracteres
Total
Removido
Para continuar usando este recurso, atualize para
Diff
checker
Pro
Ver preços
575 linhas
Copiar tudo
40 adições
Linhas
Total
Adicionado
Caracteres
Total
Adicionado
Para continuar usando este recurso, atualize para
Diff
checker
Pro
Ver preços
609 linhas
Copiar tudo
package.path = package.path .. ";data/scripts/entity/merchants/?.lua;"
package.path = package.path .. ";data/scripts/entity/merchants/?.lua;"
package.path = package.path .. ";data/scripts/lib/?.lua;"
package.path = package.path .. ";data/scripts/lib/?.lua;"
require ("galaxy")
require ("galaxy")
require ("utility")
require ("utility")
require ("faction")
require ("faction")
require ("player")
require ("player")
require ("randomext")
require ("randomext")
require ("stringutility")
require ("stringutility")
Copiar
Copiado
Copiar
Copiado
require ("autoresearch")
local SellableInventoryItem = require ("sellableinventoryitem")
local SellableInventoryItem = require ("sellableinventoryitem")
local TurretGenerator = require ("turretgenerator")
local TurretGenerator = require ("turretgenerator")
local Dialog = require("dialogutility")
local Dialog = require("dialogutility")
local button
local button
function initialize()
function initialize()
if onClient() and EntityIcon().icon == "" then
if onClient() and EntityIcon().icon == "" then
EntityIcon().icon = "data/textures/icons/pixel/research.png"
EntityIcon().icon = "data/textures/icons/pixel/research.png"
InteractionText().text = Dialog.generateStationInteractionText(Entity(), random())
InteractionText().text = Dialog.generateStationInteractionText(Entity(), random())
end
end
end
end
function interactionPossible(playerIndex, option)
function interactionPossible(playerIndex, option)
return CheckFactionInteraction(playerIndex, -25000)
return CheckFactionInteraction(playerIndex, -25000)
end
end
function initUI()
function initUI()
local res = getResolution()
local res = getResolution()
local size = vec2(800, 600)
local size = vec2(800, 600)
local menu = ScriptUI()
local menu = ScriptUI()
local window = menu:createWindow(Rect(res * 0.5 - size * 0.5, res * 0.5 + size * 0.5))
local window = menu:createWindow(Rect(res * 0.5 - size * 0.5, res * 0.5 + size * 0.5))
window.caption = "Research /* station title */"%_t
window.caption = "Research /* station title */"%_t
window.showCloseButton = 1
window.showCloseButton = 1
window.moveable = 1
window.moveable = 1
menu:registerWindow(window, "Research"%_t);
menu:registerWindow(window, "Research"%_t);
local hsplit = UIHorizontalSplitter(Rect(window.size), 10, 10, 0.4)
local hsplit = UIHorizontalSplitter(Rect(window.size), 10, 10, 0.4)
inventory = window:createInventorySelection(hsplit.bottom, 11)
inventory = window:createInventorySelection(hsplit.bottom, 11)
local vsplit = UIVerticalSplitter(hsplit.top, 10, 10, 0.4)
local vsplit = UIVerticalSplitter(hsplit.top, 10, 10, 0.4)
local hsplitleft = UIHorizontalSplitter(vsplit.left, 10, 10, 0.5)
local hsplitleft = UIHorizontalSplitter(vsplit.left, 10, 10, 0.5)
hsplitleft.padding = 6
hsplitleft.padding = 6
local rect = hsplitleft.top
local rect = hsplitleft.top
rect.width = 220
rect.width = 220
required = window:createSelection(rect, 3)
required = window:createSelection(rect, 3)
local rect = hsplitleft.bottom
local rect = hsplitleft.bottom
rect.width = 150
rect.width = 150
optional = window:createSelection(rect, 2)
optional = window:createSelection(rect, 2)
for _, sel in pairs({required, optional}) do
for _, sel in pairs({required, optional}) do
sel.dropIntoEnabled = 1
sel.dropIntoEnabled = 1
sel.entriesSelectable = 0
sel.entriesSelectable = 0
sel.onReceivedFunction = "onRequiredReceived"
sel.onReceivedFunction = "onRequiredReceived"
sel.onDroppedFunction = "onRequiredDropped"
sel.onDroppedFunction = "onRequiredDropped"
sel.onClickedFunction = "onRequiredClicked"
sel.onClickedFunction = "onRequiredClicked"
end
end
inventory.dragFromEnabled = 1
inventory.dragFromEnabled = 1
inventory.onClickedFunction = "onInventoryClicked"
inventory.onClickedFunction = "onInventoryClicked"
vsplit.padding = 30
vsplit.padding = 30
local rect = vsplit.right
local rect = vsplit.right
rect.width = 70
rect.width = 70
rect.height = 70
rect.height = 70
results = window:createSelection(rect, 1)
results = window:createSelection(rect, 1)
results.entriesSelectable = 0
results.entriesSelectable = 0
results.dropIntoEnabled = 0
results.dropIntoEnabled = 0
results.dragFromEnabled = 0
results.dragFromEnabled = 0
vsplit.padding = 10
vsplit.padding = 10
local organizer = UIOrganizer(vsplit.right)
local organizer = UIOrganizer(vsplit.right)
organizer.marginBottom = 5
organizer.marginBottom = 5
button = window:createButton(Rect(), "Research"%_t, "onClickResearch")
button = window:createButton(Rect(), "Research"%_t, "onClickResearch")
button.width = 200
button.width = 200
button.height = 40
button.height = 40
organizer:placeElementBottom(button)
organizer:placeElementBottom(button)
Copiar
Copiado
Copiar
Copiado
editUI(hsplit, button, window)
end
end
function removeItemFromMainSelection(key)
function removeItemFromMainSelection(key)
local item = inventory:getItem(key)
local item = inventory:getItem(key)
if not item then return end
if not item then return end
if item.amount then
if item.amount then
item.amount = item.amount - 1
item.amount = item.amount - 1
if item.amount == 0 then item.amount = nil end
if item.amount == 0 then item.amount = nil end
end
end
inventory:remove(key)
inventory:remove(key)
if item.amount then
if item.amount then
inventory:add(item, key)
inventory:add(item, key)
end
end
end
end
function addItemToMainSelection(item)
function addItemToMainSelection(item)
if not item then return end
if not item then return end
if item.item.stackable then
if item.item.stackable then
-- find the item and increase the amount
-- find the item and increase the amount
for k, v in pairs(inventory:getItems()) do
for k, v in pairs(inventory:getItems()) do
if v.item == item.item then
if v.item == item.item then
v.amount = v.amount + 1
v.amount = v.amount + 1
inventory:remove(k)
inventory:remove(k)
inventory:add(v, k)
inventory:add(v, k)
return
return
end
end
end
end
item.amount = 1
item.amount = 1
end
end
-- when not found or not stackable, add it
-- when not found or not stackable, add it
inventory:add(item)
inventory:add(item)
end
end
function moveItem(item, from, to, fkey, tkey)
function moveItem(item, from, to, fkey, tkey)
if not item then return end
if not item then return end
if from.index == inventory.index then -- move from inventory to a selection
if from.index == inventory.index then -- move from inventory to a selection
-- first, move the item that might be in place back to the inventory
-- first, move the item that might be in place back to the inventory
if tkey then
if tkey then
addItemToMainSelection(to:getItem(tkey))
addItemToMainSelection(to:getItem(tkey))
to:remove(tkey)
to:remove(tkey)
end
end
removeItemFromMainSelection(fkey)
removeItemFromMainSelection(fkey)
-- fix item amount, we don't want numbers in the upper selections
-- fix item amount, we don't want numbers in the upper selections
item.amount = nil
item.amount = nil
to:add(item, tkey)
to:add(item, tkey)
elseif to.index == inventory.index then
elseif to.index == inventory.index then
-- move from selection to inventory
-- move from selection to inventory
addItemToMainSelection(item)
addItemToMainSelection(item)
from:remove(fkey)
from:remove(fkey)
end
end
end
end
function onRequiredReceived(selectionIndex, fkx, fky, item, fromIndex, toIndex, tkx, tky)
function onRequiredReceived(selectionIndex, fkx, fky, item, fromIndex, toIndex, tkx, tky)
if not item then return end
if not item then return end
-- don't allow dragging from/into the left hand selections
-- don't allow dragging from/into the left hand selections
if fromIndex == optional.index or fromIndex == required.index then
if fromIndex == optional.index or fromIndex == required.index then
return
return
end
end
moveItem(item, inventory, Selection(selectionIndex), ivec2(fkx, fky), ivec2(tkx, tky))
moveItem(item, inventory, Selection(selectionIndex), ivec2(fkx, fky), ivec2(tkx, tky))
refreshButton()
refreshButton()
results:clear()
results:clear()
results:addEmpty()
results:addEmpty()
end
end
function onRequiredClicked(selectionIndex, fkx, fky, item, button)
function onRequiredClicked(selectionIndex, fkx, fky, item, button)
if button == 3 or button == 2 then
if button == 3 or button == 2 then
moveItem(item, Selection(selectionIndex), inventory, ivec2(fkx, fky), nil)
moveItem(item, Selection(selectionIndex), inventory, ivec2(fkx, fky), nil)
refreshButton()
refreshButton()
end
end
end
end
function onRequiredDropped(selectionIndex, kx, ky)
function onRequiredDropped(selectionIndex, kx, ky)
local selection = Selection(selectionIndex)
local selection = Selection(selectionIndex)
local key = ivec2(kx, ky)
local key = ivec2(kx, ky)
moveItem(selection:getItem(key), Selection(selectionIndex), inventory, key, nil)
moveItem(selection:getItem(key), Selection(selectionIndex), inventory, key, nil)
refreshButton()
refreshButton()
end
end
function onInventoryClicked(selectionIndex, kx, ky, item, button)
function onInventoryClicked(selectionIndex, kx, ky, item, button)
if button == 2 or button == 3 then
if button == 2 or button == 3 then
-- fill required first, then, once it's full, fill optional
-- fill required first, then, once it's full, fill optional
local items = required:getItems()
local items = required:getItems()
if tablelength(items) < 3 then
if tablelength(items) < 3 then
moveItem(item, inventory, required, ivec2(kx, ky), nil)
moveItem(item, inventory, required, ivec2(kx, ky), nil)
refreshButton()
refreshButton()
results:clear()
results:clear()
results:addEmpty()
results:addEmpty()
return
return
end
end
local items = optional:getItems()
local items = optional:getItems()
if tablelength(items) < 2 then
if tablelength(items) < 2 then
moveItem(item, inventory, optional, ivec2(kx, ky), nil)
moveItem(item, inventory, optional, ivec2(kx, ky), nil)
refreshButton()
refreshButton()
results:clear()
results:clear()
results:addEmpty()
results:addEmpty()
return
return
end
end
end
end
end
end
function refreshButton()
function refreshButton()
local items = required:getItems()
local items = required:getItems()
button.active = (tablelength(items) == 3)
button.active = (tablelength(items) == 3)
if tablelength(items) ~= 3 then
if tablelength(items) ~= 3 then
button.tooltip = "Place at least 3 items for research!"%_t
button.tooltip = "Place at least 3 items for research!"%_t
else
else
button.tooltip = "Transform into a new item"%_t
button.tooltip = "Transform into a new item"%_t
end
end
for _, items in pairs({items, optional:getItems()}) do
for _, items in pairs({items, optional:getItems()}) do
for _, item in pairs(items) do
for _, item in pairs(items) do
if item.item.itemType ~= InventoryItemType.TurretTemplate
if item.item.itemType ~= InventoryItemType.TurretTemplate
and item.item.itemType ~= InventoryItemType.SystemUpgrade
and item.item.itemType ~= InventoryItemType.SystemUpgrade
and item.item.itemType ~= InventoryItemType.Turret then
and item.item.itemType ~= InventoryItemType.Turret then
button.active = false
button.active = false
button.tooltip = "Invalid items in ingredients."%_t
button.tooltip = "Invalid items in ingredients."%_t
end
end
end
end
end
end
end
end
function onShowWindow()
function onShowWindow()
inventory:clear()
inventory:clear()
required:clear()
required:clear()
optional:clear()
optional:clear()
required:addEmpty()
required:addEmpty()
required:addEmpty()
required:addEmpty()
required:addEmpty()
required:addEmpty()
optional:addEmpty()
optional:addEmpty()
optional:addEmpty()
optional:addEmpty()
results:addEmpty()
results:addEmpty()
refreshButton()
refreshButton()
for i = 1, 50 do
for i = 1, 50 do
inventory:addEmpty()
inventory:addEmpty()
end
end
Copiar
Copiado
Copiar
Copiado
local items = {}
local player = Player()
local player = Player()
local ship = player.craft
local ship = player.craft
local alliance = player.alliance
local alliance = player.alliance
if alliance and ship.factionIndex == player.allianceIndex then
if alliance and ship.factionIndex == player.allianceIndex then
inventory:fill(alliance.index)
inventory:fill(alliance.index)
else
else
inventory:fill(player.index)
inventory:fill(player.index)
end
end
Copiar
Copiado
Copiar
Copiado
for index, slot in pairs(Player():getInventory():getItems()) do
local item = SellableInventoryItem(slot.item, index, player)
table.insert(items, item)
end
table.sort(items, SortSellableInventoryItems)
for i, p in pairs(items) do
local item = InventorySelectionItem()
item.item = p.item
item.uvalue = p.index -- use the uvalue uservalue to store the index of the item in the inventory
-- show numbers for stackable items
if p.item.stackable then
item.amount = p.amount
else
item.amount = nil
end
inventory:add(item)
end
if cbAutoResearch.checked then
button.active = true
end
end
end
function checkRarities(items) -- items must not be more than 1 rarity apart
function checkRarities(items) -- items must not be more than 1 rarity apart
local min = math.huge
local min = math.huge
local max = -math.huge
local max = -math.huge
for _, item in pairs(items) do
for _, item in pairs(items) do
if item.rarity.value < min then min = item.rarity.value end
if item.rarity.value < min then min = item.rarity.value end
if item.rarity.value > max then max = item.rarity.value end
if item.rarity.value > max then max = item.rarity.value end
end
end
if max - min <= 1 then
if max - min <= 1 then
return true
return true
end
end
return false
return false
end
end
function getRarityProbabilities(items)
function getRarityProbabilities(items)
local probabilities = {}
local probabilities = {}
-- for each item there is a 20% chance that the researched item has a rarity 1 better
-- for each item there is a 20% chance that the researched item has a rarity 1 better
for _, item in pairs(items) do
for _, item in pairs(items) do
-- next rarity cannot exceed legendary
-- next rarity cannot exceed legendary
local nextRarity = math.min(RarityType.Legendary, item.rarity.value + 1)
local nextRarity = math.min(RarityType.Legendary, item.rarity.value + 1)
local p = probabilities[nextRarity] or 0
local p = probabilities[nextRarity] or 0
p = p + 0.2
p = p + 0.2
probabilities[nextRarity] = p
probabilities[nextRarity] = p
end
end
-- if the amount of items is < 5 then add their own rarities as a result as well
-- if the amount of items is < 5 then add their own rarities as a result as well
if #items < 5 then
if #items < 5 then
local left = (1.0 - #items * 0.2)
local left = (1.0 - #items * 0.2)
local perItem = left / #items
local perItem = left / #items
for _, item in pairs(items) do
for _, item in pairs(items) do
local p = probabilities[item.rarity.value] or 0
local p = probabilities[item.rarity.value] or 0
p = p + perItem
p = p + perItem
probabilities[item.rarity.value] = p
probabilities[item.rarity.value] = p
end
end
end
end
local sum = 0
local sum = 0
for _, p in pairs(probabilities) do
for _, p in pairs(probabilities) do
sum = sum + p
sum = sum + p
end
end
return probabilities
return probabilities
end
end
function getTypeProbabilities(items)
function getTypeProbabilities(items)
local probabilities = {}
local probabilities = {}
for _, item in pairs(items) do
for _, item in pairs(items) do
local p = probabilities[item.itemType] or 0
local p = probabilities[item.itemType] or 0
p = p + 1
p = p + 1
probabilities[item.itemType] = p
probabilities[item.itemType] = p
end
end
return probabilities
return probabilities
end
end
-- since there are no more exact weapon types in the finished weapons,
-- since there are no more exact weapon types in the finished weapons,
-- we have to gather the weapon types by their stats, such as icons
-- we have to gather the weapon types by their stats, such as icons
function getWeaponTypesByIcon()
function getWeaponTypesByIcon()
if weaponTypes then return weaponTypes end
if weaponTypes then return weaponTypes end
weaponTypes = {}
weaponTypes = {}
local weapons = Balancing_GetWeaponProbability(0, 0)
local weapons = Balancing_GetWeaponProbability(0, 0)
for weaponType, _ in pairs(weapons) do
for weaponType, _ in pairs(weapons) do
local turret = GenerateTurretTemplate(Seed(1), weaponType, 15, 5, Rarity(RarityType.Common), Material(MaterialType.Iron))
local turret = GenerateTurretTemplate(Seed(1), weaponType, 15, 5, Rarity(RarityType.Common), Material(MaterialType.Iron))
weaponTypes[turret.weaponIcon] = weaponType
weaponTypes[turret.weaponIcon] = weaponType
end
end
return weaponTypes
return weaponTypes
end
end
function getWeaponProbabilities(items)
function getWeaponProbabilities(items)
local probabilities = {}
local probabilities = {}
local typesByIcons = getWeaponTypesByIcon()
local typesByIcons = getWeaponTypesByIcon()
for _, item in pairs(items) do
for _, item in pairs(items) do
if item.itemType == InventoryItemType.Turret
if item.itemType == InventoryItemType.Turret
or item.itemType == InventoryItemType.TurretTemplate then
or item.itemType == InventoryItemType.TurretTemplate then
local weaponType = typesByIcons[item.weaponIcon]
local weaponType = typesByIcons[item.weaponIcon]
local p = probabilities[weaponType] or 0
local p = probabilities[weaponType] or 0
p = p + 1
p = p + 1
probabilities[weaponType] = p
probabilities[weaponType] = p
end
end
end
end
return probabilities
return probabilities
end
end
function getWeaponMaterials(items)
function getWeaponMaterials(items)
local probabilities = {}
local probabilities = {}
for _, item in pairs(items) do
for _, item in pairs(items) do
if item.itemType == InventoryItemType.Turret
if item.itemType == InventoryItemType.Turret
or item.itemType == InventoryItemType.TurretTemplate then
or item.itemType == InventoryItemType.TurretTemplate then
local p = probabilities[item.material.value] or 0
local p = probabilities[item.material.value] or 0
p = p + 1
p = p + 1
probabilities[item.material.value] = p
probabilities[item.material.value] = p
end
end
end
end
return probabilities
return probabilities
end
end
function getAutoFires(items)
function getAutoFires(items)
local probabilities = {}
local probabilities = {}
for _, item in pairs(items) do
for _, item in pairs(items) do
if item.itemType == InventoryItemType.Turret
if item.itemType == InventoryItemType.Turret
or item.itemType == InventoryItemType.TurretTemplate then
or item.itemType == InventoryItemType.TurretTemplate then
local p = probabilities[item.automatic] or 0
local p = probabilities[item.automatic] or 0
p = p + 1
p = p + 1
probabilities[item.automatic] = p
probabilities[item.automatic] = p
end
end
end
end
return probabilities
return probabilities
end
end
function getSystemProbabilities(items)
function getSystemProbabilities(items)
local probabilities = {}
local probabilities = {}
for _, item in pairs(items) do
for _, item in pairs(items) do
if item.itemType == InventoryItemType.SystemUpgrade then
if item.itemType == InventoryItemType.SystemUpgrade then
local p = probabilities[item.script] or 0
local p = probabilities[item.script] or 0
p = p + 1
p = p + 1
probabilities[item.script] = p
probabilities[item.script] = p
end
end
end
end
return probabilities
return probabilities
end
end
function onClickResearch()
function onClickResearch()
local items = {}
local items = {}
local itemIndices = {}
local itemIndices = {}
for _, item in pairs(required:getItems()) do
for _, item in pairs(required:getItems()) do
table.insert(items, item.item)
table.insert(items, item.item)
Copiar
Copiado
Copiar
Copiado
local amount = itemIndices[item.
index
] or 0
local amount = itemIndices[item.
uvalue
] or 0
amount = amount
+ 1
amount = amount
itemIndices[item.
index
] = amount
itemIndices[item.
uvalue
] = amount
end
end
for _, item in pairs(optional:getItems()) do
for _, item in pairs(optional:getItems()) do
table.insert(items, item.item)
table.insert(items, item.item)
Copiar
Copiado
Copiar
Copiado
local amount = itemIndices[item.
index
] or 0
local amount = itemIndices[item.
uvalue
] or 0
amount = amount
+ 1
amount = amount
itemIndices[item.
index
] = amount
itemIndices[item.
uvalue
] = amount
end
end
if not checkRarities(items) then
if not checkRarities(items) then
displayChatMessage("Your items cannot be more than one rarity apart!"%_t, Entity().title, 1)
displayChatMessage("Your items cannot be more than one rarity apart!"%_t, Entity().title, 1)
return
return
end
end
invokeServerFunction("research", itemIndices)
invokeServerFunction("research", itemIndices)
end
end
function research(itemIndices)
function research(itemIndices)
local buyer, ship, player = getInteractingFaction(callingPlayer, AlliancePrivilege.SpendResources)
local buyer, ship, player = getInteractingFaction(callingPlayer, AlliancePrivilege.SpendResources)
if not buyer then return end
if not buyer then return end
-- check if the player has enough of the items
-- check if the player has enough of the items
local items = {}
local items = {}
for index, amount in pairs(itemIndices) do
for index, amount in pairs(itemIndices) do
local item = buyer:getInventory():find(index)
local item = buyer:getInventory():find(index)
local has = buyer:getInventory():amount(index)
local has = buyer:getInventory():amount(index)
if not item or has < amount then
if not item or has < amount then
player:sendChatMessage(Entity().title, 1, "You dont have enough items!"%_t)
player:sendChatMessage(Entity().title, 1, "You dont have enough items!"%_t)
return
return
end
end
for i = 1, amount do
for i = 1, amount do
table.insert(items, item)
table.insert(items, item)
end
end
end
end
if #items < 3 then
if #items < 3 then
player:sendChatMessage(Entity().title, 1, "You need at least 3 items to do research!"%_t)
player:sendChatMessage(Entity().title, 1, "You need at least 3 items to do research!"%_t)
return
return
end
end
if not checkRarities(items) then
if not checkRarities(items) then
player:sendChatMessage(Entity().title, 1, "Your items cannot be more than one rarity apart!"%_t)
player:sendChatMessage(Entity().title, 1, "Your items cannot be more than one rarity apart!"%_t)
return
return
end
end
local station = Entity()
local station = Entity()
local errors = {}
local errors = {}
errors[EntityType.Station] = "You must be docked to the station to research items."%_T
errors[EntityType.Station] = "You must be docked to the station to research items."%_T
errors[EntityType.Ship] = "You must be closer to the ship to research items."%_T
errors[EntityType.Ship] = "You must be closer to the ship to research items."%_T
if not CheckPlayerDocked(player, station, errors) then
if not CheckPlayerDocked(player, station, errors) then
return
return
end
end
local result = transform(items)
local result = transform(items)
if result then
if result then
for index, amount in pairs(itemIndices) do
for index, amount in pairs(itemIndices) do
for i = 1, amount do
for i = 1, amount do
buyer:getInventory():take(index)
buyer:getInventory():take(index)
end
end
end
end
buyer:getInventory():add(result)
buyer:getInventory():add(result)
invokeClientFunction(player, "receiveResult", result)
invokeClientFunction(player, "receiveResult", result)
else
else
print ("no result")
print ("no result")
end
end
end
end
function receiveResult(result)
function receiveResult(result)
Copiar
Copiado
Copiar
Copiado
receivedResult()
results:clear();
results:clear();
local item = InventorySelectionItem()
local item = InventorySelectionItem()
item.item = result
item.item = result
results:add(item)
results:add(item)
Copiar
Copiado
Copiar
Copiado
onShowWindow()
if not cbAutoResearch.checked then
onShowWindow()
end
end
end
function transform(items)
function transform(items)
local transformToKey
local transformToKey
if items[1].itemType == InventoryItemType.SystemUpgrade
if items[1].itemType == InventoryItemType.SystemUpgrade
and items[2].itemType == InventoryItemType.SystemUpgrade
and items[2].itemType == InventoryItemType.SystemUpgrade
and items[3].itemType == InventoryItemType.SystemUpgrade
and items[3].itemType == InventoryItemType.SystemUpgrade
and items[1].rarity.value == RarityType.Legendary
and items[1].rarity.value == RarityType.Legendary
and items[2].rarity.value == RarityType.Legendary
and items[2].rarity.value == RarityType.Legendary
and items[3].rarity.value == RarityType.Legendary then
and items[3].rarity.value == RarityType.Legendary then
local inputKeys = 0
local inputKeys = 0
for _, item in pairs(items) do
for _, item in pairs(items) do
if string.match(item.script, "systems/teleporterkey") then
if string.match(item.script, "systems/teleporterkey") then
inputKeys = inputKeys + 1
inputKeys = inputKeys + 1
end
end
end
end
if inputKeys <= 1 then
if inputKeys <= 1 then
transformToKey = true
transformToKey = true
end
end
end
end
local result
local result
if transformToKey then
if transformToKey then
result = SystemUpgradeTemplate("data/scripts/systems/teleporterkey2.lua", Rarity(RarityType.Legendary), random():createSeed())
result = SystemUpgradeTemplate("data/scripts/systems/teleporterkey2.lua", Rarity(RarityType.Legendary), random():createSeed())
else
else
local rarities = getRarityProbabilities(items)
local rarities = getRarityProbabilities(items)
local types = getTypeProbabilities(items, "type")
local types = getTypeProbabilities(items, "type")
local itemType = selectByWeight(random(), types)
local itemType = selectByWeight(random(), types)
local rarity = Rarity(selectByWeight(random(), rarities))
local rarity = Rarity(selectByWeight(random(), rarities))
if itemType == InventoryItemType.Turret
if itemType == InventoryItemType.Turret
or itemType == InventoryItemType.TurretTemplate then
or itemType == InventoryItemType.TurretTemplate then
local weaponTypes = getWeaponProbabilities(items)
local weaponTypes = getWeaponProbabilities(items)
local materials = getWeaponMaterials(items)
local materials = getWeaponMaterials(items)
local autoFires = getAutoFires(items)
local autoFires = getAutoFires(items)
local weaponType = selectByWeight(random(), weaponTypes)
local weaponType = selectByWeight(random(), weaponTypes)
local material = Material(selectByWeight(random(), materials))
local material = Material(selectByWeight(random(), materials))
local autoFire = selectByWeight(random(), autoFires)
local autoFire = selectByWeight(random(), autoFires)
local x, y = Sector():getCoordinates()
local x, y = Sector():getCoordinates()
result = TurretGenerator.generate(x, y, -5, rarity, weaponType, material)
result = TurretGenerator.generate(x, y, -5, rarity, weaponType, material)
if itemType == InventoryItemType.Turret then
if itemType == InventoryItemType.Turret then
result = InventoryTurret(result)
result = InventoryTurret(result)
end
end
result.automatic = autoFire or false
result.automatic = autoFire or false
elseif itemType == InventoryItemType.SystemUpgrade then
elseif itemType == InventoryItemType.SystemUpgrade then
local scripts = getSystemProbabilities(items)
local scripts = getSystemProbabilities(items)
local script = selectByWeight(random(), scripts)
local script = selectByWeight(random(), scripts)
result = SystemUpgradeTemplate(script, rarity, random():createSeed())
result = SystemUpgradeTemplate(script, rarity, random():createSeed())
end
end
end
end
return result
return result
end
end
Diferenças salvas
Texto original
Abrir arquivo
package.path = package.path .. ";data/scripts/entity/merchants/?.lua;" package.path = package.path .. ";data/scripts/lib/?.lua;" require ("galaxy") require ("utility") require ("faction") require ("player") require ("randomext") require ("stringutility") local SellableInventoryItem = require ("sellableinventoryitem") local TurretGenerator = require ("turretgenerator") local Dialog = require("dialogutility") local button function initialize() if onClient() and EntityIcon().icon == "" then EntityIcon().icon = "data/textures/icons/pixel/research.png" InteractionText().text = Dialog.generateStationInteractionText(Entity(), random()) end end function interactionPossible(playerIndex, option) return CheckFactionInteraction(playerIndex, -25000) end function initUI() local res = getResolution() local size = vec2(800, 600) local menu = ScriptUI() local window = menu:createWindow(Rect(res * 0.5 - size * 0.5, res * 0.5 + size * 0.5)) window.caption = "Research /* station title */"%_t window.showCloseButton = 1 window.moveable = 1 menu:registerWindow(window, "Research"%_t); local hsplit = UIHorizontalSplitter(Rect(window.size), 10, 10, 0.4) inventory = window:createInventorySelection(hsplit.bottom, 11) local vsplit = UIVerticalSplitter(hsplit.top, 10, 10, 0.4) local hsplitleft = UIHorizontalSplitter(vsplit.left, 10, 10, 0.5) hsplitleft.padding = 6 local rect = hsplitleft.top rect.width = 220 required = window:createSelection(rect, 3) local rect = hsplitleft.bottom rect.width = 150 optional = window:createSelection(rect, 2) for _, sel in pairs({required, optional}) do sel.dropIntoEnabled = 1 sel.entriesSelectable = 0 sel.onReceivedFunction = "onRequiredReceived" sel.onDroppedFunction = "onRequiredDropped" sel.onClickedFunction = "onRequiredClicked" end inventory.dragFromEnabled = 1 inventory.onClickedFunction = "onInventoryClicked" vsplit.padding = 30 local rect = vsplit.right rect.width = 70 rect.height = 70 results = window:createSelection(rect, 1) results.entriesSelectable = 0 results.dropIntoEnabled = 0 results.dragFromEnabled = 0 vsplit.padding = 10 local organizer = UIOrganizer(vsplit.right) organizer.marginBottom = 5 button = window:createButton(Rect(), "Research"%_t, "onClickResearch") button.width = 200 button.height = 40 organizer:placeElementBottom(button) end function removeItemFromMainSelection(key) local item = inventory:getItem(key) if not item then return end if item.amount then item.amount = item.amount - 1 if item.amount == 0 then item.amount = nil end end inventory:remove(key) if item.amount then inventory:add(item, key) end end function addItemToMainSelection(item) if not item then return end if item.item.stackable then -- find the item and increase the amount for k, v in pairs(inventory:getItems()) do if v.item == item.item then v.amount = v.amount + 1 inventory:remove(k) inventory:add(v, k) return end end item.amount = 1 end -- when not found or not stackable, add it inventory:add(item) end function moveItem(item, from, to, fkey, tkey) if not item then return end if from.index == inventory.index then -- move from inventory to a selection -- first, move the item that might be in place back to the inventory if tkey then addItemToMainSelection(to:getItem(tkey)) to:remove(tkey) end removeItemFromMainSelection(fkey) -- fix item amount, we don't want numbers in the upper selections item.amount = nil to:add(item, tkey) elseif to.index == inventory.index then -- move from selection to inventory addItemToMainSelection(item) from:remove(fkey) end end function onRequiredReceived(selectionIndex, fkx, fky, item, fromIndex, toIndex, tkx, tky) if not item then return end -- don't allow dragging from/into the left hand selections if fromIndex == optional.index or fromIndex == required.index then return end moveItem(item, inventory, Selection(selectionIndex), ivec2(fkx, fky), ivec2(tkx, tky)) refreshButton() results:clear() results:addEmpty() end function onRequiredClicked(selectionIndex, fkx, fky, item, button) if button == 3 or button == 2 then moveItem(item, Selection(selectionIndex), inventory, ivec2(fkx, fky), nil) refreshButton() end end function onRequiredDropped(selectionIndex, kx, ky) local selection = Selection(selectionIndex) local key = ivec2(kx, ky) moveItem(selection:getItem(key), Selection(selectionIndex), inventory, key, nil) refreshButton() end function onInventoryClicked(selectionIndex, kx, ky, item, button) if button == 2 or button == 3 then -- fill required first, then, once it's full, fill optional local items = required:getItems() if tablelength(items) < 3 then moveItem(item, inventory, required, ivec2(kx, ky), nil) refreshButton() results:clear() results:addEmpty() return end local items = optional:getItems() if tablelength(items) < 2 then moveItem(item, inventory, optional, ivec2(kx, ky), nil) refreshButton() results:clear() results:addEmpty() return end end end function refreshButton() local items = required:getItems() button.active = (tablelength(items) == 3) if tablelength(items) ~= 3 then button.tooltip = "Place at least 3 items for research!"%_t else button.tooltip = "Transform into a new item"%_t end for _, items in pairs({items, optional:getItems()}) do for _, item in pairs(items) do if item.item.itemType ~= InventoryItemType.TurretTemplate and item.item.itemType ~= InventoryItemType.SystemUpgrade and item.item.itemType ~= InventoryItemType.Turret then button.active = false button.tooltip = "Invalid items in ingredients."%_t end end end end function onShowWindow() inventory:clear() required:clear() optional:clear() required:addEmpty() required:addEmpty() required:addEmpty() optional:addEmpty() optional:addEmpty() results:addEmpty() refreshButton() for i = 1, 50 do inventory:addEmpty() end local player = Player() local ship = player.craft local alliance = player.alliance if alliance and ship.factionIndex == player.allianceIndex then inventory:fill(alliance.index) else inventory:fill(player.index) end end function checkRarities(items) -- items must not be more than 1 rarity apart local min = math.huge local max = -math.huge for _, item in pairs(items) do if item.rarity.value < min then min = item.rarity.value end if item.rarity.value > max then max = item.rarity.value end end if max - min <= 1 then return true end return false end function getRarityProbabilities(items) local probabilities = {} -- for each item there is a 20% chance that the researched item has a rarity 1 better for _, item in pairs(items) do -- next rarity cannot exceed legendary local nextRarity = math.min(RarityType.Legendary, item.rarity.value + 1) local p = probabilities[nextRarity] or 0 p = p + 0.2 probabilities[nextRarity] = p end -- if the amount of items is < 5 then add their own rarities as a result as well if #items < 5 then local left = (1.0 - #items * 0.2) local perItem = left / #items for _, item in pairs(items) do local p = probabilities[item.rarity.value] or 0 p = p + perItem probabilities[item.rarity.value] = p end end local sum = 0 for _, p in pairs(probabilities) do sum = sum + p end return probabilities end function getTypeProbabilities(items) local probabilities = {} for _, item in pairs(items) do local p = probabilities[item.itemType] or 0 p = p + 1 probabilities[item.itemType] = p end return probabilities end -- since there are no more exact weapon types in the finished weapons, -- we have to gather the weapon types by their stats, such as icons function getWeaponTypesByIcon() if weaponTypes then return weaponTypes end weaponTypes = {} local weapons = Balancing_GetWeaponProbability(0, 0) for weaponType, _ in pairs(weapons) do local turret = GenerateTurretTemplate(Seed(1), weaponType, 15, 5, Rarity(RarityType.Common), Material(MaterialType.Iron)) weaponTypes[turret.weaponIcon] = weaponType end return weaponTypes end function getWeaponProbabilities(items) local probabilities = {} local typesByIcons = getWeaponTypesByIcon() for _, item in pairs(items) do if item.itemType == InventoryItemType.Turret or item.itemType == InventoryItemType.TurretTemplate then local weaponType = typesByIcons[item.weaponIcon] local p = probabilities[weaponType] or 0 p = p + 1 probabilities[weaponType] = p end end return probabilities end function getWeaponMaterials(items) local probabilities = {} for _, item in pairs(items) do if item.itemType == InventoryItemType.Turret or item.itemType == InventoryItemType.TurretTemplate then local p = probabilities[item.material.value] or 0 p = p + 1 probabilities[item.material.value] = p end end return probabilities end function getAutoFires(items) local probabilities = {} for _, item in pairs(items) do if item.itemType == InventoryItemType.Turret or item.itemType == InventoryItemType.TurretTemplate then local p = probabilities[item.automatic] or 0 p = p + 1 probabilities[item.automatic] = p end end return probabilities end function getSystemProbabilities(items) local probabilities = {} for _, item in pairs(items) do if item.itemType == InventoryItemType.SystemUpgrade then local p = probabilities[item.script] or 0 p = p + 1 probabilities[item.script] = p end end return probabilities end function onClickResearch() local items = {} local itemIndices = {} for _, item in pairs(required:getItems()) do table.insert(items, item.item) local amount = itemIndices[item.index] or 0 amount = amount + 1 itemIndices[item.index] = amount end for _, item in pairs(optional:getItems()) do table.insert(items, item.item) local amount = itemIndices[item.index] or 0 amount = amount + 1 itemIndices[item.index] = amount end if not checkRarities(items) then displayChatMessage("Your items cannot be more than one rarity apart!"%_t, Entity().title, 1) return end invokeServerFunction("research", itemIndices) end function research(itemIndices) local buyer, ship, player = getInteractingFaction(callingPlayer, AlliancePrivilege.SpendResources) if not buyer then return end -- check if the player has enough of the items local items = {} for index, amount in pairs(itemIndices) do local item = buyer:getInventory():find(index) local has = buyer:getInventory():amount(index) if not item or has < amount then player:sendChatMessage(Entity().title, 1, "You dont have enough items!"%_t) return end for i = 1, amount do table.insert(items, item) end end if #items < 3 then player:sendChatMessage(Entity().title, 1, "You need at least 3 items to do research!"%_t) return end if not checkRarities(items) then player:sendChatMessage(Entity().title, 1, "Your items cannot be more than one rarity apart!"%_t) return end local station = Entity() local errors = {} errors[EntityType.Station] = "You must be docked to the station to research items."%_T errors[EntityType.Ship] = "You must be closer to the ship to research items."%_T if not CheckPlayerDocked(player, station, errors) then return end local result = transform(items) if result then for index, amount in pairs(itemIndices) do for i = 1, amount do buyer:getInventory():take(index) end end buyer:getInventory():add(result) invokeClientFunction(player, "receiveResult", result) else print ("no result") end end function receiveResult(result) results:clear(); local item = InventorySelectionItem() item.item = result results:add(item) onShowWindow() end function transform(items) local transformToKey if items[1].itemType == InventoryItemType.SystemUpgrade and items[2].itemType == InventoryItemType.SystemUpgrade and items[3].itemType == InventoryItemType.SystemUpgrade and items[1].rarity.value == RarityType.Legendary and items[2].rarity.value == RarityType.Legendary and items[3].rarity.value == RarityType.Legendary then local inputKeys = 0 for _, item in pairs(items) do if string.match(item.script, "systems/teleporterkey") then inputKeys = inputKeys + 1 end end if inputKeys <= 1 then transformToKey = true end end local result if transformToKey then result = SystemUpgradeTemplate("data/scripts/systems/teleporterkey2.lua", Rarity(RarityType.Legendary), random():createSeed()) else local rarities = getRarityProbabilities(items) local types = getTypeProbabilities(items, "type") local itemType = selectByWeight(random(), types) local rarity = Rarity(selectByWeight(random(), rarities)) if itemType == InventoryItemType.Turret or itemType == InventoryItemType.TurretTemplate then local weaponTypes = getWeaponProbabilities(items) local materials = getWeaponMaterials(items) local autoFires = getAutoFires(items) local weaponType = selectByWeight(random(), weaponTypes) local material = Material(selectByWeight(random(), materials)) local autoFire = selectByWeight(random(), autoFires) local x, y = Sector():getCoordinates() result = TurretGenerator.generate(x, y, -5, rarity, weaponType, material) if itemType == InventoryItemType.Turret then result = InventoryTurret(result) end result.automatic = autoFire or false elseif itemType == InventoryItemType.SystemUpgrade then local scripts = getSystemProbabilities(items) local script = selectByWeight(random(), scripts) result = SystemUpgradeTemplate(script, rarity, random():createSeed()) end end return result end
Texto alterado
Abrir arquivo
package.path = package.path .. ";data/scripts/entity/merchants/?.lua;" package.path = package.path .. ";data/scripts/lib/?.lua;" require ("galaxy") require ("utility") require ("faction") require ("player") require ("randomext") require ("stringutility") require ("autoresearch") local SellableInventoryItem = require ("sellableinventoryitem") local TurretGenerator = require ("turretgenerator") local Dialog = require("dialogutility") local button function initialize() if onClient() and EntityIcon().icon == "" then EntityIcon().icon = "data/textures/icons/pixel/research.png" InteractionText().text = Dialog.generateStationInteractionText(Entity(), random()) end end function interactionPossible(playerIndex, option) return CheckFactionInteraction(playerIndex, -25000) end function initUI() local res = getResolution() local size = vec2(800, 600) local menu = ScriptUI() local window = menu:createWindow(Rect(res * 0.5 - size * 0.5, res * 0.5 + size * 0.5)) window.caption = "Research /* station title */"%_t window.showCloseButton = 1 window.moveable = 1 menu:registerWindow(window, "Research"%_t); local hsplit = UIHorizontalSplitter(Rect(window.size), 10, 10, 0.4) inventory = window:createInventorySelection(hsplit.bottom, 11) local vsplit = UIVerticalSplitter(hsplit.top, 10, 10, 0.4) local hsplitleft = UIHorizontalSplitter(vsplit.left, 10, 10, 0.5) hsplitleft.padding = 6 local rect = hsplitleft.top rect.width = 220 required = window:createSelection(rect, 3) local rect = hsplitleft.bottom rect.width = 150 optional = window:createSelection(rect, 2) for _, sel in pairs({required, optional}) do sel.dropIntoEnabled = 1 sel.entriesSelectable = 0 sel.onReceivedFunction = "onRequiredReceived" sel.onDroppedFunction = "onRequiredDropped" sel.onClickedFunction = "onRequiredClicked" end inventory.dragFromEnabled = 1 inventory.onClickedFunction = "onInventoryClicked" vsplit.padding = 30 local rect = vsplit.right rect.width = 70 rect.height = 70 results = window:createSelection(rect, 1) results.entriesSelectable = 0 results.dropIntoEnabled = 0 results.dragFromEnabled = 0 vsplit.padding = 10 local organizer = UIOrganizer(vsplit.right) organizer.marginBottom = 5 button = window:createButton(Rect(), "Research"%_t, "onClickResearch") button.width = 200 button.height = 40 organizer:placeElementBottom(button) editUI(hsplit, button, window) end function removeItemFromMainSelection(key) local item = inventory:getItem(key) if not item then return end if item.amount then item.amount = item.amount - 1 if item.amount == 0 then item.amount = nil end end inventory:remove(key) if item.amount then inventory:add(item, key) end end function addItemToMainSelection(item) if not item then return end if item.item.stackable then -- find the item and increase the amount for k, v in pairs(inventory:getItems()) do if v.item == item.item then v.amount = v.amount + 1 inventory:remove(k) inventory:add(v, k) return end end item.amount = 1 end -- when not found or not stackable, add it inventory:add(item) end function moveItem(item, from, to, fkey, tkey) if not item then return end if from.index == inventory.index then -- move from inventory to a selection -- first, move the item that might be in place back to the inventory if tkey then addItemToMainSelection(to:getItem(tkey)) to:remove(tkey) end removeItemFromMainSelection(fkey) -- fix item amount, we don't want numbers in the upper selections item.amount = nil to:add(item, tkey) elseif to.index == inventory.index then -- move from selection to inventory addItemToMainSelection(item) from:remove(fkey) end end function onRequiredReceived(selectionIndex, fkx, fky, item, fromIndex, toIndex, tkx, tky) if not item then return end -- don't allow dragging from/into the left hand selections if fromIndex == optional.index or fromIndex == required.index then return end moveItem(item, inventory, Selection(selectionIndex), ivec2(fkx, fky), ivec2(tkx, tky)) refreshButton() results:clear() results:addEmpty() end function onRequiredClicked(selectionIndex, fkx, fky, item, button) if button == 3 or button == 2 then moveItem(item, Selection(selectionIndex), inventory, ivec2(fkx, fky), nil) refreshButton() end end function onRequiredDropped(selectionIndex, kx, ky) local selection = Selection(selectionIndex) local key = ivec2(kx, ky) moveItem(selection:getItem(key), Selection(selectionIndex), inventory, key, nil) refreshButton() end function onInventoryClicked(selectionIndex, kx, ky, item, button) if button == 2 or button == 3 then -- fill required first, then, once it's full, fill optional local items = required:getItems() if tablelength(items) < 3 then moveItem(item, inventory, required, ivec2(kx, ky), nil) refreshButton() results:clear() results:addEmpty() return end local items = optional:getItems() if tablelength(items) < 2 then moveItem(item, inventory, optional, ivec2(kx, ky), nil) refreshButton() results:clear() results:addEmpty() return end end end function refreshButton() local items = required:getItems() button.active = (tablelength(items) == 3) if tablelength(items) ~= 3 then button.tooltip = "Place at least 3 items for research!"%_t else button.tooltip = "Transform into a new item"%_t end for _, items in pairs({items, optional:getItems()}) do for _, item in pairs(items) do if item.item.itemType ~= InventoryItemType.TurretTemplate and item.item.itemType ~= InventoryItemType.SystemUpgrade and item.item.itemType ~= InventoryItemType.Turret then button.active = false button.tooltip = "Invalid items in ingredients."%_t end end end end function onShowWindow() inventory:clear() required:clear() optional:clear() required:addEmpty() required:addEmpty() required:addEmpty() optional:addEmpty() optional:addEmpty() results:addEmpty() refreshButton() for i = 1, 50 do inventory:addEmpty() end local items = {} local player = Player() local ship = player.craft local alliance = player.alliance if alliance and ship.factionIndex == player.allianceIndex then inventory:fill(alliance.index) else inventory:fill(player.index) end for index, slot in pairs(Player():getInventory():getItems()) do local item = SellableInventoryItem(slot.item, index, player) table.insert(items, item) end table.sort(items, SortSellableInventoryItems) for i, p in pairs(items) do local item = InventorySelectionItem() item.item = p.item item.uvalue = p.index -- use the uvalue uservalue to store the index of the item in the inventory -- show numbers for stackable items if p.item.stackable then item.amount = p.amount else item.amount = nil end inventory:add(item) end if cbAutoResearch.checked then button.active = true end end function checkRarities(items) -- items must not be more than 1 rarity apart local min = math.huge local max = -math.huge for _, item in pairs(items) do if item.rarity.value < min then min = item.rarity.value end if item.rarity.value > max then max = item.rarity.value end end if max - min <= 1 then return true end return false end function getRarityProbabilities(items) local probabilities = {} -- for each item there is a 20% chance that the researched item has a rarity 1 better for _, item in pairs(items) do -- next rarity cannot exceed legendary local nextRarity = math.min(RarityType.Legendary, item.rarity.value + 1) local p = probabilities[nextRarity] or 0 p = p + 0.2 probabilities[nextRarity] = p end -- if the amount of items is < 5 then add their own rarities as a result as well if #items < 5 then local left = (1.0 - #items * 0.2) local perItem = left / #items for _, item in pairs(items) do local p = probabilities[item.rarity.value] or 0 p = p + perItem probabilities[item.rarity.value] = p end end local sum = 0 for _, p in pairs(probabilities) do sum = sum + p end return probabilities end function getTypeProbabilities(items) local probabilities = {} for _, item in pairs(items) do local p = probabilities[item.itemType] or 0 p = p + 1 probabilities[item.itemType] = p end return probabilities end -- since there are no more exact weapon types in the finished weapons, -- we have to gather the weapon types by their stats, such as icons function getWeaponTypesByIcon() if weaponTypes then return weaponTypes end weaponTypes = {} local weapons = Balancing_GetWeaponProbability(0, 0) for weaponType, _ in pairs(weapons) do local turret = GenerateTurretTemplate(Seed(1), weaponType, 15, 5, Rarity(RarityType.Common), Material(MaterialType.Iron)) weaponTypes[turret.weaponIcon] = weaponType end return weaponTypes end function getWeaponProbabilities(items) local probabilities = {} local typesByIcons = getWeaponTypesByIcon() for _, item in pairs(items) do if item.itemType == InventoryItemType.Turret or item.itemType == InventoryItemType.TurretTemplate then local weaponType = typesByIcons[item.weaponIcon] local p = probabilities[weaponType] or 0 p = p + 1 probabilities[weaponType] = p end end return probabilities end function getWeaponMaterials(items) local probabilities = {} for _, item in pairs(items) do if item.itemType == InventoryItemType.Turret or item.itemType == InventoryItemType.TurretTemplate then local p = probabilities[item.material.value] or 0 p = p + 1 probabilities[item.material.value] = p end end return probabilities end function getAutoFires(items) local probabilities = {} for _, item in pairs(items) do if item.itemType == InventoryItemType.Turret or item.itemType == InventoryItemType.TurretTemplate then local p = probabilities[item.automatic] or 0 p = p + 1 probabilities[item.automatic] = p end end return probabilities end function getSystemProbabilities(items) local probabilities = {} for _, item in pairs(items) do if item.itemType == InventoryItemType.SystemUpgrade then local p = probabilities[item.script] or 0 p = p + 1 probabilities[item.script] = p end end return probabilities end function onClickResearch() local items = {} local itemIndices = {} for _, item in pairs(required:getItems()) do table.insert(items, item.item) local amount = itemIndices[item.uvalue] or 0 amount = amount itemIndices[item.uvalue] = amount end for _, item in pairs(optional:getItems()) do table.insert(items, item.item) local amount = itemIndices[item.uvalue] or 0 amount = amount itemIndices[item.uvalue] = amount end if not checkRarities(items) then displayChatMessage("Your items cannot be more than one rarity apart!"%_t, Entity().title, 1) return end invokeServerFunction("research", itemIndices) end function research(itemIndices) local buyer, ship, player = getInteractingFaction(callingPlayer, AlliancePrivilege.SpendResources) if not buyer then return end -- check if the player has enough of the items local items = {} for index, amount in pairs(itemIndices) do local item = buyer:getInventory():find(index) local has = buyer:getInventory():amount(index) if not item or has < amount then player:sendChatMessage(Entity().title, 1, "You dont have enough items!"%_t) return end for i = 1, amount do table.insert(items, item) end end if #items < 3 then player:sendChatMessage(Entity().title, 1, "You need at least 3 items to do research!"%_t) return end if not checkRarities(items) then player:sendChatMessage(Entity().title, 1, "Your items cannot be more than one rarity apart!"%_t) return end local station = Entity() local errors = {} errors[EntityType.Station] = "You must be docked to the station to research items."%_T errors[EntityType.Ship] = "You must be closer to the ship to research items."%_T if not CheckPlayerDocked(player, station, errors) then return end local result = transform(items) if result then for index, amount in pairs(itemIndices) do for i = 1, amount do buyer:getInventory():take(index) end end buyer:getInventory():add(result) invokeClientFunction(player, "receiveResult", result) else print ("no result") end end function receiveResult(result) receivedResult() results:clear(); local item = InventorySelectionItem() item.item = result results:add(item) if not cbAutoResearch.checked then onShowWindow() end end function transform(items) local transformToKey if items[1].itemType == InventoryItemType.SystemUpgrade and items[2].itemType == InventoryItemType.SystemUpgrade and items[3].itemType == InventoryItemType.SystemUpgrade and items[1].rarity.value == RarityType.Legendary and items[2].rarity.value == RarityType.Legendary and items[3].rarity.value == RarityType.Legendary then local inputKeys = 0 for _, item in pairs(items) do if string.match(item.script, "systems/teleporterkey") then inputKeys = inputKeys + 1 end end if inputKeys <= 1 then transformToKey = true end end local result if transformToKey then result = SystemUpgradeTemplate("data/scripts/systems/teleporterkey2.lua", Rarity(RarityType.Legendary), random():createSeed()) else local rarities = getRarityProbabilities(items) local types = getTypeProbabilities(items, "type") local itemType = selectByWeight(random(), types) local rarity = Rarity(selectByWeight(random(), rarities)) if itemType == InventoryItemType.Turret or itemType == InventoryItemType.TurretTemplate then local weaponTypes = getWeaponProbabilities(items) local materials = getWeaponMaterials(items) local autoFires = getAutoFires(items) local weaponType = selectByWeight(random(), weaponTypes) local material = Material(selectByWeight(random(), materials)) local autoFire = selectByWeight(random(), autoFires) local x, y = Sector():getCoordinates() result = TurretGenerator.generate(x, y, -5, rarity, weaponType, material) if itemType == InventoryItemType.Turret then result = InventoryTurret(result) end result.automatic = autoFire or false elseif itemType == InventoryItemType.SystemUpgrade then local scripts = getSystemProbabilities(items) local script = selectByWeight(random(), scripts) result = SystemUpgradeTemplate(script, rarity, random():createSeed()) end end return result end
Encontrar Diferença