Started work on Staff of Shifting Sands

This commit is contained in:
FyloZ 2020-06-12 19:28:38 -04:00
parent 601b097dc2
commit 06fa4569a8
6 changed files with 677 additions and 1 deletions

View File

@ -0,0 +1,29 @@
using Decimation.Content.NPCs.DuneWyrm.AncientTombCrawler;
using Decimation.Lib.Items;
using Decimation.Lib.Util;
using Terraria;
using Terraria.ModLoader;
namespace Decimation.Content.Items.Weapons.DuneWyrm
{
public class StaffofShiftingSands : DecimationWeapon
{
protected override string ItemName => "Staff of Shifting Sands";
protected override int Damages => 30;
protected override DamageType DamagesType => DamageType.Summon;
protected override void InitWeapon()
{
item.width = 42;
item.height = 42;
item.rare = Rarity.LightRed.GetRarityValue();
}
public override bool UseItem(Player player)
{
NPC.SpawnOnPlayer(player.whoAmI, ModContent.NPCType<AncientTombCrawlerFriendly>());
return true;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,146 @@
using System.IO;
using Decimation.Lib.NPCs;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Terraria;
using Terraria.ID;
using Terraria.ModLoader;
namespace Decimation.Content.NPCs.DuneWyrm.AncientTombCrawler
{
public class AncientTombCrawlerFriendlyHead : AncientTombCrawlerFriendly
{
public override void SetDefaults()
{
npc.damage = 50;
npc.defense = 5;
npc.width = 38;
npc.height = 38;
npc.value = Item.buyPrice(gold: 3);
npc.npcSlots = 1f;
npc.aiStyle = -1;
npc.dontTakeDamage = true;
}
public override void Init()
{
base.Init();
head = true;
}
public override bool PreDraw(SpriteBatch spriteBatch, Color drawColor)
{
Draw("Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerHead", spriteBatch, drawColor);
return false;
}
}
public class AncientTombCrawlerFriendlyBody : AncientTombCrawlerFriendly
{
public override void SetDefaults()
{
npc.width = 24;
npc.height = 24;
npc.damage = 35;
npc.defense = 2;
npc.lifeMax = 1;
npc.dontCountMe = true;
}
public override bool PreDraw(SpriteBatch spriteBatch, Color drawColor)
{
Draw("Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerBody", spriteBatch, drawColor);
return false;
}
}
public class AncientTombCrawlerFriendlyTail : AncientTombCrawlerFriendly
{
public override void SetDefaults()
{
npc.width = 20;
npc.height = 20;
npc.damage = 35;
npc.defense = 2;
npc.lifeMax = 1;
npc.dontCountMe = true;
}
public override void Init()
{
base.Init();
tail = true;
}
public override bool PreDraw(SpriteBatch spriteBatch, Color drawColor)
{
Draw("Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerTail", spriteBatch, drawColor);
return false;
}
}
public abstract class AncientTombCrawlerFriendly : Worm
{
protected const float BaseSpeed = 10f;
public override void SetStaticDefaults()
{
DisplayName.SetDefault("Ancient Tomb Crawler");
}
public override void Init()
{
minLength = 8;
maxLength = 8;
tailType = ModContent.NPCType<AncientTombCrawlerTail>();
bodyType = ModContent.NPCType<AncientTombCrawlerBody>();
headType = ModContent.NPCType<AncientTombCrawlerHead>();
speed = BaseSpeed;
turnSpeed = 0.045f;
npc.scale = 1.5f;
npc.lavaImmune = true;
npc.noGravity = true;
npc.noTileCollide = true;
npc.behindTiles = true;
npc.knockBackResist = 0f;
npc.netAlways = true;
npc.DeathSound = SoundID.NPCDeath18;
npc.HitSound = SoundID.NPCHit1;
undergroundSound = mod.GetLegacySoundSlot(SoundType.Custom, "Sounds/Custom/Earthquake");
}
protected override void SendSoundPacket()
{
// GetPacket(AncientTombCrawlerMessageType.UndergroundSound).Send();
}
private ModPacket GetPacket(AncientTombCrawlerMessageType type)
{
ModPacket packet = mod.GetPacket();
// packet.Write((byte) DecimationModMessageType.AncientTombCrawler);
// packet.Write(npc.whoAmI);
// packet.Write((byte) type);
return packet;
}
public void HandlePacket(BinaryReader reader)
{
// AncientTombCrawlerMessageType type = (AncientTombCrawlerMessageType) reader.ReadByte();
// switch (type)
// {
// case AncientTombCrawlerMessageType.UndergroundSound:
// Main.PlaySound(undergroundSound, npc.Center);
// break;
// }
}
public override bool ShouldRun()
{
return false;
}
}
}

View File

@ -11,7 +11,8 @@ namespace Decimation.Lib.Items
Melee,
Magic,
Throw,
Ranged
Ranged,
Summon
}
protected virtual DamageType DamagesType { get; } = DamageType.Melee;
@ -43,6 +44,9 @@ namespace Decimation.Lib.Items
case DamageType.Throw:
item.thrown = true;
break;
case DamageType.Summon:
item.summon = true;
break;
default:
item.melee = true;
break;

View File

@ -0,0 +1,485 @@
using System;
using Decimation.Content.Projectiles;
using Decimation.Lib.Util;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Terraria;
using Terraria.ID;
namespace Decimation.Lib.projectiles
{
public abstract class WormProjectile : DecimationProjectile
{
// protected int BodyType;
// protected bool Directional = false;
//
// protected bool Flies = false;
//
// /* ai[0] = follower
// * ai[1] = following
// * ai[2] = distanceFromTail
// * ai[3] = head
// */
// protected bool Head;
// protected int HeadType;
// protected int MaxLength;
// protected int MinLength;
// protected float Speed;
// protected bool Tail;
// protected int TailType;
//
// protected float TurnSpeed;
//
// protected int Target;
// protected int RealLife;
//
// public override void AI()
// {
// if (projectile.localAI[1] == 0f)
// {
// projectile.localAI[1] = 1f;
// Init();
// }
//
// if (projectile.ai[3] > 0f) RealLife = (int) projectile.ai[3];
// if (!Head && projectile.timeLeft < 300) projectile.timeLeft = 300;
// if (Target < 0 || Target == 255 || Main.player[Target].dead)
// TargetClosest();
// if (Main.player[Target].dead && projectile.timeLeft > 300) projectile.timeLeft = 300;
// if (Main.netMode != 1)
// {
// if (!Tail && projectile.ai[0] == 0f)
// {
// if (Head)
// {
// projectile.ai[3] = projectile.whoAmI;
// RealLife = projectile.whoAmI;
// projectile.ai[2] = Main.rand.Next(MinLength, MaxLength + 1);
// projectile.ai[0] = Projectile.NewProjectile(
// (int) (projectile.position.X + projectile.width / 2f),
// (int) (projectile.position.Y + projectile.height),
// 0f,
// 0f,
// BodyType,
// 0,
// 0f,
// projectile.owner
// );
// }
// else if (projectile.ai[2] > 0f)
// {
// projectile.ai[0] = Projectile.NewProjectile(
// (int) (projectile.position.X + projectile.width / 2f),
// (int) (projectile.position.Y + projectile.height),
// 0f,
// 0f,
// projectile.type,
// 0,
// 0f,
// projectile.owner
// );
// }
// else
// {
// projectile.ai[0] = Projectile.NewProjectile(
// (int) (projectile.position.X + projectile.width / 2f),
// (int) (projectile.position.Y + projectile.height),
// 0f,
// 0f,
// TailType,
// 0,
// 0f,
// projectile.whoAmI
// );
// }
//
// Main.projectile[(int) projectile.ai[0]].ai[3] = projectile.ai[3];
// ((WormProjectile) Main.projectile[(int) projectile.ai[0]].modProjectile).RealLife = RealLife;
// Main.projectile[(int) projectile.ai[0]].ai[1] = projectile.whoAmI;
// Main.projectile[(int) projectile.ai[0]].ai[2] = projectile.ai[2] - 1f;
// projectile.netUpdate = true;
// }
//
// if (!Head && (!Main.projectile[(int) projectile.ai[1]].active ||
// Main.projectile[(int) projectile.ai[1]].type != HeadType &&
// Main.projectile[(int) projectile.ai[1]].type != BodyType))
// {
// // projectile.life = 0;
// // projectile.HitEffect();
// projectile.active = false;
// }
//
// if (!Tail && (!Main.projectile[(int) projectile.ai[0]].active ||
// Main.projectile[(int) projectile.ai[0]].type != BodyType &&
// Main.projectile[(int) projectile.ai[0]].type != TailType))
// {
// // projectile.life = 0;
// // projectile.HitEffect();
// projectile.active = false;
// }
//
// if (!projectile.active && Main.netMode == 2)
// NetMessage.SendData(28, -1, -1, null, projectile.whoAmI, -1f);
// }
//
// var num180 = (int) (projectile.position.X / 16f) - 1;
// var num181 = (int) ((projectile.position.X + projectile.width) / 16f) + 2;
// var num182 = (int) (projectile.position.Y / 16f) - 1;
// var num183 = (int) ((projectile.position.Y + projectile.height) / 16f) + 2;
// if (num180 < 0) num180 = 0;
// if (num181 > Main.maxTilesX) num181 = Main.maxTilesX;
// if (num182 < 0) num182 = 0;
// if (num183 > Main.maxTilesY) num183 = Main.maxTilesY;
// var flag18 = Flies;
// if (!flag18)
// for (var num184 = num180; num184 < num181; num184++)
// for (var num185 = num182; num185 < num183; num185++)
// if (Main.tile[num184, num185] != null &&
// (Main.tile[num184, num185].nactive() &&
// (Main.tileSolid[Main.tile[num184, num185].type] ||
// Main.tileSolidTop[Main.tile[num184, num185].type] && Main.tile[num184, num185].frameY == 0) ||
// Main.tile[num184, num185].liquid > 64))
// {
// Vector2 vector17;
// vector17.X = num184 * 16;
// vector17.Y = num185 * 16;
// if (projectile.position.X + projectile.width > vector17.X &&
// projectile.position.X < vector17.X + 16f &&
// projectile.position.Y + projectile.height > vector17.Y &&
// projectile.position.Y < vector17.Y + 16f)
// {
// flag18 = true;
// // if (Main.rand.NextBool(100) && projectile.behindTiles &&
// // Main.tile[num184, num185].nactive())
// // WorldGen.KillTile(num184, num185, true, true);
// if (Main.netMode != 1 && Main.tile[num184, num185].type == 2)
// {
// var arg_BFCA_0 = Main.tile[num184, num185 - 1].type;
// }
// }
// }
//
// if (!flag18 && Head)
// {
// var rectangle = new Rectangle((int) projectile.position.X, (int) projectile.position.Y,
// projectile.width, projectile.height);
// var num186 = 1000;
// var flag19 = true;
// for (var num187 = 0; num187 < 255; num187++)
// if (Main.player[num187].active)
// {
// var rectangle2 = new Rectangle((int) Main.player[num187].position.X - num186,
// (int) Main.player[num187].position.Y - num186, num186 * 2, num186 * 2);
// if (rectangle.Intersects(rectangle2))
// {
// flag19 = false;
// break;
// }
// }
//
// if (flag19) flag18 = true;
// }
//
// if (Directional)
// {
// if (projectile.velocity.X < 0f)
// projectile.spriteDirection = 1;
// else if (projectile.velocity.X > 0f) projectile.spriteDirection = -1;
// }
//
// var num188 = Speed;
// var num189 = TurnSpeed;
// var vector18 = new Vector2(projectile.position.X + projectile.width * 0.5f,
// projectile.position.Y + projectile.height * 0.5f);
// var num191 = Main.player[Target].position.X + Main.player[Target].width / 2;
// var num192 = Main.player[Target].position.Y + Main.player[Target].height / 2;
// num191 = (int) (num191 / 16f) * 16;
// num192 = (int) (num192 / 16f) * 16;
// vector18.X = (int) (vector18.X / 16f) * 16;
// vector18.Y = (int) (vector18.Y / 16f) * 16;
// num191 -= vector18.X;
// num192 -= vector18.Y;
// var num193 = (float) Math.Sqrt(num191 * num191 + num192 * num192);
// if (projectile.ai[1] > 0f && projectile.ai[1] < Main.projectile.Length)
// {
// try
// {
// vector18 = new Vector2(projectile.position.X + projectile.width * 0.5f,
// projectile.position.Y + projectile.height * 0.5f);
// num191 = Main.projectile[(int) projectile.ai[1]].position.X +
// Main.projectile[(int) projectile.ai[1]].width / 2 -
// vector18.X;
// num192 = Main.projectile[(int) projectile.ai[1]].position.Y +
// Main.projectile[(int) projectile.ai[1]].height / 2 -
// vector18.Y;
// }
// catch
// {
// }
//
// projectile.rotation = (float) Math.Atan2(num192, num191) + 1.57f;
// num193 = (float) Math.Sqrt(num191 * num191 + num192 * num192);
// int num194 = projectile.width;
// num193 = (num193 - num194) / num193;
// num191 *= num193;
// num192 *= num193;
// projectile.velocity = Vector2.Zero;
// projectile.position.X = projectile.position.X + num191;
// projectile.position.Y = projectile.position.Y + num192;
// if (Directional)
// {
// if (num191 < 0f) projectile.spriteDirection = 1;
// if (num191 > 0f) projectile.spriteDirection = -1;
// }
// }
// else
// {
// if (!flag18)
// {
// TargetClosest();
// projectile.velocity.Y = projectile.velocity.Y + 0.11f;
// if (projectile.velocity.Y > num188) projectile.velocity.Y = num188;
// if (Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) < num188 * 0.4)
// {
// if (projectile.velocity.X < 0f)
// projectile.velocity.X = projectile.velocity.X - num189 * 1.1f;
// else
// projectile.velocity.X = projectile.velocity.X + num189 * 1.1f;
// }
// else if (projectile.velocity.Y == num188)
// {
// if (projectile.velocity.X < num191)
// projectile.velocity.X = projectile.velocity.X + num189;
// else if (projectile.velocity.X > num191) projectile.velocity.X = projectile.velocity.X - num189;
// }
// else if (projectile.velocity.Y > 4f)
// {
// if (projectile.velocity.X < 0f)
// projectile.velocity.X = projectile.velocity.X + num189 * 0.9f;
// else
// projectile.velocity.X = projectile.velocity.X - num189 * 0.9f;
// }
// }
// else
// {
// if (!Flies && projectile.BehindTiles() && projectile.soundDelay == 0)
// if (Main.netMode != NetmodeID.MultiplayerClient)
// {
// projectile.soundDelay = 120;
//
// Main.PlaySound(undergroundSound, projectile.position);
// if (Main.netMode == NetmodeID.Server) SendSoundPacket();
// }
//
// num193 = (float) Math.Sqrt(num191 * num191 + num192 * num192);
// var num196 = Math.Abs(num191);
// var num197 = Math.Abs(num192);
// var num198 = num188 / num193;
// num191 *= num198;
// num192 *= num198;
// if (ShouldRun())
// {
// if (Main.netMode != 1 &&
// projectile.position.Y / 16f > (Main.rockLayer + Main.maxTilesY) / 2.0)
// {
// projectile.active = false;
// var num200 = (int) projectile.ai[0];
// while (num200 > 0 && num200 < 200 && Main.projectile[num200].active &&
// Main.projectile[num200].aiStyle == projectile.aiStyle)
// {
// var num201 = (int) Main.projectile[num200].ai[0];
// Main.projectile[num200].active = false;
// projectile.life = 0;
// if (Main.netMode == 2) NetMessage.SendData(23, -1, -1, null, num200);
// num200 = num201;
// }
//
// if (Main.netMode == 2) NetMessage.SendData(23, -1, -1, null, projectile.whoAmI);
// }
//
// num191 = 0f;
// num192 = num188;
// }
//
// var flag21 = false;
// if (projectile.type == 87)
// {
// if ((projectile.velocity.X > 0f && num191 < 0f || projectile.velocity.X < 0f && num191 > 0f ||
// projectile.velocity.Y > 0f && num192 < 0f || projectile.velocity.Y < 0f && num192 > 0f) &&
// Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) > num189 / 2f &&
// num193 < 300f)
// {
// flag21 = true;
// if (Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) < num188)
// projectile.velocity *= 1.1f;
// }
//
// if (projectile.position.Y > Main.player[Target].position.Y ||
// Main.player[Target].position.Y / 16f > Main.worldSurface ||
// Main.player[Target].dead)
// {
// flag21 = true;
// if (Math.Abs(projectile.velocity.X) < num188 / 2f)
// {
// if (projectile.velocity.X == 0f)
// projectile.velocity.X = projectile.velocity.X - projectile.direction;
// projectile.velocity.X = projectile.velocity.X * 1.1f;
// }
// else
// {
// if (projectile.velocity.Y > -num188)
// projectile.velocity.Y = projectile.velocity.Y - num189;
// }
// }
// }
//
// if (!flag21)
// {
// if (projectile.velocity.X > 0f && num191 > 0f || projectile.velocity.X < 0f && num191 < 0f ||
// projectile.velocity.Y > 0f && num192 > 0f || projectile.velocity.Y < 0f && num192 < 0f)
// {
// if (projectile.velocity.X < num191)
// {
// projectile.velocity.X = projectile.velocity.X + num189;
// }
// else
// {
// if (projectile.velocity.X > num191)
// projectile.velocity.X = projectile.velocity.X - num189;
// }
//
// if (projectile.velocity.Y < num192)
// {
// projectile.velocity.Y = projectile.velocity.Y + num189;
// }
// else
// {
// if (projectile.velocity.Y > num192)
// projectile.velocity.Y = projectile.velocity.Y - num189;
// }
//
// if (Math.Abs(num192) < num188 * 0.2 &&
// (projectile.velocity.X > 0f && num191 < 0f ||
// projectile.velocity.X < 0f && num191 > 0f))
// {
// if (projectile.velocity.Y > 0f)
// projectile.velocity.Y = projectile.velocity.Y + num189 * 2f;
// else
// projectile.velocity.Y = projectile.velocity.Y - num189 * 2f;
// }
//
// if (Math.Abs(num191) < num188 * 0.2 &&
// (projectile.velocity.Y > 0f && num192 < 0f ||
// projectile.velocity.Y < 0f && num192 > 0f))
// {
// if (projectile.velocity.X > 0f)
// projectile.velocity.X = projectile.velocity.X + num189 * 2f;
// else
// projectile.velocity.X = projectile.velocity.X - num189 * 2f;
// }
// }
// else
// {
// if (num196 > num197)
// {
// if (projectile.velocity.X < num191)
// projectile.velocity.X = projectile.velocity.X + num189 * 1.1f;
// else if (projectile.velocity.X > num191)
// projectile.velocity.X = projectile.velocity.X - num189 * 1.1f;
// if (Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) < num188 * 0.5)
// {
// if (projectile.velocity.Y > 0f)
// projectile.velocity.Y = projectile.velocity.Y + num189;
// else
// projectile.velocity.Y = projectile.velocity.Y - num189;
// }
// }
// else
// {
// if (projectile.velocity.Y < num192)
// projectile.velocity.Y = projectile.velocity.Y + num189 * 1.1f;
// else if (projectile.velocity.Y > num192)
// projectile.velocity.Y = projectile.velocity.Y - num189 * 1.1f;
// if (Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) < num188 * 0.5)
// {
// if (projectile.velocity.X > 0f)
// projectile.velocity.X = projectile.velocity.X + num189;
// else
// projectile.velocity.X = projectile.velocity.X - num189;
// }
// }
// }
// }
// }
//
// projectile.rotation = (float) Math.Atan2(projectile.velocity.Y, projectile.velocity.X) + 1.57f;
// if (Head)
// {
// if (flag18)
// {
// if (projectile.localAI[0] != 1f) projectile.netUpdate = true;
// projectile.localAI[0] = 1f;
// }
// else
// {
// if (projectile.localAI[0] != 0f) projectile.netUpdate = true;
// projectile.localAI[0] = 0f;
// }
//
// if ((projectile.velocity.X > 0f && projectile.oldVelocity.X < 0f ||
// projectile.velocity.X < 0f && projectile.oldVelocity.X > 0f ||
// projectile.velocity.Y > 0f && projectile.oldVelocity.Y < 0f ||
// projectile.velocity.Y < 0f && projectile.oldVelocity.Y > 0f) && !projectile.justHit)
// {
// projectile.netUpdate = true;
// return;
// }
// }
// }
//
// CustomBehavior();
// }
//
// public virtual void Init()
// {
// }
//
// public virtual bool ShouldRun()
// {
// return false;
// }
//
// public virtual void CustomBehavior()
// {
// }
//
// public override bool? DrawHealthBar(byte hbPosition, ref float scale, ref Vector2 position)
// {
// return Head ? (bool?) null : false;
// }
//
// protected void Draw(string texturePath, SpriteBatch spriteBatch, Color drawColor)
// {
// var frameSize = new Vector2(projectile.width, projectile.height);
// var texture = mod.GetTexture(texturePath);
//
// spriteBatch.Draw
// (
// texture,
// new Vector2(
// projectile.position.X - Main.screenPosition.X + frameSize.X / 2,
// projectile.position.Y - Main.screenPosition.Y + frameSize.Y / 2
// ),
// projectile.frame,
// drawColor,
// projectile.rotation,
// frameSize * 0.5f,
// projectile.scale,
// SpriteEffects.None,
// 0f
// );
// }
//
// protected abstract void SendSoundPacket();
}
}

View File

@ -0,0 +1,12 @@
using Terraria;
namespace Decimation.Lib.Util
{
public static class ProjectileUtils
{
public static bool BehindTiles(this Projectile projectile)
{
return Main.tile[(int) projectile.position.X, (int) projectile.position.Y].type == -1; // TODO ?
}
}
}