XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

DeathMod

【Terraria】DeathMod (now aka Soul Harvest)

公开
关注 0 Fork 0 Star 0
UTF-8
using SoulHarvest.Items;
using SoulHarvest.UI;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using Terraria;
using Terraria.Audio;
using Terraria.GameContent;
using Terraria.GameContent.ObjectInteractions;
using Terraria.ID;
using Terraria.ModLoader;
using Terraria.ObjectData;

namespace SoulHarvest.Tiles;

public class DeathAltarTile : ModTile
{
    public override void SetStaticDefaults()
    {
        Main.tileFrameImportant[Type] = true;
        Main.tileNoAttach[Type] = true;
        Main.tileLighted[Type] = true;
        TileID.Sets.InteractibleByNPCs[Type] = true;

        TileObjectData.newTile.CopyFrom(TileObjectData.Style3x4);
        TileObjectData.newTile.LavaDeath = false;
        TileObjectData.newTile.DrawYOffset = 2;
        TileObjectData.addTile(Type);

        DustType = DustID.Obsidian;
        RegisterItemDrop(ModContent.ItemType<DeathAltarItem>());
        AddMapEntry(new Color(92, 45, 125), Mod.GetLocalization("Tiles.DeathAltarTile.MapEntry"));
    }

    public override bool HasSmartInteract(int i, int j, SmartInteractScanSettings settings)
    {
        return true;
    }

    public override bool RightClick(int i, int j)
    {
        if (Main.netMode != NetmodeID.Server)
        {
            SoundEngine.PlaySound(SoundID.MenuOpen);
            ModContent.GetInstance<DeathAltarUISystem>().Show(i, j);
        }
        return true;
    }

    public override void MouseOver(int i, int j)
    {
        Player player = Main.LocalPlayer;
        player.noThrow = 2;
        player.cursorItemIconEnabled = true;
        player.cursorItemIconID = ModContent.ItemType<DeathAltarItem>();
    }

    public override void ModifyLight(int i, int j, ref float r, ref float g, ref float b)
    {
        Tile tile = Framing.GetTileSafely(i, j);
        if (tile.TileFrameX == 18 && tile.TileFrameY == 18)
        {
            float pulse = 0.1f + (float)Math.Sin(Main.GlobalTimeWrappedHourly * 3f) * 0.025f;
            r = 0.28f + pulse * 1.6f;
            g = 0.03f + pulse * 0.24f;
            b = 0.04f + pulse * 0.35f;
        }
    }

    public override bool PreDraw(int i, int j, SpriteBatch spriteBatch)
    {
        Tile tile = Framing.GetTileSafely(i, j);
        if (tile.TileFrameX != 0 || tile.TileFrameY != 0)
            return false;

        Texture2D texture = TextureAssets.Tile[Type].Value;
        Vector2 offScreen = Main.drawToScreen ? Vector2.Zero : new Vector2(Main.offScreenRange);
        Vector2 drawPosition = new Vector2(i * 16f + 24f, j * 16f + 34f) - Main.screenPosition + offScreen;
        Vector2 origin = texture.Size() / 2f;
        float scale = 70f / texture.Height;
        float pulse = 1f + (float)Math.Sin(Main.GlobalTimeWrappedHourly * 3f) * 0.025f;
        Color lightColor = Color.Lerp(Lighting.GetColor(i + 1, j + 2), Color.White, 0.4f);
        Color glowColor = new Color(255, 28, 42, 0) * 0.24f;

        for (int direction = 0; direction < 4; direction++)
        {
            Vector2 offset = (MathHelper.PiOver2 * direction).ToRotationVector2() * (2f + pulse);
            spriteBatch.Draw(texture, drawPosition + offset, null, glowColor, 0f, origin, scale * pulse, SpriteEffects.None, 0f);
        }
        spriteBatch.Draw(texture, drawPosition, null, lightColor, 0f, origin, scale, SpriteEffects.None, 0f);
        return false;
    }
}