commit
ffd8356fc1
@ -192,3 +192,10 @@ AttackDamage=0.0
|
||||
SightDistance=25.0
|
||||
MaxHealth=6
|
||||
|
||||
[Guardian]
|
||||
AttackRange=2.0
|
||||
AttackRate=1
|
||||
AttackDamage=9.0
|
||||
SightDistance=25.0
|
||||
MaxHealth=30
|
||||
|
||||
|
@ -26,6 +26,7 @@ struct
|
||||
{entEnderman, "Enderman"},
|
||||
{entGhast, "Ghast"},
|
||||
{entGiant, "Giant"},
|
||||
{entGuardian, "Guardian"},
|
||||
{entLavaSlime, "LavaSlime"},
|
||||
{entMushroomCow, "MushroomCow"},
|
||||
{entOzelot, "Ozelot"},
|
||||
|
@ -25,6 +25,7 @@ enum eEntityType
|
||||
entEnderman,
|
||||
entGhast,
|
||||
entGiant,
|
||||
entGuardian,
|
||||
entLavaSlime,
|
||||
entMushroomCow,
|
||||
entOzelot,
|
||||
|
@ -959,6 +959,7 @@ enum
|
||||
E_META_SPAWN_EGG_WITHER = 64,
|
||||
E_META_SPAWN_EGG_BAT = 65,
|
||||
E_META_SPAWN_EGG_WITCH = 66,
|
||||
E_META_SPAWN_EGG_GUARDIAN = 68,
|
||||
E_META_SPAWN_EGG_PIG = 90,
|
||||
E_META_SPAWN_EGG_SHEEP = 91,
|
||||
E_META_SPAWN_EGG_COW = 92,
|
||||
|
@ -64,6 +64,7 @@ public:
|
||||
case E_META_SPAWN_EGG_CREEPER: return mtCreeper;
|
||||
case E_META_SPAWN_EGG_ENDERMAN: return mtEnderman;
|
||||
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_MAGMA_CUBE: return mtMagmaCube;
|
||||
case E_META_SPAWN_EGG_MOOSHROOM: return mtMooshroom;
|
||||
|
@ -83,6 +83,7 @@ eMonsterType cMobSpawner::ChooseMobType(EMCSBiome a_Biome)
|
||||
addIfAllowed(mtSkeleton, allowedMobs);
|
||||
addIfAllowed(mtCreeper, allowedMobs);
|
||||
addIfAllowed(mtSquid, allowedMobs);
|
||||
addIfAllowed(mtGuardian, allowedMobs);
|
||||
|
||||
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)
|
||||
{
|
||||
case mtGuardian:
|
||||
{
|
||||
return IsBlockWater(TargetBlock) && (a_RelY >= 45) && (a_RelY <= 62);
|
||||
}
|
||||
|
||||
case mtSquid:
|
||||
{
|
||||
return IsBlockWater(TargetBlock) && (a_RelY >= 45) && (a_RelY <= 62);
|
||||
|
@ -16,6 +16,7 @@ SET (SRCS
|
||||
Enderman.cpp
|
||||
Ghast.cpp
|
||||
Giant.cpp
|
||||
Guardian.cpp
|
||||
Horse.cpp
|
||||
IronGolem.cpp
|
||||
MagmaCube.cpp
|
||||
@ -49,6 +50,7 @@ SET (HDRS
|
||||
Enderman.h
|
||||
Ghast.h
|
||||
Giant.h
|
||||
Guardian.h
|
||||
Horse.h
|
||||
IncludeAllMonsters.h
|
||||
IronGolem.h
|
||||
|
65
src/Mobs/Guardian.cpp
Normal file
65
src/Mobs/Guardian.cpp
Normal 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
31
src/Mobs/Guardian.h
Normal 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 {}
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "EnderDragon.h"
|
||||
#include "Ghast.h"
|
||||
#include "Giant.h"
|
||||
#include "Guardian.h"
|
||||
#include "Horse.h"
|
||||
#include "IronGolem.h"
|
||||
#include "MagmaCube.h"
|
||||
|
@ -38,6 +38,7 @@ static const struct
|
||||
{mtEnderman, "enderman", "Enderman"},
|
||||
{mtEnderDragon, "enderdragon", "EnderDragon"},
|
||||
{mtGhast, "ghast", "Ghast"},
|
||||
{mtGuardian, "guardian", "Guardian"},
|
||||
{mtHorse, "horse", "EntityHorse"},
|
||||
{mtIronGolem, "irongolem", "VillagerGolem"},
|
||||
{mtMagmaCube, "magmacube", "LavaSlime"},
|
||||
@ -513,6 +514,7 @@ void cMonster::KilledBy(TakeDamageInfo & a_TDI)
|
||||
case mtCreeper:
|
||||
case mtEnderman:
|
||||
case mtGhast:
|
||||
case mtGuardian:
|
||||
case mtSilverfish:
|
||||
case mtSkeleton:
|
||||
case mtSpider:
|
||||
@ -842,6 +844,7 @@ cMonster::eFamily cMonster::FamilyFromType(eMonsterType a_Type)
|
||||
case mtEnderman: return mfHostile;
|
||||
case mtGhast: return mfHostile;
|
||||
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 mtIronGolem: return mfPassive;
|
||||
case mtMagmaCube: return mfHostile;
|
||||
@ -955,6 +958,7 @@ cMonster * cMonster::NewMonsterFromType(eMonsterType a_MobType)
|
||||
case mtEnderman: toReturn = new cEnderman(); break;
|
||||
case mtGhast: toReturn = new cGhast(); break;
|
||||
case mtGiant: toReturn = new cGiant(); break;
|
||||
case mtGuardian: toReturn = new cGuardian(); break;
|
||||
case mtIronGolem: toReturn = new cIronGolem(); break;
|
||||
case mtMooshroom: toReturn = new cMooshroom(); break;
|
||||
case mtOcelot: toReturn = new cOcelot(); break;
|
||||
|
@ -30,7 +30,7 @@ public:
|
||||
mfHostile = 0, // Spider, Zombies ...
|
||||
mfPassive = 1, // Cows, Pigs
|
||||
mfAmbient = 2, // Bats
|
||||
mfWater = 3, // Squid
|
||||
mfWater = 3, // Squid, Guardian
|
||||
|
||||
mfNoSpawn,
|
||||
mfUnhandled, // Nothing. Be sure this is the last and the others are in order
|
||||
|
@ -18,6 +18,7 @@ enum eMonsterType
|
||||
mtEnderman = E_META_SPAWN_EGG_ENDERMAN,
|
||||
mtGhast = E_META_SPAWN_EGG_GHAST,
|
||||
mtGiant = E_META_SPAWN_EGG_GIANT,
|
||||
mtGuardian = E_META_SPAWN_EGG_GUARDIAN,
|
||||
mtHorse = E_META_SPAWN_EGG_HORSE,
|
||||
mtIronGolem = E_META_SPAWN_EGG_IRON_GOLEM,
|
||||
mtMagmaCube = E_META_SPAWN_EGG_MAGMA_CUBE,
|
||||
|
@ -495,6 +495,7 @@ void cNBTChunkSerializer::AddMonsterEntity(cMonster * a_Monster)
|
||||
case mtEnderman: EntityClass = "Enderman"; break;
|
||||
case mtGhast: EntityClass = "Ghast"; break;
|
||||
case mtGiant: EntityClass = "Giant"; break;
|
||||
case mtGuardian: EntityClass = "Guardian"; break;
|
||||
case mtHorse: EntityClass = "Horse"; break;
|
||||
case mtIronGolem: EntityClass = "VillagerGolem"; break;
|
||||
case mtMagmaCube: EntityClass = "LavaSlime"; break;
|
||||
@ -627,6 +628,7 @@ void cNBTChunkSerializer::AddMonsterEntity(cMonster * a_Monster)
|
||||
case mtEnderDragon:
|
||||
case mtGhast:
|
||||
case mtGiant:
|
||||
case mtGuardian:
|
||||
case mtIronGolem:
|
||||
case mtMooshroom:
|
||||
case mtOcelot:
|
||||
|
@ -1410,6 +1410,10 @@ void cWSSAnvil::LoadEntityFromNBT(cEntityList & a_Entities, const cParsedNBT & a
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
int TypeIdx = a_NBT.FindChildByName(a_TagIdx, "Type");
|
||||
|
@ -191,6 +191,7 @@ protected:
|
||||
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 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 LoadIronGolemFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||
void LoadMagmaCubeFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||
|
Loading…
Reference in New Issue
Block a user