Merge branch 'master' of https://github.com/mc-server/MCServer
This commit is contained in:
commit
103c867f1f
@ -47,12 +47,13 @@ AttackDamage=4.0
|
||||
SightDistance=25.0
|
||||
MaxHealth=40
|
||||
|
||||
[Zombiepigman]
|
||||
[ZombiePigman]
|
||||
AttackRange=2.0
|
||||
AttackRate=1
|
||||
AttackDamage=7.0
|
||||
SightDistance=25.0
|
||||
MaxHealth=20
|
||||
IsFireproof=1
|
||||
|
||||
[Cavespider]
|
||||
AttackRange=2.0
|
||||
@ -74,6 +75,7 @@ AttackRate=1
|
||||
AttackDamage=0.0
|
||||
SightDistance=50.0
|
||||
MaxHealth=10
|
||||
IsFireproof=1
|
||||
|
||||
[Silverfish]
|
||||
AttackRange=2.0
|
||||
@ -115,6 +117,7 @@ AttackRate=1
|
||||
AttackDamage=6.0
|
||||
SightDistance=25.0
|
||||
MaxHealth=20
|
||||
IsFireproof=1
|
||||
|
||||
[Villager]
|
||||
AttackRange=2.0
|
||||
@ -122,6 +125,7 @@ AttackRate=1
|
||||
AttackDamage=0.0
|
||||
SightDistance=25.0
|
||||
MaxHealth=20
|
||||
IsFireproof=0
|
||||
|
||||
[Witch]
|
||||
AttackRange=2.0
|
||||
@ -145,12 +149,13 @@ AttackDamage=0.0
|
||||
SightDistance=25.0
|
||||
MaxHealth=10
|
||||
|
||||
[Magmacube]
|
||||
[MagmaCube]
|
||||
AttackRange=2.0
|
||||
AttackRate=1
|
||||
AttackDamage=6.0
|
||||
SightDistance=25.0
|
||||
MaxHealth=16
|
||||
IsFireproof=1
|
||||
|
||||
[Horse]
|
||||
AttackRange=2.0
|
||||
|
@ -46,10 +46,6 @@ macro(set_flags)
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11")
|
||||
else()
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++0x")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++0x")
|
||||
|
||||
add_flags_cxx("-pthread")
|
||||
endif()
|
||||
|
||||
@ -60,10 +56,6 @@ macro(set_flags)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11")
|
||||
else()
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++0x")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++0x")
|
||||
endif()
|
||||
|
||||
# We use a signed char (fixes #640 on RasPi)
|
||||
|
@ -128,9 +128,10 @@ void cDispenserEntity::DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum)
|
||||
if (DispChunk->GetBlock(DispX, DispY, DispZ) == E_BLOCK_AIR)
|
||||
{
|
||||
DispChunk->SetBlock(DispX, DispY, DispZ, E_BLOCK_FIRE, 0);
|
||||
m_Contents.SetSlot(a_SlotNum, m_Contents.GetSlot(a_SlotNum).m_ItemType, m_Contents.GetSlot(a_SlotNum).m_ItemCount, m_Contents.GetSlot(a_SlotNum).m_ItemDamage + 1);
|
||||
// If the durability has run out destroy the item.
|
||||
if (m_Contents.GetSlot(a_SlotNum).m_ItemDamage > 64)
|
||||
|
||||
bool ItemBroke = m_Contents.DamageItem(a_SlotNum, 1);
|
||||
|
||||
if (ItemBroke)
|
||||
{
|
||||
m_Contents.ChangeSlotCount(a_SlotNum, -1);
|
||||
}
|
||||
|
@ -413,19 +413,20 @@ bool cFurnaceEntity::CanCookInputToOutput(void) const
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_Contents.GetSlot(fsOutput).IsEmpty())
|
||||
const cItem & Slot = m_Contents.GetSlot(fsOutput);
|
||||
if (Slot.IsEmpty())
|
||||
{
|
||||
// The output is empty, can cook
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!m_Contents.GetSlot(fsOutput).IsEqual(*m_CurrentRecipe->Out))
|
||||
if (!Slot.IsEqual(*m_CurrentRecipe->Out))
|
||||
{
|
||||
// The output slot is blocked with something that cannot be stacked with the recipe's output
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_Contents.GetSlot(fsOutput).IsFullStack())
|
||||
if (Slot.IsFullStack())
|
||||
{
|
||||
// Cannot add any more items to the output slot
|
||||
return false;
|
||||
|
@ -234,24 +234,27 @@ bool cHopperEntity::MovePickupsIn(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||
|
||||
bool TrySuckPickupIn(cPickup * a_Pickup)
|
||||
{
|
||||
cItem & Item = a_Pickup->GetItem();
|
||||
|
||||
for (int i = 0; i < ContentsWidth * ContentsHeight; i++)
|
||||
{
|
||||
if (m_Contents.IsSlotEmpty(i))
|
||||
{
|
||||
m_bFoundPickupsAbove = true;
|
||||
m_Contents.SetSlot(i, a_Pickup->GetItem());
|
||||
m_Contents.SetSlot(i, Item);
|
||||
a_Pickup->Destroy(); // Kill pickup
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (m_Contents.GetSlot(i).IsEqual(a_Pickup->GetItem()) && !m_Contents.GetSlot(i).IsFullStack())
|
||||
else if (m_Contents.GetSlot(i).IsEqual(Item) && !m_Contents.GetSlot(i).IsFullStack())
|
||||
{
|
||||
m_bFoundPickupsAbove = true;
|
||||
|
||||
int PreviousCount = m_Contents.GetSlot(i).m_ItemCount;
|
||||
a_Pickup->GetItem().m_ItemCount -= m_Contents.ChangeSlotCount(i, a_Pickup->GetItem().m_ItemCount) - PreviousCount; // Set count to however many items were added
|
||||
|
||||
if (a_Pickup->GetItem().IsEmpty())
|
||||
Item.m_ItemCount -= m_Contents.ChangeSlotCount(i, Item.m_ItemCount) - PreviousCount; // Set count to however many items were added
|
||||
|
||||
if (Item.IsEmpty())
|
||||
{
|
||||
a_Pickup->Destroy(); // Kill pickup if all items were added
|
||||
}
|
||||
|
@ -56,6 +56,7 @@ public:
|
||||
(Area.GetRelBlockType(2, 0, 1) == E_BLOCK_CHEST)
|
||||
)
|
||||
{
|
||||
// FIXME: This is unreachable, as the condition is the same as the above one
|
||||
a_BlockMeta = (yaw < 0) ? 4 : 5;
|
||||
return true;
|
||||
}
|
||||
|
@ -141,7 +141,7 @@ public:
|
||||
NIBBLETYPE Meta = 0;
|
||||
char RailsCnt = 0;
|
||||
bool Neighbors[8]; // 0 - EAST, 1 - WEST, 2 - NORTH, 3 - SOUTH, 4 - EAST UP, 5 - WEST UP, 6 - NORTH UP, 7 - SOUTH UP
|
||||
memset(Neighbors, false, sizeof(Neighbors));
|
||||
memset(Neighbors, 0, sizeof(Neighbors));
|
||||
Neighbors[0] = (IsUnstable(a_ChunkInterface, a_BlockX + 1, a_BlockY, a_BlockZ) || !IsNotConnected(a_ChunkInterface, a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_EAST, E_PURE_DOWN));
|
||||
Neighbors[1] = (IsUnstable(a_ChunkInterface, a_BlockX - 1, a_BlockY, a_BlockZ) || !IsNotConnected(a_ChunkInterface, a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_WEST, E_PURE_DOWN));
|
||||
Neighbors[2] = (IsUnstable(a_ChunkInterface, a_BlockX, a_BlockY, a_BlockZ - 1) || !IsNotConnected(a_ChunkInterface, a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_NORTH, E_PURE_DOWN));
|
||||
|
@ -288,7 +288,7 @@ bool cBoundingBox::CalcLineIntersection(const Vector3d & a_Min, const Vector3d &
|
||||
Coeff = c;
|
||||
}
|
||||
c = a_Line1.LineCoeffToXZPlane(a_Line2, a_Max.y);
|
||||
if ((c >= 0) && (c >= 0) && (c < Coeff) && IsInside(a_Min, a_Max, a_Line1 + (a_Line2 - a_Line1) * c))
|
||||
if ((c >= 0) && (c < Coeff) && IsInside(a_Min, a_Max, a_Line1 + (a_Line2 - a_Line1) * c))
|
||||
{
|
||||
Face = (a_Line1.y > a_Line2.y) ? BLOCK_FACE_YP : BLOCK_FACE_YM;
|
||||
Coeff = c;
|
||||
|
@ -452,7 +452,7 @@ void cChunk::CollectMobCensus(cMobCensus& toFill)
|
||||
{
|
||||
cMonster& Monster = (cMonster&)(**itr);
|
||||
currentPosition = Monster.GetPosition();
|
||||
for (std::list<const Vector3d*>::const_iterator itr2 = playerPositions.begin(); itr2 != playerPositions.end(); itr2 ++)
|
||||
for (std::list<const Vector3d*>::const_iterator itr2 = playerPositions.begin(); itr2 != playerPositions.end(); ++itr2)
|
||||
{
|
||||
toFill.CollectMob(Monster,*this,(currentPosition-**itr2).SqrLength());
|
||||
}
|
||||
@ -600,7 +600,7 @@ void cChunk::Tick(float a_Dt)
|
||||
delete ToDelete;
|
||||
continue;
|
||||
}
|
||||
itr++;
|
||||
++itr;
|
||||
} // for itr - m_Entitites[]
|
||||
|
||||
// If any entity moved out of the chunk, move it to the neighbor:
|
||||
|
@ -382,14 +382,14 @@ private:
|
||||
|
||||
struct sSetBlockQueueItem
|
||||
{
|
||||
Int64 m_Tick;
|
||||
int m_RelX, m_RelY, m_RelZ;
|
||||
BLOCKTYPE m_BlockType;
|
||||
NIBBLETYPE m_BlockMeta;
|
||||
Int64 m_Tick;
|
||||
BLOCKTYPE m_PreviousType;
|
||||
|
||||
sSetBlockQueueItem(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Int64 a_Tick, BLOCKTYPE a_PreviousBlockType) :
|
||||
m_RelX(a_RelX), m_RelY(a_RelY), m_RelZ(a_RelZ), m_BlockType(a_BlockType), m_BlockMeta(a_BlockMeta), m_Tick(a_Tick), m_PreviousType(a_PreviousBlockType)
|
||||
m_Tick(a_Tick), m_RelX(a_RelX), m_RelY(a_RelY), m_RelZ(a_RelZ), m_BlockType(a_BlockType), m_BlockMeta(a_BlockMeta), m_PreviousType(a_PreviousBlockType)
|
||||
{
|
||||
}
|
||||
} ;
|
||||
|
@ -1656,7 +1656,7 @@ void cChunkMap::AddEntity(cEntity * a_Entity)
|
||||
{
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(a_Entity->GetChunkX(), ZERO_CHUNK_Y, a_Entity->GetChunkZ());
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
LOGWARNING("Entity at %p (%s, ID %d) spawning in a non-existent chunk, the entity is lost.",
|
||||
a_Entity, a_Entity->GetClass(), a_Entity->GetUniqueID()
|
||||
@ -1691,7 +1691,7 @@ void cChunkMap::RemoveEntity(cEntity * a_Entity)
|
||||
{
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(a_Entity->GetChunkX(), ZERO_CHUNK_Y, a_Entity->GetChunkZ());
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -1723,7 +1723,7 @@ bool cChunkMap::ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback
|
||||
{
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -1973,7 +1973,7 @@ bool cChunkMap::ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEnti
|
||||
{
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -1988,7 +1988,7 @@ bool cChunkMap::ForEachChestInChunk(int a_ChunkX, int a_ChunkZ, cChestCallback &
|
||||
{
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2003,7 +2003,7 @@ bool cChunkMap::ForEachDispenserInChunk(int a_ChunkX, int a_ChunkZ, cDispenserCa
|
||||
{
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2018,7 +2018,7 @@ bool cChunkMap::ForEachDropperInChunk(int a_ChunkX, int a_ChunkZ, cDropperCallba
|
||||
{
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2033,7 +2033,7 @@ bool cChunkMap::ForEachDropSpenserInChunk(int a_ChunkX, int a_ChunkZ, cDropSpens
|
||||
{
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2048,7 +2048,7 @@ bool cChunkMap::ForEachFurnaceInChunk(int a_ChunkX, int a_ChunkZ, cFurnaceCallba
|
||||
{
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2066,7 +2066,7 @@ bool cChunkMap::DoWithBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cB
|
||||
cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2084,7 +2084,7 @@ bool cChunkMap::DoWithChestAt(int a_BlockX, int a_BlockY, int a_BlockZ, cChestCa
|
||||
cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2102,7 +2102,7 @@ bool cChunkMap::DoWithDispenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDis
|
||||
cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2120,7 +2120,7 @@ bool cChunkMap::DoWithDropperAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDropp
|
||||
cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2138,7 +2138,7 @@ bool cChunkMap::DoWithDropSpenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cD
|
||||
cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2156,7 +2156,7 @@ bool cChunkMap::DoWithFurnaceAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFurna
|
||||
cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2173,7 +2173,7 @@ bool cChunkMap::DoWithNoteBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cNot
|
||||
cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2190,7 +2190,7 @@ bool cChunkMap::DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, c
|
||||
cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2208,7 +2208,7 @@ bool cChunkMap::DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHe
|
||||
cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2226,7 +2226,7 @@ bool cChunkMap::DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlo
|
||||
cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -2244,7 +2244,7 @@ bool cChunkMap::GetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, AString &
|
||||
cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||
cCSLock Lock(m_CSLayers);
|
||||
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||
if ((Chunk == NULL) || !Chunk->IsValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -453,14 +453,16 @@ void cClientHandle::HandlePing(void)
|
||||
{
|
||||
// Somebody tries to retrieve information about the server
|
||||
AString Reply;
|
||||
const cServer & Server = *cRoot::Get()->GetServer();
|
||||
|
||||
Printf(Reply, "%s%s%i%s%i",
|
||||
cRoot::Get()->GetServer()->GetDescription().c_str(),
|
||||
Server.GetDescription().c_str(),
|
||||
cChatColor::Delimiter.c_str(),
|
||||
cRoot::Get()->GetServer()->GetNumPlayers(),
|
||||
Server.GetNumPlayers(),
|
||||
cChatColor::Delimiter.c_str(),
|
||||
cRoot::Get()->GetServer()->GetMaxPlayers()
|
||||
Server.GetMaxPlayers()
|
||||
);
|
||||
Kick(Reply.c_str());
|
||||
Kick(Reply);
|
||||
}
|
||||
|
||||
|
||||
@ -1217,7 +1219,7 @@ void cClientHandle::HandleChat(const AString & a_Message)
|
||||
}
|
||||
else
|
||||
{
|
||||
Color.empty();
|
||||
Color.clear();
|
||||
}
|
||||
Msg.AddTextPart(AString("<") + m_Player->GetName() + "> ", Color);
|
||||
Msg.ParseText(a_Message);
|
||||
|
@ -661,14 +661,16 @@ cCraftingRecipes::cRecipe * cCraftingRecipes::MatchRecipe(const cItem * a_Crafti
|
||||
ASSERT(itrS->x + a_OffsetX < a_GridWidth);
|
||||
ASSERT(itrS->y + a_OffsetY < a_GridHeight);
|
||||
int GridID = (itrS->x + a_OffsetX) + a_GridStride * (itrS->y + a_OffsetY);
|
||||
|
||||
const cItem & Item = itrS->m_Item;
|
||||
if (
|
||||
(itrS->x >= a_GridWidth) ||
|
||||
(itrS->y >= a_GridHeight) ||
|
||||
(itrS->m_Item.m_ItemType != a_CraftingGrid[GridID].m_ItemType) || // same item type?
|
||||
(itrS->m_Item.m_ItemCount > a_CraftingGrid[GridID].m_ItemCount) || // not enough items
|
||||
(Item.m_ItemType != a_CraftingGrid[GridID].m_ItemType) || // same item type?
|
||||
(Item.m_ItemCount > a_CraftingGrid[GridID].m_ItemCount) || // not enough items
|
||||
(
|
||||
(itrS->m_Item.m_ItemDamage > 0) && // should compare damage values?
|
||||
(itrS->m_Item.m_ItemDamage != a_CraftingGrid[GridID].m_ItemDamage)
|
||||
(Item.m_ItemDamage > 0) && // should compare damage values?
|
||||
(Item.m_ItemDamage != a_CraftingGrid[GridID].m_ItemDamage)
|
||||
)
|
||||
)
|
||||
{
|
||||
@ -824,7 +826,7 @@ void cCraftingRecipes::HandleFireworks(const cItem * a_CraftingGrid, cCraftingRe
|
||||
case E_ITEM_DYE:
|
||||
{
|
||||
int GridID = (itr->x + a_OffsetX) + a_GridStride * (itr->y + a_OffsetY);
|
||||
DyeColours.push_back(cFireworkItem::GetVanillaColourCodeFromDye(a_CraftingGrid[GridID].m_ItemDamage));
|
||||
DyeColours.push_back(cFireworkItem::GetVanillaColourCodeFromDye((NIBBLETYPE)(a_CraftingGrid[GridID].m_ItemDamage & 0x0f)));
|
||||
break;
|
||||
}
|
||||
case E_ITEM_GUNPOWDER: break;
|
||||
|
@ -206,7 +206,7 @@ int cRSAPrivateKey::Encrypt(const Byte * a_PlainData, size_t a_PlainLength, Byte
|
||||
ASSERT(!"Invalid a_DecryptedMaxLength!");
|
||||
return -1;
|
||||
}
|
||||
if (a_EncryptedMaxLength < m_Rsa.len)
|
||||
if (a_PlainLength < m_Rsa.len)
|
||||
{
|
||||
LOGD("%s: Invalid a_PlainLength: got %u, exp at least %u",
|
||||
__FUNCTION__, (unsigned)a_PlainLength, (unsigned)(m_Rsa.len)
|
||||
|
@ -112,18 +112,21 @@ void cDeadlockDetect::CheckWorldAge(const AString & a_WorldName, Int64 a_Age)
|
||||
ASSERT(!"Unknown world in cDeadlockDetect");
|
||||
return;
|
||||
}
|
||||
if (itr->second.m_Age == a_Age)
|
||||
|
||||
cDeadlockDetect::sWorldAge & WorldAge = itr->second;
|
||||
|
||||
if (WorldAge.m_Age == a_Age)
|
||||
{
|
||||
itr->second.m_NumCyclesSame += 1;
|
||||
if (itr->second.m_NumCyclesSame > (1000 * m_IntervalSec) / CYCLE_MILLISECONDS)
|
||||
WorldAge.m_NumCyclesSame += 1;
|
||||
if (WorldAge.m_NumCyclesSame > (1000 * m_IntervalSec) / CYCLE_MILLISECONDS)
|
||||
{
|
||||
DeadlockDetected();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
itr->second.m_Age = a_Age;
|
||||
itr->second.m_NumCyclesSame = 0;
|
||||
WorldAge.m_Age = a_Age;
|
||||
WorldAge.m_NumCyclesSame = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,18 @@ cEnchantments::cEnchantments(const AString & a_StringSpec)
|
||||
|
||||
|
||||
|
||||
void cEnchantments::Add(const cEnchantments & a_Other)
|
||||
{
|
||||
for (cEnchantments::cMap::const_iterator itr = a_Other.m_Enchantments.begin(), end = a_Other.m_Enchantments.end(); itr != end; ++itr)
|
||||
{
|
||||
SetLevel(itr->first, itr->second);
|
||||
} // for itr - a_Other.m_Enchantments[]
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cEnchantments::AddFromString(const AString & a_StringSpec)
|
||||
{
|
||||
// Add enchantments in the stringspec; if a specified enchantment already exists, overwrites it
|
||||
|
@ -40,7 +40,8 @@ Serialization will never put zero-level enchantments into the stringspec and wil
|
||||
class cEnchantments
|
||||
{
|
||||
public:
|
||||
/// Individual enchantment IDs, corresponding to their NBT IDs ( http://www.minecraftwiki.net/wiki/Data_Values#Enchantment_IDs )
|
||||
/** Individual enchantment IDs, corresponding to their NBT IDs ( http://www.minecraftwiki.net/wiki/Data_Values#Enchantment_IDs )
|
||||
*/
|
||||
|
||||
enum
|
||||
{
|
||||
@ -70,34 +71,38 @@ public:
|
||||
enchLure = 62,
|
||||
} ;
|
||||
|
||||
/// Creates an empty enchantments container
|
||||
/** Creates an empty enchantments container */
|
||||
cEnchantments(void);
|
||||
|
||||
/// Creates an enchantments container filled with enchantments parsed from stringspec
|
||||
/** Creates an enchantments container filled with enchantments parsed from stringspec */
|
||||
cEnchantments(const AString & a_StringSpec);
|
||||
|
||||
/// Adds enchantments in the stringspec; if a specified enchantment already exists, overwrites it
|
||||
/** Adds the enchantments contained in a_Other into this object.
|
||||
Existing enchantments are preserved, unless a_Other specifies a different level, in which case the level is changed. */
|
||||
void Add(const cEnchantments & a_Other);
|
||||
|
||||
/** Adds enchantments in the stringspec; if a specified enchantment already exists, overwrites it */
|
||||
void AddFromString(const AString & a_StringSpec);
|
||||
|
||||
/// Serializes all the enchantments into a string
|
||||
/** Serializes all the enchantments into a string */
|
||||
AString ToString(void) const;
|
||||
|
||||
/// Returns the level for the specified enchantment; 0 if not stored
|
||||
/** Returns the level for the specified enchantment; 0 if not stored */
|
||||
int GetLevel(int a_EnchantmentID) const;
|
||||
|
||||
/// Sets the level for the specified enchantment, adding it if not stored before or removing it if level <= 0
|
||||
/** Sets the level for the specified enchantment, adding it if not stored before or removing it if level <= 0 */
|
||||
void SetLevel(int a_EnchantmentID, int a_Level);
|
||||
|
||||
/// Removes all enchantments
|
||||
/** Removes all enchantments */
|
||||
void Clear(void);
|
||||
|
||||
/// Returns true if there are no enchantments
|
||||
/** Returns true if there are no enchantments */
|
||||
bool IsEmpty(void) const;
|
||||
|
||||
/// Converts enchantment name to the numeric representation; returns -1 if enchantment name not found; case insensitive
|
||||
/** Converts enchantment name to the numeric representation; returns -1 if enchantment name not found; case insensitive */
|
||||
static int StringToEnchantmentID(const AString & a_EnchantmentName);
|
||||
|
||||
/// Returns true if a_Other contains exactly the same enchantments and levels
|
||||
/** Returns true if a_Other contains exactly the same enchantments and levels */
|
||||
bool operator ==(const cEnchantments & a_Other) const;
|
||||
|
||||
// tolua_end
|
||||
@ -120,20 +125,20 @@ public:
|
||||
/** Gets random enchantment from Vector and returns it */
|
||||
static cEnchantments GetRandomEnchantmentFromVector(cWeightedEnchantments & a_Enchantments);
|
||||
|
||||
/// Returns true if a_Other doesn't contain exactly the same enchantments and levels
|
||||
/** Returns true if a_Other doesn't contain exactly the same enchantments and levels */
|
||||
bool operator !=(const cEnchantments & a_Other) const;
|
||||
|
||||
/// Writes the enchantments into the specified NBT writer; begins with the LIST tag of the specified name ("ench" or "StoredEnchantments")
|
||||
/** Writes the enchantments into the specified NBT writer; begins with the LIST tag of the specified name ("ench" or "StoredEnchantments") */
|
||||
friend void EnchantmentSerializer::WriteToNBTCompound(cEnchantments const& a_Enchantments, cFastNBTWriter & a_Writer, const AString & a_ListTagName);
|
||||
|
||||
/// Reads the enchantments from the specified NBT list tag (ench or StoredEnchantments)
|
||||
/** Reads the enchantments from the specified NBT list tag (ench or StoredEnchantments) */
|
||||
friend void EnchantmentSerializer::ParseFromNBT(cEnchantments& a_Enchantments, const cParsedNBT & a_NBT, int a_EnchListTagIdx);
|
||||
|
||||
protected:
|
||||
/// Maps enchantment ID -> enchantment level
|
||||
/** Maps enchantment ID -> enchantment level */
|
||||
typedef std::map<int, int> cMap;
|
||||
|
||||
/// Currently stored enchantments
|
||||
/** Currently stored enchantments */
|
||||
cMap m_Enchantments;
|
||||
} ; // tolua_export
|
||||
|
||||
|
@ -45,6 +45,7 @@ cEntity::cEntity(eEntityType a_EntityType, double a_X, double a_Y, double a_Z, d
|
||||
, m_IsInitialized(false)
|
||||
, m_EntityType(a_EntityType)
|
||||
, m_World(NULL)
|
||||
, m_IsFireproof(false)
|
||||
, m_TicksSinceLastBurnDamage(0)
|
||||
, m_TicksSinceLastLavaDamage(0)
|
||||
, m_TicksSinceLastFireDamage(0)
|
||||
@ -815,8 +816,11 @@ void cEntity::TickBurning(cChunk & a_Chunk)
|
||||
{
|
||||
m_TicksSinceLastBurnDamage++;
|
||||
if (m_TicksSinceLastBurnDamage >= BURN_TICKS_PER_DAMAGE)
|
||||
{
|
||||
if (!m_IsFireproof)
|
||||
{
|
||||
TakeDamage(dtOnFire, NULL, BURN_DAMAGE, 0);
|
||||
}
|
||||
m_TicksSinceLastBurnDamage = 0;
|
||||
}
|
||||
m_TicksLeftBurning--;
|
||||
@ -883,8 +887,11 @@ void cEntity::TickBurning(cChunk & a_Chunk)
|
||||
// Periodically damage:
|
||||
m_TicksSinceLastLavaDamage++;
|
||||
if (m_TicksSinceLastLavaDamage >= LAVA_TICKS_PER_DAMAGE)
|
||||
{
|
||||
if (!m_IsFireproof)
|
||||
{
|
||||
TakeDamage(dtLavaContact, NULL, LAVA_DAMAGE, 0);
|
||||
}
|
||||
m_TicksSinceLastLavaDamage = 0;
|
||||
}
|
||||
}
|
||||
@ -901,8 +908,11 @@ void cEntity::TickBurning(cChunk & a_Chunk)
|
||||
// Periodically damage:
|
||||
m_TicksSinceLastFireDamage++;
|
||||
if (m_TicksSinceLastFireDamage >= FIRE_TICKS_PER_DAMAGE)
|
||||
{
|
||||
if (!m_IsFireproof)
|
||||
{
|
||||
TakeDamage(dtFireContact, NULL, FIRE_DAMAGE, 0);
|
||||
}
|
||||
m_TicksSinceLastFireDamage = 0;
|
||||
}
|
||||
}
|
||||
@ -1061,6 +1071,16 @@ void cEntity::SetMaxHealth(int a_MaxHealth)
|
||||
|
||||
|
||||
|
||||
/// Sets whether the entity is fireproof
|
||||
void cEntity::SetIsFireproof(bool a_IsFireproof)
|
||||
{
|
||||
m_IsFireproof = a_IsFireproof;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/// Puts the entity on fire for the specified amount of ticks
|
||||
void cEntity::StartBurning(int a_TicksLeftBurning)
|
||||
{
|
||||
|
@ -329,6 +329,11 @@ public:
|
||||
|
||||
int GetMaxHealth(void) const { return m_MaxHealth; }
|
||||
|
||||
/// Sets whether the entity is fireproof
|
||||
void SetIsFireproof(bool a_IsFireproof);
|
||||
|
||||
bool IsFireproof(void) const { return m_IsFireproof; }
|
||||
|
||||
/// Puts the entity on fire for the specified amount of ticks
|
||||
void StartBurning(int a_TicksLeftBurning);
|
||||
|
||||
@ -435,6 +440,9 @@ protected:
|
||||
|
||||
cWorld * m_World;
|
||||
|
||||
/// Whether the entity is capable of taking fire or lava damage.
|
||||
bool m_IsFireproof;
|
||||
|
||||
/// Time, in ticks, since the last damage dealt by being on fire. Valid only if on fire (IsOnFire())
|
||||
int m_TicksSinceLastBurnDamage;
|
||||
|
||||
|
@ -795,7 +795,7 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
|
||||
{
|
||||
BLOCKTYPE BlockXM = m_World->GetBlock(POSX_TOINT - 1, POSY_TOINT, POSZ_TOINT);
|
||||
BLOCKTYPE BlockXP = m_World->GetBlock(POSX_TOINT + 1, POSY_TOINT, POSZ_TOINT);
|
||||
BLOCKTYPE BlockZM = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT + 1);
|
||||
BLOCKTYPE BlockZM = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT - 1);
|
||||
BLOCKTYPE BlockZP = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT + 1);
|
||||
if (
|
||||
(!IsBlockRail(BlockXM) && cBlockInfo::IsSolid(BlockXM)) ||
|
||||
|
@ -85,9 +85,10 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName)
|
||||
if (!LoadFromDisk())
|
||||
{
|
||||
m_Inventory.Clear();
|
||||
SetPosX(cRoot::Get()->GetDefaultWorld()->GetSpawnX());
|
||||
SetPosY(cRoot::Get()->GetDefaultWorld()->GetSpawnY());
|
||||
SetPosZ(cRoot::Get()->GetDefaultWorld()->GetSpawnZ());
|
||||
cWorld * DefaultWorld = cRoot::Get()->GetDefaultWorld();
|
||||
SetPosX(DefaultWorld->GetSpawnX());
|
||||
SetPosY(DefaultWorld->GetSpawnY());
|
||||
SetPosZ(DefaultWorld->GetSpawnZ());
|
||||
|
||||
LOGD("Player \"%s\" is connecting for the first time, spawning at default world spawn {%.2f, %.2f, %.2f}",
|
||||
a_PlayerName.c_str(), GetPosX(), GetPosY(), GetPosZ()
|
||||
@ -1165,9 +1166,9 @@ Vector3d cPlayer::GetThrowSpeed(double a_SpeedCoeff) const
|
||||
|
||||
|
||||
|
||||
void cPlayer::ForceSetSpeed(Vector3d a_Direction)
|
||||
void cPlayer::ForceSetSpeed(const Vector3d & a_Speed)
|
||||
{
|
||||
SetSpeed(a_Direction);
|
||||
SetSpeed(a_Speed);
|
||||
m_ClientHandle->SendEntityVelocity(*this);
|
||||
}
|
||||
|
||||
|
@ -181,7 +181,7 @@ public:
|
||||
void LoginSetGameMode(eGameMode a_GameMode);
|
||||
|
||||
/** Forces the player to move in the given direction. */
|
||||
void ForceSetSpeed(Vector3d a_Direction); // tolua_export
|
||||
void ForceSetSpeed(const Vector3d & a_Speed); // tolua_export
|
||||
|
||||
/** Tries to move to a new position, with attachment-related checks (y == -999) */
|
||||
void MoveTo(const Vector3d & a_NewPos); // tolua_export
|
||||
|
@ -56,7 +56,6 @@ void cFurnaceRecipe::ReloadRecipes(void)
|
||||
std::ifstream f;
|
||||
char a_File[] = "furnace.txt";
|
||||
f.open(a_File, std::ios::in);
|
||||
std::string input;
|
||||
|
||||
if (!f.good())
|
||||
{
|
||||
|
@ -200,13 +200,14 @@ void cCaveTunnel::Randomize(cNoise & a_Noise)
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
// For each already present point, insert a point in between it and its predecessor, shifted randomly.
|
||||
int PrevX = m_Points.front().m_BlockX;
|
||||
int PrevY = m_Points.front().m_BlockY;
|
||||
int PrevZ = m_Points.front().m_BlockZ;
|
||||
int PrevR = m_Points.front().m_Radius;
|
||||
cCaveDefPoint & Point = m_Points.front();
|
||||
int PrevX = Point.m_BlockX;
|
||||
int PrevY = Point.m_BlockY;
|
||||
int PrevZ = Point.m_BlockZ;
|
||||
int PrevR = Point.m_Radius;
|
||||
cCaveDefPoints Pts;
|
||||
Pts.reserve(m_Points.size() * 2 + 1);
|
||||
Pts.push_back(m_Points.front());
|
||||
Pts.push_back(Point);
|
||||
for (cCaveDefPoints::const_iterator itr = m_Points.begin() + 1, end = m_Points.end(); itr != end; ++itr)
|
||||
{
|
||||
int Random = a_Noise.IntNoise3DInt(PrevX, PrevY, PrevZ + i) / 11;
|
||||
@ -244,11 +245,12 @@ bool cCaveTunnel::RefineDefPoints(const cCaveDefPoints & a_Src, cCaveDefPoints &
|
||||
a_Dst.clear();
|
||||
a_Dst.reserve(Num * 2 + 2);
|
||||
cCaveDefPoints::const_iterator itr = a_Src.begin() + 1;
|
||||
a_Dst.push_back(a_Src.front());
|
||||
int PrevX = a_Src.front().m_BlockX;
|
||||
int PrevY = a_Src.front().m_BlockY;
|
||||
int PrevZ = a_Src.front().m_BlockZ;
|
||||
int PrevR = a_Src.front().m_Radius;
|
||||
const cCaveDefPoint & Source = a_Src.front();
|
||||
a_Dst.push_back(Source);
|
||||
int PrevX = Source.m_BlockX;
|
||||
int PrevY = Source.m_BlockY;
|
||||
int PrevZ = Source.m_BlockZ;
|
||||
int PrevR = Source.m_Radius;
|
||||
for (int i = 0; i <= Num; ++i, ++itr)
|
||||
{
|
||||
int dx = itr->m_BlockX - PrevX;
|
||||
@ -310,9 +312,10 @@ void cCaveTunnel::FinishLinear(void)
|
||||
std::swap(Pts, m_Points);
|
||||
|
||||
m_Points.reserve(Pts.size() * 3);
|
||||
int PrevX = Pts.front().m_BlockX;
|
||||
int PrevY = Pts.front().m_BlockY;
|
||||
int PrevZ = Pts.front().m_BlockZ;
|
||||
cCaveDefPoint & PrevPoint = Pts.front();
|
||||
int PrevX = PrevPoint.m_BlockX;
|
||||
int PrevY = PrevPoint.m_BlockY;
|
||||
int PrevZ = PrevPoint.m_BlockZ;
|
||||
for (cCaveDefPoints::const_iterator itr = Pts.begin() + 1, end = Pts.end(); itr != end; ++itr)
|
||||
{
|
||||
int x1 = itr->m_BlockX;
|
||||
@ -433,9 +436,10 @@ void cCaveTunnel::FinishLinear(void)
|
||||
|
||||
void cCaveTunnel::CalcBoundingBox(void)
|
||||
{
|
||||
m_MinBlockX = m_MaxBlockX = m_Points.front().m_BlockX;
|
||||
m_MinBlockY = m_MaxBlockY = m_Points.front().m_BlockY;
|
||||
m_MinBlockZ = m_MaxBlockZ = m_Points.front().m_BlockZ;
|
||||
cCaveDefPoint & Point = m_Points.front();
|
||||
m_MinBlockX = m_MaxBlockX = Point.m_BlockX;
|
||||
m_MinBlockY = m_MaxBlockY = Point.m_BlockY;
|
||||
m_MinBlockZ = m_MaxBlockZ = Point.m_BlockZ;
|
||||
for (cCaveDefPoints::const_iterator itr = m_Points.begin() + 1, end = m_Points.end(); itr != end; ++itr)
|
||||
{
|
||||
m_MinBlockX = std::min(m_MinBlockX, itr->m_BlockX - itr->m_Radius);
|
||||
|
@ -23,6 +23,10 @@ static const cPrefab::sDef g_TestPrefabDef =
|
||||
// Size:
|
||||
7, 6, 7, // SizeX = 7, SizeY = 6, SizeZ = 7
|
||||
|
||||
// Hitbox (relative to bounding box):
|
||||
0, 0, 0, // MinX, MinY, MinZ
|
||||
6, 5, 6, // MaxX, MaxY, MaxZ
|
||||
|
||||
// Block definitions:
|
||||
".: 0: 0\n" /* 0 */
|
||||
"a:112: 0\n" /* netherbrick */
|
||||
@ -115,7 +119,10 @@ static cPrefab g_TestPrefab(g_TestPrefabDef);
|
||||
|
||||
cPrefab::cPrefab(const cPrefab::sDef & a_Def) :
|
||||
m_Size(a_Def.m_SizeX, a_Def.m_SizeY, a_Def.m_SizeZ),
|
||||
m_HitBox(0, 0, 0, a_Def.m_SizeX - 1, a_Def.m_SizeY - 1, a_Def.m_SizeZ - 1),
|
||||
m_HitBox(
|
||||
a_Def.m_HitboxMinX, a_Def.m_HitboxMinY, a_Def.m_HitboxMinZ,
|
||||
a_Def.m_HitboxMaxX, a_Def.m_HitboxMaxY, a_Def.m_HitboxMaxZ
|
||||
),
|
||||
m_AllowedRotations(a_Def.m_AllowedRotations),
|
||||
m_MergeStrategy(a_Def.m_MergeStrategy),
|
||||
m_ShouldExtendFloor(a_Def.m_ShouldExtendFloor),
|
||||
|
@ -38,6 +38,10 @@ public:
|
||||
int m_SizeY;
|
||||
int m_SizeZ;
|
||||
|
||||
/** The hitbox used for collision-checking between prefabs. Relative to the bounds. */
|
||||
int m_HitboxMinX, m_HitboxMinY, m_HitboxMinZ;
|
||||
int m_HitboxMaxX, m_HitboxMaxY, m_HitboxMaxZ;
|
||||
|
||||
/** The mapping between characters in m_Image and the blocktype / blockmeta.
|
||||
Format: "Char: BlockType: BlockMeta \n Char: BlockType : BlockMeta \n ..." */
|
||||
const char * m_CharMap;
|
||||
@ -114,7 +118,7 @@ protected:
|
||||
/** The size of the prefab */
|
||||
Vector3i m_Size;
|
||||
|
||||
/** The hitbox of the prefab. In first version is the same as the m_BlockArea dimensions */
|
||||
/** The hitbox used for collision-checking between prefabs. */
|
||||
cCuboid m_HitBox;
|
||||
|
||||
/** The connectors through which the piece connects to other pieces */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -269,7 +269,7 @@ void cStructGenRavines::cRavine::GenerateBaseDefPoints(int a_BlockX, int a_Block
|
||||
int CenterZ = a_BlockZ + OffsetZ;
|
||||
|
||||
// Get the base angle in which the ravine "axis" goes:
|
||||
float Angle = (float)(((float)((a_Noise.IntNoise3DInt(20 * a_BlockX, 70 * a_BlockZ, 6000) / 9) % 16384)) / 16384.0 * 3.141592653);
|
||||
float Angle = (float)(((float)((a_Noise.IntNoise3DInt(20 * a_BlockX, 70 * a_BlockZ, 6000) / 9) % 16384)) / 16384.0 * M_PI);
|
||||
float xc = sin(Angle);
|
||||
float zc = cos(Angle);
|
||||
|
||||
@ -311,12 +311,13 @@ void cStructGenRavines::cRavine::RefineDefPoints(const cRavDefPoints & a_Src, cR
|
||||
a_Dst.clear();
|
||||
a_Dst.reserve(Num * 2 + 2);
|
||||
cRavDefPoints::const_iterator itr = a_Src.begin() + 1;
|
||||
a_Dst.push_back(a_Src.front());
|
||||
int PrevX = a_Src.front().m_BlockX;
|
||||
int PrevZ = a_Src.front().m_BlockZ;
|
||||
int PrevR = a_Src.front().m_Radius;
|
||||
int PrevT = a_Src.front().m_Top;
|
||||
int PrevB = a_Src.front().m_Bottom;
|
||||
const cRavDefPoint & Source = a_Src.front();
|
||||
a_Dst.push_back(Source);
|
||||
int PrevX = Source.m_BlockX;
|
||||
int PrevZ = Source.m_BlockZ;
|
||||
int PrevR = Source.m_Radius;
|
||||
int PrevT = Source.m_Top;
|
||||
int PrevB = Source.m_Bottom;
|
||||
for (int i = 0; i <= Num; ++i, ++itr)
|
||||
{
|
||||
int dx = itr->m_BlockX - PrevX;
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
|
||||
|
||||
void cGroup::AddCommand( AString a_Command )
|
||||
void cGroup::AddCommand( const AString & a_Command )
|
||||
{
|
||||
m_Commands[ a_Command ] = true;
|
||||
}
|
||||
@ -16,7 +16,7 @@ void cGroup::AddCommand( AString a_Command )
|
||||
|
||||
|
||||
|
||||
void cGroup::AddPermission( AString a_Permission )
|
||||
void cGroup::AddPermission( const AString & a_Permission )
|
||||
{
|
||||
m_Permissions[ a_Permission ] = true;
|
||||
}
|
||||
|
@ -11,11 +11,11 @@ public: // tolua_export
|
||||
cGroup() {}
|
||||
~cGroup() {}
|
||||
|
||||
void SetName( AString a_Name ) { m_Name = a_Name; } // tolua_export
|
||||
void SetName( const AString & a_Name ) { m_Name = a_Name; } // tolua_export
|
||||
const AString & GetName() const { return m_Name; } // tolua_export
|
||||
void SetColor( AString a_Color ) { m_Color = a_Color; } // tolua_export
|
||||
void AddCommand( AString a_Command ); // tolua_export
|
||||
void AddPermission( AString a_Permission ); // tolua_export
|
||||
void SetColor( const AString & a_Color ) { m_Color = a_Color; } // tolua_export
|
||||
void AddCommand( const AString & a_Command ); // tolua_export
|
||||
void AddPermission( const AString & a_Permission ); // tolua_export
|
||||
void InheritFrom( cGroup* a_Group ); // tolua_export
|
||||
|
||||
typedef std::map< AString, bool > PermissionMap;
|
||||
|
@ -198,9 +198,6 @@ bool cItem::IsEnchantable(short item)
|
||||
return true;
|
||||
if ((item >= 298) && (item <= 317))
|
||||
return true;
|
||||
if ((item >= 290) && (item <= 294))
|
||||
return true;
|
||||
|
||||
if ((item == 346) || (item == 359) || (item == 261))
|
||||
return true;
|
||||
|
||||
@ -318,7 +315,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels)
|
||||
// Next Enchantment (Second)
|
||||
NewEnchantmentLevel = NewEnchantmentLevel / 2;
|
||||
float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100;
|
||||
if ((Random.NextFloat(100) > SecondEnchantmentChance) || (enchantments.size() == 0))
|
||||
if (enchantments.empty() || (Random.NextFloat(100) > SecondEnchantmentChance))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -333,7 +330,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels)
|
||||
// Next Enchantment (Third)
|
||||
NewEnchantmentLevel = NewEnchantmentLevel / 2;
|
||||
float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100;
|
||||
if ((Random.NextFloat(100) > ThirdEnchantmentChance) || (enchantments.size() == 0))
|
||||
if (enchantments.empty() || (Random.NextFloat(100) > ThirdEnchantmentChance))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -348,7 +345,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels)
|
||||
// Next Enchantment (Fourth)
|
||||
NewEnchantmentLevel = NewEnchantmentLevel / 2;
|
||||
float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100;
|
||||
if ((Random.NextFloat(100) > FourthEnchantmentChance) || (enchantments.size() == 0))
|
||||
if (enchantments.empty() || (Random.NextFloat(100) > FourthEnchantmentChance))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
@ -431,7 +431,6 @@ bool cItemHandler::IsTool()
|
||||
|| (m_ItemType >= 267 && m_ItemType <= 279)
|
||||
|| (m_ItemType >= 283 && m_ItemType <= 286)
|
||||
|| (m_ItemType >= 290 && m_ItemType <= 294)
|
||||
|| (m_ItemType >= 256 && m_ItemType <= 259)
|
||||
|| (m_ItemType == 325)
|
||||
|| (m_ItemType == 346);
|
||||
}
|
||||
|
@ -58,13 +58,13 @@ public:
|
||||
|
||||
struct FoodInfo
|
||||
{
|
||||
int FoodLevel;
|
||||
double Saturation;
|
||||
int FoodLevel;
|
||||
int PoisonChance; // 0 - 100, in percent. 0 = no chance of poisoning, 100 = sure poisoning
|
||||
|
||||
FoodInfo(int a_FoodLevel, double a_Saturation, int a_PoisonChance = 0) :
|
||||
FoodLevel(a_FoodLevel),
|
||||
Saturation(a_Saturation),
|
||||
FoodLevel(a_FoodLevel),
|
||||
PoisonChance(a_PoisonChance)
|
||||
{
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ void cMobProximityCounter::CollectMob(cEntity& a_Monster, cChunk& a_Chunk, doubl
|
||||
|
||||
void cMobProximityCounter::convertMaps()
|
||||
{
|
||||
for(tMonsterToDistance::const_iterator itr = m_MonsterToDistance.begin(); itr != m_MonsterToDistance.end(); itr++)
|
||||
for(tMonsterToDistance::const_iterator itr = m_MonsterToDistance.begin(); itr != m_MonsterToDistance.end(); ++itr)
|
||||
{
|
||||
m_DistanceToMonster.insert(tDistanceToMonster::value_type(itr->second.m_Distance,sMonsterAndChunk(*itr->first,itr->second.m_Chunk)));
|
||||
}
|
||||
@ -55,7 +55,7 @@ cMobProximityCounter::sIterablePair cMobProximityCounter::getMobWithinThosesDist
|
||||
convertMaps();
|
||||
}
|
||||
|
||||
for(tDistanceToMonster::const_iterator itr = m_DistanceToMonster.begin(); itr != m_DistanceToMonster.end(); itr++)
|
||||
for(tDistanceToMonster::const_iterator itr = m_DistanceToMonster.begin(); itr != m_DistanceToMonster.end(); ++itr)
|
||||
{
|
||||
if (toReturn.m_Begin == m_DistanceToMonster.end())
|
||||
{
|
||||
|
@ -13,7 +13,7 @@ cMobSpawner::cMobSpawner(cMonster::eFamily a_MonsterFamily,const std::set<cMonst
|
||||
m_NewPack(true),
|
||||
m_MobType(cMonster::mtInvalidType)
|
||||
{
|
||||
for (std::set<cMonster::eType>::const_iterator itr = a_AllowedTypes.begin(); itr != a_AllowedTypes.end(); itr++)
|
||||
for (std::set<cMonster::eType>::const_iterator itr = a_AllowedTypes.begin(); itr != a_AllowedTypes.end(); ++itr)
|
||||
{
|
||||
if (cMonster::FamilyFromType(*itr) == a_MonsterFamily)
|
||||
{
|
||||
@ -112,7 +112,7 @@ cMonster::eType cMobSpawner::ChooseMobType(EMCSBiome a_Biome)
|
||||
|
||||
for(int i = 0; i < iRandom; i++)
|
||||
{
|
||||
itr++;
|
||||
++itr;
|
||||
}
|
||||
|
||||
return *itr;
|
||||
|
@ -36,7 +36,8 @@ void cSheep::GetDrops(cItems & a_Drops, cEntity * a_Killer)
|
||||
|
||||
void cSheep::OnRightClicked(cPlayer & a_Player)
|
||||
{
|
||||
if ((a_Player.GetEquippedItem().m_ItemType == E_ITEM_SHEARS) && (!m_IsSheared))
|
||||
const cItem & EquippedItem = a_Player.GetEquippedItem();
|
||||
if ((EquippedItem.m_ItemType == E_ITEM_SHEARS) && (!m_IsSheared))
|
||||
{
|
||||
m_IsSheared = true;
|
||||
m_World->BroadcastEntityMetadata(*this);
|
||||
@ -51,9 +52,9 @@ void cSheep::OnRightClicked(cPlayer & a_Player)
|
||||
Drops.push_back(cItem(E_BLOCK_WOOL, NumDrops, m_WoolColor));
|
||||
m_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ(), 10);
|
||||
}
|
||||
if ((a_Player.GetEquippedItem().m_ItemType == E_ITEM_DYE) && (m_WoolColor != 15 - a_Player.GetEquippedItem().m_ItemDamage))
|
||||
else if ((EquippedItem.m_ItemType == E_ITEM_DYE) && (m_WoolColor != 15 - EquippedItem.m_ItemDamage))
|
||||
{
|
||||
m_WoolColor = 15 - a_Player.GetEquippedItem().m_ItemDamage;
|
||||
m_WoolColor = 15 - EquippedItem.m_ItemDamage;
|
||||
if (!a_Player.IsGameModeCreative())
|
||||
{
|
||||
a_Player.GetInventory().RemoveOneEquippedItem();
|
||||
|
@ -37,7 +37,7 @@ public:
|
||||
void SetIsTame (bool a_IsTame) { m_IsTame = a_IsTame; }
|
||||
void SetIsBegging (bool a_IsBegging) { m_IsBegging = a_IsBegging; }
|
||||
void SetIsAngry (bool a_IsAngry) { m_IsAngry = a_IsAngry; }
|
||||
void SetOwner (AString a_NewOwner) { m_OwnerName = a_NewOwner; }
|
||||
void SetOwner (const AString & a_NewOwner) { m_OwnerName = a_NewOwner; }
|
||||
void SetCollarColor(int a_CollarColor) { m_CollarColor = a_CollarColor; }
|
||||
|
||||
protected:
|
||||
|
@ -17,6 +17,7 @@ struct cMonsterConfig::sAttributesStruct
|
||||
int m_AttackRange;
|
||||
double m_AttackRate;
|
||||
int m_MaxHealth;
|
||||
bool m_IsFireproof;
|
||||
};
|
||||
|
||||
|
||||
@ -72,6 +73,7 @@ void cMonsterConfig::Initialize()
|
||||
Attributes.m_SightDistance = MonstersIniFile.GetValueI(Name, "SightDistance", 0);
|
||||
Attributes.m_AttackRate = MonstersIniFile.GetValueF(Name, "AttackRate", 0);
|
||||
Attributes.m_MaxHealth = MonstersIniFile.GetValueI(Name, "MaxHealth", 1);
|
||||
Attributes.m_IsFireproof = MonstersIniFile.GetValueB(Name, "IsFireproof", false);
|
||||
m_pState->AttributesList.push_front(Attributes);
|
||||
} // for i - SplitList[]
|
||||
}
|
||||
@ -92,6 +94,7 @@ void cMonsterConfig::AssignAttributes(cMonster * a_Monster, const AString & a_Na
|
||||
a_Monster->SetSightDistance(itr->m_SightDistance);
|
||||
a_Monster->SetAttackRate ((float)itr->m_AttackRate);
|
||||
a_Monster->SetMaxHealth (itr->m_MaxHealth);
|
||||
a_Monster->SetIsFireproof (itr->m_IsFireproof);
|
||||
return;
|
||||
}
|
||||
} // for itr - m_pState->AttributesList[]
|
||||
|
@ -840,12 +840,14 @@ void cPerlinNoise::Generate2D(
|
||||
}
|
||||
|
||||
// Generate the first octave directly into array:
|
||||
m_Octaves.front().m_Noise.Generate2D(
|
||||
const cOctave & FirstOctave = m_Octaves.front();
|
||||
|
||||
FirstOctave.m_Noise.Generate2D(
|
||||
a_Workspace, a_SizeX, a_SizeY,
|
||||
a_StartX * m_Octaves.front().m_Frequency, a_EndX * m_Octaves.front().m_Frequency,
|
||||
a_StartY * m_Octaves.front().m_Frequency, a_EndY * m_Octaves.front().m_Frequency
|
||||
a_StartX * FirstOctave.m_Frequency, a_EndX * FirstOctave.m_Frequency,
|
||||
a_StartY * FirstOctave.m_Frequency, a_EndY * FirstOctave.m_Frequency
|
||||
);
|
||||
NOISE_DATATYPE Amplitude = m_Octaves.front().m_Amplitude;
|
||||
NOISE_DATATYPE Amplitude = FirstOctave.m_Amplitude;
|
||||
for (int i = 0; i < ArrayCount; i++)
|
||||
{
|
||||
a_Array[i] *= Amplitude;
|
||||
@ -902,13 +904,15 @@ void cPerlinNoise::Generate3D(
|
||||
}
|
||||
|
||||
// Generate the first octave directly into array:
|
||||
m_Octaves.front().m_Noise.Generate3D(
|
||||
const cOctave & FirstOctave = m_Octaves.front();
|
||||
|
||||
FirstOctave.m_Noise.Generate3D(
|
||||
a_Workspace, a_SizeX, a_SizeY, a_SizeZ,
|
||||
a_StartX * m_Octaves.front().m_Frequency, a_EndX * m_Octaves.front().m_Frequency,
|
||||
a_StartY * m_Octaves.front().m_Frequency, a_EndY * m_Octaves.front().m_Frequency,
|
||||
a_StartZ * m_Octaves.front().m_Frequency, a_EndZ * m_Octaves.front().m_Frequency
|
||||
a_StartX * FirstOctave.m_Frequency, a_EndX * FirstOctave.m_Frequency,
|
||||
a_StartY * FirstOctave.m_Frequency, a_EndY * FirstOctave.m_Frequency,
|
||||
a_StartZ * FirstOctave.m_Frequency, a_EndZ * FirstOctave.m_Frequency
|
||||
);
|
||||
NOISE_DATATYPE Amplitude = m_Octaves.front().m_Amplitude;
|
||||
NOISE_DATATYPE Amplitude = FirstOctave.m_Amplitude;
|
||||
for (int i = 0; i < ArrayCount; i++)
|
||||
{
|
||||
a_Array[i] = a_Workspace[i] * Amplitude;
|
||||
|
@ -119,9 +119,10 @@ void cAuthenticator::Execute(void)
|
||||
}
|
||||
ASSERT(!m_Queue.empty());
|
||||
|
||||
int ClientID = m_Queue.front().m_ClientID;
|
||||
AString UserName = m_Queue.front().m_Name;
|
||||
AString ServerID = m_Queue.front().m_ServerID;
|
||||
cAuthenticator::cUser & User = m_Queue.front();
|
||||
int ClientID = User.m_ClientID;
|
||||
AString UserName = User.m_Name;
|
||||
AString ServerID = User.m_ServerID;
|
||||
m_Queue.pop_front();
|
||||
Lock.Unlock();
|
||||
|
||||
|
@ -538,9 +538,10 @@ void cProtocol125::SendHealth(void)
|
||||
{
|
||||
cCSLock Lock(m_CSPacket);
|
||||
WriteByte (PACKET_UPDATE_HEALTH);
|
||||
WriteShort((short)m_Client->GetPlayer()->GetHealth());
|
||||
WriteShort((short)m_Client->GetPlayer()->GetFoodLevel());
|
||||
WriteFloat((float)m_Client->GetPlayer()->GetFoodSaturationLevel());
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
WriteShort((short)Player->GetHealth());
|
||||
WriteShort((short)Player->GetFoodLevel());
|
||||
WriteFloat((float)Player->GetFoodSaturationLevel());
|
||||
Flush();
|
||||
}
|
||||
|
||||
@ -668,13 +669,14 @@ void cProtocol125::SendPickupSpawn(const cPickup & a_Pickup)
|
||||
cCSLock Lock(m_CSPacket);
|
||||
WriteByte (PACKET_PICKUP_SPAWN);
|
||||
WriteInt (a_Pickup.GetUniqueID());
|
||||
WriteShort (a_Pickup.GetItem().m_ItemType);
|
||||
WriteChar (a_Pickup.GetItem().m_ItemCount);
|
||||
WriteShort (a_Pickup.GetItem().m_ItemDamage);
|
||||
const cItem & Item = a_Pickup.GetItem();
|
||||
WriteShort (Item.m_ItemType);
|
||||
WriteChar (Item.m_ItemCount);
|
||||
WriteShort (Item.m_ItemDamage);
|
||||
WriteVectorI((Vector3i)(a_Pickup.GetPosition() * 32));
|
||||
WriteByte ((char)(a_Pickup.GetSpeed().x * 8));
|
||||
WriteByte ((char)(a_Pickup.GetSpeed().y * 8));
|
||||
WriteByte ((char)(a_Pickup.GetSpeed().z * 8));
|
||||
WriteByte ((char)(a_Pickup.GetSpeedX() * 8));
|
||||
WriteByte ((char)(a_Pickup.GetSpeedY() * 8));
|
||||
WriteByte ((char)(a_Pickup.GetSpeedZ() * 8));
|
||||
Flush();
|
||||
}
|
||||
|
||||
@ -831,10 +833,11 @@ void cProtocol125::SendRemoveEntityEffect(const cEntity & a_Entity, int a_Effect
|
||||
void cProtocol125::SendRespawn(void)
|
||||
{
|
||||
cCSLock Lock(m_CSPacket);
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
WriteByte (PACKET_RESPAWN);
|
||||
WriteInt ((int)(m_Client->GetPlayer()->GetWorld()->GetDimension()));
|
||||
WriteInt ((int)(Player->GetWorld()->GetDimension()));
|
||||
WriteByte (2); // TODO: Difficulty; 2 = Normal
|
||||
WriteChar ((char)m_Client->GetPlayer()->GetGameMode());
|
||||
WriteChar ((char)Player->GetGameMode());
|
||||
WriteShort (256); // Current world height
|
||||
WriteString("default");
|
||||
}
|
||||
@ -846,10 +849,11 @@ void cProtocol125::SendRespawn(void)
|
||||
void cProtocol125::SendExperience(void)
|
||||
{
|
||||
cCSLock Lock(m_CSPacket);
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
WriteByte (PACKET_EXPERIENCE);
|
||||
WriteFloat (m_Client->GetPlayer()->GetXpPercentage());
|
||||
WriteShort (m_Client->GetPlayer()->GetXpLevel());
|
||||
WriteShort (m_Client->GetPlayer()->GetCurrentXp());
|
||||
WriteFloat (Player->GetXpPercentage());
|
||||
WriteShort (Player->GetXpLevel());
|
||||
WriteShort (Player->GetCurrentXp());
|
||||
Flush();
|
||||
}
|
||||
|
||||
|
@ -408,7 +408,8 @@ void cProtocol132::SendWholeInventory(const cWindow & a_Window)
|
||||
super::SendWholeInventory(a_Window);
|
||||
|
||||
// Send the player inventory and hotbar:
|
||||
const cInventory & Inventory = m_Client->GetPlayer()->GetInventory();
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
const cInventory & Inventory = Player->GetInventory();
|
||||
int BaseOffset = a_Window.GetNumSlots() - (cInventory::invNumSlots - cInventory::invInventoryOffset); // Number of non-inventory slots
|
||||
char WindowID = a_Window.GetWindowID();
|
||||
for (short i = 0; i < cInventory::invInventoryCount; i++)
|
||||
@ -422,7 +423,7 @@ void cProtocol132::SendWholeInventory(const cWindow & a_Window)
|
||||
} // for i - Hotbar[]
|
||||
|
||||
// Send even the item being dragged:
|
||||
SendInventorySlot(-1, -1, m_Client->GetPlayer()->GetDraggingItem());
|
||||
SendInventorySlot(-1, -1, Player->GetDraggingItem());
|
||||
}
|
||||
|
||||
|
||||
@ -800,10 +801,12 @@ void cProtocol132::SendCompass(const cWorld & a_World)
|
||||
void cProtocol132::SendEncryptionKeyRequest(void)
|
||||
{
|
||||
cCSLock Lock(m_CSPacket);
|
||||
cServer * Server = cRoot::Get()->GetServer();
|
||||
WriteByte(0xfd);
|
||||
WriteString(cRoot::Get()->GetServer()->GetServerID());
|
||||
WriteShort((short)(cRoot::Get()->GetServer()->GetPublicKeyDER().size()));
|
||||
SendData(cRoot::Get()->GetServer()->GetPublicKeyDER().data(), cRoot::Get()->GetServer()->GetPublicKeyDER().size());
|
||||
WriteString(Server->GetServerID());
|
||||
const AString & PublicKeyDER = Server->GetPublicKeyDER();
|
||||
WriteShort((short)(PublicKeyDER.size()));
|
||||
SendData(PublicKeyDER.data(), PublicKeyDER.size());
|
||||
WriteShort(4);
|
||||
WriteInt((int)(intptr_t)this); // Using 'this' as the cryptographic nonce, so that we don't have to generate one each time :)
|
||||
Flush();
|
||||
@ -874,10 +877,11 @@ void cProtocol132::StartEncryption(const Byte * a_Key)
|
||||
|
||||
// Prepare the m_AuthServerID:
|
||||
cSHA1Checksum Checksum;
|
||||
AString ServerID = cRoot::Get()->GetServer()->GetServerID();
|
||||
cServer * Server = cRoot::Get()->GetServer();
|
||||
AString ServerID = Server->GetServerID();
|
||||
Checksum.Update((const Byte *)ServerID.c_str(), ServerID.length());
|
||||
Checksum.Update(a_Key, 16);
|
||||
Checksum.Update((const Byte *)cRoot::Get()->GetServer()->GetPublicKeyDER().data(), cRoot::Get()->GetServer()->GetPublicKeyDER().size());
|
||||
Checksum.Update((const Byte *)Server->GetPublicKeyDER().data(), Server->GetPublicKeyDER().size());
|
||||
Byte Digest[20];
|
||||
Checksum.Finalize(Digest);
|
||||
cSHA1Checksum::DigestToJava(Digest, m_AuthServerID);
|
||||
|
@ -103,9 +103,9 @@ void cProtocol142::SendPickupSpawn(const cPickup & a_Pickup)
|
||||
WriteInt (a_Pickup.GetUniqueID());
|
||||
WriteItem (a_Pickup.GetItem());
|
||||
WriteVectorI((Vector3i)(a_Pickup.GetPosition() * 32));
|
||||
WriteChar ((char)(a_Pickup.GetSpeed().x * 8));
|
||||
WriteChar ((char)(a_Pickup.GetSpeed().y * 8));
|
||||
WriteChar ((char)(a_Pickup.GetSpeed().z * 8));
|
||||
WriteChar((char)(a_Pickup.GetSpeedX() * 8));
|
||||
WriteChar((char)(a_Pickup.GetSpeedY() * 8));
|
||||
WriteChar((char)(a_Pickup.GetSpeedZ() * 8));
|
||||
Flush();
|
||||
}
|
||||
|
||||
@ -170,9 +170,9 @@ void cProtocol146::SendPickupSpawn(const cPickup & a_Pickup)
|
||||
WriteInt ((int)(a_Pickup.GetPosY() * 32));
|
||||
WriteInt ((int)(a_Pickup.GetPosZ() * 32));
|
||||
WriteInt (1);
|
||||
WriteShort((short)(a_Pickup.GetSpeed().x * 32));
|
||||
WriteShort((short)(a_Pickup.GetSpeed().y * 32));
|
||||
WriteShort((short)(a_Pickup.GetSpeed().z * 32));
|
||||
WriteShort((short)(a_Pickup.GetSpeedX() * 32));
|
||||
WriteShort((short)(a_Pickup.GetSpeedY() * 32));
|
||||
WriteShort((short)(a_Pickup.GetSpeedZ() * 32));
|
||||
WriteByte(0);
|
||||
WriteByte(0);
|
||||
|
||||
|
@ -131,9 +131,10 @@ void cProtocol161::SendHealth(void)
|
||||
{
|
||||
cCSLock Lock(m_CSPacket);
|
||||
WriteByte (PACKET_UPDATE_HEALTH);
|
||||
WriteFloat((float)m_Client->GetPlayer()->GetHealth());
|
||||
WriteShort((short)m_Client->GetPlayer()->GetFoodLevel());
|
||||
WriteFloat((float)m_Client->GetPlayer()->GetFoodSaturationLevel());
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
WriteFloat((float)Player->GetHealth());
|
||||
WriteShort((short)Player->GetFoodLevel());
|
||||
WriteFloat((float)Player->GetFoodSaturationLevel());
|
||||
Flush();
|
||||
}
|
||||
|
||||
@ -144,11 +145,12 @@ void cProtocol161::SendHealth(void)
|
||||
void cProtocol161::SendPlayerMaxSpeed(void)
|
||||
{
|
||||
cCSLock Lock(m_CSPacket);
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
WriteByte(PACKET_ENTITY_PROPERTIES);
|
||||
WriteInt(m_Client->GetPlayer()->GetUniqueID());
|
||||
WriteInt(Player->GetUniqueID());
|
||||
WriteInt(1);
|
||||
WriteString("generic.movementSpeed");
|
||||
WriteDouble(0.1 * m_Client->GetPlayer()->GetMaxSpeed());
|
||||
WriteDouble(0.1 * Player->GetMaxSpeed());
|
||||
Flush();
|
||||
}
|
||||
|
||||
@ -295,11 +297,12 @@ cProtocol162::cProtocol162(cClientHandle * a_Client) :
|
||||
void cProtocol162::SendPlayerMaxSpeed(void)
|
||||
{
|
||||
cCSLock Lock(m_CSPacket);
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
WriteByte(PACKET_ENTITY_PROPERTIES);
|
||||
WriteInt(m_Client->GetPlayer()->GetUniqueID());
|
||||
WriteInt(Player->GetUniqueID());
|
||||
WriteInt(1);
|
||||
WriteString("generic.movementSpeed");
|
||||
WriteDouble(0.1 * m_Client->GetPlayer()->GetMaxSpeed());
|
||||
WriteDouble(0.1 * Player->GetMaxSpeed());
|
||||
WriteShort(0);
|
||||
Flush();
|
||||
}
|
||||
|
@ -563,9 +563,10 @@ void cProtocol172::SendHealth(void)
|
||||
ASSERT(m_State == 3); // In game mode?
|
||||
|
||||
cPacketizer Pkt(*this, 0x06); // Update Health packet
|
||||
Pkt.WriteFloat((float)m_Client->GetPlayer()->GetHealth());
|
||||
Pkt.WriteShort(m_Client->GetPlayer()->GetFoodLevel());
|
||||
Pkt.WriteFloat((float)m_Client->GetPlayer()->GetFoodSaturationLevel());
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
Pkt.WriteFloat((float)Player->GetHealth());
|
||||
Pkt.WriteShort(Player->GetFoodLevel());
|
||||
Pkt.WriteFloat((float)Player->GetFoodSaturationLevel());
|
||||
}
|
||||
|
||||
|
||||
@ -607,12 +608,13 @@ void cProtocol172::SendLogin(const cPlayer & a_Player, const cWorld & a_World)
|
||||
{
|
||||
// Send the Join Game packet:
|
||||
{
|
||||
cServer * Server = cRoot::Get()->GetServer();
|
||||
cPacketizer Pkt(*this, 0x01); // Join Game packet
|
||||
Pkt.WriteInt(a_Player.GetUniqueID());
|
||||
Pkt.WriteByte((Byte)a_Player.GetEffectiveGameMode() | (cRoot::Get()->GetServer()->IsHardcore() ? 0x08 : 0)); // Hardcore flag bit 4
|
||||
Pkt.WriteByte((Byte)a_Player.GetEffectiveGameMode() | (Server->IsHardcore() ? 0x08 : 0)); // Hardcore flag bit 4
|
||||
Pkt.WriteChar((char)a_World.GetDimension());
|
||||
Pkt.WriteByte(2); // TODO: Difficulty (set to Normal)
|
||||
Pkt.WriteByte(std::min(cRoot::Get()->GetServer()->GetMaxPlayers(), 60));
|
||||
Pkt.WriteByte(std::min(Server->GetMaxPlayers(), 60));
|
||||
Pkt.WriteString("default"); // Level type - wtf?
|
||||
}
|
||||
|
||||
@ -758,22 +760,23 @@ void cProtocol172::SendPlayerAbilities(void)
|
||||
|
||||
cPacketizer Pkt(*this, 0x39); // Player Abilities packet
|
||||
Byte Flags = 0;
|
||||
if (m_Client->GetPlayer()->IsGameModeCreative())
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
if (Player->IsGameModeCreative())
|
||||
{
|
||||
Flags |= 0x01;
|
||||
Flags |= 0x08; // Godmode, used for creative
|
||||
}
|
||||
if (m_Client->GetPlayer()->IsFlying())
|
||||
if (Player->IsFlying())
|
||||
{
|
||||
Flags |= 0x02;
|
||||
}
|
||||
if (m_Client->GetPlayer()->CanFly())
|
||||
if (Player->CanFly())
|
||||
{
|
||||
Flags |= 0x04;
|
||||
}
|
||||
Pkt.WriteByte(Flags);
|
||||
Pkt.WriteFloat((float)(0.05 * m_Client->GetPlayer()->GetFlyingMaxSpeed()));
|
||||
Pkt.WriteFloat((float)(0.1 * m_Client->GetPlayer()->GetMaxSpeed()));
|
||||
Pkt.WriteFloat((float)(0.05 * Player->GetFlyingMaxSpeed()));
|
||||
Pkt.WriteFloat((float)(0.1 * Player->GetMaxSpeed()));
|
||||
}
|
||||
|
||||
|
||||
@ -832,17 +835,18 @@ void cProtocol172::SendPlayerMaxSpeed(void)
|
||||
ASSERT(m_State == 3); // In game mode?
|
||||
|
||||
cPacketizer Pkt(*this, 0x20); // Entity Properties
|
||||
Pkt.WriteInt(m_Client->GetPlayer()->GetUniqueID());
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
Pkt.WriteInt(Player->GetUniqueID());
|
||||
Pkt.WriteInt(1); // Count
|
||||
Pkt.WriteString("generic.movementSpeed");
|
||||
// The default game speed is 0.1, multiply that value by the relative speed:
|
||||
Pkt.WriteDouble(0.1 * m_Client->GetPlayer()->GetNormalMaxSpeed());
|
||||
if (m_Client->GetPlayer()->IsSprinting())
|
||||
Pkt.WriteDouble(0.1 * Player->GetNormalMaxSpeed());
|
||||
if (Player->IsSprinting())
|
||||
{
|
||||
Pkt.WriteShort(1); // Modifier count
|
||||
Pkt.WriteInt64(0x662a6b8dda3e4c1c);
|
||||
Pkt.WriteInt64(0x881396ea6097278d); // UUID of the modifier
|
||||
Pkt.WriteDouble(m_Client->GetPlayer()->GetSprintingMaxSpeed() - m_Client->GetPlayer()->GetNormalMaxSpeed());
|
||||
Pkt.WriteDouble(Player->GetSprintingMaxSpeed() - Player->GetNormalMaxSpeed());
|
||||
Pkt.WriteByte(2);
|
||||
}
|
||||
else
|
||||
@ -860,16 +864,17 @@ void cProtocol172::SendPlayerMoveLook(void)
|
||||
ASSERT(m_State == 3); // In game mode?
|
||||
|
||||
cPacketizer Pkt(*this, 0x08); // Player Position And Look packet
|
||||
Pkt.WriteDouble(m_Client->GetPlayer()->GetPosX());
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
Pkt.WriteDouble(Player->GetPosX());
|
||||
|
||||
// Protocol docs say this is PosY, but #323 says this is eye-pos
|
||||
// Moreover, the "+ 0.001" is there because otherwise the player falls through the block they were standing on.
|
||||
Pkt.WriteDouble(m_Client->GetPlayer()->GetStance() + 0.001);
|
||||
Pkt.WriteDouble(Player->GetStance() + 0.001);
|
||||
|
||||
Pkt.WriteDouble(m_Client->GetPlayer()->GetPosZ());
|
||||
Pkt.WriteFloat((float)m_Client->GetPlayer()->GetYaw());
|
||||
Pkt.WriteFloat((float)m_Client->GetPlayer()->GetPitch());
|
||||
Pkt.WriteBool(m_Client->GetPlayer()->IsOnGround());
|
||||
Pkt.WriteDouble(Player->GetPosZ());
|
||||
Pkt.WriteFloat((float)Player->GetYaw());
|
||||
Pkt.WriteFloat((float)Player->GetPitch());
|
||||
Pkt.WriteBool(Player->IsOnGround());
|
||||
}
|
||||
|
||||
|
||||
@ -941,9 +946,10 @@ void cProtocol172::SendRemoveEntityEffect(const cEntity & a_Entity, int a_Effect
|
||||
void cProtocol172::SendRespawn(void)
|
||||
{
|
||||
cPacketizer Pkt(*this, 0x07); // Respawn packet
|
||||
Pkt.WriteInt(m_Client->GetPlayer()->GetWorld()->GetDimension());
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
Pkt.WriteInt(Player->GetWorld()->GetDimension());
|
||||
Pkt.WriteByte(2); // TODO: Difficulty (set to Normal)
|
||||
Pkt.WriteByte((Byte)m_Client->GetPlayer()->GetEffectiveGameMode());
|
||||
Pkt.WriteByte((Byte)Player->GetEffectiveGameMode());
|
||||
Pkt.WriteString("default");
|
||||
}
|
||||
|
||||
@ -956,9 +962,10 @@ void cProtocol172::SendExperience (void)
|
||||
ASSERT(m_State == 3); // In game mode?
|
||||
|
||||
cPacketizer Pkt(*this, 0x1f); // Experience Packet
|
||||
Pkt.WriteFloat(m_Client->GetPlayer()->GetXpPercentage());
|
||||
Pkt.WriteShort(m_Client->GetPlayer()->GetXpLevel());
|
||||
Pkt.WriteShort(m_Client->GetPlayer()->GetCurrentXp());
|
||||
cPlayer * Player = m_Client->GetPlayer();
|
||||
Pkt.WriteFloat(Player->GetXpPercentage());
|
||||
Pkt.WriteShort(Player->GetXpLevel());
|
||||
Pkt.WriteShort(Player->GetCurrentXp());
|
||||
}
|
||||
|
||||
|
||||
@ -1635,15 +1642,16 @@ void cProtocol172::HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer)
|
||||
{
|
||||
// Send the response:
|
||||
AString Response = "{\"version\":{\"name\":\"1.7.2\",\"protocol\":4},\"players\":{";
|
||||
cServer * Server = cRoot::Get()->GetServer();
|
||||
AppendPrintf(Response, "\"max\":%u,\"online\":%u,\"sample\":[]},",
|
||||
cRoot::Get()->GetServer()->GetMaxPlayers(),
|
||||
cRoot::Get()->GetServer()->GetNumPlayers()
|
||||
Server->GetMaxPlayers(),
|
||||
Server->GetNumPlayers()
|
||||
);
|
||||
AppendPrintf(Response, "\"description\":{\"text\":\"%s\"},",
|
||||
cRoot::Get()->GetServer()->GetDescription().c_str()
|
||||
Server->GetDescription().c_str()
|
||||
);
|
||||
AppendPrintf(Response, "\"favicon\":\"data:image/png;base64,%s\"",
|
||||
cRoot::Get()->GetServer()->GetFaviconData().c_str()
|
||||
Server->GetFaviconData().c_str()
|
||||
);
|
||||
Response.append("}");
|
||||
|
||||
@ -1723,12 +1731,13 @@ void cProtocol172::HandlePacketLoginStart(cByteBuffer & a_ByteBuffer)
|
||||
return;
|
||||
}
|
||||
|
||||
cServer * Server = cRoot::Get()->GetServer();
|
||||
// If auth is required, then send the encryption request:
|
||||
if (cRoot::Get()->GetServer()->ShouldAuthenticate())
|
||||
if (Server->ShouldAuthenticate())
|
||||
{
|
||||
cPacketizer Pkt(*this, 0x01);
|
||||
Pkt.WriteString(cRoot::Get()->GetServer()->GetServerID());
|
||||
const AString & PubKeyDer = cRoot::Get()->GetServer()->GetPublicKeyDER();
|
||||
Pkt.WriteString(Server->GetServerID());
|
||||
const AString & PubKeyDer = Server->GetPublicKeyDER();
|
||||
Pkt.WriteShort(PubKeyDer.size());
|
||||
Pkt.WriteBuf(PubKeyDer.data(), PubKeyDer.size());
|
||||
Pkt.WriteShort(4);
|
||||
@ -2281,10 +2290,11 @@ void cProtocol172::StartEncryption(const Byte * a_Key)
|
||||
|
||||
// Prepare the m_AuthServerID:
|
||||
cSHA1Checksum Checksum;
|
||||
const AString & ServerID = cRoot::Get()->GetServer()->GetServerID();
|
||||
cServer * Server = cRoot::Get()->GetServer();
|
||||
const AString & ServerID = Server->GetServerID();
|
||||
Checksum.Update((const Byte *)ServerID.c_str(), ServerID.length());
|
||||
Checksum.Update(a_Key, 16);
|
||||
Checksum.Update((const Byte *)cRoot::Get()->GetServer()->GetPublicKeyDER().data(), cRoot::Get()->GetServer()->GetPublicKeyDER().size());
|
||||
Checksum.Update((const Byte *)Server->GetPublicKeyDER().data(), Server->GetPublicKeyDER().size());
|
||||
Byte Digest[20];
|
||||
Checksum.Finalize(Digest);
|
||||
cSHA1Checksum::DigestToJava(Digest, m_AuthServerID);
|
||||
@ -2626,11 +2636,12 @@ void cProtocol172::cPacketizer::WriteEntityMetadata(const cEntity & a_Entity)
|
||||
if (((cMinecart &)a_Entity).GetPayload() == cMinecart::mpNone)
|
||||
{
|
||||
cRideableMinecart & RideableMinecart = ((cRideableMinecart &)a_Entity);
|
||||
if (!RideableMinecart.GetContent().IsEmpty())
|
||||
const cItem & MinecartContent = RideableMinecart.GetContent();
|
||||
if (!MinecartContent.IsEmpty())
|
||||
{
|
||||
WriteByte(0x54);
|
||||
int Content = RideableMinecart.GetContent().m_ItemType;
|
||||
Content |= RideableMinecart.GetContent().m_ItemDamage << 8;
|
||||
int Content = MinecartContent.m_ItemType;
|
||||
Content |= MinecartContent.m_ItemDamage << 8;
|
||||
WriteInt(Content);
|
||||
WriteByte(0x55);
|
||||
WriteInt(RideableMinecart.GetBlockHeight());
|
||||
|
@ -1003,6 +1003,7 @@ bool cProtocolRecognizer::TryRecognizeLengthedProtocol(UInt32 a_PacketLengthRema
|
||||
void cProtocolRecognizer::SendLengthlessServerPing(void)
|
||||
{
|
||||
AString Reply;
|
||||
cServer * Server = cRoot::Get()->GetServer();
|
||||
switch (cRoot::Get()->GetPrimaryServerVersion())
|
||||
{
|
||||
case PROTO_VERSION_1_2_5:
|
||||
@ -1010,11 +1011,11 @@ void cProtocolRecognizer::SendLengthlessServerPing(void)
|
||||
{
|
||||
// http://wiki.vg/wiki/index.php?title=Protocol&oldid=3099#Server_List_Ping_.280xFE.29
|
||||
Printf(Reply, "%s%s%i%s%i",
|
||||
cRoot::Get()->GetServer()->GetDescription().c_str(),
|
||||
Server->GetDescription().c_str(),
|
||||
cChatColor::Delimiter.c_str(),
|
||||
cRoot::Get()->GetServer()->GetNumPlayers(),
|
||||
Server->GetNumPlayers(),
|
||||
cChatColor::Delimiter.c_str(),
|
||||
cRoot::Get()->GetServer()->GetMaxPlayers()
|
||||
Server->GetMaxPlayers()
|
||||
);
|
||||
break;
|
||||
}
|
||||
@ -1044,9 +1045,9 @@ void cProtocolRecognizer::SendLengthlessServerPing(void)
|
||||
|
||||
// http://wiki.vg/wiki/index.php?title=Server_List_Ping&oldid=3100
|
||||
AString NumPlayers;
|
||||
Printf(NumPlayers, "%d", cRoot::Get()->GetServer()->GetNumPlayers());
|
||||
Printf(NumPlayers, "%d", Server->GetNumPlayers());
|
||||
AString MaxPlayers;
|
||||
Printf(MaxPlayers, "%d", cRoot::Get()->GetServer()->GetMaxPlayers());
|
||||
Printf(MaxPlayers, "%d", Server->GetMaxPlayers());
|
||||
|
||||
AString ProtocolVersionNum;
|
||||
Printf(ProtocolVersionNum, "%d", cRoot::Get()->GetPrimaryServerVersion());
|
||||
@ -1060,7 +1061,7 @@ void cProtocolRecognizer::SendLengthlessServerPing(void)
|
||||
Reply.push_back(0);
|
||||
Reply.append(ProtocolVersionTxt);
|
||||
Reply.push_back(0);
|
||||
Reply.append(cRoot::Get()->GetServer()->GetDescription());
|
||||
Reply.append(Server->GetDescription());
|
||||
Reply.push_back(0);
|
||||
Reply.append(NumPlayers);
|
||||
Reply.push_back(0);
|
||||
|
@ -190,7 +190,7 @@ void cServer::PlayerDestroying(const cPlayer * a_Player)
|
||||
|
||||
bool cServer::InitServer(cIniFile & a_SettingsIni)
|
||||
{
|
||||
m_Description = a_SettingsIni.GetValueSet("Server", "Description", "MCServer - in C++!").c_str();
|
||||
m_Description = a_SettingsIni.GetValueSet("Server", "Description", "MCServer - in C++!");
|
||||
m_MaxPlayers = a_SettingsIni.GetValueSetI("Server", "MaxPlayers", 100);
|
||||
m_bIsHardcore = a_SettingsIni.GetValueSetB("Server", "HardcoreEnabled", false);
|
||||
m_PlayerCount = 0;
|
||||
@ -275,7 +275,7 @@ bool cServer::InitServer(cIniFile & a_SettingsIni)
|
||||
|
||||
|
||||
|
||||
int cServer::GetNumPlayers(void)
|
||||
int cServer::GetNumPlayers(void) const
|
||||
{
|
||||
cCSLock Lock(m_CSPlayerCount);
|
||||
return m_PlayerCount;
|
||||
|
@ -59,7 +59,7 @@ public: // tolua_export
|
||||
|
||||
// Player counts:
|
||||
int GetMaxPlayers(void) const {return m_MaxPlayers; }
|
||||
int GetNumPlayers(void);
|
||||
int GetNumPlayers(void) const;
|
||||
void SetMaxPlayers(int a_MaxPlayers) { m_MaxPlayers = a_MaxPlayers; }
|
||||
|
||||
// Hardcore mode or not:
|
||||
@ -168,7 +168,7 @@ private:
|
||||
cClientHandleList m_Clients; ///< Clients that are connected to the server and not yet assigned to a cWorld
|
||||
cClientHandleList m_ClientsToRemove; ///< Clients that have just been moved into a world and are to be removed from m_Clients in the next Tick()
|
||||
|
||||
cCriticalSection m_CSPlayerCount; ///< Locks the m_PlayerCount
|
||||
mutable cCriticalSection m_CSPlayerCount; ///< Locks the m_PlayerCount
|
||||
int m_PlayerCount; ///< Number of players currently playing in the server
|
||||
cCriticalSection m_CSPlayerCountDiff; ///< Locks the m_PlayerCountDiff
|
||||
int m_PlayerCountDiff; ///< Adjustment to m_PlayerCount to be applied in the Tick thread
|
||||
|
@ -350,7 +350,7 @@ void cFireSimulator::RemoveFuelNeighbors(cChunk * a_Chunk, int a_RelX, int a_Rel
|
||||
{
|
||||
continue;
|
||||
}
|
||||
BlockType = Neighbour->GetBlock(X, a_RelY + gCrossCoords[i].y, Z);
|
||||
BlockType = Neighbour->GetBlock(X, a_RelY + gNeighborCoords[i].y, Z);
|
||||
|
||||
if (!IsFuel(BlockType))
|
||||
{
|
||||
|
@ -155,7 +155,7 @@ Direction cFluidSimulator::GetFlowingDirection(int a_X, int a_Y, int a_Z, bool a
|
||||
Points.push_back(new Vector3i(a_X, a_Y, a_Z + 1));
|
||||
Points.push_back(new Vector3i(a_X, a_Y, a_Z - 1));
|
||||
|
||||
for (std::vector<Vector3i *>::iterator it = Points.begin(); it < Points.end(); it++)
|
||||
for (std::vector<Vector3i *>::iterator it = Points.begin(); it < Points.end(); ++it)
|
||||
{
|
||||
Vector3i *Pos = (*it);
|
||||
char BlockID = m_World.GetBlock(Pos->x, Pos->y, Pos->z);
|
||||
|
@ -935,7 +935,8 @@ BOOL StackWalker::LoadModules()
|
||||
break;
|
||||
}
|
||||
} // for (search for path separator...)
|
||||
if (strlen(szTemp) > 0)
|
||||
|
||||
if (szTemp[0] != '\0') // If szTemp is not empty (Note: This is more efficient than using strlen)
|
||||
{
|
||||
strcat_s(szSymPath, nSymPathLen, szTemp);
|
||||
strcat_s(szSymPath, nSymPathLen, ";");
|
||||
|
@ -485,6 +485,7 @@ void cSlotAreaCrafting::ClickedResult(cPlayer & a_Player)
|
||||
|
||||
// Get the current recipe:
|
||||
cCraftingRecipe & Recipe = GetRecipeForPlayer(a_Player);
|
||||
const cItem & Result = Recipe.GetResult();
|
||||
|
||||
cItem * PlayerSlots = GetPlayerSlots(a_Player) + 1;
|
||||
cCraftingGrid Grid(PlayerSlots, m_GridSize, m_GridSize);
|
||||
@ -492,16 +493,16 @@ void cSlotAreaCrafting::ClickedResult(cPlayer & a_Player)
|
||||
// If possible, craft:
|
||||
if (DraggingItem.IsEmpty())
|
||||
{
|
||||
DraggingItem = Recipe.GetResult();
|
||||
DraggingItem = Result;
|
||||
Recipe.ConsumeIngredients(Grid);
|
||||
Grid.CopyToItems(PlayerSlots);
|
||||
}
|
||||
else if (DraggingItem.IsEqual(Recipe.GetResult()))
|
||||
else if (DraggingItem.IsEqual(Result))
|
||||
{
|
||||
cItemHandler * Handler = ItemHandler(Recipe.GetResult().m_ItemType);
|
||||
if (DraggingItem.m_ItemCount + Recipe.GetResult().m_ItemCount <= Handler->GetMaxStackSize())
|
||||
cItemHandler * Handler = ItemHandler(Result.m_ItemType);
|
||||
if (DraggingItem.m_ItemCount + Result.m_ItemCount <= Handler->GetMaxStackSize())
|
||||
{
|
||||
DraggingItem.m_ItemCount += Recipe.GetResult().m_ItemCount;
|
||||
DraggingItem.m_ItemCount += Result.m_ItemCount;
|
||||
Recipe.ConsumeIngredients(Grid);
|
||||
Grid.CopyToItems(PlayerSlots);
|
||||
}
|
||||
|
@ -229,10 +229,11 @@ void cWebAdmin::HandleWebadminRequest(cHTTPConnection & a_Connection, cHTTPReque
|
||||
} // for itr - Data->m_Form[]
|
||||
|
||||
// Parse the URL into individual params:
|
||||
size_t idxQM = a_Request.GetURL().find('?');
|
||||
const AString & URL = a_Request.GetURL();
|
||||
size_t idxQM = URL.find('?');
|
||||
if (idxQM != AString::npos)
|
||||
{
|
||||
cHTTPFormParser URLParams(cHTTPFormParser::fpkURL, a_Request.GetURL().c_str() + idxQM + 1, a_Request.GetURL().length() - idxQM - 1, *Data);
|
||||
cHTTPFormParser URLParams(cHTTPFormParser::fpkURL, URL.c_str() + idxQM + 1, URL.length() - idxQM - 1, *Data);
|
||||
URLParams.Finish();
|
||||
for (cHTTPFormParser::const_iterator itr = URLParams.begin(), end = URLParams.end(); itr != end; ++itr)
|
||||
{
|
||||
@ -388,7 +389,6 @@ AString cWebAdmin::GetDefaultPage(void)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
AString VersionNum;
|
||||
AppendPrintf(Content, "<li>%s V.%i</li>", itr->second->GetName().c_str(), itr->second->GetVersion());
|
||||
}
|
||||
Content += "</ul>";
|
||||
|
@ -860,7 +860,7 @@ void cWorld::TickMobs(float a_Dt)
|
||||
{
|
||||
m_ChunkMap->SpawnMobs(Spawner);
|
||||
// do the spawn
|
||||
for (cMobSpawner::tSpawnedContainer::const_iterator itr2 = Spawner.getSpawned().begin(); itr2 != Spawner.getSpawned().end(); itr2++)
|
||||
for (cMobSpawner::tSpawnedContainer::const_iterator itr2 = Spawner.getSpawned().begin(); itr2 != Spawner.getSpawned().end(); ++itr2)
|
||||
{
|
||||
SpawnMobFinalize(*itr2);
|
||||
}
|
||||
@ -870,14 +870,14 @@ void cWorld::TickMobs(float a_Dt)
|
||||
|
||||
// move close mobs
|
||||
cMobProximityCounter::sIterablePair allCloseEnoughToMoveMobs = MobCensus.GetProximityCounter().getMobWithinThosesDistances(-1, 64 * 16);// MG TODO : deal with this magic number (the 16 is the size of a block)
|
||||
for(cMobProximityCounter::tDistanceToMonster::const_iterator itr = allCloseEnoughToMoveMobs.m_Begin; itr != allCloseEnoughToMoveMobs.m_End; itr++)
|
||||
for(cMobProximityCounter::tDistanceToMonster::const_iterator itr = allCloseEnoughToMoveMobs.m_Begin; itr != allCloseEnoughToMoveMobs.m_End; ++itr)
|
||||
{
|
||||
itr->second.m_Monster.Tick(a_Dt, itr->second.m_Chunk);
|
||||
}
|
||||
|
||||
// remove too far mobs
|
||||
cMobProximityCounter::sIterablePair allTooFarMobs = MobCensus.GetProximityCounter().getMobWithinThosesDistances(128 * 16, -1);// MG TODO : deal with this magic number (the 16 is the size of a block)
|
||||
for(cMobProximityCounter::tDistanceToMonster::const_iterator itr = allTooFarMobs.m_Begin; itr != allTooFarMobs.m_End; itr++)
|
||||
for(cMobProximityCounter::tDistanceToMonster::const_iterator itr = allTooFarMobs.m_Begin; itr != allTooFarMobs.m_End; ++itr)
|
||||
{
|
||||
itr->second.m_Monster.Destroy(true);
|
||||
}
|
||||
@ -2894,7 +2894,7 @@ void cWorld::TickQueuedBlocks(void)
|
||||
m_BlockTickQueueCopy.clear();
|
||||
m_BlockTickQueue.swap(m_BlockTickQueueCopy);
|
||||
|
||||
for (std::vector<BlockTickQueueItem *>::iterator itr = m_BlockTickQueueCopy.begin(); itr != m_BlockTickQueueCopy.end(); itr++)
|
||||
for (std::vector<BlockTickQueueItem *>::iterator itr = m_BlockTickQueueCopy.begin(); itr != m_BlockTickQueueCopy.end(); ++itr)
|
||||
{
|
||||
BlockTickQueueItem * Block = (*itr);
|
||||
Block->TicksToWait -= 1;
|
||||
@ -2985,7 +2985,7 @@ int cWorld::SpawnMobFinalize(cMonster * a_Monster)
|
||||
|
||||
|
||||
|
||||
int cWorld::CreateProjectile(double a_PosX, double a_PosY, double a_PosZ, cProjectileEntity::eKind a_Kind, cEntity * a_Creator, const cItem a_Item, const Vector3d * a_Speed)
|
||||
int cWorld::CreateProjectile(double a_PosX, double a_PosY, double a_PosZ, cProjectileEntity::eKind a_Kind, cEntity * a_Creator, const cItem & a_Item, const Vector3d * a_Speed)
|
||||
{
|
||||
cProjectileEntity * Projectile = cProjectileEntity::Create(a_Kind, a_Creator, a_PosX, a_PosY, a_PosZ, a_Item, a_Speed);
|
||||
if (Projectile == NULL)
|
||||
|
@ -711,7 +711,7 @@ public:
|
||||
int SpawnMobFinalize(cMonster* a_Monster);
|
||||
|
||||
/** Creates a projectile of the specified type. Returns the projectile's EntityID if successful, <0 otherwise */
|
||||
int CreateProjectile(double a_PosX, double a_PosY, double a_PosZ, cProjectileEntity::eKind a_Kind, cEntity * a_Creator, const cItem a_Item, const Vector3d * a_Speed = NULL); // tolua_export
|
||||
int CreateProjectile(double a_PosX, double a_PosY, double a_PosZ, cProjectileEntity::eKind a_Kind, cEntity * a_Creator, const cItem & a_Item, const Vector3d * a_Speed = NULL); // tolua_export
|
||||
|
||||
/** Returns a random number from the m_TickRand in range [0 .. a_Range]. To be used only in the tick thread! */
|
||||
int GetTickRandomNumber(unsigned a_Range) { return (int)(m_TickRand.randInt(a_Range)); }
|
||||
|
@ -345,7 +345,7 @@ cFastNBTWriter::cFastNBTWriter(const AString & a_RootTagName) :
|
||||
|
||||
void cFastNBTWriter::BeginCompound(const AString & a_Name)
|
||||
{
|
||||
if (m_CurrentStack >= MAX_STACK)
|
||||
if (m_CurrentStack >= MAX_STACK - 1)
|
||||
{
|
||||
ASSERT(!"Stack overflow");
|
||||
return;
|
||||
@ -376,7 +376,7 @@ void cFastNBTWriter::EndCompound(void)
|
||||
|
||||
void cFastNBTWriter::BeginList(const AString & a_Name, eTagType a_ChildrenType)
|
||||
{
|
||||
if (m_CurrentStack >= MAX_STACK)
|
||||
if (m_CurrentStack >= MAX_STACK - 1)
|
||||
{
|
||||
ASSERT(!"Stack overflow");
|
||||
return;
|
||||
|
@ -839,7 +839,7 @@ void cWSSCompact::cPAKFile::UpdateChunk2To3()
|
||||
|
||||
|
||||
|
||||
bool cWSSCompact::LoadChunkFromData(const cChunkCoords & a_Chunk, int & a_UncompressedSize, const AString & a_Data, cWorld * a_World)
|
||||
bool cWSSCompact::LoadChunkFromData(const cChunkCoords & a_Chunk, int a_UncompressedSize, const AString & a_Data, cWorld * a_World)
|
||||
{
|
||||
// Crude data integrity check:
|
||||
if (a_UncompressedSize < cChunkDef::BlockDataSize)
|
||||
|
@ -135,7 +135,7 @@ protected:
|
||||
bool EraseChunkData(const cChunkCoords & a_Chunk);
|
||||
|
||||
/// Loads the chunk from the data (no locking needed)
|
||||
bool LoadChunkFromData(const cChunkCoords & a_Chunk, int & a_UncompressedSize, const AString & a_Data, cWorld * a_World);
|
||||
bool LoadChunkFromData(const cChunkCoords & a_Chunk, int a_UncompressedSize, const AString & a_Data, cWorld * a_World);
|
||||
|
||||
void LoadEntitiesFromJson(Json::Value & a_Value, cEntityList & a_Entities, cBlockEntityList & a_BlockEntities, cWorld * a_World);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user