1
0

Adding Silverfish Spawning Blocks (#4946)

* added breaking, spawning, animation

* checkstyle

* added undocumented API symbols

* added changes suggested by @peterbell10

* added natural ore like generation

* fixed spawning two silverfishes

* fixed clang

* fixed clang try 2

* updated comment
unified offset

* final clang fix

* added spawning for more silverfishes if one was damaged

* fixed spawning on one hit kill

* fixed spawning on one hit kill
fixed spawning by potion damage

* fixed clang

* fixed broken build

* fixed broken build

* I should read the error message properly
fixed build now?

* added small changes suggested by @peterbell10

Co-authored-by: 12xx12 <12xx12100@gmail.com>
This commit is contained in:
12xx12 2020-10-11 17:27:41 +02:00 committed by GitHub
parent c8a1cda48c
commit c080f819d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 199 additions and 13 deletions

View File

@ -16867,6 +16867,18 @@ end
{
Notes = ""
},
E_META_SILVERFISH_EGG_CHISELED_STONE_BRICK =
{
Notes = "A flag in the metadata of the silverfish egg that the block is made from chiseled stone bricks"
},
E_META_SILVERFISH_EGG_CRACKED_STONE_BRICK =
{
Notes = "A flag in the metadata of the silverfish egg that the block is made from cracked stone bricks"
},
E_META_SILVERFISH_EGG_MOSSY_STONE_BRICK =
{
Notes = "A flag in the metadata of the silverfish egg that the block is made from mossy stone bricks"
},
E_META_SPONGE_DRY =
{
Notes = "A flag in the metadata of sponges that indicates that the sponge is dry.",

View File

@ -804,9 +804,12 @@ enum ENUM_BLOCK_META : NIBBLETYPE
E_META_SAPLING_DARK_OAK = 5,
// E_BLOCK_SILVERFISH_EGG metas:
E_META_SILVERFISH_EGG_STONE = 0,
E_META_SILVERFISH_EGG_COBBLESTONE = 1,
E_META_SILVERFISH_EGG_STONE_BRICK = 2,
E_META_SILVERFISH_EGG_STONE = 0,
E_META_SILVERFISH_EGG_COBBLESTONE = 1,
E_META_SILVERFISH_EGG_STONE_BRICK = 2,
E_META_SILVERFISH_EGG_MOSSY_STONE_BRICK = 3,
E_META_SILVERFISH_EGG_CRACKED_STONE_BRICK = 4,
E_META_SILVERFISH_EGG_CHISELED_STONE_BRICK = 5,
// E_BLOCK_SNOW metas:
E_META_SNOW_LAYER_ONE = 0,

View File

@ -56,6 +56,7 @@
#include "BlockMelon.h"
#include "BlockMobHead.h"
#include "BlockMobSpawner.h"
#include "BlockInfested.h"
#include "BlockMushroom.h"
#include "BlockMycelium.h"
#include "BlockNetherWart.h"
@ -297,7 +298,7 @@ namespace
constexpr cDefaultBlockHandler BlockHugeRedMushroomHandler (E_BLOCK_HUGE_RED_MUSHROOM);
constexpr cBlockIceHandler BlockIceHandler (E_BLOCK_ICE);
constexpr cBlockComparatorHandler BlockInactiveComparatorHandler (E_BLOCK_INACTIVE_COMPARATOR);
constexpr cDefaultBlockHandler BlockInfestedBlockHandler (E_BLOCK_SILVERFISH_EGG);
constexpr cBlockInfestedHandler BlockInfestedBlockHandler (E_BLOCK_SILVERFISH_EGG);
constexpr cDefaultBlockHandler BlockIronBarsHandler (E_BLOCK_IRON_BARS);
constexpr cDefaultBlockHandler BlockIronBlockHandler (E_BLOCK_IRON_BLOCK);
constexpr cBlockDoorHandler BlockIronDoorHandler (E_BLOCK_IRON_DOOR);

View File

@ -0,0 +1,88 @@
// BlockInfested.h
#include "../Entities/Player.h"
/* This Block Handler describes the blocks spawning silver fishes. Mojang calls them monster egg */
class cBlockInfestedHandler final:
public cBlockHandler
{
using Super = cBlockHandler;
public:
using Super::Super;
static void SpawnSilverfish(cWorldInterface & a_WorldInterface, Vector3i a_BlockPos)
{
auto Pos = Vector3f(a_BlockPos.x - 0.5f, a_BlockPos.y - 0.5f, a_BlockPos.z - 0.5f);
// TODO: only display animation if the difficulty allows mob spawns - Add when difficulty is implemented
// Spawn Silverfish
a_WorldInterface.SpawnMob(Pos.x, Pos.y, Pos.z, mtSilverfish, false);
// Play particle
a_WorldInterface.GetBroadcastManager().BroadcastParticleEffect("explode", Pos, Vector3f(), 0.1f, 50);
}
private:
virtual cItems ConvertToPickups(NIBBLETYPE a_BlockMeta, const cEntity * a_Digger, const cItem * a_Tool) const override
{
switch (a_BlockMeta)
{
case E_META_SILVERFISH_EGG_STONE:
{
if (ToolHasSilkTouch(a_Tool))
{
return cItem(E_BLOCK_STONE);
}
else
{
return cItem(E_BLOCK_COBBLESTONE);
}
}
case E_META_SILVERFISH_EGG_COBBLESTONE: return cItem(E_BLOCK_COBBLESTONE);
case E_META_SILVERFISH_EGG_STONE_BRICK: return cItem(E_BLOCK_STONE_BRICKS);
case E_META_SILVERFISH_EGG_MOSSY_STONE_BRICK: return cItem(E_BLOCK_STONE_BRICKS, 1, E_META_STONE_BRICK_MOSSY);
case E_META_SILVERFISH_EGG_CRACKED_STONE_BRICK: return cItem(E_BLOCK_STONE_BRICKS, 1, E_META_STONE_BRICK_CRACKED);
case E_META_SILVERFISH_EGG_CHISELED_STONE_BRICK: return cItem(E_BLOCK_STONE_BRICKS, 1, E_META_STONE_BRICK_ORNAMENT);
}
return {};
}
virtual void OnBroken(
cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,
Vector3i a_BlockPos,
BLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,
const cEntity * a_Digger
) const override
{
if (a_Digger != nullptr)
{
if (a_Digger->IsPlayer())
{
const auto Player = static_cast<const cPlayer *>(a_Digger);
if (Player->IsGameModeCreative())
{
return;
}
}
if (a_Digger->IsMob())
{
return;
}
}
SpawnSilverfish(a_WorldInterface, a_BlockPos);
}
virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override
{
return 11;
}
} ;

View File

@ -59,6 +59,7 @@ target_sources(
BlockMelon.h
BlockMobHead.h
BlockMobSpawner.h
BlockInfested.h
BlockMushroom.h
BlockMycelium.h
BlockNetherrack.h

View File

@ -1615,14 +1615,15 @@ const cFinishGenOres::OreInfos & cFinishGenOres::DefaultOverworldOres(void)
{
static OreInfos res
{
// OreType, OreMeta, MaxHeight, NumNests, NestSize
{E_BLOCK_COAL_ORE, 0, 127, 20, 16},
{E_BLOCK_IRON_ORE, 0, 64, 20, 8},
{E_BLOCK_GOLD_ORE, 0, 32, 2, 8},
{E_BLOCK_REDSTONE_ORE, 0, 16, 8, 7},
{E_BLOCK_DIAMOND_ORE, 0, 15, 1, 7},
{E_BLOCK_LAPIS_ORE, 0, 30, 1, 6},
{E_BLOCK_EMERALD_ORE, 0, 32, 11, 1},
// OreType, OreMeta, MaxHeight, NumNests, NestSize
{E_BLOCK_COAL_ORE, 0, 127, 20, 16},
{E_BLOCK_IRON_ORE, 0, 64, 20, 8},
{E_BLOCK_GOLD_ORE, 0, 32, 2, 8},
{E_BLOCK_REDSTONE_ORE, 0, 16, 8, 7},
{E_BLOCK_DIAMOND_ORE, 0, 15, 1, 7},
{E_BLOCK_LAPIS_ORE, 0, 30, 1, 6},
{E_BLOCK_EMERALD_ORE, 0, 32, 11, 1},
{E_BLOCK_SILVERFISH_EGG, 0, 64, 7, 9},
};
return res;
}
@ -1792,6 +1793,24 @@ void cFinishGenOreNests::GenerateOre(
}
}
if (a_OreType == E_BLOCK_SILVERFISH_EGG)
{
const auto BiomeSampleOne = a_ChunkDesc.GetBiome( 4, 4);
const auto BiomeSampleTwo = a_ChunkDesc.GetBiome( 4, 12);
const auto BiomeSampleThree = a_ChunkDesc.GetBiome(12, 4);
const auto BiomeSampleFour = a_ChunkDesc.GetBiome(12, 12);
if (
!IsBiomeMountain(BiomeSampleOne) &&
!IsBiomeMountain(BiomeSampleTwo) &&
!IsBiomeMountain(BiomeSampleThree) &&
!IsBiomeMountain(BiomeSampleFour)
)
{
return;
}
}
auto chunkX = a_ChunkDesc.GetChunkX();
auto chunkZ = a_ChunkDesc.GetChunkZ();
auto & blockTypes = a_ChunkDesc.GetBlockTypes();

View File

@ -26,6 +26,7 @@ target_sources(
Pig.cpp
Rabbit.cpp
Sheep.cpp
Silverfish.cpp
Skeleton.cpp
Slime.cpp
SnowGolem.cpp

60
src/Mobs/Silverfish.cpp Normal file
View File

@ -0,0 +1,60 @@
#include "Globals.h"
#include "Silverfish.h"
#include "../World.h"
#include "../Chunk.h"
#include "../Blocks/BlockHandler.h"
#include "../Blocks/BlockInfested.h"
bool cSilverfish::DoTakeDamage(TakeDamageInfo &a_TDI)
{
bool SuperResult = Super::DoTakeDamage(a_TDI);
// Todo: stop this if /gamerule mobGriefing is set to false
// If the entity didn't take andy damage
if (!SuperResult)
{
return SuperResult;
}
// Entity does receive lethal damage or Attacker doesn't exist
if ((m_Health < a_TDI.FinalDamage) ||
((a_TDI.Attacker == nullptr) && (a_TDI.DamageType != dtPoison) && (a_TDI.DamageType != dtPotionOfHarming)))
{
return SuperResult;
}
// If attacker is player or splash potion
bool ShouldSpawn = (
(a_TDI.DamageType == dtPoison) || (a_TDI.DamageType == dtPotionOfHarming) ||
a_TDI.Attacker->IsPlayer()
);
if (!ShouldSpawn)
{
return SuperResult;
}
auto Blocks = sSetBlockVector();
for (int X = static_cast<int>(GetPosX() - 10); X <= static_cast<int>(GetPosX() + 10); X++)
{
for (int Y = static_cast<int>(GetPosY() - 5); Y <= static_cast<int>(GetPosY() + 5); Y++)
{
for (int Z = static_cast<int>(GetPosZ() - 10); Z <= static_cast<int>(GetPosZ() + 10); Z++)
{
Blocks.emplace_back(sSetBlock({X, Y, Z}, 0, 0));
}
}
}
m_World->GetBlocks(Blocks, true);
for (const auto & BlockInfo : Blocks)
{
if (BlockInfo.m_BlockType == E_BLOCK_SILVERFISH_EGG)
{
m_World->DigBlock(BlockInfo.GetAbsolutePos(), nullptr);
}
}
return SuperResult;
}

View File

@ -18,8 +18,9 @@ public:
Super("Silverfish", mtSilverfish, "entity.silverfish.hurt", "entity.silverfish.death", "entity.silverfish.ambient", 0.3, 0.4)
{
}
CLASS_PROTODEF(cSilverfish)
virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
} ;