Improved the /grow command to reduce code duplication, use TileID

constants for less ambiguous types.
This commit is contained in:
James Puleo 2021-07-16 02:09:36 -04:00
parent f3b1a84821
commit e9b86b8f62
No known key found for this signature in database
GPG key ID: 3E16C7EFA34FB15D
2 changed files with 104 additions and 228 deletions

View file

@ -12,6 +12,9 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin
* Do not forget to sign every line you change with your name. (@hakusaro)
* If there is no section called "Upcoming changes" below this line, please add one with `## Upcoming changes` as the first line, and then a bulleted item directly after with the first change.
## Upcoming changes
* Improved the `/grow` command to reduce code duplication, use `TileID` constants for less ambiguous types. (@drunderscore)
## TShock 4.5.12
* Fixed the ability to spawn Zenith projectile with non-original items. (@AgaSpace)
* Added hook `GetDataHandlers.OnNpcTalk` for NpcTalk and a handler for it that stops unregistered and logged out players from interacting with NPCs, preventing them from smuggling or duplicating items via NPC item slots. (@tru321)

View file

@ -6301,7 +6301,7 @@ namespace TShockAPI
public static void Grow(CommandArgs args)
{
bool growevilAmb = args.Player.HasPermission(Permissions.growevil);
bool canGrowEvil = args.Player.HasPermission(Permissions.growevil);
string subcmd = args.Parameters.Count == 0 ? "help" : args.Parameters[0].ToLower();
var name = "Fail";
@ -6343,284 +6343,163 @@ namespace TShockAPI
}
break;
case "basic":
bool rejectCannotGrowEvil()
{
if(!canGrowEvil)
{
args.Player.SendErrorMessage("You do not have permission to grow this tree type");
return false;
}
return true;
}
bool prepareAreaForGrow(ushort groundType = TileID.Grass, bool evil = false)
{
if(evil && !rejectCannotGrowEvil())
return false;
for (var i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = groundType;
Main.tile[i, y].wall = WallID.None;
}
Main.tile[x, y - 1].wall = WallID.None;
return true;
}
bool growTree(ushort groundType, string fancyName, bool evil = false)
{
if(!prepareAreaForGrow(groundType, evil))
return false;
WorldGen.GrowTree(x, y);
name = fancyName;
return true;
}
bool growTreeByType(ushort groundType, string fancyName, ushort typeToPrepare = 2, bool evil = false)
{
if(!prepareAreaForGrow(typeToPrepare, evil))
return false;
WorldGen.TryGrowingTreeByType(groundType, x, y);
name = fancyName;
return true;
}
bool growPalmTree(ushort sandType, ushort supportingType, string properName, bool evil = false)
{
if(evil && !rejectCannotGrowEvil())
return false;
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 2;
Main.tile[i, y].wall = 0;
Main.tile[i, y].type = sandType;
Main.tile[i, y].wall = WallID.None;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.GrowTree(x, y);
name = "Basic Tree";
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y + 1].active(true);
Main.tile[i, y + 1].type = supportingType;
Main.tile[i, y + 1].wall = WallID.None;
}
Main.tile[x, y - 1].wall = WallID.None;
WorldGen.GrowPalmTree(x, y);
name = properName;
return true;
}
case "basic":
growTree(TileID.Grass, "Basic Tree");
break;
case "boreal":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 147;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.GrowTree(x, y);
name = "Boreal Tree";
growTree(TileID.SnowBlock, "Boreal Tree");
break;
case "mahogany":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 60;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.GrowTree(x, y);
name = "Rich Mahogany";
growTree(TileID.JungleGrass, "Rich Mahogany");
break;
case "sakura":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 2;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.TryGrowingTreeByType(596, x, y);
name = "Sakura Tree";
growTreeByType(TileID.VanityTreeSakura, "Sakura Tree");
break;
case "willow":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 2;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.TryGrowingTreeByType(616, x, y);
name = "Willow Tree";
growTreeByType(TileID.VanityTreeYellowWillow, "Willow Tree");
break;
case "shadewood":
if (growevilAmb)
{
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 199;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.GrowTree(x, y);
name = "Shadewood tree";
}
else args.Player.SendErrorMessage("You do not have permission to grow this tree type");
if(!growTree(TileID.CrimsonGrass, "Shadewood Tree", true))
return;
break;
case "ebonwood":
if (growevilAmb)
{
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 23;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.GrowTree(x, y);
name = "Ebonwood Tree";
}
else args.Player.SendErrorMessage("You do not have permission to grow this tree type");
if(!growTree(TileID.CorruptGrass, "Ebonwood Tree", true))
return;
break;
case "pearlwood":
if (growevilAmb)
{
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 109;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.GrowTree(x, y);
name = "Pearlwood Tree";
}
else args.Player.SendErrorMessage("You do not have permission to grow this tree type");
if(!growTree(TileID.HallowedGrass, "Pearlwood Tree", true))
return;
break;
case "palm":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 53;
Main.tile[i, y].wall = 0;
}
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y + 1].active(true);
Main.tile[i, y + 1].type = 397;
Main.tile[i, y + 1].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.GrowPalmTree(x, y);
name = "Desert Palm";
growPalmTree(TileID.Sand, TileID.HardenedSand, "Desert Palm");
break;
case "hallowpalm":
if (growevilAmb)
{
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 116;
Main.tile[i, y].wall = 0;
}
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y + 1].active(true);
Main.tile[i, y + 1].type = 402;
Main.tile[i, y + 1].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.GrowPalmTree(x, y);
name = "Hallow Palm";
}
else args.Player.SendErrorMessage("You do not have permission to grow this tree type");
if(!growPalmTree(TileID.Pearlsand, TileID.HallowHardenedSand, "Hallow Palm", true))
return;
break;
case "crimsonpalm":
if (growevilAmb)
{
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 234;
Main.tile[i, y].wall = 0;
}
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y + 1].active(true);
Main.tile[i, y + 1].type = 399;
Main.tile[i, y + 1].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.GrowPalmTree(x, y);
name = "Crimson Palm";
}
else args.Player.SendErrorMessage("You do not have permission to grow this tree type");
if(!growPalmTree(TileID.Crimsand, TileID.CrimsonHardenedSand, "Crimson Palm", true))
return;
break;
case "corruptpalm":
if (growevilAmb)
{
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 112;
Main.tile[i, y].wall = 0;
}
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y + 1].active(true);
Main.tile[i, y + 1].type = 398;
Main.tile[i, y + 1].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.GrowPalmTree(x, y);
name = "Corruption Palm";
}
else args.Player.SendErrorMessage("You do not have permission to grow this tree type");
if(!growPalmTree(TileID.Ebonsand, TileID.CorruptHardenedSand, "Corruption Palm", true))
return;
break;
case "topaz":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 1;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.TryGrowingTreeByType(583, x, y);
name = "Topaz Gemtree";
growTreeByType(TileID.TreeTopaz, "Topaz Gemtree", 1);
break;
case "amethyst":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 1;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.TryGrowingTreeByType(584, x, y);
name = "Amethyst Gemtree";
growTreeByType(TileID.TreeAmethyst, "Amethyst Gemtree", 1);
break;
case "sapphire":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 1;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.TryGrowingTreeByType(585, x, y);
name = "Sapphire Gemtree";
growTreeByType(TileID.TreeSapphire, "Sapphire Gemtree", 1);
break;
case "emerald":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 1;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.TryGrowingTreeByType(586, x, y);
name = "Emerald Gemtree";
growTreeByType(TileID.TreeEmerald, "Emerald Gemtree", 1);
break;
case "ruby":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 1;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.TryGrowingTreeByType(587, x, y);
name = "Ruby Gemtree";
growTreeByType(TileID.TreeRuby, "Ruby Gemtree", 1);
break;
case "diamond":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 1;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.TryGrowingTreeByType(588, x, y);
name = "Diamond Gemtree";
growTreeByType(TileID.TreeDiamond, "Diamond Gemtree", 1);
break;
case "amber":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 1;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
WorldGen.TryGrowingTreeByType(589, x, y);
name = "Amber Gemtree";
growTreeByType(TileID.TreeAmber, "Amber Gemtree", 1);
break;
case "cactus":
Main.tile[x, y].type = 53;
Main.tile[x, y].type = TileID.Sand;
WorldGen.GrowCactus(x, y);
name = "Cactus";
break;
@ -6628,19 +6507,13 @@ namespace TShockAPI
case "herb":
Main.tile[x, y].active(true);
Main.tile[x, y].frameX = 36;
Main.tile[x, y].type = 83;
Main.tile[x, y].type = TileID.MatureHerbs;
WorldGen.GrowAlch(x, y);
name = "Herb";
break;
case "mushroom":
for (int i = x - 2; i < x + 3; i++)
{
Main.tile[i, y].active(true);
Main.tile[i, y].type = 70;
Main.tile[i, y].wall = 0;
}
Main.tile[x, y - 1].wall = 0;
prepareAreaForGrow(TileID.MushroomGrass);
WorldGen.GrowShroom(x, y);
name = "Glowing Mushroom Tree";
break;