Merge branch 'master' into portals
Conflicts: src/Blocks/WorldInterface.h src/ClientHandle.cpp src/ClientHandle.h src/Entities/Player.cpp src/Entities/Player.h src/Generating/FinishGen.cpp src/Protocol/Protocol.h src/Protocol/Protocol125.cpp src/Protocol/Protocol125.h src/Protocol/Protocol16x.cpp src/Protocol/Protocol16x.h src/Protocol/Protocol17x.cpp src/Protocol/Protocol17x.h src/Protocol/ProtocolRecognizer.cpp src/Protocol/ProtocolRecognizer.h src/Root.h src/World.cpp
This commit is contained in:
217
src/Chunk.cpp
217
src/Chunk.cpp
@@ -41,7 +41,7 @@
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// sSetBlock:
|
||||
|
||||
sSetBlock::sSetBlock( int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta ) // absolute block position
|
||||
@@ -58,11 +58,11 @@ sSetBlock::sSetBlock( int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_Bloc
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cChunk:
|
||||
|
||||
cChunk::cChunk(
|
||||
int a_ChunkX, int a_ChunkY, int a_ChunkZ,
|
||||
int a_ChunkX, int a_ChunkY, int a_ChunkZ,
|
||||
cChunkMap * a_ChunkMap, cWorld * a_World,
|
||||
cChunk * a_NeighborXM, cChunk * a_NeighborXP, cChunk * a_NeighborZM, cChunk * a_NeighborZP,
|
||||
cAllocationPool<cChunkData::sChunkSection> & a_Pool
|
||||
@@ -87,7 +87,8 @@ cChunk::cChunk(
|
||||
m_NeighborZM(a_NeighborZM),
|
||||
m_NeighborZP(a_NeighborZP),
|
||||
m_WaterSimulatorData(a_World->GetWaterSimulator()->CreateChunkData()),
|
||||
m_LavaSimulatorData (a_World->GetLavaSimulator ()->CreateChunkData())
|
||||
m_LavaSimulatorData (a_World->GetLavaSimulator ()->CreateChunkData()),
|
||||
m_AlwaysTicked(0)
|
||||
{
|
||||
if (a_NeighborXM != NULL)
|
||||
{
|
||||
@@ -442,12 +443,12 @@ void cChunk::CollectMobCensus(cMobCensus& toFill)
|
||||
{
|
||||
currentPlayer = (*itr)->GetPlayer();
|
||||
playerPositions.push_back(&(currentPlayer->GetPosition()));
|
||||
}
|
||||
}
|
||||
|
||||
Vector3d currentPosition;
|
||||
for (cEntityList::iterator itr = m_Entities.begin(); itr != m_Entities.end(); ++itr)
|
||||
{
|
||||
//LOGD("Counting entity #%i (%s)", (*itr)->GetUniqueID(), (*itr)->GetClass());
|
||||
// LOGD("Counting entity #%i (%s)", (*itr)->GetUniqueID(), (*itr)->GetClass());
|
||||
if ((*itr)->IsMob())
|
||||
{
|
||||
cMonster& Monster = (cMonster&)(**itr);
|
||||
@@ -463,7 +464,7 @@ void cChunk::CollectMobCensus(cMobCensus& toFill)
|
||||
|
||||
|
||||
|
||||
void cChunk::getThreeRandomNumber(int& a_X, int& a_Y, int& a_Z,int a_MaxX, int a_MaxY, int a_MaxZ)
|
||||
void cChunk::GetThreeRandomNumbers(int & a_X, int & a_Y, int & a_Z,int a_MaxX, int a_MaxY, int a_MaxZ)
|
||||
{
|
||||
ASSERT(a_MaxX * a_MaxY * a_MaxZ * 8 < 0x00ffffff);
|
||||
int Random = m_World->GetTickRandomNumber(0x00ffffff);
|
||||
@@ -479,12 +480,12 @@ void cChunk::getThreeRandomNumber(int& a_X, int& a_Y, int& a_Z,int a_MaxX, int a
|
||||
|
||||
|
||||
|
||||
void cChunk::getRandomBlockCoords(int& a_X, int& a_Y, int& a_Z)
|
||||
void cChunk::GetRandomBlockCoords(int & a_X, int & a_Y, int & a_Z)
|
||||
{
|
||||
// MG TODO : check if this kind of optimization (only one random call) is still needed
|
||||
// MG TODO : if so propagate it
|
||||
|
||||
getThreeRandomNumber(a_X, a_Y, a_Z, Width, Height-2, Width);
|
||||
GetThreeRandomNumbers(a_X, a_Y, a_Z, Width, Height - 2, Width);
|
||||
a_Y++;
|
||||
}
|
||||
|
||||
@@ -494,65 +495,68 @@ void cChunk::getRandomBlockCoords(int& a_X, int& a_Y, int& a_Z)
|
||||
|
||||
void cChunk::SpawnMobs(cMobSpawner& a_MobSpawner)
|
||||
{
|
||||
int Center_X,Center_Y,Center_Z;
|
||||
getRandomBlockCoords(Center_X,Center_Y,Center_Z);
|
||||
int CenterX, CenterY, CenterZ;
|
||||
GetRandomBlockCoords(CenterX, CenterY, CenterZ);
|
||||
|
||||
BLOCKTYPE PackCenterBlock = GetBlock(Center_X, Center_Y, Center_Z);
|
||||
if (a_MobSpawner.CheckPackCenter(PackCenterBlock))
|
||||
BLOCKTYPE PackCenterBlock = GetBlock(CenterX, CenterY, CenterZ);
|
||||
if (!a_MobSpawner.CheckPackCenter(PackCenterBlock))
|
||||
{
|
||||
a_MobSpawner.NewPack();
|
||||
int NumberOfTries = 0;
|
||||
int NumberOfSuccess = 0;
|
||||
int MaxNbOfSuccess = 4; // this can be changed during the process for Wolves and Ghass
|
||||
while (NumberOfTries < 12 && NumberOfSuccess < MaxNbOfSuccess)
|
||||
{
|
||||
const int HorizontalRange = 20; // MG TODO : relocate
|
||||
const int VerticalRange = 0; // MG TODO : relocate
|
||||
int Try_X, Try_Y, Try_Z;
|
||||
getThreeRandomNumber(Try_X, Try_Y, Try_Z, 2*HorizontalRange+1 , 2*VerticalRange+1 , 2*HorizontalRange+1);
|
||||
Try_X -= HorizontalRange;
|
||||
Try_Y -= VerticalRange;
|
||||
Try_Z -= HorizontalRange;
|
||||
Try_X += Center_X;
|
||||
Try_Y += Center_Y;
|
||||
Try_Z += Center_Z;
|
||||
|
||||
ASSERT(Try_Y > 0);
|
||||
ASSERT(Try_Y < cChunkDef::Height-1);
|
||||
|
||||
EMCSBiome Biome = m_ChunkMap->GetBiomeAt (Try_X, Try_Z);
|
||||
// MG TODO :
|
||||
// Moon cycle (for slime)
|
||||
// check player and playerspawn presence < 24 blocks
|
||||
// check mobs presence on the block
|
||||
|
||||
// MG TODO : check that "Level" really means Y
|
||||
|
||||
/*
|
||||
NIBBLETYPE SkyLight = 0;
|
||||
|
||||
NIBBLETYPE BlockLight = 0;
|
||||
*/
|
||||
|
||||
if (IsLightValid())
|
||||
{
|
||||
cEntity* newMob = a_MobSpawner.TryToSpawnHere(this, Try_X, Try_Y, Try_Z, Biome, MaxNbOfSuccess);
|
||||
if (newMob)
|
||||
{
|
||||
int WorldX, WorldY, WorldZ;
|
||||
PositionToWorldPosition(Try_X, Try_Y, Try_Z, WorldX, WorldY, WorldZ);
|
||||
double ActualX = WorldX + 0.5;
|
||||
double ActualZ = WorldZ + 0.5;
|
||||
newMob->SetPosition(ActualX, WorldY, ActualZ);
|
||||
LOGD("Spawning %s #%i at %d,%d,%d",newMob->GetClass(),newMob->GetUniqueID(),WorldX, WorldY, WorldZ);
|
||||
NumberOfSuccess++;
|
||||
}
|
||||
}
|
||||
|
||||
NumberOfTries++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
a_MobSpawner.NewPack();
|
||||
int NumberOfTries = 0;
|
||||
int NumberOfSuccess = 0;
|
||||
int MaxNbOfSuccess = 4; // This can be changed during the process for Wolves and Ghasts
|
||||
while ((NumberOfTries < 12) && (NumberOfSuccess < MaxNbOfSuccess))
|
||||
{
|
||||
const int HorizontalRange = 20; // MG TODO : relocate
|
||||
const int VerticalRange = 0; // MG TODO : relocate
|
||||
int TryX, TryY, TryZ;
|
||||
GetThreeRandomNumbers(TryX, TryY, TryZ, 2 * HorizontalRange + 1, 2 * VerticalRange + 1, 2 * HorizontalRange + 1);
|
||||
TryX -= HorizontalRange;
|
||||
TryY -= VerticalRange;
|
||||
TryZ -= HorizontalRange;
|
||||
TryX += CenterX;
|
||||
TryY += CenterY;
|
||||
TryZ += CenterZ;
|
||||
|
||||
ASSERT(TryY > 0);
|
||||
ASSERT(TryY < cChunkDef::Height - 1);
|
||||
|
||||
EMCSBiome Biome = m_ChunkMap->GetBiomeAt(TryX, TryZ);
|
||||
// MG TODO :
|
||||
// Moon cycle (for slime)
|
||||
// check player and playerspawn presence < 24 blocks
|
||||
// check mobs presence on the block
|
||||
|
||||
// MG TODO : check that "Level" really means Y
|
||||
|
||||
/*
|
||||
NIBBLETYPE SkyLight = 0;
|
||||
|
||||
NIBBLETYPE BlockLight = 0;
|
||||
*/
|
||||
|
||||
NumberOfTries++;
|
||||
if (!IsLightValid())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
cEntity * newMob = a_MobSpawner.TryToSpawnHere(this, TryX, TryY, TryZ, Biome, MaxNbOfSuccess);
|
||||
if (newMob == NULL)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int WorldX, WorldY, WorldZ;
|
||||
PositionToWorldPosition(TryX, TryY, TryZ, WorldX, WorldY, WorldZ);
|
||||
double ActualX = WorldX + 0.5;
|
||||
double ActualZ = WorldZ + 0.5;
|
||||
newMob->SetPosition(ActualX, WorldY, ActualZ);
|
||||
LOGD("Spawning %s #%i at {%d, %d, %d}", newMob->GetClass(), newMob->GetUniqueID(), WorldX, WorldY, WorldZ);
|
||||
NumberOfSuccess++;
|
||||
} // while (retry)
|
||||
}
|
||||
|
||||
|
||||
@@ -695,13 +699,13 @@ void cChunk::ProcessQueuedSetBlocks(void)
|
||||
{
|
||||
if (itr->m_Tick <= CurrTick)
|
||||
{
|
||||
if (itr->m_PreviousType != E_BLOCK_AIR) // PreviousType defaults to 0 if not specified
|
||||
if (itr->m_PreviousType != E_BLOCK_AIR) // PreviousType defaults to 0 if not specified
|
||||
{
|
||||
if (GetBlock(itr->m_RelX, itr->m_RelY, itr->m_RelZ) == itr->m_PreviousType)
|
||||
{
|
||||
// Current world age is bigger than/equal to target world age - delay time reached AND
|
||||
// Previous block type was the same as current block type (to prevent duplication)
|
||||
SetBlock(itr->m_RelX, itr->m_RelY, itr->m_RelZ, itr->m_BlockType, itr->m_BlockMeta); // SetMeta doesn't send to client
|
||||
SetBlock(itr->m_RelX, itr->m_RelY, itr->m_RelZ, itr->m_BlockType, itr->m_BlockMeta); // SetMeta doesn't send to client
|
||||
itr = m_SetBlockQueue.erase(itr);
|
||||
LOGD("Successfully set queued block - previous and current types matched");
|
||||
}
|
||||
@@ -807,7 +811,7 @@ void cChunk::TickBlocks(void)
|
||||
|
||||
if (m_BlockTickY > cChunkDef::GetHeight(m_HeightMap, m_BlockTickX, m_BlockTickZ))
|
||||
{
|
||||
continue; // It's all air up here
|
||||
continue; // It's all air up here
|
||||
}
|
||||
|
||||
cBlockHandler * Handler = BlockHandler(GetBlock(m_BlockTickX, m_BlockTickY, m_BlockTickZ));
|
||||
@@ -892,7 +896,7 @@ void cChunk::ApplyWeatherToTop()
|
||||
SetBlock(X, Height, Z, E_BLOCK_ICE, 0);
|
||||
}
|
||||
else if (
|
||||
(m_World->IsDeepSnowEnabled()) &&
|
||||
(m_World->IsDeepSnowEnabled()) &&
|
||||
(
|
||||
(TopBlock == E_BLOCK_RED_ROSE) ||
|
||||
(TopBlock == E_BLOCK_YELLOW_FLOWER) ||
|
||||
@@ -940,10 +944,10 @@ void cChunk::GrowMelonPumpkin(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_Bl
|
||||
IsValid = IsValid && UnboundedRelGetBlock(a_RelX, a_RelY, a_RelZ + 1, BlockType[2], BlockMeta);
|
||||
IsValid = IsValid && UnboundedRelGetBlock(a_RelX, a_RelY, a_RelZ - 1, BlockType[3], BlockMeta);
|
||||
if (
|
||||
!IsValid ||
|
||||
(BlockType[0] == ProduceType) ||
|
||||
(BlockType[1] == ProduceType) ||
|
||||
(BlockType[2] == ProduceType) ||
|
||||
!IsValid ||
|
||||
(BlockType[0] == ProduceType) ||
|
||||
(BlockType[1] == ProduceType) ||
|
||||
(BlockType[2] == ProduceType) ||
|
||||
(BlockType[3] == ProduceType)
|
||||
)
|
||||
{
|
||||
@@ -1225,7 +1229,7 @@ bool cChunk::UnboundedRelSetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE
|
||||
}
|
||||
Chunk->SetBlock(a_RelX, a_RelY, a_RelZ, a_BlockType, a_BlockMeta);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1297,6 +1301,7 @@ void cChunk::CreateBlockEntities(void)
|
||||
switch (BlockType)
|
||||
{
|
||||
case E_BLOCK_BEACON:
|
||||
case E_BLOCK_TRAPPED_CHEST:
|
||||
case E_BLOCK_CHEST:
|
||||
case E_BLOCK_COMMAND_BLOCK:
|
||||
case E_BLOCK_DISPENSER:
|
||||
@@ -1427,6 +1432,7 @@ void cChunk::SetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType,
|
||||
switch (a_BlockType)
|
||||
{
|
||||
case E_BLOCK_BEACON:
|
||||
case E_BLOCK_TRAPPED_CHEST:
|
||||
case E_BLOCK_CHEST:
|
||||
case E_BLOCK_COMMAND_BLOCK:
|
||||
case E_BLOCK_DISPENSER:
|
||||
@@ -1524,11 +1530,11 @@ void cChunk::FastSetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockT
|
||||
|
||||
m_ChunkData.SetBlock(a_RelX, a_RelY, a_RelZ, a_BlockType);
|
||||
|
||||
if ( // Queue block to be sent only if ...
|
||||
a_SendToClients && // ... we are told to do so AND ...
|
||||
if ( // Queue block to be sent only if ...
|
||||
a_SendToClients && // ... we are told to do so AND ...
|
||||
(
|
||||
(OldBlockMeta != a_BlockMeta) || // ... the meta value is different OR ...
|
||||
!( // ... the old and new blocktypes AREN'T liquids (because client doesn't need to distinguish betwixt them); see below for specifics:
|
||||
(OldBlockMeta != a_BlockMeta) || // ... the meta value is different OR ...
|
||||
!( // ... the old and new blocktypes AREN'T liquids (because client doesn't need to distinguish betwixt them); see below for specifics:
|
||||
((OldBlockType == E_BLOCK_STATIONARY_WATER) && (a_BlockType == E_BLOCK_WATER)) || // Replacing stationary water with water
|
||||
((OldBlockType == E_BLOCK_WATER) && (a_BlockType == E_BLOCK_STATIONARY_WATER)) || // Replacing water with stationary water
|
||||
((OldBlockType == E_BLOCK_STATIONARY_LAVA) && (a_BlockType == E_BLOCK_LAVA)) || // Replacing stationary water with water
|
||||
@@ -1641,6 +1647,31 @@ cBlockEntity * cChunk::GetBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
|
||||
|
||||
|
||||
bool cChunk::ShouldBeTicked(void) const
|
||||
{
|
||||
return (HasAnyClients() || (m_AlwaysTicked > 0));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cChunk::SetAlwaysTicked(bool a_AlwaysTicked)
|
||||
{
|
||||
if (a_AlwaysTicked)
|
||||
{
|
||||
m_AlwaysTicked += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_AlwaysTicked -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cChunk::UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z)
|
||||
{
|
||||
cBlockEntity * be = GetBlockEntity(a_X, a_Y, a_Z);
|
||||
@@ -1696,7 +1727,7 @@ void cChunk::CollectPickupsByPlayer(cPlayer * a_Player)
|
||||
{
|
||||
if ((!(*itr)->IsPickup()) && (!(*itr)->IsProjectile()))
|
||||
{
|
||||
continue; // Only pickups and projectiles
|
||||
continue; // Only pickups and projectiles can be picked up
|
||||
}
|
||||
float DiffX = (float)((*itr)->GetPosX() - PosX );
|
||||
float DiffY = (float)((*itr)->GetPosY() - PosY );
|
||||
@@ -1852,7 +1883,7 @@ bool cChunk::HasClient(cClientHandle* a_Client)
|
||||
|
||||
|
||||
|
||||
bool cChunk::HasAnyClients(void)
|
||||
bool cChunk::HasAnyClients(void) const
|
||||
{
|
||||
return !m_LoadedByClient.empty();
|
||||
}
|
||||
@@ -2116,7 +2147,7 @@ bool cChunk::DoWithChestAt(int a_BlockX, int a_BlockY, int a_BlockZ, cChestCallb
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ((*itr)->GetBlockType() != E_BLOCK_CHEST)
|
||||
if (((*itr)->GetBlockType() != E_BLOCK_CHEST) && ((*itr)->GetBlockType() != E_BLOCK_TRAPPED_CHEST)) // Trapped chests use normal chests' handlers
|
||||
{
|
||||
// There is a block entity here, but of different type. No other block entity can be here, so we can safely bail out
|
||||
return false;
|
||||
@@ -2258,7 +2289,7 @@ bool cChunk::DoWithFurnaceAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFurnaceC
|
||||
}
|
||||
} // switch (BlockType)
|
||||
|
||||
// The correct block entity is here,
|
||||
// The correct block entity is here,
|
||||
if (a_Callback.Item((cFurnaceEntity *)*itr))
|
||||
{
|
||||
return false;
|
||||
@@ -2290,7 +2321,7 @@ bool cChunk::DoWithNoteBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cNoteBl
|
||||
return false;
|
||||
}
|
||||
|
||||
// The correct block entity is here,
|
||||
// The correct block entity is here
|
||||
if (a_Callback.Item((cNoteEntity *)*itr))
|
||||
{
|
||||
return false;
|
||||
@@ -2322,7 +2353,7 @@ bool cChunk::DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cCom
|
||||
return false;
|
||||
}
|
||||
|
||||
// The correct block entity is here,
|
||||
// The correct block entity is here,
|
||||
if (a_Callback.Item((cCommandBlockEntity *)*itr))
|
||||
{
|
||||
return false;
|
||||
@@ -2354,7 +2385,7 @@ bool cChunk::DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadC
|
||||
return false;
|
||||
}
|
||||
|
||||
// The correct block entity is here,
|
||||
// The correct block entity is here,
|
||||
if (a_Callback.Item((cMobHeadEntity *)*itr))
|
||||
{
|
||||
return false;
|
||||
@@ -2386,7 +2417,7 @@ bool cChunk::DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlower
|
||||
return false;
|
||||
}
|
||||
|
||||
// The correct block entity is here,
|
||||
// The correct block entity is here
|
||||
if (a_Callback.Item((cFlowerPotEntity *)*itr))
|
||||
{
|
||||
return false;
|
||||
@@ -2439,13 +2470,13 @@ bool cChunk::GetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_
|
||||
BLOCKTYPE cChunk::GetBlock(int a_RelX, int a_RelY, int a_RelZ) const
|
||||
{
|
||||
if (
|
||||
(a_RelX < 0) || (a_RelX >= Width) ||
|
||||
(a_RelX < 0) || (a_RelX >= Width) ||
|
||||
(a_RelY < 0) || (a_RelY >= Height) ||
|
||||
(a_RelZ < 0) || (a_RelZ >= Width)
|
||||
)
|
||||
{
|
||||
ASSERT(!"GetBlock(x, y, z) out of bounds!");
|
||||
return 0; // Clip
|
||||
return 0; // Clip
|
||||
}
|
||||
|
||||
return m_ChunkData.GetBlock(a_RelX, a_RelY, a_RelZ);
|
||||
@@ -2496,8 +2527,8 @@ cChunk * cChunk::GetRelNeighborChunk(int a_RelX, int a_RelZ)
|
||||
{
|
||||
int BlockX = m_PosX * cChunkDef::Width + a_RelX;
|
||||
int BlockZ = m_PosZ * cChunkDef::Width + a_RelZ;
|
||||
int BlockY, ChunkX, ChunkZ;
|
||||
AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||
int ChunkX, ChunkZ;
|
||||
BlockToChunk(BlockX, BlockZ, ChunkX, ChunkZ);
|
||||
return m_ChunkMap->GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
}
|
||||
|
||||
@@ -2696,7 +2727,7 @@ void cChunk::BroadcastChunkData(cChunkDataSerializer & a_Serializer, const cClie
|
||||
|
||||
|
||||
|
||||
void cChunk::BroadcastCollectPickup(const cPickup & a_Pickup, const cPlayer & a_Player, const cClientHandle * a_Exclude)
|
||||
void cChunk::BroadcastCollectEntity(const cEntity & a_Entity, const cPlayer & a_Player, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
{
|
||||
@@ -2704,7 +2735,7 @@ void cChunk::BroadcastCollectPickup(const cPickup & a_Pickup, const cPlayer & a_
|
||||
{
|
||||
continue;
|
||||
}
|
||||
(*itr)->SendCollectPickup(a_Pickup, a_Player);
|
||||
(*itr)->SendCollectEntity(a_Entity, a_Player);
|
||||
} // for itr - LoadedByClient[]
|
||||
}
|
||||
|
||||
@@ -2920,7 +2951,7 @@ void cChunk::BroadcastRemoveEntityEffect(const cEntity & a_Entity, int a_EffectI
|
||||
|
||||
|
||||
|
||||
void cChunk::BroadcastSoundEffect(const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude)
|
||||
void cChunk::BroadcastSoundEffect(const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
|
||||
{
|
||||
@@ -2928,7 +2959,7 @@ void cChunk::BroadcastSoundEffect(const AString & a_SoundName, int a_SrcX, int a
|
||||
{
|
||||
continue;
|
||||
}
|
||||
(*itr)->SendSoundEffect(a_SoundName, a_SrcX, a_SrcY, a_SrcZ, a_Volume, a_Pitch);
|
||||
(*itr)->SendSoundEffect(a_SoundName, a_X, a_Y, a_Z, a_Volume, a_Pitch);
|
||||
} // for itr - LoadedByClient[]
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user