commit
ffd8356fc1
@ -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
|
||||||
|
|
||||||
|
@ -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"},
|
||||||
|
@ -25,6 +25,7 @@ enum eEntityType
|
|||||||
entEnderman,
|
entEnderman,
|
||||||
entGhast,
|
entGhast,
|
||||||
entGiant,
|
entGiant,
|
||||||
|
entGuardian,
|
||||||
entLavaSlime,
|
entLavaSlime,
|
||||||
entMushroomCow,
|
entMushroomCow,
|
||||||
entOzelot,
|
entOzelot,
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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
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 "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"
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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:
|
||||||
|
@ -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");
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user