aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/TamableAnimal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/TamableAnimal.cpp')
-rw-r--r--Minecraft.World/TamableAnimal.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/Minecraft.World/TamableAnimal.cpp b/Minecraft.World/TamableAnimal.cpp
new file mode 100644
index 00000000..b065d7bd
--- /dev/null
+++ b/Minecraft.World/TamableAnimal.cpp
@@ -0,0 +1,159 @@
+#include "stdafx.h"
+#include "net.minecraft.world.entity.ai.goal.h"
+#include "net.minecraft.world.entity.h"
+#include "net.minecraft.world.level.h"
+#include "SynchedEntityData.h"
+#include "ParticleTypes.h"
+#include "TamableAnimal.h"
+
+TamableAnimal::TamableAnimal(Level *level) : Animal(level)
+{
+ sitGoal = new SitGoal(this);
+}
+
+TamableAnimal::~TamableAnimal()
+{
+ if(sitGoal != NULL) delete sitGoal;
+}
+
+void TamableAnimal::defineSynchedData()
+{
+ Animal::defineSynchedData();
+ entityData->define(DATA_FLAGS_ID, (byte) 0);
+ entityData->define(DATA_OWNERUUID_ID, L"");
+}
+
+void TamableAnimal::addAdditonalSaveData(CompoundTag *tag)
+{
+ Animal::addAdditonalSaveData(tag);
+#ifdef _XBOX_ONE
+ // 4J Stu Added from later Java version to remove owners from save transfer saves. We will probably want this on other platforms in the future
+ if (getOwnerUUID().empty())
+ {
+ tag->putString(L"OwnerUUID", L"");
+ }
+ else
+ {
+ tag->putString(L"OwnerUUID", getOwnerUUID());
+ }
+#else
+ if (getOwnerUUID().empty())
+ {
+ tag->putString(L"Owner", L"");
+ }
+ else
+ {
+ tag->putString(L"Owner", getOwnerUUID());
+ }
+#endif
+ tag->putBoolean(L"Sitting", isSitting());
+}
+
+void TamableAnimal::readAdditionalSaveData(CompoundTag *tag)
+{
+ Animal::readAdditionalSaveData(tag);
+#ifdef _XBOX_ONE
+ // 4J Stu Added from later Java version to remove owners from save transfer saves. We will probably want this on other platforms in the future
+ wstring owner = L"";
+ if(tag->contains(L"OwnerUUID") )
+ {
+ owner = tag->getString(L"OwnerUUID");
+ }
+#else
+ wstring owner = tag->getString(L"Owner");
+#endif
+ if (owner.length() > 0)
+ {
+ setOwnerUUID(owner);
+ setTame(true);
+ }
+ sitGoal->wantToSit(tag->getBoolean(L"Sitting"));
+}
+
+void TamableAnimal::spawnTamingParticles(bool success)
+{
+ ePARTICLE_TYPE particle = eParticleType_heart;
+ if (!success)
+ {
+ particle = eParticleType_smoke;
+ }
+ for (int i = 0; i < 7; i++)
+ {
+ double xa = random->nextGaussian() * 0.02;
+ double ya = random->nextGaussian() * 0.02;
+ double za = random->nextGaussian() * 0.02;
+ level->addParticle(particle, x + random->nextFloat() * bbWidth * 2 - bbWidth, y + .5f + random->nextFloat() * bbHeight, z + random->nextFloat() * bbWidth * 2 - bbWidth, xa, ya, za);
+ }
+}
+
+void TamableAnimal::handleEntityEvent(byte id)
+{
+ if (id == EntityEvent::TAMING_SUCCEEDED)
+ {
+ spawnTamingParticles(true);
+ }
+ else if (id == EntityEvent::TAMING_FAILED)
+ {
+ spawnTamingParticles(false);
+ }
+ else
+ {
+ Animal::handleEntityEvent(id);
+ }
+}
+
+bool TamableAnimal::isTame()
+{
+ return (entityData->getByte(DATA_FLAGS_ID) & 0x04) != 0;
+}
+
+void TamableAnimal::setTame(bool value)
+{
+ byte current = entityData->getByte(DATA_FLAGS_ID);
+ if (value)
+ {
+ entityData->set(DATA_FLAGS_ID, (byte) (current | 0x04));
+ }
+ else
+ {
+ entityData->set(DATA_FLAGS_ID, (byte) (current & ~0x04));
+ }
+}
+
+bool TamableAnimal::isSitting()
+{
+ return (entityData->getByte(DATA_FLAGS_ID) & 0x01) != 0;
+}
+
+void TamableAnimal::setSitting(bool value)
+{
+ byte current = entityData->getByte(DATA_FLAGS_ID);
+ if (value)
+ {
+ entityData->set(DATA_FLAGS_ID, (byte) (current | 0x01));
+ }
+ else
+ {
+ entityData->set(DATA_FLAGS_ID, (byte) (current & ~0x01));
+ }
+}
+
+wstring TamableAnimal::getOwnerUUID()
+{
+ return entityData->getString(DATA_OWNERUUID_ID);
+}
+
+void TamableAnimal::setOwnerUUID(const wstring &name)
+{
+ entityData->set(DATA_OWNERUUID_ID, name);
+}
+
+shared_ptr<Mob> TamableAnimal::getOwner()
+{
+ return level->getPlayerByUUID(getOwnerUUID());
+}
+
+SitGoal *TamableAnimal::getSitGoal()
+{
+ return sitGoal;
+} \ No newline at end of file