diff --git a/MCServer/monsters.ini b/MCServer/monsters.ini index 70c845b5c..af1938e3e 100644 --- a/MCServer/monsters.ini +++ b/MCServer/monsters.ini @@ -1,56 +1,14 @@ -[Spider] +[Bat] AttackRange=2.0 AttackRate=1 -AttackDamage=2.0 +AttackDamage=0.0 SightDistance=25.0 -MaxHealth=16 +MaxHealth=6 -[Chicken] -AttackRange=2.0 +[Blaze] +AttackRange=15.0 AttackRate=1 -AttackDamage=1.0 -SightDistance=25.0 -MaxHealth=4 - -[Cow] -AttackRange=2.0 -AttackRate=1 -AttackDamage=1.0 -SightDistance=25.0 -MaxHealth=10 - -[Pig] -AttackRange=2.0 -AttackRate=1 -AttackDamage=1.0 -SightDistance=25.0 -MaxHealth=10 - -[Sheep] -AttackRange=2.0 -AttackRate=1 -AttackDamage=1.0 -SightDistance=25.0 -MaxHealth=8 - -[Squid] -AttackRange=2.0 -AttackRate=1 -AttackDamage=1.0 -SightDistance=25.0 -MaxHealth=10 - -[Enderman] -AttackRange=2.0 -AttackRate=1 -AttackDamage=4.0 -SightDistance=64.0 -MaxHealth=40 - -[ZombiePigman] -AttackRange=2.0 -AttackRate=1 -AttackDamage=7.0 +AttackDamage=6.0 SightDistance=25.0 MaxHealth=20 IsFireproof=1 @@ -62,6 +20,20 @@ AttackDamage=2.0 SightDistance=25.0 MaxHealth=12 +[Chicken] +AttackRange=2.0 +AttackRate=1 +AttackDamage=0.0 +SightDistance=25.0 +MaxHealth=4 + +[Cow] +AttackRange=2.0 +AttackRate=1 +AttackDamage=0.0 +SightDistance=25.0 +MaxHealth=10 + [Creeper] AttackRange=3.0 AttackRate=1 @@ -69,6 +41,21 @@ AttackDamage=0.0 SightDistance=25.0 MaxHealth=20 +[EnderDragon] +AttackRange=2.0 +AttackRate=1 +AttackDamage=6.0 +SightDistance=25.0 +MaxHealth=200 + +[Enderman] +AttackRange=2.0 +AttackRate=1 +AttackDamage=4.0 +SightDistance=64.0 +MaxHealth=40 + + [Ghast] AttackRange=50.0 AttackRate=1 @@ -77,6 +64,77 @@ SightDistance=50.0 MaxHealth=10 IsFireproof=1 +[Giant] +AttackRange=2.0 +AttackRate=1 +AttackDamage=6.0 +SightDistance=25.0 +MaxHealth=100 + +[Guardian] +AttackRange=2.0 +AttackRate=1 +AttackDamage=9.0 +SightDistance=25.0 +MaxHealth=30 + +[Horse] +AttackRange=2.0 +AttackRate=1 +AttackDamage=6.0 +SightDistance=25.0 +MaxHealth=30 + +[IronGolem] +AttackRange=2.0 +AttackRate=1 +AttackDamage=6.0 +SightDistance=25.0 +MaxHealth=100 + +[MagmaCube] +AttackRange=2.0 +AttackRate=1 +AttackDamage=6.0 +SightDistance=25.0 +MaxHealth=16 +IsFireproof=1 + +[Mooshroom] +AttackRange=2.0 +AttackRate=1 +AttackDamage=0.0 +SightDistance=25.0 +MaxHealth=10 + +[Ocelot] +AttackRange=2.0 +AttackRate=1 +AttackDamage=0.0 +SightDistance=25.0 +MaxHealth=10 + +[Pig] +AttackRange=2.0 +AttackRate=1 +AttackDamage=0.0 +SightDistance=25.0 +MaxHealth=10 + +[Rabbit] +AttackRange=2.0 +AttackRate=1 +AttackDamage=0.0 +SightDistance=25.0 +MaxHealth=10 + +[Sheep] +AttackRange=2.0 +AttackRate=1 +AttackDamage=0.0 +SightDistance=25.0 +MaxHealth=8 + [Silverfish] AttackRange=2.0 AttackRate=1 @@ -97,27 +155,26 @@ AttackDamage=4.0 SightDistance=25.0 MaxHealth=16 -[Zombie] +[SnowGolem] AttackRange=2.0 AttackRate=1 -AttackDamage=4.0 +AttackDamage=0.0 SightDistance=25.0 -MaxHealth=20 +MaxHealth=4 -[Wolf] +[Spider] +AttackRange=2.0 +AttackRate=1 +AttackDamage=2.0 +SightDistance=25.0 +MaxHealth=16 + +[Squid] AttackRange=2.0 AttackRate=1 -AttackDamage=4.0 +AttackDamage=0.0 SightDistance=25.0 -MaxHealth=20 - -[Blaze] -AttackRange=15.0 -AttackRate=1 -AttackDamage=6.0 -SightDistance=25.0 -MaxHealth=20 -IsFireproof=1 +MaxHealth=10 [Villager] AttackRange=2.0 @@ -125,7 +182,6 @@ AttackRate=1 AttackDamage=0.0 SightDistance=25.0 MaxHealth=20 -IsFireproof=0 [Witch] AttackRange=2.0 @@ -134,68 +190,24 @@ AttackDamage=0.0 SightDistance=25.0 MaxHealth=26 - -[Ocelot] +[Wolf] AttackRange=2.0 AttackRate=1 -AttackDamage=0.0 +AttackDamage=4.0 SightDistance=25.0 -MaxHealth=10 +MaxHealth=20 -[Mooshroom] +[Zombie] AttackRange=2.0 AttackRate=1 -AttackDamage=0.0 +AttackDamage=4.0 SightDistance=25.0 -MaxHealth=10 +MaxHealth=20 -[MagmaCube] +[ZombiePigman] AttackRange=2.0 AttackRate=1 -AttackDamage=6.0 +AttackDamage=7.0 SightDistance=25.0 -MaxHealth=16 +MaxHealth=20 IsFireproof=1 - -[Horse] -AttackRange=2.0 -AttackRate=1 -AttackDamage=6.0 -SightDistance=25.0 -MaxHealth=30 - -[EnderDragon] -AttackRange=2.0 -AttackRate=1 -AttackDamage=6.0 -SightDistance=25.0 -MaxHealth=200 - -[Giant] -AttackRange=2.0 -AttackRate=1 -AttackDamage=6.0 -SightDistance=25.0 -MaxHealth=100 - -[IronGolem] -AttackRange=2.0 -AttackRate=1 -AttackDamage=6.0 -SightDistance=25.0 -MaxHealth=100 - -[Bat] -AttackRange=2.0 -AttackRate=1 -AttackDamage=0.0 -SightDistance=25.0 -MaxHealth=6 - -[Guardian] -AttackRange=2.0 -AttackRate=1 -AttackDamage=9.0 -SightDistance=25.0 -MaxHealth=30 - diff --git a/Tools/AnvilStats/Utils.cpp b/Tools/AnvilStats/Utils.cpp index f5b3b58fb..34374647b 100644 --- a/Tools/AnvilStats/Utils.cpp +++ b/Tools/AnvilStats/Utils.cpp @@ -32,6 +32,7 @@ struct {entOzelot, "Ozelot"}, {entPig, "Pig"}, {entPigZombie, "PigZombie"}, + {entRabbit, "Rabbit"}, {entSheep, "Sheep"}, {entSilverfish, "Slverfish"}, {entSkeleton, "Skeleton"}, diff --git a/Tools/AnvilStats/Utils.h b/Tools/AnvilStats/Utils.h index 4c4e89f26..e3172649c 100644 --- a/Tools/AnvilStats/Utils.h +++ b/Tools/AnvilStats/Utils.h @@ -31,6 +31,7 @@ enum eEntityType entOzelot, entPig, entPigZombie, + entRabbit, entSheep, entSilverfish, entSkeleton, diff --git a/src/BlockID.h b/src/BlockID.h index bfb6b8d6d..41ccf90b5 100644 --- a/src/BlockID.h +++ b/src/BlockID.h @@ -971,6 +971,7 @@ enum E_META_SPAWN_EGG_OCELOT = 98, E_META_SPAWN_EGG_IRON_GOLEM = 99, E_META_SPAWN_EGG_HORSE = 100, + E_META_SPAWN_EGG_RABBIT = 101, E_META_SPAWN_EGG_VILLAGER = 120, E_META_SPAWN_EGG_ENDER_CRYSTAL = 200, } ; diff --git a/src/Items/ItemSpawnEgg.h b/src/Items/ItemSpawnEgg.h index 2f28ec6eb..dee8a9057 100644 --- a/src/Items/ItemSpawnEgg.h +++ b/src/Items/ItemSpawnEgg.h @@ -70,6 +70,7 @@ public: case E_META_SPAWN_EGG_MOOSHROOM: return mtMooshroom; case E_META_SPAWN_EGG_OCELOT: return mtOcelot; case E_META_SPAWN_EGG_PIG: return mtPig; + case E_META_SPAWN_EGG_RABBIT: return mtRabbit; case E_META_SPAWN_EGG_SHEEP: return mtSheep; case E_META_SPAWN_EGG_SILVERFISH: return mtSilverfish; case E_META_SPAWN_EGG_SKELETON: return mtSkeleton; diff --git a/src/MobSpawner.cpp b/src/MobSpawner.cpp index bd34d8fcd..0a32d17ef 100644 --- a/src/MobSpawner.cpp +++ b/src/MobSpawner.cpp @@ -92,6 +92,7 @@ eMonsterType cMobSpawner::ChooseMobType(EMCSBiome a_Biome) addIfAllowed(mtCow, allowedMobs); addIfAllowed(mtChicken, allowedMobs); addIfAllowed(mtEnderman, allowedMobs); + addIfAllowed(mtRabbit, allowedMobs); addIfAllowed(mtSlime, allowedMobs); // MG TODO : much more complicated rule if ((a_Biome == biForest) || (a_Biome == biForestHills) || (a_Biome == biTaiga) || (a_Biome == biTaigaHills)) @@ -164,6 +165,7 @@ bool cMobSpawner::CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_R case mtCow: case mtPig: case mtHorse: + case mtRabbit: case mtSheep: { return ( diff --git a/src/Mobs/IncludeAllMonsters.h b/src/Mobs/IncludeAllMonsters.h index f5eb9dcc3..53c709c2b 100644 --- a/src/Mobs/IncludeAllMonsters.h +++ b/src/Mobs/IncludeAllMonsters.h @@ -15,6 +15,7 @@ #include "Mooshroom.h" #include "Ocelot.h" #include "Pig.h" +#include "Rabbit.h" #include "Sheep.h" #include "Silverfish.h" #include "Skeleton.h" diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index 3d174677c..a02ea357e 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -45,6 +45,7 @@ static const struct {mtMooshroom, "mooshroom", "MushroomCow"}, {mtOcelot, "ocelot", "Ozelot"}, {mtPig, "pig", "Pig"}, + {mtRabbit, "rabbit", "Rabbit"}, {mtSheep, "sheep", "Sheep"}, {mtSilverfish, "silverfish", "Silverfish"}, {mtSkeleton, "skeleton", "Skeleton"}, @@ -499,6 +500,7 @@ void cMonster::KilledBy(TakeDamageInfo & a_TDI) case mtCow: case mtHorse: case mtPig: + case mtRabbit: case mtSheep: case mtSquid: case mtMooshroom: @@ -851,6 +853,7 @@ cMonster::eFamily cMonster::FamilyFromType(eMonsterType a_Type) case mtMooshroom: return mfHostile; case mtOcelot: return mfPassive; case mtPig: return mfPassive; + case mtRabbit: return mfPassive; case mtSheep: return mfPassive; case mtSilverfish: return mfHostile; case mtSkeleton: return mfHostile; @@ -963,6 +966,7 @@ cMonster * cMonster::NewMonsterFromType(eMonsterType a_MobType) case mtMooshroom: toReturn = new cMooshroom(); break; case mtOcelot: toReturn = new cOcelot(); break; case mtPig: toReturn = new cPig(); break; + case mtRabbit: toReturn = new cRabbit(); break; case mtSheep: toReturn = new cSheep(); break; case mtSilverfish: toReturn = new cSilverfish(); break; case mtSnowGolem: toReturn = new cSnowGolem(); break; diff --git a/src/Mobs/MonsterTypes.h b/src/Mobs/MonsterTypes.h index 0d716cca3..02bec267b 100644 --- a/src/Mobs/MonsterTypes.h +++ b/src/Mobs/MonsterTypes.h @@ -25,6 +25,7 @@ enum eMonsterType mtMooshroom = E_META_SPAWN_EGG_MOOSHROOM, mtOcelot = E_META_SPAWN_EGG_OCELOT, mtPig = E_META_SPAWN_EGG_PIG, + mtRabbit = E_META_SPAWN_EGG_RABBIT, mtSheep = E_META_SPAWN_EGG_SHEEP, mtSilverfish = E_META_SPAWN_EGG_SILVERFISH, mtSkeleton = E_META_SPAWN_EGG_SKELETON, diff --git a/src/Mobs/Rabbit.cpp b/src/Mobs/Rabbit.cpp new file mode 100644 index 000000000..1c7d810b7 --- /dev/null +++ b/src/Mobs/Rabbit.cpp @@ -0,0 +1,38 @@ + +#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules + +#include "Rabbit.h" +#include "../Entities/Player.h" +#include "../World.h" + + + + + +cRabbit::cRabbit(void) : + super("Rabbit", mtRabbit, "mob.rabbit.idle", "mob.rabbit.death", 0.9, 0.9) +{ +} + + + + + +void cRabbit::GetDrops(cItems & a_Drops, cEntity * a_Killer) +{ + int LootingLevel = 0; + if (a_Killer != nullptr) + { + LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting); + } + AddRandomDropItem(a_Drops, 0, 1 + LootingLevel, IsOnFire() ? E_ITEM_COOKED_RABBIT : E_ITEM_RAW_RABBIT); + AddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_RABBIT_HIDE); + cItems RareDrops; + RareDrops.Add(cItem(E_ITEM_RABBITS_FOOT)); + AddRandomRareDropItem(a_Drops, RareDrops, LootingLevel); +} + + + + + diff --git a/src/Mobs/Rabbit.h b/src/Mobs/Rabbit.h new file mode 100644 index 000000000..5ea03d09b --- /dev/null +++ b/src/Mobs/Rabbit.h @@ -0,0 +1,24 @@ + +#pragma once + +#include "PassiveMonster.h" + + + + + +class cRabbit : + public cPassiveMonster +{ + typedef cPassiveMonster super; + +public: + cRabbit(); + + CLASS_PROTODEF(cRabbit) + + virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override; + + virtual const cItem GetFollowedItem(void) const override { return cItem(E_ITEM_CARROT); } + +} ; \ No newline at end of file diff --git a/src/WorldStorage/NBTChunkSerializer.cpp b/src/WorldStorage/NBTChunkSerializer.cpp index 9d8e20b0b..c87397542 100644 --- a/src/WorldStorage/NBTChunkSerializer.cpp +++ b/src/WorldStorage/NBTChunkSerializer.cpp @@ -502,6 +502,7 @@ void cNBTChunkSerializer::AddMonsterEntity(cMonster * a_Monster) case mtMooshroom: EntityClass = "MushroomCow"; break; case mtOcelot: EntityClass = "Ozelot"; break; case mtPig: EntityClass = "Pig"; break; + case mtRabbit: EntityClass = "Rabbit"; break; case mtSheep: EntityClass = "Sheep"; break; case mtSilverfish: EntityClass = "Silverfish"; break; case mtSkeleton: EntityClass = "Skeleton"; break; @@ -633,6 +634,7 @@ void cNBTChunkSerializer::AddMonsterEntity(cMonster * a_Monster) case mtMooshroom: case mtOcelot: case mtPig: + case mtRabbit: case mtSilverfish: case mtSnowGolem: case mtSpider: diff --git a/src/WorldStorage/WSSAnvil.cpp b/src/WorldStorage/WSSAnvil.cpp index a045497bc..cf51ab19c 100755 --- a/src/WorldStorage/WSSAnvil.cpp +++ b/src/WorldStorage/WSSAnvil.cpp @@ -1442,6 +1442,10 @@ void cWSSAnvil::LoadEntityFromNBT(cEntityList & a_Entities, const cParsedNBT & a { LoadPigFromNBT(a_Entities, a_NBT, a_EntityTagIdx); } + else if (strncmp(a_IDTag, "Rabbit", a_IDTagLength) == 0) + { + LoadRabbitFromNBT(a_Entities, a_NBT, a_EntityTagIdx); + } else if (strncmp(a_IDTag, "Sheep", a_IDTagLength) == 0) { LoadSheepFromNBT(a_Entities, a_NBT, a_EntityTagIdx); @@ -2363,6 +2367,26 @@ void cWSSAnvil::LoadPigFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NB +void cWSSAnvil::LoadRabbitFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx) +{ + std::unique_ptr Monster(new cRabbit()); + 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::LoadSheepFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx) { int ColorIdx = a_NBT.FindChildByName(a_TagIdx, "Color"); diff --git a/src/WorldStorage/WSSAnvil.h b/src/WorldStorage/WSSAnvil.h index 7bcdd259e..362796614 100755 --- a/src/WorldStorage/WSSAnvil.h +++ b/src/WorldStorage/WSSAnvil.h @@ -198,6 +198,7 @@ protected: void LoadMooshroomFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx); void LoadOcelotFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx); void LoadPigFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx); + void LoadRabbitFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx); void LoadSheepFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx); void LoadSilverfishFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx); void LoadSkeletonFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);