1
0

Merge pull request #1680 from Masy98/entities

Added Guardian
This commit is contained in:
Mattes D 2014-12-19 23:37:35 +01:00
commit ffd8356fc1
16 changed files with 149 additions and 1 deletions

View File

@ -192,3 +192,10 @@ AttackDamage=0.0
SightDistance=25.0 SightDistance=25.0
MaxHealth=6 MaxHealth=6
[Guardian]
AttackRange=2.0
AttackRate=1
AttackDamage=9.0
SightDistance=25.0
MaxHealth=30

View File

@ -26,6 +26,7 @@ struct
{entEnderman, "Enderman"}, {entEnderman, "Enderman"},
{entGhast, "Ghast"}, {entGhast, "Ghast"},
{entGiant, "Giant"}, {entGiant, "Giant"},
{entGuardian, "Guardian"},
{entLavaSlime, "LavaSlime"}, {entLavaSlime, "LavaSlime"},
{entMushroomCow, "MushroomCow"}, {entMushroomCow, "MushroomCow"},
{entOzelot, "Ozelot"}, {entOzelot, "Ozelot"},

View File

@ -25,6 +25,7 @@ enum eEntityType
entEnderman, entEnderman,
entGhast, entGhast,
entGiant, entGiant,
entGuardian,
entLavaSlime, entLavaSlime,
entMushroomCow, entMushroomCow,
entOzelot, entOzelot,

View File

@ -959,6 +959,7 @@ enum
E_META_SPAWN_EGG_WITHER = 64, E_META_SPAWN_EGG_WITHER = 64,
E_META_SPAWN_EGG_BAT = 65, E_META_SPAWN_EGG_BAT = 65,
E_META_SPAWN_EGG_WITCH = 66, E_META_SPAWN_EGG_WITCH = 66,
E_META_SPAWN_EGG_GUARDIAN = 68,
E_META_SPAWN_EGG_PIG = 90, E_META_SPAWN_EGG_PIG = 90,
E_META_SPAWN_EGG_SHEEP = 91, E_META_SPAWN_EGG_SHEEP = 91,
E_META_SPAWN_EGG_COW = 92, E_META_SPAWN_EGG_COW = 92,

View File

@ -64,6 +64,7 @@ public:
case E_META_SPAWN_EGG_CREEPER: return mtCreeper; case E_META_SPAWN_EGG_CREEPER: return mtCreeper;
case E_META_SPAWN_EGG_ENDERMAN: return mtEnderman; case E_META_SPAWN_EGG_ENDERMAN: return mtEnderman;
case E_META_SPAWN_EGG_GHAST: return mtGhast; case E_META_SPAWN_EGG_GHAST: return mtGhast;
case E_META_SPAWN_EGG_GUARDIAN: return mtGuardian;
case E_META_SPAWN_EGG_HORSE: return mtHorse; case E_META_SPAWN_EGG_HORSE: return mtHorse;
case E_META_SPAWN_EGG_MAGMA_CUBE: return mtMagmaCube; case E_META_SPAWN_EGG_MAGMA_CUBE: return mtMagmaCube;
case E_META_SPAWN_EGG_MOOSHROOM: return mtMooshroom; case E_META_SPAWN_EGG_MOOSHROOM: return mtMooshroom;

View File

