lukanpeixe / projetocastleroid

Trabalhando em códigos para o mod/mapa de aventura para Terraria produzido pelo Idealizador e seguidores do canal Press key to play.
Apache License 2.0
8 stars 7 forks source link

Definição dos itens iniciais #41

Closed Gurigraphics closed 7 years ago

Gurigraphics commented 7 years ago

Arquivo: ## ExamplePlayer.cs


using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Terraria;
using Terraria.DataStructures;
using Terraria.ID;
using Terraria.ModLoader;

namespace Castleroid
{
    public class ExamplePlayer : ModPlayer
    {
        private const int saveVersion = 0;
        public int score = 0;
        public bool eFlames = false;
        public bool elementShield = false;
        public int elementShields = 0;
        private int elementShieldTimer = 0;
        public int elementShieldPos = 0;
        public int lockTime = 0;
        public bool voidMonolith = false;
        public int heroLives = 0;
        public int reviveTime = 0;
        public int constantDamage = 0;
        public float percentDamage = 0f;
        public float defenseEffect = -1f;
        public bool badHeal = false;
        public int healHurt = 0;
        public bool nullified = false;  

        public bool examplePet = false;
        public bool exampleLightPet = false;

        public bool ZoneExample = false;

        public override void ResetEffects()
        {
            eFlames = false;
            elementShield = false;
            constantDamage = 0;
            percentDamage = 0f;
            defenseEffect = -1f;
            badHeal = false;
            healHurt = 0;
            nullified = false;

            examplePet = false;
            exampleLightPet = false;
        }

        public override void UpdateDead()
        {
            eFlames = false;
            badHeal = false;
        }

        public override void SaveCustomData(BinaryWriter writer)
        {
            writer.Write(saveVersion);
            writer.Write(score);
        }

        public override void LoadCustomData(BinaryReader reader)
        {
            int loadVersion = reader.ReadInt32();
            score = reader.ReadInt32();
        }

        public override void SetupStartInventory(IList<Item> items)
        {
            items.Clear();   // Remove os 3 ítens iniciais de cobre     

            Item item = new Item();
            item.SetDefaults(mod.ItemType("Item")); // Seleciona o Item de exemplo
            item.stack = 5;
            items.Add(item);   // Adiciona o Item para o inventário

            Item obj1 = new Item();
            obj1.SetDefaults("Wooden Sword");  // Adiciona um ítem qualquer pelo nome
            obj1.Prefix(-1);   

            items.Add(obj1);   // Adiciona o Item para o inventário

                        player.statLifeMax = 50; // define a quantidade máxima de vida
                        player.statLife = 50; // define a quantidade atual de vida           

        }

        public override void UpdateBadLifeRegen()
        {
            if (eFlames)
            {
                if (player.lifeRegen > 0)
                {
                    player.lifeRegen = 0;
                }
                player.lifeRegenTime = 0;
                player.lifeRegen -= 16;
            }
            if (healHurt > 0)
            {
                if (player.lifeRegen > 0)
                {
                    player.lifeRegen = 0;
                }
                player.lifeRegenTime = 0;
                player.lifeRegen -= 120 * healHurt;
            }
        }

        public override void PostUpdateBuffs()
        {
            if (nullified)
            {
                Nullify();
            }
        }

        public override void PostUpdateEquips()
        {
            if (nullified)
            {
                Nullify();
            }
            if (elementShield)
            {
                if (elementShields > 0)
                {
                    elementShieldTimer--;
                    if (elementShieldTimer < 0)
                    {
                        elementShields--;
                        elementShieldTimer = 600;
                    }
                }
            }
            else
            {
                elementShields = 0;
                elementShieldTimer = 0;
            }
            elementShieldPos++;
            elementShieldPos %= 300;
        }

        public override void FrameEffects()
        {
            if (nullified)
            {
                Nullify();
            }
        }

        private void Nullify()
        {
            player.ResetEffects();
            player.head = -1;
            player.body = -1;
            player.legs = -1;
            player.handon = -1;
            player.handoff = -1;
            player.back = -1;
            player.front = -1;
            player.shoe = -1;
            player.waist = -1;
            player.shield = -1;
            player.neck = -1;
            player.face = -1;
            player.balloon = -1;
            nullified = true;
        }

