diff --git a/.gitignore b/.gitignore index 32402ad88..95e3ecc3c 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,8 @@ # VSCode /.vscode +/saves +/logs +/config +/options.txt +/usernamecache.json diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 2b1031c2d..0e6989e00 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -976,6 +976,7 @@ opencomputers { # mod's context in an appropriate manner, e.g. using a system firewall. blacklist: [ "127.0.0.0/8" + "0.0.0.0/8" "10.0.0.0/8" "192.168.0.0/16" "172.16.0.0/12" diff --git a/src/main/resources/assets/opencomputers/doc/en_US/block/transposer.md b/src/main/resources/assets/opencomputers/doc/en_US/block/transposer.md index ccc3e07ff..f666883bb 100644 --- a/src/main/resources/assets/opencomputers/doc/en_US/block/transposer.md +++ b/src/main/resources/assets/opencomputers/doc/en_US/block/transposer.md @@ -6,4 +6,4 @@ The transposer bridges the gap between redstone controlled hoppers and [robots]( *Note that this block has no internal inventory.* -Besides moving things around, it can also be used to inspect the contents of the adjacent inventories, like an [adapter](adapter.md) with an [inventory controller upgrade](../item/inventoryControllerUpgrade.md) could, and the contents of adjacent tanks, like and adapter with a [tank controller upgrade](../item/tankControllerUpgrade.md) could. +Besides moving things around, it can also be used to inspect the contents of the adjacent inventories, like an [adapter](adapter.md) with an [inventory controller upgrade](../item/inventoryControllerUpgrade.md) could, and the contents of adjacent tanks, like an adapter with a [tank controller upgrade](../item/tankControllerUpgrade.md) could. diff --git a/src/main/resources/assets/opencomputers/lang/pt_BR.lang b/src/main/resources/assets/opencomputers/lang/pt_BR.lang index 31a23fa6e..d4cd3204f 100644 --- a/src/main/resources/assets/opencomputers/lang/pt_BR.lang +++ b/src/main/resources/assets/opencomputers/lang/pt_BR.lang @@ -1,5 +1,6 @@ -# This is the Brazilian portuguese translation based on master english file. -#Author: Hilton W. Silva (hws689) +# This is the Brazilian portuguese translation based on the en_US.lang file. +# Author: Hilton W. Silva (hws689) +# Updated by guilherme-puida in 03/01/2021 # Blocks tile.oc.accessPoint.name=§cPonto de Acesso§7 @@ -7,6 +8,7 @@ tile.oc.adapter.name=Adaptador tile.oc.assembler.name=Montador Eletrônico tile.oc.cable.name=Cabo tile.oc.capacitor.name=Capacitador +tile.oc.carpetedCapacitor.name=Capacitador com Tapete tile.oc.case1.name=Gabinete (Nível 1) tile.oc.case2.name=Gabinete (Nível 2) tile.oc.case3.name=Gabinete (Nível 3) @@ -56,6 +58,7 @@ item.oc.CircuitBoard.name=Placa de Circuito item.oc.ComponentBus0.name=Componente de Barramento (Nível 1) item.oc.ComponentBus1.name=Componente de Barramento (Nível 2) item.oc.ComponentBus2.name=Componente de Barramento (Nível 3) +item.oc.ComponentBus3.name=Componente de Barramento (Criativo) item.oc.ControlUnit.name=Unidade de Controle (UC) item.oc.CPU0.name=Unidade Central de Processamento (CPU) (Nível 1) item.oc.CPU1.name=Unidade Central de Processamento (CPU) (Nível 2) @@ -101,10 +104,10 @@ item.oc.Microchip2.name=Circuito Integrado (Nível 3) item.oc.MicrocontrollerCase0.name=Carcaça do Microcontrolador (Nível 1) item.oc.MicrocontrollerCase1.name=Carcaça do Microcontrolador (Nível 2) item.oc.MicrocontrollerCase3.name=Carcaça do Microcontrolador (Criativo) -item.oc.Nanomachines.name=Nanomaquinas +item.oc.Nanomachines.name=Nanomáquinas item.oc.NetworkCard.name=Cartão de Rede -item.oc.NumPad.name=Teclado Númerico -item.oc.Present.name=Um pouco de tudo... +item.oc.NumPad.name=Teclado Numérico +item.oc.Present.name=Uma coisinha... item.oc.PrintedCircuitBoard.name=Placa de Circuito Impresso (PCB) item.oc.RawCircuitBoard.name=Placa de Circuito Crua item.oc.RedstoneCard0.name=Cartão de Redstone (Nível 1) @@ -114,9 +117,9 @@ item.oc.Server1.name=Servidor (Nível 2) item.oc.Server2.name=Servidor (Nível 3) item.oc.Server3.name=Servidor (Criativo) item.oc.Tablet.name=Tablet -item.oc.TabletCase0.name=Carcaça do Tablet (Nível 1) -item.oc.TabletCase1.name=Carcaça do Tablet (Nível 2) -item.oc.TabletCase3.name=Carcaça do Tablet (Criativo) +item.oc.TabletCase0.name=Carcaça de Tablet (Nível 1) +item.oc.TabletCase1.name=Carcaça de Tablet (Nível 2) +item.oc.TabletCase3.name=Carcaça de Tablet (Criativo) item.oc.Terminal.name=Terminal Remoto item.oc.TerminalServer.name=Servidor de Terminal item.oc.TexturePicker.name=Selecionador de Textura @@ -143,6 +146,7 @@ item.oc.UpgradeHover1.name=Aprimoramento de Flutuação (Nível 2) item.oc.UpgradeInventory.name=Aprimoramento de Inventário item.oc.UpgradeInventoryController.name=Aprimoramento de Controlador de Inventário item.oc.UpgradeLeash.name=Aprimoramento de Correia +item.oc.UpgradeMF.name=MFU item.oc.UpgradeNavigation.name=Aprimoramento de Navegação item.oc.UpgradePiston.name=Aprimoramento de Pistão item.oc.UpgradeSign.name=Aprimoramento de Sinal de E/S @@ -178,33 +182,35 @@ oc:gui.Assembler.Collect=Saída do coletador oc:gui.Assembler.Complexity=Complexidade: %s/%s oc:gui.Assembler.InsertCase=Insira uma parte base oc:gui.Assembler.InsertCPU=Insira uma CPU -oc:gui.Assembler.InsertRAM=Insera alguma RAM +oc:gui.Assembler.InsertRAM=Insira alguma RAM oc:gui.Assembler.Progress=Progresso: %s%% (%s) -oc:gui.Assembler.Run=Montando +oc:gui.Assembler.Run=Montar oc:gui.Assembler.Warning.BIOS=BIOS oc:gui.Assembler.Warning.GraphicsCard=Placa de Vídeo oc:gui.Assembler.Warning.Inventory=Aprimoramento de Inventário oc:gui.Assembler.Warning.Keyboard=Teclado oc:gui.Assembler.Warning.OS=Mídia Inicializável oc:gui.Assembler.Warning.Screen=Monitor -oc:gui.Assembler.Warnings=§eAtenção§7: Componentes recomendados aussentes. +oc:gui.Assembler.Warnings=§eAtenção§7: Componentes recomendados ausentes. oc:gui.Chat.NewVersion=Uma nova versão está disponível: %s oc:gui.Chat.TextureName=§7Nome da textura é §a%s§f. oc:gui.Chat.WarningClassTransformer=Houve um erro §cerros§f ao rodar o 'class transformer'. Por favor relate isso, junto com o seu arquivo de log (completo!) FML §alatest.log§f/§afml-server-latest.log§f , obrigado! -oc:gui.Chat.WarningFingerprint=§cATENÇÃO§f - impressão digital não reconhecida! Experado '§a%s§f' mas recebido '§e%s§f'. Há não ser que seja um moderador e esteja rodando uma versão desofuscada, é §lextremamente§f recomendável que baixe novamente o OpenComputers, por que o JAR que está usando talvez esteja adulterado. -oc:gui.Chat.WarningLink=Não pode abrir o atalho: %s -oc:gui.Chat.WarningLuaFallback=Bibliotecas de LUA nativas não disponíveis, computadores não serão capazes de persistir seus estados. Eles reiniciarizaram com chunkloaders. -oc:gui.Chat.WarningProjectRed=Você está usando a versão Project: Red que é incompativel com OpenComputers. Tente atualizar sua versão do Project: Red. -oc:gui.Chat.WarningRecipes=Houve erros ao carregar uma ou mais receitas. Algumas não poderão ser construídas. Por favor verifique seu arquivo de log para mais informações. +oc:gui.Chat.WarningFingerprint=§cATENÇÃO§f - impressão digital não reconhecida! Experado '§a%s§f' mas recebido '§e%s§f'. A não ser que você seja um desenvolvedor e esteja rodando uma versão desofuscada, é §lextremamente§f recomendável que baixe novamente o OpenComputers, por que o JAR que está usando talvez esteja adulterado. +oc:gui.Chat.WarningLink=Não foi possível abrir o atalho: %s +oc:gui.Chat.WarningLuaFallback=Bibliotecas nativas do Lua não disponíveis, computadores não serão capazes de persistir seus estados. Eles reinicializarão quando chunks descarregarem. +oc:gui.Chat.WarningProjectRed=Você está usando uma versão do Project: Red que é incompativel com OpenComputers. Tente atualizar sua versão do Project: Red. +oc:gui.Chat.WarningRecipes=Houve erros ao carregar uma ou mais receitas. Alguns itens não poderão ser construídos. Verifique seu arquivo de log para mais informações. oc:gui.Chat.WarningSimpleComponent=Um addon (seu?) usa a interface §aSimpleComponent§f que faz §ealgo errado§f. A lógica de componente não pode ser injetada. Por favor verifique seu arquivo de log para mais informações. oc:gui.Drive.Managed=Gerenciado oc:gui.Drive.Unmanaged=Não Gerenciado +oc:gui.Drive.ReadOnlyLock=Bloqueado +oc:gui.Drive.ReadOnlyLockWarning=§Somente leitura§r. Isso não pode ser removido, exceto quando o disco é formatado. oc:gui.Drive.Warning=§lAtençaõ§r: mudança de modos resultará em perca de todos os dados do disco! oc:gui.Error.ComponentOverflow=Muitos componentes conectados ao computador. oc:gui.Error.InternalError=Erro interno, por favor veja o arquivo de log. Isto é provavelmente um erro. oc:gui.Error.NoCPU=Não há CPU instalada no computador. oc:gui.Error.NoEnergy=Energia insuficiente. -oc:gui.Error.NoRAM=Não há RAM instalda no computador. +oc:gui.Error.NoRAM=Não há RAM instalada no computador. oc:gui.Error.OutOfMemory=Sem memória. oc:gui.Manual.Blocks=Blocos do OpenComputers oc:gui.Manual.Home=Início @@ -213,10 +219,10 @@ oc:gui.Manual.Warning.BlockMissing=Bloco indisponível. oc:gui.Manual.Warning.ImageMissing=Imagem não encontrada. oc:gui.Manual.Warning.ItemMissing=Item indisponível. oc:gui.Manual.Warning.OreDictMissing=Entrada no dicionário de minérios indisponível. -oc:gui.Raid.Warning=§4Adicionando um disco limpe-o.[nl] Removendo um disco limpando o raid. +oc:gui.Raid.Warning=§4Adicionar um disco o formata.[nl] Remover um disco limpa a raid. oc:gui.Robot.Power=Energia oc:gui.Robot.TurnOff=Desligar -oc:gui.Robot.TurnOn=Ligar[nl]§7Use um analizador para verficar problemas.§r +oc:gui.Robot.TurnOn=Ligar[nl]§7Use um Analizador para verficar problemas.§r oc:gui.Rack.Back=Voltar oc:gui.Rack.Bottom=Baixo oc:gui.Rack.Left=Esquerda @@ -224,6 +230,7 @@ oc:gui.Rack.None=Nenhum oc:gui.Rack.Right=Direita oc:gui.Rack.Enabled=Habilitado oc:gui.Rack.Disabled=Disabilitado +oc:gui.Rack.RelayModeTooltip=Modo de relé oc:gui.Rack.Top=Cima oc:gui.Switch.PacketsPerCycle=Pacotes / ciclo oc:gui.Switch.QueueSize=Tamanho da fila @@ -247,7 +254,7 @@ oc:container.Switch=Switch oc:container.TabletWrapper=Tablet # Keybinds -key.clipboardPaste=Copiar para área de transferência +key.clipboardPaste=Colar da área de transferência key.materialCosts=Mostrar custo dos materiais # Item / Block Tooltips @@ -262,6 +269,7 @@ oc:tooltip.Assembler=Permite construir robôs e outros dispositivos com várias oc:tooltip.Cable=Uma maneira barata de conectar os blocos. oc:tooltip.Capacitor=Armazena energia para usar mais tarde. Pode ser enchido e esvaziado rapidamente. oc:tooltip.CardBase=Como o nome diz, este é o bloco de construção básico para os cartões de expansão. +oc:tooltip.CarpetedCapacitor=Armazena energia para uso posterior. Pode ser carregado e descarregado rapidamente. Carrega quando uma ovelha ou jaguatirica anda sobre o mesmo. oc:tooltip.Case=O gabinete é o bloco básico para computadores e guarda os §fcartões de extensão§7, §fRAM§7 e §fdiscos rígidos§7.[nl] Slots: §f%s§7 oc:tooltip.Chamelium=Matéria prima para as imressões 3D. Não ingerir: talvez leve a cegueira e um lapso temporário de presença. oc:tooltip.ChameliumBlock=Agradável e Limpo. Usado para formas coloridas nas impressões 3D, ou para simplesmente ter, um bloco colorido para decorar sua linda e chamativa base. @@ -280,21 +288,22 @@ oc:tooltip.Debugger=Pode ser usado para depurar informações na grade de rede i oc:tooltip.DiamondChip=Um pedacinho de um diamante uma vez impecável. Ele nunca será o mesmo de novo. oc:tooltip.Disassembler=Separa os itens em seus componentes originais. §lAtenção§7: o item retornado tem uma chance de %s%% de quebrar no processo! oc:tooltip.Disk=Uma mídia primitiva que pode ser usada para construir dispositvos de armazenamentos contínuos. -oc:to+oltip.DiskDrive.CC=Disquetes do ComputerCraft são §asuportados§7. +oc:tooltip.DiskDrive.CC=Disquetes do ComputerCraft são §asuportados§7. oc:tooltip.DiskDrive=Permite escrever e ler disquetes. Pode ser instalado em robôs para permitir inserir disquetes mais tarde. oc:tooltip.DiskDriveMountable=Provê a mesma funcionalidade de uma unidade de disco normal, mas só pode ser instalado em um rack. oc:tooltip.DiskUsage=Uso de disco: %s/%s Byte +oc:tooltip.DiskLocked=Bloqueado por: %s oc:tooltip.DiskModeManaged=Modo: Gerenciado oc:tooltip.DiskModeUnmanaged=Modo: Não gerenciado oc:tooltip.Drone=Drones são leves, com reconhecimento rápido de unidades com espaço interno limitado. oc:tooltip.DroneCase=Está carcaça é usada para montar drones no montador. Ele tem um espaço para uma pequena quantidade de componentes e provê levitação com a pedra do fim. -oc:tooltip.EEPROM=Pequeno, espaço programável que contem a BIOS dos computadores usado para inicia-lo. -oc:tooltip.FakeEndstone=Quase igual a coisa real, até mesmo emula sua levitação! -oc:tooltip.Geolyzer=Permite escanear ao redor de área de blocos sólidos. Essa informação pode ser útil para geração de hologramas de área ou para detectar minérios. +oc:tooltip.EEPROM=Pequeno armazenamento programável que contem a BIOS dos computadores usado para iniciá-los. +oc:tooltip.FakeEndstone=Quase igual a coisa real, emula até mesmo sua levitação! +oc:tooltip.Geolyzer=Permite escanear a dureza da área ao redor de blocos sólidos. Essa informação pode ser útil para geração de hologramas de área ou para detectar minérios. oc:tooltip.GraphicsCard=Usado para mudar o que é mostrado nos monitores.[nl] Máxima resolução: §f%sx%s§7[nl] Máxima profundidade de cores: §f%s§7[nl] Operações/tick: §f%s§7 -oc:tooltip.HoverBoots=Pule alto, caia devagar, caminhe melhor. Isso é mais, com as mais novas patentiadas Botas Voadoras (TM). +oc:tooltip.HoverBoots=Pule alto, caia devagar, caminhe melhor. Isso e mais, com as mais novas e patenteadas Botas Voadoras (TM). oc:tooltip.InkCartridge=Usado para carregar tinta nas impressoras 3D. Por razões misteriosas ele não tem que permanecer na impressora. -oc:tooltip.InkCartridgeEmpty=Este cartucho de tinta foi usado até secar. Recarregue isso usando corrantes. Ou jogando fora. Veja minha cara de preocupado -.-. +oc:tooltip.InkCartridgeEmpty=Este cartucho de tinta foi usado até secar. Recarregue isso usando corantes. Ou jogue-o fora. Veja minha cara de preocupado -.-. oc:tooltip.InternetCard=Este cartão faz requisições HTTP usa protocolos TCP reais. oc:tooltip.Interweb=Parabéns, você ganhou um (1) interweb. Você pode conectar a isso usando um Cartão de Internet. Cuidado: não alimente os trolls. oc:tooltip.IronNugget=Uma pepita feita de ferro, por isso é chamado de Pepita de Ferro, darrr... @@ -306,13 +315,13 @@ oc:tooltip.LinkedCard_Channel=§8Canal: %s§7 oc:tooltip.Manual=Toda informaçâo que você provalvemente precisará do OpenComputers. E mais. Por um preço inacreditável de... §opor favor pressiona R para continuar§7. oc:tooltip.MaterialCosts=Segure [§f%s§7] para custos do material. oc:tooltip.Materials=Materiais: -oc:tooltip.Memory=Requerido para fazer os computadores funcionarem. Quanto mais tiver, mais complexo podem ser os programas. -oc:tooltip.Microchip=Um chip reconhecido formalmente como Circuito Integrado. Eu não tenho ideia porque isso funciona com redstone, mas funciona. -oc:tooltip.Microcontroller=Microcontrolador são mini computadores. Eles são usadas para cuidar de tarefas específicas, rodando um único programa que é provido pela EEPROM consruida dentro dele.[nl] §cNão pode conectar com componentes externos.§7 +oc:tooltip.Memory=Requerida para fazer os computadores funcionarem. Quanto mais tiver, mais complexos podem ser os programas. +oc:tooltip.Microchip=Um chip conhecido formalmente como Circuito Integrado. Eu não tenho ideia porque isso funciona com redstone, mas funciona. +oc:tooltip.Microcontroller=Microcontroladores são mini computadores. Eles são usadas para cuidar de tarefas específicas, rodando um único programa que é provido pela EEPROM consruida dentro dele.[nl] §cNão pode conectar com componentes externos.§7 oc:tooltip.MicrocontrollerCase=Componente básico para construir microcontroladores. Coloque-o em um montador para adicionar novos componentes e montar um microcontrolador. -oc:tooltip.MotionSensor=Pode detectar movimento de forma de vidas próximas. Requer uma visão limpa. -oc:tooltip.Nanomachines=Unidade de controle e um grupo de nanomaquinas pra comer, se você quiser. -oc:tooltip.NetworkCard=Permite que computadores distantes conectem por outros blocos (como cabos) para comunicar-se enviando mensagens um pro outro. +oc:tooltip.MotionSensor=Pode detectar movimento de formas de vidas próximas. Requer visão direta. +oc:tooltip.Nanomachines=Unidade de controle e um grupo de nanomáquinas pra ingerir, se você tiver coragem. +oc:tooltip.NetworkCard=Permite que computadores distantes conectem por outros blocos (como cabos) para comunicar-se enviando mensagens um para o outro. oc:tooltip.PowerAcceptor=Velocidade da conversão de energia: §f%s/t§7 oc:tooltip.PowerConverter.BuildCraft=§fBuildCraft MJ§7: §a%s:%s§7 oc:tooltip.PowerConverter.Factorization=§fCarregamento do Factorization§7: §a%s:%s§7 @@ -322,13 +331,13 @@ oc:tooltip.PowerConverter.ThermalExpansion=§fThermal Expansion RF§7: §a%s:%s oc:tooltip.PowerConverter.ResonantEngine=§fResonant Engine Coulombs§7: §a%s:%s§7 oc:tooltip.PowerConverter=Converte energia de outros mods para o tipo de energia interna. Taxa de conversão: oc:tooltip.PowerDistributor=Distribui energia por meio de diferentes redes. Isto é útil para compartilhar fluxo de energia de seu sistema para outro conversor em diferentes sub-redes que podem manter separados. -oc:tooltip.Present=... para seus problemas. Abra este presente para ter uma chance de receber §kum grande tessouro§7![nl]§8Construa itens do OpenComputers até que chegue o tempo certo para ter uma chance de receber presente.§7 +oc:tooltip.Present=... para seus problemas. Abra este presente para ter uma chance de receber §kum grande tesouro§7![nl]§8Construa itens do OpenComputers para ter uma chance de receber presente.§7 oc:tooltip.Print.BeaconBase=§8Funciona como uma base do sinalizador. oc:tooltip.Print.LightValue=§8Luz emitida: %s. oc:tooltip.Print.RedstoneLevel=§8Saída da Redstone: %s. -oc:tooltip.PrintedCircuitBoard=O bloco de construção básico para cartões de expansão e memória e tal. +oc:tooltip.PrintedCircuitBoard=O bloco de construção básico para cartões de expansão, memória e outros. oc:tooltip.Printer=Permite imprimir blocos com forma definida pelo usuário usando o Camaleão (nome lindo?) e Cartucho de Tinta. Deve ser configurado usando um computador. Deixe longe do alcance das crianças. Porque sim. -oc:tooltip.Raid=Permite cobinar três discos rigídos em um único grande arquivo de sistema que pode ser usuado para todos os computadores conectados. +oc:tooltip.Raid=Permite cobinar três discos rigídos em um único grande arquivo de sistema que pode ser usado por todos os computadores conectados. oc:tooltip.RawCircuitBoard=Pode ser endurecido em qualquer fornalha compátivel. oc:tooltip.Redstone=Permite ler e emitir sinais de redstone ao redor do bloco. Pode ser controlado por qualquer computador que o bloco estiver conectado. Isto é básicamente um cartão de redstone externo. oc:tooltip.RedstoneCard.ProjectRed=§fProjectRed§7 é §asuportado§7. @@ -338,28 +347,28 @@ oc:tooltip.RedstoneCard.WirelessCBE=§fWireless Redstone (ChickenBones)§7 é § oc:tooltip.RedstoneCard.WirelessSV=§fWireless Redstone (SlimeVoid)§7 é §asuportado§7. oc:tooltip.RedstoneCard=Permite ler e emitir sinais de redstone ao redor do robô computadorizado. oc:tooltip.Relay=Permite conectar diversas redes uma com a outra. Somente mensagens de rede serão passadas, componentes não serão vísiveis através disto. Use para separar redes e continuar permitindo comunicação usando Cartões de Rede, por exemplo. -oc:tooltip.Robot=Diferente de computadores, robôs podem mover-se por ai e interagir com o mundo parecido com que um jogador faz.[nl] §cNão pode conectar com componentes externos.§7 +oc:tooltip.Robot=Diferente de computadores, robôs podem mover-se por ai e interagir com o mundo parecido com o que um jogador faz.[nl] §cNão pode conectar-se com componentes externos.§7 # The underscore makes sure this isn't hidden with the rest of the tooltip. oc:tooltip.Robot_Level=§fNível§7: §a%s§7 oc:tooltip.Robot_StoredEnergy=§fEnergia armazenada§7: §a%s§7 oc:tooltip.Screen=Mostra texto, controlado por uma placa de vídeo em um Gabinete.[nl] Resolução máxima: §f%sx%s§7[nl] Densidade máxima: §f%s§7 -oc:tooltip.Server=Isto é um servidor, tem muitos como este, mas este pode ser aprimorado com componentes como um gabinete pode ser. Ele pode ser ligado inserindo-o em um rack de servidor. +oc:tooltip.Server=Isto é um servidor: existem muitos como este, mas este pode ser aprimorado com componentes como um gabinete pode ser. Ele pode ser ligado inserindo-o em um rack de servidor. oc:tooltip.Server.Components=Componentes instalados: oc:tooltip.Rack=Permite a instalação de até quatro servidores ou outros montáveis. -oc:tooltip.Switch=Permite conectar várias redes uma com a outra. Somente mensagem de rede será passada, componentes não serão vísiveis. Use-o para separar redes permitindo comunicação usando Cartões de Rede, por exemplo. -oc:tooltip.Tablet=Um tablet, com um Lua saindo do forno. Pode ser forçado a desligar se abaixando e ativando-o. +oc:tooltip.Switch=Permite conectar várias redes uma com a outra. Somente mensagens de rede serão transmitidas, componentes não serão vísiveis. Use-o para separar redes permitindo comunicação usando Cartões de Rede, por exemplo. +oc:tooltip.Tablet=Um tablet, para usar Lua de maneira portátil. Pode ser forçado a desligar se abaixando e ativando-o. oc:tooltip.TabletCase=Carcaça básica para tablets. Coloque-o no montador para adicionar componentes e criar um tablet. oc:tooltip.Terminal=Permite controlar um servidor remotamente, enquanto estiver no seu alcance. Atua como monitor e teclados portateis. Shift + Botão Direito em um servidor em um rack para vincular um terminal. -oc:tooltip.TerminalServer=Backend para que Terminais remotos possam ser conectados para provê controle remoto. Contem um monitor virtual e teclado. +oc:tooltip.TerminalServer=Backend para que Terminais remotos possam ser conectados para prover controle remoto. Contém um monitor virtual e um teclado. oc:tooltip.TexturePicker=Esta ferramente mostra uma string descrevendo uma superfície de bloco, para usar na impressora 3D e definir formas. Não são nomes de texturas, nana nina não. oc:tooltip.Tier=§8Nível %s oc:tooltip.NetSplitter=Atua como um conector dinâmico. Conectividade de cada lado pode ser mudada batendo-a com uma chave. Conectividade de todos os lados podem ser invertidas aplicando um sinal de redstone. oc:tooltip.TooLong=Segure [§f%s§7] para uma dica detalhada. -oc:tooltip.Transistor=Um elemento básico para outras partes de computador. É um pouco retorcido, mas faz seu trabalho. -oc:tooltip.Transposer=Permite transferir automaticamente itens e fluídos entre inventários adjacentes e recipientes de fluidos. -oc:tooltip.UpgradeAngel=Permite robôs colocar blocos no ar, mesmo sem um ponto de apoio. +oc:tooltip.Transistor=Um elemento básico para outras partes de computador. É um pouco torto, mas faz seu trabalho. +oc:tooltip.Transposer=Permite transferir automaticamente itens e fluidos entre inventários adjacentes e recipientes de fluidos. +oc:tooltip.UpgradeAngel=Permite que robôs coloquem blocos no ar, mesmo sem um ponto de apoio. oc:tooltip.UpgradeBattery=Aumenta a quantidade de energia que o dispositivo pode armazenar, permitindo que trabalhe mais tempo sem precisa recarregar. [nl] Capacidade: §f%s§7 -oc:tooltip.UpgradeChunkloader=Se um robô move-se em uma floresta e ninguém é capaz de ver ele, ele está se mechendo ou não? Este aprimoramento faz ter certeza que sim. Isto mantêm um chunk, um dispositvo está carregado, mas consome energia continua enquanto ativo. +oc:tooltip.UpgradeChunkloader=Se um robô move-se em uma floresta e ninguém é capaz de ver ele, ele está se mexendo ou não? Este aprimoramento faz ter certeza que sim. Isto mantêm um chunk em que um dispositvo está carregado, mas consome energia continuamente enquanto ativo. oc:tooltip.UpgradeContainerCard=Este aprimoramento de contêiner permite dinamicamente instalar e remover um cartão de um dispositivo montado. [nl] Nível máximo: §f%s§7 oc:tooltip.UpgradeContainerUpgrade=Este aprimoramento de contêiner permite dinamicamente instalar e remover outro aprimoramento de um dispositivo montado. [nl] Nível máximo: §f%s§7 oc:tooltip.UpgradeCrafting=Permite que robôs usem o canto superior esquerdo de seu inventário para construir objetos. Os itens devem estar posicionados como se estivessem numa mesa de trabalho. @@ -369,17 +378,21 @@ oc:tooltip.UpgradeGenerator=Pode ser usado para gerar combustível em movimento. oc:tooltip.UpgradeHover=Este aprimoramento permite que robôs voem acima do solo sem precisar escalar paredes.[nl] Altura máxima: §f%s§7 oc:tooltip.UpgradeInventory=Este aprimoramento provê espaço no inventário para robôs ou drones. Sem um destes, eles não serão capazes de armazenar itens internamente. oc:tooltip.UpgradeInventoryController=Este aprimoramento permite que robôs e drones tenham mais controle de como eles interagem com o inventário externo, e permite que robôs troquem sua ferramenta equipada com algum item do seu inventário. +oc:tooltip.UpgradeMF=Permite que adaptadores acessem blocos não adjacentes. +oc:tooltip.UpgradeMF.Linked=§fConexão estabelecida§7 +oc:tooltip.UpgradeMF.Unlinked=§fSem conexão§7 oc:tooltip.UpgradeLeash=Permite que alguns dispostivos, como drones, coloquem animais em coleiras. MUITOSSSS ANIMAIIIIIIss. oc:tooltip.UpgradeNavigation=Pode ser usado para determinar a posição e orientação de um dispositivo. A posição é relativa ao centro do mapa que foi usado para construir este aprimoramento. -oc:tooltip.UpgradePiston=Este aprimoramento tem um movimento sexy. Permite mexer blocos, como se estive-se usando um pistão. Isto §lnão§7 move entidades. -oc:tooltip.UpgradeSign=Permite escrever texto nele e escrever placa de textos. +oc:tooltip.UpgradePiston=Este aprimoramento tem um movimento agressivo. Permite mexer blocos, como se estivesse usando um pistão. Isto §lnão§7 move entidades. +oc:tooltip.UpgradeSign=Permite ler e escrever em placas de texto. oc:tooltip.UpgradeSolarGenerator=Pode ser usado para gerar energia solar em movimento. Requer uma linha de visão limpa do céu acima do dispositivo. Gera energia em %s%% da velocidade de um Motor Stirling. -oc:tooltip.UpgradeTank=Este aprimoramento provê um armazenamento de tanque ou fluídos para robôs e drones. Sem um destes, ele não será capaz de armazenar fluídos internamente. -oc:tooltip.UpgradeTankController=Este aprimoramento permite que robôs e drones tenham mais controle de como eles interagem com tanques externos, e permite que ele transfira fluídos para os tanques e dos tanques. +oc:tooltip.UpgradeTank=Este aprimoramento provê um armazenamento de tanque ou fluidos para robôs e drones. Sem um destes, ele não será capaz de armazenar fluidos internamente. +oc:tooltip.UpgradeTankController=Este aprimoramento permite que robôs e drones tenham mais controle de como eles interagem com tanques externos, e permite que ele transfira fluidos para os tanques e dos tanques. oc:tooltip.UpgradeTractorBeam=Equipa um dispositivo com uma tecnologia extremamente avançada, codenome "Imã". Permite que dispositivos capturem blocos com o raio de 3 blocos de sua localização. +oc:tooltip.UpgradeTrading=Permite que robôs e drones façam trocas com Aldeões. oc:tooltip.Waypoint=Provê um ponto de referência para os dispositvos com um aprimoramento de navegação. oc:tooltip.WirelessNetworkCard=Permite enviar mensagens de rede além do meio normal. Você pode ajustar a §fforça do sinal§7 para controlar o quão longe as mensagens vão. Altos níveis de força de sinal resulta em alto consumo de energia. -oc:tooltip.WorldSensorCard=Permite ler informações sobre o mundo, como gravidade e/ou se tem uma atmosfera respirável. Use os resultados por sua conta e risco. O fabricando não se responsabiliza por danos corporais ou materias por decisões causadas sobre as saídas dos cartões. Nós temos leis. E dinheiro. Então nem tente. +oc:tooltip.WorldSensorCard=Permite ler informações sobre o mundo, como gravidade e/ou se tem uma atmosfera respirável. Use os resultados por sua conta e risco. O fabricando não se responsabiliza por danos corporais ou materias por decisões causadas sobre as saídas dos cartões. Nós temos advogados. E dinheiro. Então nem tente. oc:tooltip.Wrench=Um híbrido entre uma Chave de fenda e uma Chave de boca, esta ferramenta é fácil de usar, mas díficil de dominar. #Achievements @@ -388,21 +401,21 @@ achievement.oc.adapter.desc=Interagiu com blocos de outros mods e também do Min achievement.oc.assembler=Explêndido achievement.oc.assembler.desc=Hora de dominar o mundo! achievement.oc.cable=Não é um Fio Sujo -achievement.oc.cable.desc=Com a tecnologia patentiada anti-espaguete. +achievement.oc.cable.desc=Com a tecnologia patenteada de anti-espaguete. achievement.oc.capacitor=Baterias inclusas achievement.oc.capacitor.desc=Você não pode parar isso. achievement.oc.card=Aceitamos Cartões -achievement.oc.card.desc=Para seu entendimento. Sem segundas intenções, prometo. +achievement.oc.card.desc=Para sua conveniência. Sem segundas intenções, prometo. achievement.oc.case=Em Caso de Problemas achievement.oc.case.desc=Porque torres quadradas são as melhores. achievement.oc.charger=Tá bom, vamo lá -achievement.oc.charger.desc=Carrreeegaaaan- dour, esqueça do sinal de redstone de novo. +achievement.oc.charger.desc=Carrreeegaaaan- poxa, esqueci do sinal de redstone de novo. achievement.oc.chip=Todas as Pequenas Coisas -achievement.oc.chip.desc=Porque tubos a vácuo são do passado. +achievement.oc.chip.desc=Porque tubos a vácuo são coisa do passado. achievement.oc.cpu=Overclocked achievement.oc.cpu.desc=Hora de fazer uso destes ciclos computacionais. achievement.oc.disassembler=Vamo quebra tudo! -achievement.oc.disassembler.desc=Em caso de suas ideias brilhantes não sejam tão brilhantes assim. +achievement.oc.disassembler.desc=Caso suas ideias brilhantes não sejam tão brilhantes assim. achievement.oc.diskDrive=Roda a Roda. achievement.oc.diskDrive.desc=Capacidade inferior mas um som lindíssimo. achievement.oc.drone=Voando alto. @@ -410,7 +423,7 @@ achievement.oc.drone.desc=Mantenha a calma e jogue-o para fora do planeta. achievement.oc.eeprom=Só pode ter um achievement.oc.eeprom.desc=Por computador, claro. Para manter a ordem da inicialização, entendeu? achievement.oc.floppy=Um ri- disco -achievement.oc.floppy.desc=Velho mais ainda funciona. +achievement.oc.floppy.desc=Velho, mas ainda funciona. achievement.oc.geolyzer=Pra dentro da Terra achievement.oc.geolyzer.desc=Têm qualidades extraordinárias. achievement.oc.graphicsCard=Ultima Geração @@ -428,9 +441,9 @@ achievement.oc.motionSensor.desc=Igual a Steve Swagger. achievement.oc.networkCard=Agora Estamos Falando! achievement.oc.networkCard.desc=Mantenha contato com esses parentes distantes. achievement.oc.openOS=Buti -achievement.oc.openOS.desc=Um SO para bot - espere, Já usei isso antes? Droga. -achievement.oc.powerDistributor=Compartilhar é Amor -achievement.oc.powerDistributor.desc=Quando precisa de ajuda distribua essa energia. +achievement.oc.openOS.desc=Um SO para - espere, já usei essa antes? Droga. +achievement.oc.powerDistributor=Compartilhar é Amar +achievement.oc.powerDistributor.desc=Quando você precisa de ajuda para equilibrar toda essa energia. achievement.oc.rack=Mas que potência achievement.oc.rack.desc=Sim, os racks de servidores são potentes. achievement.oc.raid=LFG @@ -444,13 +457,13 @@ achievement.oc.redstoneIO.desc=Levando os sinais de redstone para onde quiser. achievement.oc.robot=Bip Bip achievement.oc.robot.desc=EXTERMINAR! achievement.oc.screen=Tentou desligar e ligar de novo? -achievement.oc.screen.desc=Não, não. Um pulso de redstone pode alternar o monitor entre ligado e desligado. +achievement.oc.screen.desc=Não, de verdade. Um pulso de redstone pode alternar o monitor entre ligado e desligado. achievement.oc.server=Dedicado achievement.oc.server.desc=Servidores na nuvem, aqui vamos nós. achievement.oc.switch=Topologia Complexa achievement.oc.switch.desc=Evite embalagens baratas devido a possibilidade de pacotes perdidos. -achievement.oc.tablet=Não engula -achievement.oc.tablet.desc=Mantenha longe do alcance das crianças para evitar um exagero no seu cartão de crédito. +achievement.oc.tablet=Não Engula +achievement.oc.tablet.desc=Mantenha longe do alcance das crianças para evitar cobranças exageradas no seu cartão de crédito. achievement.oc.transistor=Onipresente achievement.oc.transistor.desc=Crie um Transistor para começar. achievement.oc.wirelessNetworkCard=Sinais @@ -460,9 +473,9 @@ achievement.oc.wirelessNetworkCard.desc=Hora de ir onde nenhum pacote foi antes. # set in the actual damage source in code. death.attack.oc.nanomachinesOverload.1=%s foi muito ganancioso. death.attack.oc.nanomachinesOverload.2=%s teve um ataque de nervos. -death.attack.oc.nanomachinesOverload.3=As nanomaquinas de %s estão fora de controle. -death.attack.oc.nanomachinesHungry.1=%s foi comido por nanomaquinas. -death.attack.oc.nanomachinesHungry.2=%s não alimentou suas nanomaquinas. +death.attack.oc.nanomachinesOverload.3=As nanomáquinas de %s estão fora de controle. +death.attack.oc.nanomachinesHungry.1=%s foi comido por nanomáquinas. +death.attack.oc.nanomachinesHungry.2=%s não alimentou suas nanomáquinas. death.attack.oc.nanomachinesHungry.3=%s foi digerido. # NEI Integration diff --git a/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua b/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua index 208d41111..4fc9428eb 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua @@ -16,7 +16,8 @@ _G.coroutine = setmetatable( }, { __index = function(_, key) - return assert(process.info(_coroutine.running()), "thread has no proc").data.coroutine_handler[key] + local proc = process.info(_coroutine.running()) + return (proc and proc.data.coroutine_handler or _coroutine)[key] end } ) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_vt.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_vt.lua index dcafc5edc..b2e7fbc83 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_vt.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_vt.lua @@ -14,13 +14,13 @@ local function set_cursor(window, x, y) end -- -- These DO NOT SCROLL --- [(%d+)A move cursor up n lines --- [(%d+)B move cursor down n lines --- [(%d+)C move cursor right n lines --- [(%d+)D move cursor left n lines -rules[{"%[", "%d+", "[ABCD]"}] = function(window, _, n, dir) +-- [(%d*)A move cursor up n lines +-- [(%d*)B move cursor down n lines +-- [(%d*)C move cursor right n lines +-- [(%d*)D move cursor left n lines +rules[{"%[", "%d*", "[ABCD]"}] = function(window, _, n, dir) local dx, dy = 0, 0 - n = tonumber(n) + n = tonumber(n) or 1 if dir == "A" then dy = -n elseif dir == "B" then diff --git a/src/main/resources/assets/opencomputers/lua/machine.lua b/src/main/resources/assets/opencomputers/lua/machine.lua index 7c42c3b49..583f15755 100644 --- a/src/main/resources/assets/opencomputers/lua/machine.lua +++ b/src/main/resources/assets/opencomputers/lua/machine.lua @@ -621,7 +621,7 @@ do local function str_gsub(s, pattern, repl, n) checkArg(1, s, "string") - checkArg(2, pattern, "string") + checkArg(2, pattern, "string", "number") checkArg(3, repl, "number", "string", "function", "table") checkArg(4, n, "number", "nil") @@ -629,6 +629,7 @@ do return string_gsub(s, pattern, repl, n) end + pattern = tostring(pattern) local src = strptr(s); local p = strptr(pattern) local tr = type(repl) diff --git a/src/main/scala/li/cil/oc/common/component/TerminalServer.scala b/src/main/scala/li/cil/oc/common/component/TerminalServer.scala index 6cecfbd0e..4832c5d13 100644 --- a/src/main/scala/li/cil/oc/common/component/TerminalServer.scala +++ b/src/main/scala/li/cil/oc/common/component/TerminalServer.scala @@ -293,7 +293,10 @@ object TerminalServer { def find(address: String): Option[TerminalServer] = { completePending() - Some(ready.getOrDefault(address, null)) + ready.getOrDefault(address, null) match { + case term: TerminalServer => Option(term) + case _ => None + } } } } diff --git a/src/main/scala/li/cil/oc/common/component/traits/TextBufferProxy.scala b/src/main/scala/li/cil/oc/common/component/traits/TextBufferProxy.scala index c0c5f9e1d..41a9ea286 100644 --- a/src/main/scala/li/cil/oc/common/component/traits/TextBufferProxy.scala +++ b/src/main/scala/li/cil/oc/common/component/traits/TextBufferProxy.scala @@ -130,9 +130,9 @@ trait TextBufferProxy extends api.internal.TextBuffer { for (y <- row until ((row + color.length) min data.height)) { val line = color(y - row) for (x <- col until ((col + line.length) min data.width)) { - val packedBackground = data.format.deflate(PackedColor.Color(line(x - col))) & 0x00FF - val packedForeground = data.color(row)(col) & 0xFF00 - data.color(row)(col) = (packedForeground | packedBackground).toShort + val packedBackground = data.color(y)(x) & 0x00FF + val packedForeground = (data.format.deflate(PackedColor.Color(line(x - col))) << PackedColor.ForegroundShift) & 0xFF00 + data.color(y)(x) = (packedForeground | packedBackground).toShort } } } @@ -141,9 +141,9 @@ trait TextBufferProxy extends api.internal.TextBuffer { for (y <- row until ((row + color.length) min data.height)) { val line = color(y - row) for (x <- col until ((col + line.length) min data.width)) { - val packedBackground = data.color(row)(col) & 0x00FF - val packedForeground = (data.format.deflate(PackedColor.Color(line(x - col))) << PackedColor.ForegroundShift) & 0xFF00 - data.color(row)(col) = (packedForeground | packedBackground).toShort + val packedBackground = data.format.deflate(PackedColor.Color(line(x - col))) & 0x00FF + val packedForeground = data.color(y)(x) & 0xFF00 + data.color(y)(x) = (packedForeground | packedBackground).toShort } } } diff --git a/src/main/scala/li/cil/oc/common/item/Delegator.scala b/src/main/scala/li/cil/oc/common/item/Delegator.scala index 2aae69424..087c00290 100644 --- a/src/main/scala/li/cil/oc/common/item/Delegator.scala +++ b/src/main/scala/li/cil/oc/common/item/Delegator.scala @@ -1,7 +1,6 @@ package li.cil.oc.common.item import java.util - import li.cil.oc.CreativeTab import li.cil.oc.OpenComputers import li.cil.oc.api.driver @@ -9,6 +8,7 @@ import li.cil.oc.api.driver.item.Chargeable import li.cil.oc.api.event.RobotRenderEvent.MountPoint import li.cil.oc.api.internal.Robot import li.cil.oc.client.renderer.item.UpgradeRenderer +import li.cil.oc.integration.opencomputers.{Item => OpenComputersItem} import li.cil.oc.util.BlockPosition import net.minecraft.creativetab.CreativeTabs import net.minecraft.entity.Entity @@ -47,9 +47,12 @@ class Delegator extends Item with driver.item.UpgradeRenderer with Chargeable { // SubItem // ----------------------------------------------------------------------- // - override def getItemStackLimit(stack: ItemStack) = + override def getItemStackLimit(stack: ItemStack): Int = Delegator.subItem(stack) match { - case Some(subItem) => subItem.maxStackSize + case Some(subItem) => OpenComputersItem.address(stack) match { + case Some(address) => 1 + case _ => subItem.maxStackSize + } case _ => maxStackSize } diff --git a/src/main/scala/li/cil/oc/common/item/HardDiskDrive.scala b/src/main/scala/li/cil/oc/common/item/HardDiskDrive.scala index da7b2a227..57ee665a9 100644 --- a/src/main/scala/li/cil/oc/common/item/HardDiskDrive.scala +++ b/src/main/scala/li/cil/oc/common/item/HardDiskDrive.scala @@ -4,11 +4,11 @@ import li.cil.oc.Settings import net.minecraft.item.ItemStack class HardDiskDrive(val parent: Delegator, val tier: Int) extends traits.Delegate with traits.ItemTier with traits.FileSystemLike { - override val unlocalizedName = super.unlocalizedName + tier - val kiloBytes = Settings.get.hddSizes(tier) - val platterCount = Settings.get.hddPlatterCounts(tier) + override val unlocalizedName: String = super.unlocalizedName + tier + val kiloBytes: Int = Settings.get.hddSizes(tier) + val platterCount: Int = Settings.get.hddPlatterCounts(tier) - override def displayName(stack: ItemStack) = { + override def displayName(stack: ItemStack): Option[String] = { val localizedName = parent.internalGetItemStackDisplayName(stack) Some(if (kiloBytes >= 1024) { localizedName + s" (${kiloBytes / 1024}MB)" diff --git a/src/main/scala/li/cil/oc/common/item/data/DriveData.scala b/src/main/scala/li/cil/oc/common/item/data/DriveData.scala index e37257e76..0e4b81fff 100644 --- a/src/main/scala/li/cil/oc/common/item/data/DriveData.scala +++ b/src/main/scala/li/cil/oc/common/item/data/DriveData.scala @@ -41,7 +41,7 @@ object DriveData { val data = new DriveData(stack) if (!data.isLocked) { data.lockInfo = key match { - case name: String if name != null && !name.isEmpty => name + case name: String if name != null && name.nonEmpty => name case _ => "notch" // meaning: "unknown" } data.save(stack) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala index f753da8f1..d7c6e939f 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala @@ -37,6 +37,8 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra var totalRequiredEnergy = 0.0 + override def getInventoryStackLimit: Int = 1 + var buffer = 0.0 var disassembleNextInstantly = false diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala index 094f130bc..d5dedd239 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/RedstoneAware.scala @@ -94,7 +94,9 @@ trait RedstoneAware extends RotationAware /* with IConnectable with IRedstoneEmi def getOutput: Array[Int] = EnumFacing.values.map{ side: EnumFacing => _output(toLocal(side).ordinal) } - def getOutput(side: EnumFacing) = _output(toLocal(side).ordinal()) + def getOutput(side: EnumFacing) = if (_output != null && _output.length <= toLocal(side).ordinal()) + _output(toLocal(side).ordinal()) + else 0 def setOutput(side: EnumFacing, value: Int): Boolean = { if (value == getOutput(side)) return false diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/Item.scala b/src/main/scala/li/cil/oc/integration/opencomputers/Item.scala index 6962cc7e2..5d52946d1 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/Item.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/Item.scala @@ -1,5 +1,6 @@ package li.cil.oc.integration.opencomputers +import com.google.common.base.Strings import li.cil.oc.Settings import li.cil.oc.api import li.cil.oc.api.driver @@ -10,6 +11,8 @@ import li.cil.oc.server.driver.Registry import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound +import scala.annotation.tailrec + trait Item extends driver.Item { def worksWith(stack: ItemStack, host: Class[_ <: EnvironmentHost]): Boolean = worksWith(stack) && !Registry.blacklist.exists { @@ -52,4 +55,25 @@ object Item { } nbt.getCompoundTag(Settings.namespace + "data") } + + @tailrec + private def getTag(tagCompound: NBTTagCompound, keys: Array[String]): Option[NBTTagCompound] = { + if (keys.length == 0) Option(tagCompound) + else if (!tagCompound.hasKey(keys(0))) None + else getTag(tagCompound.getCompoundTag(keys(0)), keys.drop(1)) + } + + private def getTag(stack: ItemStack, keys: Array[String]): Option[NBTTagCompound] = { + if (stack == null || stack.stackSize == 0) None + else if (!stack.hasTagCompound) None + else getTag(stack.getTagCompound, keys) + } + + def address(stack: ItemStack): Option[String] = { + val addressKey = "address" + getTag(stack, Array(Settings.namespace + "data", "node")) match { + case Some(tag) if tag.hasKey(addressKey) => Option(tag.getString(addressKey)) + case _ => None + } + } } diff --git a/src/main/scala/li/cil/oc/server/component/DebugCard.scala b/src/main/scala/li/cil/oc/server/component/DebugCard.scala index 625801679..f3596558e 100644 --- a/src/main/scala/li/cil/oc/server/component/DebugCard.scala +++ b/src/main/scala/li/cil/oc/server/component/DebugCard.scala @@ -266,8 +266,7 @@ class DebugCard(host: EnvironmentHost) extends prefab.ManagedEnvironment with De checkAccess() val destination = args.checkString(0) DebugNetwork.getEndpoint(destination).filter(_ != this).foreach{endpoint => - // Cast to iterable to use Scala's toArray instead of the Arguments' one (which converts byte arrays to Strings). - val packet = Network.newPacket(node.address, destination, 0, args.drop(1).asInstanceOf[java.lang.Iterable[AnyRef]].toArray) + val packet = Network.newPacket(node.address, destination, 0, args.drop(1).toArray) endpoint.receivePacket(packet) } result() diff --git a/src/main/scala/li/cil/oc/server/component/InternetCard.scala b/src/main/scala/li/cil/oc/server/component/InternetCard.scala index 9022db756..eeb69b9aa 100644 --- a/src/main/scala/li/cil/oc/server/component/InternetCard.scala +++ b/src/main/scala/li/cil/oc/server/component/InternetCard.scala @@ -249,6 +249,7 @@ object InternetCard { private val id = UUID.randomUUID() private def setupSelector() { + if (channel == null) return TCPNotifier.add((channel, () => { owner match { case Some(internetCard) => diff --git a/src/main/scala/li/cil/oc/server/component/UpgradeGenerator.scala b/src/main/scala/li/cil/oc/server/component/UpgradeGenerator.scala index 1ce66828d..8a3f9db39 100644 --- a/src/main/scala/li/cil/oc/server/component/UpgradeGenerator.scala +++ b/src/main/scala/li/cil/oc/server/component/UpgradeGenerator.scala @@ -53,6 +53,8 @@ class UpgradeGenerator(val host: EnvironmentHost with internal.Agent) extends pr if (!TileEntityFurnace.isItemFuel(stack)) { return result(Unit, "selected slot does not contain fuel") } + val container = stack.getItem().getContainerItem(stack) + var consumedCount = 0 inventory match { case Some(existingStack) => if (!existingStack.isItemEqual(stack) || @@ -63,38 +65,79 @@ class UpgradeGenerator(val host: EnvironmentHost with internal.Agent) extends pr if (space <= 0) { return result(Unit, "queue is full") } - val moveCount = math.min(stack.stackSize, math.min(space, count)) - existingStack.stackSize += moveCount - stack.stackSize -= moveCount + consumedCount = math.min(stack.stackSize, math.min(space, count)) + existingStack.stackSize += consumedCount + stack.stackSize -= consumedCount case _ => - inventory = Some(stack.splitStack(math.min(stack.stackSize, count))) + consumedCount = math.min(stack.stackSize, count) + inventory = Some(stack.splitStack(consumedCount)) } - if (stack.stackSize > 0) host.mainInventory.setInventorySlotContents(host.selectedSlot, stack) - else host.mainInventory.setInventorySlotContents(host.selectedSlot, null) + if (consumedCount > 0 && container != null) { + container.stackSize = consumedCount + } + if (stack.stackSize > 0) { + host.mainInventory.setInventorySlotContents(host.selectedSlot, stack) + } + if (stack.stackSize == 0 || container != null) { + host.mainInventory.setInventorySlotContents(host.selectedSlot, container) + } + result(true) } @Callback(doc = """function():number -- Get the size of the item stack in the generator's queue.""") def count(context: Context, args: Arguments): Array[AnyRef] = { inventory match { - case Some(stack) => result(stack.stackSize) + case Some(stack) => result(stack.stackSize, stack.getItem.getItemStackDisplayName(stack)) case _ => result(0) } } + @Callback() + def clear(context: Context, args: Arguments): Array[AnyRef] = { + inventory = None + remainingTicks = 0 + result(true) + } + @Callback(doc = """function([count:number]):boolean -- Tries to remove items from the generator's queue.""") def remove(context: Context, args: Arguments): Array[AnyRef] = { val count = args.optInteger(0, Int.MaxValue) + var selectSlotContainer: ItemStack = null inventory match { case Some(stack) => - val removedStack = stack.splitStack(math.min(count, stack.stackSize)) - val success = host.player.inventory.addItemStackToInventory(removedStack) - stack.stackSize += removedStack.stackSize - if (success && stack.stackSize <= 0) { - inventory = None + val moveCount = Option(stack.getItem().getContainerItem(stack)) match { + case Some(fuelContainer) => + // if the fuel requires a container, we can only refill containers + Option(host.mainInventory.getStackInSlot(host.selectedSlot)) match { + case Some(selectedStack) if selectedStack.getItem() == fuelContainer.getItem() => + selectSlotContainer = selectedStack.copy() // keep a copy in case we have to put it back + 1 // refill one container + case _ => 0 // container required + } + case _ => count } - result(success) - case _ => result(false) + if (moveCount == 0) { + result(false, "fuel requires container in the selected slot") + } else { + val removedStack = stack.splitStack(math.min(moveCount, stack.stackSize)) + if (selectSlotContainer != null) { + host.mainInventory.decrStackSize(host.selectedSlot, 1) + } + val success = host.player.inventory.addItemStackToInventory(removedStack) + stack.stackSize += removedStack.stackSize + if (success) { + if (stack.stackSize <= 0) { + inventory = None + } + result(true) + } else { + // if we decremented the container, we need to put it back + host.mainInventory.setInventorySlotContents(host.selectedSlot, selectSlotContainer) + result(false, "no inventory space available for fuel") + } + } + case _ => result(false, "queue is empty") } } @@ -108,13 +151,10 @@ class UpgradeGenerator(val host: EnvironmentHost with internal.Agent) extends pr val stack = inventory.get remainingTicks = TileEntityFurnace.getItemBurnTime(stack) if (remainingTicks > 0) { - // If not we probably have a container item now (e.g. bucket after lava bucket). updateClient() stack.stackSize -= 1 if (stack.stackSize <= 0) { - if (stack.getItem.hasContainerItem(stack)) - inventory = Option(stack.getItem.getContainerItem(stack)) - else + // do not put container in inventory (we left the container when fuel was inserted) inventory = None } } diff --git a/src/main/scala/li/cil/oc/server/fs/FileSystem.scala b/src/main/scala/li/cil/oc/server/fs/FileSystem.scala index 2a46c7ad4..ef3451bf9 100755 --- a/src/main/scala/li/cil/oc/server/fs/FileSystem.scala +++ b/src/main/scala/li/cil/oc/server/fs/FileSystem.scala @@ -99,7 +99,7 @@ object FileSystem extends api.detail.FileSystemAPI { } } - override def fromSaveDirectory(root: String, capacity: Long, buffered: Boolean) = { + override def fromSaveDirectory(root: String, capacity: Long, buffered: Boolean): Capacity = { val path = new io.File(DimensionManager.getCurrentSaveRootDirectory, Settings.savePath + root) if (!path.isDirectory) { path.delete() @@ -194,7 +194,7 @@ object FileSystem extends api.detail.FileSystemAPI { extends VirtualFileSystem with Buffered with Capacity { - protected override def segments(path: String) = { + protected override def segments(path: String): Array[String] = { val parts = super.segments(path) if (isCaseInsensitive) toCaseInsensitive(parts) else parts }