@ -83,6 +83,7 @@ eMonsterType cMobSpawner::ChooseMobType(EMCSBiome a_Biome)
addIfAllowed(mtSkeleton, allowedMobs); addIfAllowed(mtSkeleton, allowedMobs);
addIfAllowed(mtCreeper, allowedMobs); addIfAllowed(mtCreeper, allowedMobs);
addIfAllowed(mtSquid, allowedMobs); addIfAllowed(mtSquid, allowedMobs);
addIfAllowed(mtGuardian, allowedMobs);
if ((a_Biome != biDesert) && (a_Biome != biBeach) && (a_Biome != biOcean)) if ((a_Biome != biDesert) && (a_Biome != biBeach) && (a_Biome != biOcean))
{ {
@ -144,6 +145,11 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R
switch (a_MobType) switch (a_MobType)
{ {
case mtGuardian:
{
return IsBlockWater(TargetBlock) && (a_RelY >= 45) && (a_RelY <= 62);
}
case mtSquid: case mtSquid:
{ {
return IsBlockWater(TargetBlock) && (a_RelY >= 45) && (a_RelY <= 62); return IsBlockWater(TargetBlock) && (a_RelY >= 45) && (a_RelY <= 62);

View File

@ -16,6 +16,7 @@ SET (SRCS
Enderman.cpp Enderman.cpp
Ghast.cpp Ghast.cpp
Giant.cpp Giant.cpp
Guardian.cpp
Horse.cpp Horse.cpp
IronGolem.cpp IronGolem.cpp
MagmaCube.cpp MagmaCube.cpp
@ -49,6 +50,7 @@ SET (HDRS
Enderman.h Enderman.h
Ghast.h Ghast.h
Giant.h Giant.h
Guardian.h
Horse.h Horse.h
IncludeAllMonsters.h IncludeAllMonsters.h
IronGolem.h IronGolem.h

65
src/Mobs/Guardian.cpp Normal file
View File

@ -0,0 +1,65 @@
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
#include "Guardian.h"
#include "../Vector3.h"
#include "../Chunk.h"
cGuardian::cGuardian(void) :
super("Guardian", mtGuardian, "mob.guardian.idle", "mob.guardian.death", 0.875, 0.8)
{
}
void cGuardian::GetDrops(cItems & a_Drops, cEntity * a_Killer)
{
// Drops 0-3 Ink Sacs
int LootingLevel = 0;
if (a_Killer != nullptr)
{
LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);
}
AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_PRISMARINE_SHARD);
AddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_RAW_FISH);
AddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_PRISMARINE_CRYSTALS); // ToDo: Prismarine Crystals only drop if the raw fish drop is 0
}
void cGuardian::Tick(float a_Dt, cChunk & a_Chunk)
{
// We must first process current location, and only then tick, otherwise we risk processing a location in a chunk
// that is not where the entity currently resides (FS #411)
Vector3d Pos = GetPosition();
// TODO: Not a real behavior, but cool :D
int RelY = (int)floor(Pos.y);
if ((RelY < 0) || (RelY >= cChunkDef::Height))
{
return;
}
int RelX = (int)floor(Pos.x) - a_Chunk.GetPosX() * cChunkDef::Width;
int RelZ = (int)floor(Pos.z) - a_Chunk.GetPosZ() * cChunkDef::Width;
BLOCKTYPE BlockType;
if (a_Chunk.UnboundedRelGetBlockType(RelX, RelY, RelZ, BlockType) && !IsBlockWater(BlockType) && !IsOnFire())
{
// Burn for 10 ticks, then decide again
StartBurning(10);
}
super::Tick(a_Dt, a_Chunk);
}

31
src/Mobs/Guardian.h Normal file
View File

@ -0,0 +1,31 @@
#pragma once
#include "AggressiveMonster.h"
class cGuardian :
public cAggressiveMonster
{
typedef cAggressiveMonster super;
public:
cGuardian();
virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
CLASS_PROTODEF(cGuardian)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
// Guardians do not drown (or float)
virtual void HandleAir(void) override {}
virtual void SetSwimState(cChunk & a_Chunk) override {}
} ;

View File

@ -8,6 +8,7 @@
#include "EnderDragon.h" #include "EnderDragon.h"
#include "Ghast.h" #include "Ghast.h"
#include "Giant.h" #include "Giant.h"
#include "Guardian.h"
#include "Horse.h" #include "Horse.h"
#include "IronGolem.h" #include "IronGolem.h"
#include "MagmaCube.h" #include "MagmaCube.h"

View File

@ -38,6 +38,7 @@ static const struct
{mtEnderman, "enderman", "Enderman"}, {mtEnderman, "enderman", "Enderman"},
{mtEnderDragon, "enderdragon", "EnderDragon"}, {mtEnderDragon, "enderdragon", "EnderDragon"},
{mtGhast, "ghast", "Ghast"}, {mtGhast, "ghast", "Ghast"},
{mtGuardian, "guardian", "Guardian"},
{mtHorse, "horse", "EntityHorse"}, {mtHorse, "horse", "EntityHorse"},
{mtIronGolem, "irongolem", "VillagerGolem"}, {mtIronGolem, "irongolem", "VillagerGolem"},
{mtMagmaCube, "magmacube", "LavaSlime"}, {mtMagmaCube, "magmacube", "LavaSlime"},
@ -513,6 +514,7 @@ void cMonster::KilledBy(TakeDamageInfo & a_TDI)
case mtCreeper: case mtCreeper:
case mtEnderman: case mtEnderman:
case mtGhast: case mtGhast:
case mtGuardian:
case mtSilverfish: case mtSilverfish:
case mtSkeleton: case mtSkeleton:
case mtSpider: case mtSpider:
@ -842,6 +844,7 @@ cMonster::eFamily cMonster::FamilyFromType(eMonsterType a_Type)
case mtEnderman: return mfHostile; case mtEnderman: return mfHostile;
case mtGhast: return mfHostile; case mtGhast: return mfHostile;
case mtGiant: return mfNoSpawn; case mtGiant: return mfNoSpawn;
case mtGuardian: return mfWater; // Just because they have special spawning conditions. If Watertemples have been added, this needs to be edited!
case mtHorse: return mfPassive; case mtHorse: return mfPassive;
case mtIronGolem: return mfPassive; case mtIronGolem: return mfPassive;
case mtMagmaCube: return mfHostile; case mtMagmaCube: return mfHostile;
@ -955,6 +958,7 @@ cMonster * cMonster::NewMonsterFromType(eMonsterType a_MobType)
case mtEnderman: toReturn = new cEnderman(); break; case mtEnderman: toReturn = new cEnderman(); break;
case mtGhast: toReturn = new cGhast(); break; case mtGhast: toReturn = new cGhast(); break;
case mtGiant: toReturn = new cGiant(); break; case mtGiant: toReturn = new cGiant(); break;
case mtGuardian: toReturn = new cGuardian(); break;
case mtIronGolem: toReturn = new cIronGolem(); break; case mtIronGolem: toReturn = new cIronGolem(); break;
case mtMooshroom: toReturn = new cMooshroom(); break; case mtMooshroom: toReturn = new cMooshroom(); break;
case mtOcelot: toReturn = new cOcelot(); break; case mtOcelot: toReturn = new cOcelot(); break;

View File

@ -30,7 +30,7 @@ public:
mfHostile = 0, // Spider, Zombies ... mfHostile = 0, // Spider, Zombies ...
mfPassive = 1, // Cows, Pigs mfPassive = 1, // Cows, Pigs
mfAmbient = 2, // Bats mfAmbient = 2, // Bats
mfWater = 3, // Squid mfWater = 3, // Squid, Guardian
mfNoSpawn, mfNoSpawn,
mfUnhandled, // Nothing. Be sure this is the last and the others are in order mfUnhandled, // Nothing. Be sure this is the last and the others are in order

View File

@ -18,6 +18,7 @@ enum eMonsterType
mtEnderman = E_META_SPAWN_EGG_ENDERMAN, mtEnderman = E_META_SPAWN_EGG_ENDERMAN,
mtGhast = E_META_SPAWN_EGG_GHAST, mtGhast = E_META_SPAWN_EGG_GHAST,
mtGiant = E_META_SPAWN_EGG_GIANT, mtGiant = E_META_SPAWN_EGG_GIANT,
mtGuardian = E_META_SPAWN_EGG_GUARDIAN,
mtHorse = E_META_SPAWN_EGG_HORSE, mtHorse = E_META_SPAWN_EGG_HORSE,
mtIronGolem = E_META_SPAWN_EGG_IRON_GOLEM, mtIronGolem = E_META_SPAWN_EGG_IRON_GOLEM,
mtMagmaCube = E_META_SPAWN_EGG_MAGMA_CUBE, mtMagmaCube = E_META_SPAWN_EGG_MAGMA_CUBE,

View File

@ -495,6 +495,7 @@ void cNBTChunkSerializer::AddMonsterEntity(cMonster * a_Monster)
case mtEnderman: EntityClass = "Enderman"; break; case mtEnderman: EntityClass = "Enderman"; break;
case mtGhast: EntityClass = "Ghast"; break; case mtGhast: EntityClass = "Ghast"; break;
case mtGiant: EntityClass = "Giant"; break; case mtGiant: EntityClass = "Giant"; break;
case mtGuardian: EntityClass = "Guardian"; break;
case mtHorse: EntityClass = "Horse"; break; case mtHorse: EntityClass = "Horse"; break;
case mtIronGolem: EntityClass = "VillagerGolem"; break; case mtIronGolem: EntityClass = "VillagerGolem"; break;
case mtMagmaCube: EntityClass = "LavaSlime"; break; case mtMagmaCube: EntityClass = "LavaSlime"; break;
@ -627,6 +628,7 @@ void cNBTChunkSerializer::AddMonsterEntity(cMonster * a_Monster)
case mtEnderDragon: case mtEnderDragon:
case mtGhast: case mtGhast:
case mtGiant: case mtGiant:
case mtGuardian:
case mtIronGolem: case mtIronGolem:
case mtMooshroom: case mtMooshroom:
case mtOcelot: case mtOcelot:

View File

@ -1410,6 +1410,10 @@ void cWSSAnvil::LoadEntityFromNBT(cEntityList & a_Entities, const cParsedNBT & a
{ {
LoadGiantFromNBT(a_Entities, a_NBT, a_EntityTagIdx); LoadGiantFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
} }
else if (strncmp(a_IDTag, "Guardian", a_IDTagLength) == 0)
{
LoadGuardianFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Horse", a_IDTagLength) == 0) else if (strncmp(a_IDTag, "Horse", a_IDTagLength) == 0)
{ {
LoadHorseFromNBT(a_Entities, a_NBT, a_EntityTagIdx); LoadHorseFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
@ -2197,6 +2201,26 @@ void cWSSAnvil::LoadGiantFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
void cWSSAnvil::LoadGuardianFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cGuardian> Monster(new cGuardian());
if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
{
return;
}
if (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
{
return;
}
a_Entities.push_back(Monster.release());
}
void cWSSAnvil::LoadHorseFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx) void cWSSAnvil::LoadHorseFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{ {
int TypeIdx = a_NBT.FindChildByName(a_TagIdx, "Type"); int TypeIdx = a_NBT.FindChildByName(a_TagIdx, "Type");

View File

@ -191,6 +191,7 @@ protected:
void LoadEndermanFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx); void LoadEndermanFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadGhastFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx); void LoadGhastFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadGiantFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx); void LoadGiantFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadGuardianFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadHorseFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx); void LoadHorseFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadIronGolemFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx); void LoadIronGolemFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadMagmaCubeFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx); void LoadMagmaCubeFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);