1
0

- Implemented vertical dispensing for projectiles.

- Fixed some terrible commit issues on my side.
This commit is contained in:
Joannis 2014-05-28 09:10:09 +02:00
parent 1128dc783f
commit e5fd782524
2 changed files with 40 additions and 16 deletions

View File

@ -147,6 +147,7 @@ void cDispenserEntity::DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum)
case E_ITEM_FIRE_CHARGE: case E_ITEM_FIRE_CHARGE:
{ {
SpawnProjectileFromDispenser(a_Chunk, DispX, DispY, DispZ, cProjectileEntity::pkFireCharge); SpawnProjectileFromDispenser(a_Chunk, DispX, DispY, DispZ, cProjectileEntity::pkFireCharge);
m_Contents.ChangeSlotCount(a_SlotNum, -1);
break; break;
} }
@ -154,6 +155,7 @@ void cDispenserEntity::DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum)
case E_ITEM_ARROW: case E_ITEM_ARROW:
{ {
SpawnProjectileFromDispenser(a_Chunk, DispX, DispY, DispZ, cProjectileEntity::pkArrow); SpawnProjectileFromDispenser(a_Chunk, DispX, DispY, DispZ, cProjectileEntity::pkArrow);
m_Contents.ChangeSlotCount(a_SlotNum, -1);
break; break;
} }
@ -162,6 +164,7 @@ void cDispenserEntity::DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum)
{ {
// Not working as there is no such entity yet? // Not working as there is no such entity yet?
SpawnProjectileFromDispenser(a_Chunk, DispX, DispY, DispZ, cProjectileEntity::pkSnowball); SpawnProjectileFromDispenser(a_Chunk, DispX, DispY, DispZ, cProjectileEntity::pkSnowball);
m_Contents.ChangeSlotCount(a_SlotNum, -1);
break; break;
} }
@ -170,6 +173,7 @@ void cDispenserEntity::DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum)
{ {
// Not working as there is no such entity yet? // Not working as there is no such entity yet?
SpawnProjectileFromDispenser(a_Chunk, DispX, DispY, DispZ, cProjectileEntity::pkEgg); SpawnProjectileFromDispenser(a_Chunk, DispX, DispY, DispZ, cProjectileEntity::pkEgg);
m_Contents.ChangeSlotCount(a_SlotNum, -1);
break; break;
} }
@ -177,6 +181,7 @@ void cDispenserEntity::DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum)
case E_ITEM_FIREWORK_ROCKET: case E_ITEM_FIREWORK_ROCKET:
{ {
SpawnProjectileFromDispenser(a_Chunk, DispX, DispY, DispZ, cProjectileEntity::pkFirework); SpawnProjectileFromDispenser(a_Chunk, DispX, DispY, DispZ, cProjectileEntity::pkFirework);
m_Contents.ChangeSlotCount(a_SlotNum, -1);
break; break;
} }
@ -199,7 +204,7 @@ void cDispenserEntity::SpawnProjectileFromDispenser(cChunk & a_Chunk, int & Disp
double EntityX = 0.5 + (DispX + DispChunk->GetPosX() * cChunkDef::Width); double EntityX = 0.5 + (DispX + DispChunk->GetPosX() * cChunkDef::Width);
double EntityZ = 0.5 + (DispZ + DispChunk->GetPosZ() * cChunkDef::Width); double EntityZ = 0.5 + (DispZ + DispChunk->GetPosZ() * cChunkDef::Width);
m_World->CreateProjectile((double) EntityX, (double) DispY, (double) EntityZ, cProjectileEntity::pkArrow, NULL, NULL, & Speed); m_World->CreateProjectile((double) EntityX, (double) DispY + 0.5, (double) EntityZ, cProjectileEntity::pkArrow, NULL, NULL, &Speed);
} }
@ -210,22 +215,45 @@ Vector3d cDispenserEntity::GetProjectileLookVector(cChunk & a_Chunk)
int Direction = 0; int Direction = 0;
switch (Meta) switch (Meta)
{ {
case E_META_DROPSPENSER_FACING_YP: Direction = 0; break; // YP & YM don't have associated smoke dirs, just do 4 (centre of block) case E_META_DROPSPENSER_FACING_YP: Direction = -1; break; // UP
case E_META_DROPSPENSER_FACING_YM: Direction = 0; break; case E_META_DROPSPENSER_FACING_YM: Direction = -2; break; // DOWN
case E_META_DROPSPENSER_FACING_XM: Direction = 90; break; // WEST case E_META_DROPSPENSER_FACING_XM: Direction = 90; break; // WEST
case E_META_DROPSPENSER_FACING_XP: Direction = 270; break; // EAST case E_META_DROPSPENSER_FACING_XP: Direction = 270; break; // EAST
case E_META_DROPSPENSER_FACING_ZM: Direction = 180; break; case E_META_DROPSPENSER_FACING_ZM: Direction = 180; break;
case E_META_DROPSPENSER_FACING_ZP: Direction = 0; break; case E_META_DROPSPENSER_FACING_ZP: Direction = 0; break;
} }
Matrix4d m; if(Direction >= 0)
m.Init(Vector3d(), 0, Direction, 0); {
Vector3d Look = m.Transform(Vector3d(0, 0, 1)); Matrix4d m;
m.Init(Vector3d(), 0, Direction, 0);
Vector3d Look = m.Transform(Vector3d(0, 0, 1));
Vector3d Speed = Look * 20; Vector3d Speed = Look * 20;
Speed.y = Speed.y + 1; Speed.y = Speed.y + 1;
return Speed; return Speed;
} else if(Direction == -1)
{
Matrix4d m;
m.Init(Vector3d(), 0, 180, 0);
Vector3d Look = m.Transform(Vector3d(0, 1, 0));
Vector3d Speed = Look * 20;
return Speed;
} else {
Matrix4d m;
m.Init(Vector3d(), 0, -360, 0);
Vector3d Look = m.Transform(Vector3d(0, -1, 0));
Vector3d Speed = Look * 20;
return Speed;
}
} }
@ -291,7 +319,3 @@ bool cDispenserEntity::EmptyLiquidBucket(BLOCKTYPE a_BlockInFront, int a_SlotNum
m_Contents.AddItem(EmptyBucket); m_Contents.AddItem(EmptyBucket);
return true; return true;
} }

View File

@ -30,7 +30,7 @@ private:
bool ScoopUpLiquid(int a_SlotNum, short a_BucketItemType); bool ScoopUpLiquid(int a_SlotNum, short a_BucketItemType);
// Spawns a projectile of the given kind in front of the dispenser // Spawns a projectile of the given kind in front of the dispenser
void SpawnProjectileFromDispenser(cChunk& a_Chunk, int& DispX, int& DispY, int& DispZ, cProjectileEntity::eKind kind); void SpawnProjectileFromDispenser(cChunk & a_Chunk, int & DispX, int & DispY, int & DispZ, cProjectileEntity::eKind kind);
// Returns how to aim the projectile // Returns how to aim the projectile
Vector3d GetProjectileLookVector(cChunk & a_Chunk); Vector3d GetProjectileLookVector(cChunk & a_Chunk);