123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- #include "Chest.h"
- #include <TextFeld.h>
- #include "Game.h"
- Chest::Chest(
- int typeId, ItemType* zTool, Framework::Vec3<int> pos, int dimensionId)
- : BasicBlock(typeId, zTool, 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 + Vec3<float>(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,
- Vec3<float>(0.5f, 0.f, 0.45f),
- Vec3<float>(0.0f, 0.f, 0.f)); // close the chest over one second
- Game::INSTANCE->broadcastMessage(msg);
- }
- }
- Framework::Text Chest::getDialogId() const
- {
- 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;
- }
- void Chest::interact(Item* zItem, Entity* zActor)
- {
- lock();
- if (open)
- {
- if (!Game::INSTANCE->zEntity(userEntityId)) open = 0;
- }
- if (!open)
- {
- userEntityId = zActor->getId();
- open = 1;
- NetworkMessage* msg = new NetworkMessage();
- msg->openDialog(getDialogId());
- Text uiml = "";
- uiml.append()
- << "<dialog id=\"" << getDialogId()
- << "\" title=\"Chest\" "
- "notifyOnClose=\""
- << getDimensionId() << "," << getPos().x << "," << getPos().y << ","
- << getPos().z
- << "\" "
- "width=\"610\" "
- "height=\"480\">"
- << "<inventory id=\"chest_inventory\" margin-bottom=\"18\" "
- "align-bottom=\"player_label\" align-left=\"start\" "
- "margin-left=\"9\" width=\"592\" height=\"172\" rowSize=\"10\" "
- "numSlots=\"30\" slotNameFilter=\"\" target=\""
- << getDimensionId() << "," << getPos().x << "," << getPos().y << ","
- << getPos().z << "\"/>"
- << "<text id=\"player_label\" width=\"100%\" height=\"auto\" style=\""
- << std::uppercase << std::hex
- << (TextFeld::Style::Text | TextFeld::Style::Center) << std::dec
- << std::nouppercase
- << "\" margin-bottom=\"9\" align-bottom=\"player_inventory\">Player "
- "Inventory</text>"
- << "<inventory id=\"player_inventory\" margin-bottom=\"18\" "
- "align-bottom=\"item_bar\" align-left=\"start\" "
- "margin-left=\"9\" width=\"592\" height=\"172\" rowSize=\"10\" "
- "numSlots=\"30\" slotNameFilter=\"Inventory\" target=\""
- << zActor->getId() << "\"/>"
- << "<inventory id=\"item_bar\" margin-bottom=\"9\" "
- "align-bottom=\"end\" align-left=\"start\" margin-left=\"9\" "
- "width=\"592\" height=\"52\" rowSize=\"10\" numSlots=\"10\" "
- "slotNameFilter=\"ItemBar\" target=\""
- << zActor->getId() << "\"/>"
- << "</dialog>";
- int msgSize = 4 + uiml.getLength();
- char* data = new char[msgSize];
- *(int*)data = uiml.getLength();
- memcpy(data + 4, uiml.getText(), uiml.getLength());
- msg->setMessage(data, msgSize);
- Game::INSTANCE->sendMessage(msg, zActor);
- msg = new NetworkMessage();
- msg->animateBlockBone(getDimensionId(),
- Game::getChunkCenter(getPos().x, getPos().y),
- Chunk::index(Dimension::chunkCoordinates(getPos())),
- 1,
- 1.0,
- Vec3<float>(0.5f, 0.f, 0.45f),
- Vec3<float>(
- 0.0f, (float)(PI / 2.0), 0.f)); // open the chest over 1 second
- Game::INSTANCE->broadcastMessage(msg);
- }
- unlock();
- }
- void Chest::sendModelInfo(NetworkMessage* zMessage)
- {
- if (open)
- {
- zMessage->animateBlockBone(getDimensionId(),
- Game::getChunkCenter(getPos().x, getPos().y),
- Chunk::index(Dimension::chunkCoordinates(getPos())),
- 1,
- 0.0,
- Vec3<float>(0.5f, 0.f, 0.45f),
- Vec3<float>(
- 0.0f, (float)(PI / 2.0), 0.f)); // open the chest instantly
- }
- }
|