#include "Chest.h" #include #include "Chunk.h" #include "Dimension.h" #include "Entity.h" #include "Game.h" #include "ItemSlot.h" #include "UIController.h" #include "UIDialog.h" Chest::Chest(int typeId, Framework::Vec3 pos, int dimensionId) : BasicBlock(typeId, pos, dimensionId, 1), open(0), userEntityId(0) { for (int i = 0; i < 30; i++) { ItemSlot* slot = new ItemSlot( "Inventory", 50, i, i, ANY_DIRECTION, ANY_DIRECTION, 0); addSlot(slot); } } void Chest::onDestroy() { for (ItemSlot* slot : *this) { if (!slot->isEmpty()) { Game::INSTANCE->spawnItem( location + Framework::Vec3(0.5f, 0.5f, 0.5f), getDimensionId(), slot->takeItemsOut(slot->getNumberOfItems(), NO_DIRECTION)); } } BasicBlock::onDestroy(); } void Chest::onDialogClosed(Framework::Text dialogId) { if (dialogId.istGleich(getDialogId())) { open = 0; userEntityId = 0; NetworkMessage* msg = new NetworkMessage(); msg->animateBlockBone(getDimensionId(), Game::getChunkCenter(getPos().x, getPos().y), Chunk::index(Dimension::chunkCoordinates(getPos())), 1, 1.0, Framework::Vec3(0.5f, 0.f, 0.45f), Framework::Vec3( 0.0f, 0.f, 0.f)); // close the chest over one second broadcastMessage(msg); } } Framework::Text Chest::getDialogId() const { Framework::Text dialogId = "chest_inventory_"; dialogId.append() << getDimensionId() << "," << getPos().x << "," << getPos().y << "," << getPos().z; return dialogId; } bool Chest::onTick(TickQueue* zQueue, int numTicks, bool& blocked) { if (open) { if (!Game::INSTANCE->zEntity(userEntityId)) { onDialogClosed(getDialogId()); } } return open; } bool Chest::interact(Item* zItem, Entity* zActor) { lock(); if (open) { if (!Game::INSTANCE->zEntity(userEntityId)) open = 0; } if (!open) { userEntityId = zActor->getId(); open = 1; Framework::Text uiml = ""; uiml.append() << "" << "" << "Player " "Inventory" << "getId() << "\"/>" << "getId() << "\"/>" << ""; Game::INSTANCE->zUIController()->addDialog(new UIDialog( getDialogId(), zActor->getId(), new Framework::XML::Element(uiml))); NetworkMessage* msg = new NetworkMessage(); msg->animateBlockBone(getDimensionId(), Game::getChunkCenter(getPos().x, getPos().y), Chunk::index(Dimension::chunkCoordinates(getPos())), 1, 1.0, Framework::Vec3(0.5f, 0.f, 0.45f), Framework::Vec3( 0.0f, (float)(PI / 2.0), 0.f)); // open the chest over 1 second broadcastMessage(msg); } unlock(); return false; // item was not changed } void Chest::sendModelInfo(NetworkMessage* zMessage) { if (open) { zMessage->animateBlockBone(getDimensionId(), Game::getChunkCenter(getPos().x, getPos().y), Chunk::index(Dimension::chunkCoordinates(getPos())), 1, 0.0, Framework::Vec3(0.5f, 0.f, 0.45f), Framework::Vec3( 0.0f, (float)(PI / 2.0), 0.f)); // open the chest instantly } } ChestBlockType::ChestBlockType() : BasicBlockType() {} Block* ChestBlockType::createBlock( Framework::Vec3 position, int dimensionId) const { return new Chest(getItemTypeId(), position, dimensionId); } ChestBlockTypeFactory::ChestBlockTypeFactory() : SubTypeFactory(), super() {} ChestBlockType* ChestBlockTypeFactory::createValue( Framework::JSON::JSONObject* zJson) const { return new ChestBlockType(); } void ChestBlockTypeFactory::fromJson( ChestBlockType* zResult, Framework::JSON::JSONObject* zJson) const { super.fromJson(zResult, zJson); } void ChestBlockTypeFactory::toJson( ChestBlockType* zObject, Framework::JSON::JSONObject* zResult) const { super.toJson(zObject, zResult); } JSONObjectValidationBuilder* ChestBlockTypeFactory::addToValidator( JSONObjectValidationBuilder* builder) const { return super.addToValidator(builder); } Framework::Text ChestBlockTypeFactory::getTypeToken() const { return "chest"; }