#include "ItemEntity.h" #include "Game.h" #include "ItemSlot.h" #include "ItemStack.h" #include "ItemType.h" #ifdef _WINDOWS # define __INT32_MAX__ 0x7FFFFFFF #endif ItemEntity::ItemEntity( Framework::Vec3 location, int dimensionId, int entityId) : Entity(EntityTypeEnum::ITEM, location, dimensionId, entityId) { slot = new ItemSlot("Inventory", __INT32_MAX__, 0, 0, 0, ANY_DIRECTION, 0); addSlot(slot); faceOffset = {0.f, 0.f, 0.f}; maxHP = 10; maxStamina = 10; maxHunger = 10; maxThirst = 10; setHP(0, 0, 0, 10.f); setStamina(10); setHunger(10); setThirst(10); targetDistanceLimit = 4; maxMovementSpeed = 1; movementFlags |= MovementFlags::ROTATE_TO_FACE | MovementFlags::FLYING; } void ItemEntity::prepareTick(const Dimension* zDimension, double seconds) { if (slot->zStack() == 0 && !removed) throw "Illegal State exception"; Entity* zOther = Game::INSTANCE->zNearestEntity( dimensionId, location, [this](Entity* zOther) { return zOther != this && zOther->numberOfAddableItems( slot->zStack()->zItem(), NO_DIRECTION) && (!this->slot->isFull() || zOther->zType()->getId() != EntityTypeEnum::ITEM); }); if (zOther) { faceDir = zOther->getPosition() - getPosition(); movementFlags |= MovementFlags::WALK_FORWARD; if (getPosition().z < zOther->getPosition().z) { movementFlags |= MovementFlags::JUMPING; movementFlags &= ~MovementFlags::SNEAKING; } else if (getPosition().z > zOther->getPosition().z) { movementFlags |= MovementFlags::SNEAKING; movementFlags &= ~MovementFlags::JUMPING; } } else { movementFlags &= ~MovementFlags::WALK_FORWARD; movementFlags &= ~MovementFlags::JUMPING; movementFlags &= ~MovementFlags::SNEAKING; } Entity::prepareTick(zDimension, seconds); } void ItemEntity::tick(const Dimension* zDimension, double seconds) { Entity* zOther = Game::INSTANCE->zNearestEntity( dimensionId, location, [this](Entity* zOther) { return zOther != this && zOther->numberOfAddableItems( slot->zStack()->zItem(), NO_DIRECTION) && (!this->slot->isFull() || zOther->zType()->getId() != EntityTypeEnum::ITEM); }); if (zOther) { float d = location.abstand(zOther->getPosition()); if (d < 0.5f) { // add items of this entity to the other entity zOther->interactWith(this, NO_DIRECTION) .pullItems(slot->getNumberOfItems(), 0); if (slot->getNumberOfItems() == 0) onDeath(0, 0, 0); } } Entity::tick(zDimension, seconds); } void ItemEntity::onFall(float collisionSpeed) { if (collisionSpeed >= 50.f) this->setHP(0, 0, 0, 0.f); } bool ItemEntity::hasDefaultModel() const { return 0; } ModelInfo* ItemEntity::zSpecialModel() const { const ItemType* zItemType = 0; if (!slot->isEmpty()) zItemType = slot->zStack()->zItem()->zItemType(); return !zItemType ? 0 : zItemType->zModel(); } ItemEntityType::ItemEntityType() : EntityType() { setName("Item"); } Entity* ItemEntityType::createEntity( Framework::Vec3 position, int dimensionId, int entityId) const { return new ItemEntity(position, dimensionId, entityId); }