Closed SamuelDeboni closed 7 years ago
Isso parece maravilhoso, vai ser útil em algumas ocasiões.
Vou entender o código e talvez altere algumas coisas, para que exista um objeto que sempre deixe de noite quado ativado e outro que sempre deixe de dia, assim podemos personalizar a área para cada área do castelo, como Castlevania SOTN onde a catedral é um ambiente diurno e todo o resto do castelo é noturno.
Tentei fazer funcionar, mas o burro aqui se embananou na hora de fazer o código do item e deu um monte de erro kkk
Mas analisando o código, aparentemente ele copia a função do Sundial né? Enfim, esperarei oura pessoa ajeitar esta parte ou outro dia eu tento.
Talvez de problema por falta dos sprites, WiringSundial e WiringSundiaItem na pasta tiles, então e só extrair esse arquivo com o script e sprites na pasta tiles e ai e so editar como quiser. WiringSundial.zip
Talvez de problema por falta dos sprites, WiringSundial e WiringSundiaItem na pasta tiles, então e só extrair esse arquivo com o script e sprites na pasta tiles e ai e so editar como quiser.
Na verdade, eu fui inventar moda de renomear o item/tile e acabei fazendo besteira (devo ter confundido um termo com o outro) enfim, vou testar a sua pasta aqui e já dou um retorno,
Beleza, testei aqui.
No castelo haverão 3 ambientes que gostaria que fosse diurno, e por isso um item de wire seria interessante para cambiar o tempo. Porém, se estiver muito complexo o processo, podemos deixar setado para noite eterna mesmo.
O ideal seria ter um item que deixa-se de dia e outro que deixa-se de noite.
Sobre a lambança que eu fiz, foi o seguinte: eu tentei atribuir o tile a um item com código separado na pasta item. Não tinha reparado que tanto o item quanto o tile estavam fazendo referência a mesma pasta (neste caso, a pasta tile),
Vou fazer dois itens então, um para deixar de dia e outro para deixar de noite, deve facilitar.
Pronto
using Microsoft.Xna.Framework;
using System;
using System.Linq;
using Terraria;
using Terraria.DataStructures;
using Terraria.ID;
using Terraria.ModLoader;
using Terraria.ObjectData;
namespace Castleroid.Tiles
{
public class WiringSundial : ModTile
{
public override void SetDefaults()
{
// For some reason, setting tileFrameImportant will cause world gen to fail. Stack Overflow
//Main.tileFrameImportant[Type] = true;
Main.tileObsidianKill[Type] = true;
TileObjectData.newTile.CopyFrom(TileObjectData.Style2xX);
TileObjectData.addTile(Type);
AddMapEntry(new Color(190, 230, 190), "WiringSundial");
dustType = 11;
disableSmartCursor = true;
}
public override void KillMultiTile(int i, int j, int frameX, int frameY)
{
Item.NewItem(i * 16, j * 16, 32, 48, mod.ItemType("WiringSundialItem"));
}
public override void HitWire(int i, int j)
{
// Find the coordinates of top left tile square through math
int y = j - (Main.tile[i, j].frameY / 18);
int x = i - (Main.tile[i, j].frameX / 18);
Wiring.SkipWire(x, y);
Wiring.SkipWire(x, y + 1);
Wiring.SkipWire(x, y + 2);
Wiring.SkipWire(x + 1, y);
Wiring.SkipWire(x + 1, y + 1);
Wiring.SkipWire(x + 1, y + 2);
if (Wiring.CheckMech(x, y, 30))
{
Main.time = 32400.1;
}
}
}
public class WiringSundialItem : ModItem
{
public override void SetDefaults()
{
item.CloneDefaults(ItemID.Actuator);
item.name = "WiringSundial";
item.createTile = mod.TileType("WiringSundial");
item.placeStyle = 0;
}
}
}
e wiring muldial
using Microsoft.Xna.Framework;
using System;
using System.Linq;
using Terraria;
using Terraria.DataStructures;
using Terraria.ID;
using Terraria.ModLoader;
using Terraria.ObjectData;
namespace Castleroid.Tiles
{
public class WiringMundial : ModTile
{
public override void SetDefaults()
{
// For some reason, setting tileFrameImportant will cause world gen to fail. Stack Overflow
//Main.tileFrameImportant[Type] = true;
Main.tileObsidianKill[Type] = true;
TileObjectData.newTile.CopyFrom(TileObjectData.Style2xX);
TileObjectData.addTile(Type);
AddMapEntry(new Color(190, 230, 190), "WiringMundial");
dustType = 11;
disableSmartCursor = true;
}
public override void KillMultiTile(int i, int j, int frameX, int frameY)
{
Item.NewItem(i * 16, j * 16, 32, 48, mod.ItemType("WiringMundialItem"));
}
public override void HitWire(int i, int j)
{
// Find the coordinates of top left tile square through math
int y = j - (Main.tile[i, j].frameY / 18);
int x = i - (Main.tile[i, j].frameX / 18);
Wiring.SkipWire(x, y);
Wiring.SkipWire(x, y + 1);
Wiring.SkipWire(x, y + 2);
Wiring.SkipWire(x + 1, y);
Wiring.SkipWire(x + 1, y + 1);
Wiring.SkipWire(x + 1, y + 2);
if (Wiring.CheckMech(x, y, 30))
{
Main.time = 0;
}
}
}
public class WiringMundialItem : ModItem
{
public override void SetDefaults()
{
item.CloneDefaults(ItemID.Actuator);
item.name = "WiringMundial";
item.createTile = mod.TileType("WiringMundial");
item.placeStyle = 0;
}
}
}
Vou fazer dois itens então, um para deixar de dia e outro para deixar de noite, deve facilitar.
Obrigadão Samuel, não vou poder testar agora, mas quando puder eu dou meu feedback :smiley:
Finalmente pude testar (o diurno) e esta OK! :smile_cat:
Mas ainda há uma questão: manter o tempo continuo.
Tentei duas coisas:
Chutar termos genéricos para zerar a passagem do tempo, como Main.timeCount
// Main.timeTransition
// Main.timeSpeedy
tudo = 0
mas não existe uma atribuição para estas linhas.
Usar este troço após o Main.time (almejando um looping)
for (; ; )
{
// ...
}
Fonte: https://msdn.microsoft.com/pt-BR/library/ch45axte.aspx Mas congelou o jogo haha
Enfim, deve ter um meio, não muito complicado de fazer o Main.time = 32400.1;
a cada 15 frames (0,25 seg) e criar uma condição para paralisar o loop, condição essa que seria ativada no outro item noturno, que também teria um loop e uma condição para ser ativada com o item diurno. (quase bugei nessa frase)
É isso, por hoje, chega de código, deixa eu ir jantar/dormir ;D
isoo funciona assim for(i = 0; i < 10 ; i++) enquanto o i for menor que 10 ele executa uma peça de código; e meio complexo explicar assim. O motivo do jogo congelar é porque ele compila o mesmo código 60x por segundo, ou fps que vc tem e o for executa até ele terminar as 10, 15, 200 vezes que foi programado.
consegui
subittitui o
Main.Time = 32400.1;
por
Main.time = Main.time-1;
assim a cada frame o tempo e adicionado em 1 mas com esse comando coloca o tempo para o valor do frame anterior
e desta forma o tempo fica parado
porem mesmo assim da para mudar o tempo com o wiringSundial
Muito obrigado pela ajuda @SamuelDeboni
Peguei o Main.Time-1;
e coloquei no Castleroid.cs e depois peguei parte de seu código do WiringSundial e quebrei a cabeça para fazer dois itens visualmente amigáveis para alteração para Dia e Noite e funciona perfeitamente.
Até descobri uma coisa bizarra: Deixei o Main.time = -32400.1;
e além de obviamente bugar o relógio, o mapa ficou assustadoramente vermelho cor de sangue O_O vai dar para usar isso a nosso favor xD
A única coisa que não consegui foi botar o horário noturno para a meia noite (00:00 / Lua no Meio da Tela).
Main.time = 0
volta 07:30PM se não me engano :/
meia noite e Main.time = 16240
meia noite e Main.time = 16240
Não deu certo, voltou AM 09:00.
Estranho, comigo deu.
Coloquei o Main.time = 16240
no wiringSundial
e 12:00AM certinho
Estranho, comigo deu.
ihhhh começou as dorgas haha
Eu vou upar os itens que eu fiz e logo libero do Gdrive, ai você dá uma olhada :D
Embora não tenha ainda fechado a questão da meia noite, fecharei o tópico porque o MoonSummon e SunSummon funcionam de forma satisfatória. Informações extras sobre o assunto podem ser tratadas na #14
Troca entre dia e noite quando recebe um sinal de wire. Foi baseado em um script de uma estatua por já ter funcionamento com partir de wires.
`using Microsoft.Xna.Framework; using System; using System.Linq; using Terraria; using Terraria.DataStructures; using Terraria.ID; using Terraria.ModLoader; using Terraria.ObjectData;
namespace Castleroid.Tiles { public class WiringSundial : ModTile { public override void SetDefaults() { Main.tileObsidianKill[Type] = true; TileObjectData.newTile.CopyFrom(TileObjectData.Style2xX); TileObjectData.addTile(Type); AddMapEntry(new Color(190, 230, 190), "WiringSundial"); dustType = 11; disableSmartCursor = true; }
} `