        public override bool PreHurt(bool pvp, bool quiet, ref int damage, ref int hitDirection, ref bool crit,
            ref bool customDamage, ref bool playSound, ref bool genGore, ref string deathText)
        {
            if (constantDamage > 0 || percentDamage > 0f)
            {
                int damageFromPercent = (int)(player.statLifeMax2 * percentDamage);
                damage = Math.Max(constantDamage, damageFromPercent);
                customDamage = true;
            }
            else if (defenseEffect >= 0f)
            {
                if (Main.expertMode)
                {
                    defenseEffect *= 1.5f;
                }
                damage -= (int)(player.statDefense * defenseEffect);
                if (damage < 0)
                {
                    damage = 1;
                }
                customDamage = true;
            }
            constantDamage = 0;
            percentDamage = 0f;
            defenseEffect = -1f;
            return base.PreHurt(pvp, quiet, ref damage, ref hitDirection, ref crit, ref customDamage, ref playSound, ref genGore, ref deathText);
        }       

        public override void DrawEffects(PlayerDrawInfo drawInfo, ref float r, ref float g, ref float b, ref float a, ref bool fullBright)
        {
            if (eFlames)
            {
                if (Main.rand.Next(4) == 0 && drawInfo.shadow == 0f)
                {
                    int dust = Dust.NewDust(drawInfo.position - new Vector2(2f, 2f), player.width + 4, player.height + 4, mod.DustType("EtherealFlame"), player.velocity.X * 0.4f, player.velocity.Y * 0.4f, 100, default(Color), 3f);
                    Main.dust[dust].noGravity = true;
                    Main.dust[dust].velocity *= 1.8f;
                    Main.dust[dust].velocity.Y -= 0.5f;
                    Main.playerDrawDust.Add(dust);
                }
                r *= 0.1f;
                g *= 0.2f;
                b *= 0.7f;
                fullBright = true;
            }
        }

    }
}
Gurigraphics commented 7 years ago

Esse foi mais complicado descobrir, mas foi...

O segredo está aqui:

public override void SetupStartInventory(IList items) { items.Clear(); // Remove os 3 ítens iniciais de cobre

        Item item = new Item();
        item.SetDefaults(mod.ItemType("Item")); // Seleciona o Item de exemplo
        item.stack = 5;
        items.Add(item);   // Adiciona o Item para o inventário

        Item obj1 = new Item();
        obj1.SetDefaults("Wooden Sword");  // Adiciona um ítem qualquer pelo nome
        obj1.Prefix(-1);   

        items.Add(obj1);   // Adiciona o Item para o inventário             

    }

Colocando esta linha, todos os itens do inventário são removidos. items.Clear(); // Remove os 3 ítens iniciais de cobre

Depois basta adicionar os itens:

Item item = new Item();
item.SetDefaults(mod.ItemType("Item")); // Seleciona o Item de exemplo
item.stack = 5;
items.Add(item);   // Adiciona o Item para o inventário

Também encontrei esta função, mas não testei: globalItems.Clear(); Talvez remova os acessórios também.

Esse código funciona quando um novo personagem é criado.

Bom seria obrigar o jogador a criar um novo personagem. Por exemplo, adicionar um item X quando o personagem é criado. Depois, no mapa, verificar se o personagem possui o item X. Se ele não possui, colocar dia e soltar um Skeletron Prime. kkk

Ou então, criar um item essencial para avançar no jogo, como a ideia da poção de lava. E só disponibilizar este item quando um Novo Jogador é criado.

Por exemplo, o mapa pode iniciar com o jogador cercado por um quadrado de blocos inquebráveis, como aquelas bolas de aço giratórias. E o item para sair dali pode ser um teleporte para o inicio do jogo.

O problema seria os mais espertos. Eles podem pegar o item, e sair do jogo e entrar com outro personagem. Para resolver isso, após o teleporte todos os itens teriam que ser novamente deletados. Contudo, o código acima funciona apenas quando o personagem é criado.

De qualquer forma, alguém capaz de fazer isso não representa nem 1%.

Gurigraphics commented 7 years ago

Atualizei esse código com aquela definição da vida para iniciar com 50.

player.statLifeMax = 50; // define a quantidade máxima de vida
player.statLife = 50; // define a quantidade atual de vida

Também testei isso: player.head = 20; Ele fica com um aquário na cabeça. kkk Eu ainda não tinha visto isso. ^ ^

lukanpeixe commented 7 years ago

Ele fica com um aquário na cabeça. kkk

O Equipamento favorito do @LukanPEIXE HUAHAUHAUHA não tem graça, desculpa u_u Obrigado @Gurigraphics, agora eu estou bem sem tempo, mas depois de botar as ideias no lugar, eu te digo se vou precisar de mais alguma coisa neste ponto =D

lukanpeixe commented 7 years ago

Adicionado na versão 0.106 (vide #42 ) Por enquanto a função funciona de forma satisfatória. Se caso necessário alterações posteriores, torno a abrir esta issue no futuro.