Files
cuberite-2a/source/DispenserEntity.cpp
T

128 lines
3.1 KiB
C++
Raw Normal View History

#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
#include "DispenserEntity.h"
#include "Player.h"
#include "Simulator/FluidSimulator.h"
cDispenserEntity::cDispenserEntity(int a_BlockX, int a_BlockY, int a_BlockZ) :
2013-05-26 14:39:04 +00:00
super(E_BLOCK_DISPENSER, a_BlockX, a_BlockY, a_BlockZ, NULL)
{
SetBlockEntity(this); // cBlockEntityWindowOwner
}
cDispenserEntity::cDispenserEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World) :
2013-05-26 14:39:04 +00:00
super(E_BLOCK_DISPENSER, a_BlockX, a_BlockY, a_BlockZ, a_World)
{
SetBlockEntity(this); // cBlockEntityWindowOwner
}
2013-05-26 14:39:04 +00:00
void cDispenserEntity::DropSpenseFromSlot(int a_SlotNum)
{
2013-05-26 14:39:04 +00:00
int DispX = m_PosX;
int DispY = m_PosY;
int DispZ = m_PosZ;
2013-04-10 21:40:30 +00:00
NIBBLETYPE Meta = m_World->GetBlockMeta(m_PosX, m_PosY, m_PosZ);
2013-05-26 14:39:04 +00:00
AddDropSpenserDir(DispX, DispY, DispZ, Meta);
cItem & Drop = m_Contents.GetSlot(a_SlotNum);
2013-04-10 21:40:30 +00:00
// Dispense the item:
switch (Drop.m_ItemType)
{
2013-04-10 21:40:30 +00:00
case E_ITEM_BUCKET:
{
2013-05-26 14:39:04 +00:00
BLOCKTYPE DispBlock = m_World->GetBlock(DispX, DispY, DispZ);
2013-04-10 21:40:30 +00:00
if (DispBlock == E_BLOCK_STATIONARY_WATER)
{
2013-05-26 14:39:04 +00:00
m_World->SetBlock(DispX, DispY, DispZ, E_BLOCK_AIR, 0);
2013-04-10 21:40:30 +00:00
Drop.m_ItemType = E_ITEM_WATER_BUCKET; // TODO: Duplication glitch - bucket stacking allows you to duplicate water
}
else if (DispBlock == E_BLOCK_STATIONARY_LAVA)
{
2013-05-26 14:39:04 +00:00
m_World->SetBlock(DispX, DispY, DispZ, E_BLOCK_AIR, 0);
2013-04-10 21:40:30 +00:00
Drop.m_ItemType = E_ITEM_LAVA_BUCKET; // TODO: Duplication glitch - bucket stacking allows you to duplicate lava
}
2013-04-10 21:40:30 +00:00
else
{
cItems Pickups;
Pickups.push_back(Drop.CopyOne());
2013-05-26 14:39:04 +00:00
m_World->SpawnItemPickups(Pickups, DispX, DispY, DispZ);
2013-04-10 21:40:30 +00:00
Drop.m_ItemCount--;
}
break;
}
case E_ITEM_WATER_BUCKET:
{
2013-05-26 14:39:04 +00:00
BLOCKTYPE DispBlock = m_World->GetBlock(DispX, DispY, DispZ);
2013-04-10 21:40:30 +00:00
if ((DispBlock == E_BLOCK_AIR) || IsBlockLiquid(DispBlock) || cFluidSimulator::CanWashAway(DispBlock))
{
2013-05-26 14:39:04 +00:00
m_World->SetBlock(DispX, DispY, DispZ, E_BLOCK_STATIONARY_WATER, 0);
2013-04-10 21:40:30 +00:00
Drop.m_ItemType = E_ITEM_BUCKET;
}
2013-04-10 21:40:30 +00:00
else
{
2013-04-10 21:40:30 +00:00
cItems Pickups;
Pickups.push_back(Drop.CopyOne());
2013-05-26 14:39:04 +00:00
m_World->SpawnItemPickups(Pickups, DispX, DispY, DispZ);
2013-04-10 21:40:30 +00:00
Drop.m_ItemCount--;
2012-12-26 18:15:11 +00:00
}
2013-04-10 21:40:30 +00:00
break;
}
case E_ITEM_LAVA_BUCKET:
{
2013-05-26 14:39:04 +00:00
BLOCKTYPE DispBlock = m_World->GetBlock( DispX, DispY, DispZ );
2013-04-10 21:40:30 +00:00
if ((DispBlock == E_BLOCK_AIR) || IsBlockLiquid(DispBlock) || cFluidSimulator::CanWashAway(DispBlock))
2012-12-26 18:15:11 +00:00
{
2013-05-26 14:39:04 +00:00
m_World->SetBlock(DispX, DispY, DispZ, E_BLOCK_STATIONARY_LAVA, 0);
2013-04-10 21:40:30 +00:00
Drop.m_ItemType = E_ITEM_BUCKET;
}
2013-04-10 21:40:30 +00:00
else
{
cItems Pickups;
2013-04-10 21:40:30 +00:00
Pickups.push_back(Drop.CopyOne());
2013-05-26 14:39:04 +00:00
m_World->SpawnItemPickups(Pickups, DispX, DispY, DispZ);
2013-04-10 21:40:30 +00:00
Drop.m_ItemCount--;
}
2013-04-10 21:40:30 +00:00
break;
}
2013-04-10 21:40:30 +00:00
case E_ITEM_SPAWN_EGG:
{
2013-05-26 14:39:04 +00:00
if (m_World->SpawnMob(DispX + 0.5, DispY, DispZ + 0.5, Drop.m_ItemDamage) >= 0)
2013-04-10 21:40:30 +00:00
{
Drop.m_ItemCount--;
}
break;
}
2013-04-10 21:40:30 +00:00
default:
{
2013-04-10 21:40:30 +00:00
cItems Pickups;
Pickups.push_back(Drop.CopyOne());
2013-05-26 14:39:04 +00:00
m_World->SpawnItemPickups(Pickups, DispX, DispY, DispZ);
2013-04-10 21:40:30 +00:00
Drop.m_ItemCount--;
break;
}
2013-04-10 21:40:30 +00:00
} // switch (ItemType)
}