From 0f1fd3312332da2a6104c9eb98625610a4a08eff Mon Sep 17 00:00:00 2001 From: Hownaer Date: Thu, 28 Aug 2014 01:21:54 +0200 Subject: [PATCH 001/226] Enchanting table improvements. --- src/Item.cpp | 32 +++----- src/UI/SlotArea.cpp | 192 ++++++++++++++++++-------------------------- src/UI/SlotArea.h | 7 +- src/UI/Window.cpp | 33 ++++---- src/UI/Window.h | 3 - 5 files changed, 113 insertions(+), 154 deletions(-) diff --git a/src/Item.cpp b/src/Item.cpp index 2c5deaddf..a5117c271 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -190,31 +190,23 @@ void cItem::FromJson(const Json::Value & a_Value) -bool cItem::IsEnchantable(short item) +bool cItem::IsEnchantable(short a_ItemType) { - if ((item >= 256) && (item <= 259)) + if (ItemCategory::IsTool(a_ItemType) || ItemCategory::IsArmor(a_ItemType)) { return true; } - if ((item >= 267) && (item <= 279)) + + switch (a_ItemType) { - return true; - } - if ((item >= 283) && (item <= 286)) - { - return true; - } - if ((item >= 290) && (item <= 294)) - { - return true; - } - if ((item >= 298) && (item <= 317)) - { - return true; - } - if ((item == 346) || (item == 359) || (item == 261)) - { - return true; + case E_ITEM_BOOK: + case E_ITEM_BOW: + case E_ITEM_CARROT_ON_STICK: + case E_ITEM_FISHING_ROD: + case E_ITEM_SHEARS: + { + return true; + } } return false; diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 4199bbf56..74173d087 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -207,7 +207,7 @@ void cSlotArea::ShiftClicked(cPlayer & a_Player, int a_SlotNum, const cItem & a_ m_ParentWindow.DistributeStack(Slot, a_Player, this, true); if (Slot.IsEmpty()) { - // Empty the slot completely, the cilent doesn't like left-over ItemType with zero count + // Empty the slot completely, the client doesn't like left-over ItemType with zero count Slot.Empty(); } SetSlot(a_SlotNum, a_Player, Slot); @@ -1389,8 +1389,11 @@ void cSlotAreaBeacon::OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum) //////////////////////////////////////////////////////////////////////////////// // cSlotAreaEnchanting: -cSlotAreaEnchanting::cSlotAreaEnchanting(cEnchantingWindow & a_ParentWindow) : - cSlotAreaTemporary(1, a_ParentWindow) +cSlotAreaEnchanting::cSlotAreaEnchanting(cEnchantingWindow & a_ParentWindow, int a_BlockX, int a_BlockY, int a_BlockZ) : + cSlotAreaTemporary(1, a_ParentWindow), + m_BlockX(a_BlockX), + m_BlockY(a_BlockY), + m_BlockZ(a_BlockZ) { a_ParentWindow.m_SlotArea = this; } @@ -1409,7 +1412,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio LOGWARNING("GetSlot(%d) returned NULL! Ignoring click", a_SlotNum); return; } - + switch (a_ClickAction) { case caShiftLeftClick: @@ -1420,7 +1423,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio } case caDblClick: { - DblClicked(a_Player, a_SlotNum); + // DblClicked(a_Player, a_SlotNum); return; } case caMiddleClick: @@ -1428,6 +1431,25 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio MiddleClicked(a_Player, a_SlotNum); return; } + case caDropKey: + case caCtrlDropKey: + { + DropClicked(a_Player, a_SlotNum, false); + return; + } + case caNumber1: + case caNumber2: + case caNumber3: + case caNumber4: + case caNumber5: + case caNumber6: + case caNumber7: + case caNumber8: + case caNumber9: + { + NumberClicked(a_Player, a_SlotNum, a_ClickAction); + return; + } default: { break; @@ -1443,107 +1465,38 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio bAsync = true; } cItem & DraggingItem = a_Player.GetDraggingItem(); - switch (a_ClickAction) + + if (DraggingItem.IsEmpty()) { - case caRightClick: + if (!Slot.IsEmpty()) { - // Right-clicked - if (DraggingItem.IsEmpty()) - { - DraggingItem = Slot.CopyOne(); - Slot.Empty(); - break; - } - - if (Slot.IsEmpty()) - { - Slot = DraggingItem.CopyOne(); - DraggingItem.m_ItemCount -= 1; - if (DraggingItem.m_ItemCount <= 0) - { - DraggingItem.Empty(); - } - } - else if ((!DraggingItem.IsEqual(Slot)) && (DraggingItem.m_ItemCount == 1)) - { - // Swap contents - cItem tmp(DraggingItem); - DraggingItem = Slot; - Slot = tmp; - } - break; + DraggingItem = Slot; + Slot.Empty(); } - - case caLeftClick: + } + else if (Slot.IsEmpty()) + { + Slot = DraggingItem.CopyOne(); + DraggingItem.m_ItemCount -= 1; + + if (DraggingItem.m_ItemCount <= 0) { - // Left-clicked - if (DraggingItem.IsEmpty()) - { - DraggingItem = Slot.CopyOne(); - Slot.Empty(); - break; - } - - if (DraggingItem.IsEqual(Slot)) - { - // Do nothing - break; - } - - if (!Slot.IsEmpty()) - { - if (DraggingItem.m_ItemCount == 1) - { - // Swap contents - cItem tmp(DraggingItem); - DraggingItem = Slot; - Slot = tmp; - } - } - else - { - Slot = DraggingItem.CopyOne(); - DraggingItem.m_ItemCount -= 1; - if (DraggingItem.m_ItemCount <= 0) - { - DraggingItem.Empty(); - } - } - break; + DraggingItem.Empty(); } - default: - { - LOGWARNING("SlotArea: Unhandled click action: %d (%s)", a_ClickAction, ClickActionToString(a_ClickAction)); - m_ParentWindow.BroadcastWholeWindow(); - return; - } - } // switch (a_ClickAction - + } + else if ((DraggingItem.m_ItemCount == 1) && !DraggingItem.IsEqual(Slot)) + { + // Switch contents + cItem tmp(DraggingItem); + DraggingItem = Slot; + Slot = tmp; + } + SetSlot(a_SlotNum, a_Player, Slot); if (bAsync) { m_ParentWindow.BroadcastWholeWindow(); } - UpdateResult(a_Player); -} - - - - - -void cSlotAreaEnchanting::DblClicked(cPlayer & a_Player, int a_SlotNum) -{ - cItem & Dragging = a_Player.GetDraggingItem(); - if ((!Dragging.IsEmpty()) || (a_SlotNum != 0)) - { - return; - } - - cItem Item = *GetSlot(0, a_Player); - if (!m_ParentWindow.CollectItemsToHand(Item, *this, a_Player, false)) - { - m_ParentWindow.CollectItemsToHand(Item, *this, a_Player, true); - } } @@ -1567,7 +1520,15 @@ void cSlotAreaEnchanting::DistributeStack(cItem & a_ItemStack, cPlayer & a_Playe { a_ItemStack.Empty(); } +} + + + + +void cSlotAreaEnchanting::OnPlayerAdded(cPlayer & a_Player) +{ + super::OnPlayerAdded(a_Player); UpdateResult(a_Player); } @@ -1587,29 +1548,33 @@ void cSlotAreaEnchanting::OnPlayerRemoved(cPlayer & a_Player) +void cSlotAreaEnchanting::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) +{ + super::SetSlot(a_SlotNum, a_Player, a_Item); + UpdateResult(a_Player); +} + + + + + void cSlotAreaEnchanting::UpdateResult(cPlayer & a_Player) { cItem Item = *GetSlot(0, a_Player); - if (Item.IsEmpty() || !Item.m_Enchantments.IsEmpty()) - { - m_ParentWindow.SetProperty(0, 0, a_Player); - m_ParentWindow.SetProperty(1, 0, a_Player); - m_ParentWindow.SetProperty(2, 0, a_Player); - } - else if (cItem::IsEnchantable(Item.m_ItemType) || Item.m_ItemType == E_ITEM_BOOK) + if (cItem::IsEnchantable(Item.m_ItemType) && Item.m_Enchantments.IsEmpty()) { int Bookshelves = std::min(GetBookshelvesCount(a_Player.GetWorld()), 15); cFastRandom Random; - int base = (Random.GenerateRandomInteger(1, 8) + (int)floor((float)Bookshelves / 2) + Random.GenerateRandomInteger(0, Bookshelves)); - int topSlot = std::max(base / 3, 1); - int middleSlot = (base * 2) / 3 + 1; - int bottomSlot = std::max(base, Bookshelves * 2); + int Base = (Random.GenerateRandomInteger(1, 8) + (int)floor((float)Bookshelves / 2) + Random.GenerateRandomInteger(0, Bookshelves)); + int TopSlot = std::max(Base / 3, 1); + int MiddleSlot = (Base * 2) / 3 + 1; + int BottomSlot = std::max(Base, Bookshelves * 2); - m_ParentWindow.SetProperty(0, topSlot, a_Player); - m_ParentWindow.SetProperty(1, middleSlot, a_Player); - m_ParentWindow.SetProperty(2, bottomSlot, a_Player); + m_ParentWindow.SetProperty(0, TopSlot, a_Player); + m_ParentWindow.SetProperty(1, MiddleSlot, a_Player); + m_ParentWindow.SetProperty(2, BottomSlot, a_Player); } else { @@ -1625,12 +1590,9 @@ void cSlotAreaEnchanting::UpdateResult(cPlayer & a_Player) int cSlotAreaEnchanting::GetBookshelvesCount(cWorld * a_World) { - int PosX, PosY, PosZ; - ((cEnchantingWindow*)&m_ParentWindow)->GetBlockPos(PosX, PosY, PosZ); - int Bookshelves = 0; cBlockArea Area; - Area.Read(a_World, PosX - 2, PosX + 2, PosY, PosY + 1, PosZ - 2, PosZ + 2); + Area.Read(a_World, m_BlockX - 2, m_BlockX + 2, m_BlockY, m_BlockY + 1, m_BlockZ - 2, m_BlockZ + 2); static const struct { @@ -1678,7 +1640,7 @@ int cSlotAreaEnchanting::GetBookshelvesCount(cWorld * a_World) if ( (Area.GetRelBlockType(CheckCoords[i].m_AirX, CheckCoords[i].m_AirY, CheckCoords[i].m_AirZ) == E_BLOCK_AIR) && // There's air in the checkspot (Area.GetRelBlockType(CheckCoords[i].m_BookX, CheckCoords[i].m_BookY, CheckCoords[i].m_BookZ) == E_BLOCK_BOOKCASE) // There's bookcase in the wanted place - ) + ) { Bookshelves++; } diff --git a/src/UI/SlotArea.h b/src/UI/SlotArea.h index 9a96f2f3c..6bbc87b76 100644 --- a/src/UI/SlotArea.h +++ b/src/UI/SlotArea.h @@ -349,14 +349,15 @@ class cSlotAreaEnchanting : typedef cSlotAreaTemporary super; public: - cSlotAreaEnchanting(cEnchantingWindow & a_ParentWindow); + cSlotAreaEnchanting(cEnchantingWindow & a_ParentWindow, int a_BlockX, int a_BlockY, int a_BlockZ); // cSlotArea overrides: virtual void Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override; - virtual void DblClicked(cPlayer & a_Player, int a_SlotNum) override; virtual void DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots) override; + virtual void SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) override; // cSlotAreaTemporary overrides: + virtual void OnPlayerAdded (cPlayer & a_Player) override; virtual void OnPlayerRemoved(cPlayer & a_Player) override; /* Get the count of bookshelves who stand in the near of the enchanting table */ @@ -365,6 +366,8 @@ public: protected: /** Handles a click in the item slot. */ void UpdateResult(cPlayer & a_Player); + + int m_BlockX, m_BlockY, m_BlockZ; }; diff --git a/src/UI/Window.cpp b/src/UI/Window.cpp index 8f4913030..66900269f 100644 --- a/src/UI/Window.cpp +++ b/src/UI/Window.cpp @@ -881,7 +881,7 @@ cEnchantingWindow::cEnchantingWindow(int a_BlockX, int a_BlockY, int a_BlockZ) : m_BlockY(a_BlockY), m_BlockZ(a_BlockZ) { - m_SlotAreas.push_back(new cSlotAreaEnchanting(*this)); + m_SlotAreas.push_back(new cSlotAreaEnchanting(*this, m_BlockX, m_BlockY, m_BlockZ)); m_SlotAreas.push_back(new cSlotAreaInventory(*this)); m_SlotAreas.push_back(new cSlotAreaHotBar(*this)); } @@ -892,8 +892,13 @@ cEnchantingWindow::cEnchantingWindow(int a_BlockX, int a_BlockY, int a_BlockZ) : void cEnchantingWindow::SetProperty(int a_Property, int a_Value) { - m_PropertyValue[a_Property] = a_Value; + if ((a_Property < 0) || ((size_t)a_Property >= ARRAYCOUNT(m_PropertyValue))) + { + ASSERT(!"a_Property is invalid"); + return; + } + m_PropertyValue[a_Property] = a_Value; super::SetProperty(a_Property, a_Value); } @@ -903,8 +908,13 @@ void cEnchantingWindow::SetProperty(int a_Property, int a_Value) void cEnchantingWindow::SetProperty(int a_Property, int a_Value, cPlayer & a_Player) { - m_PropertyValue[a_Property] = a_Value; + if ((a_Property < 0) || ((size_t)a_Property >= ARRAYCOUNT(m_PropertyValue))) + { + ASSERT(!"a_Property is invalid"); + return; + } + m_PropertyValue[a_Property] = a_Value; super::SetProperty(a_Property, a_Value, a_Player); } @@ -914,6 +924,12 @@ void cEnchantingWindow::SetProperty(int a_Property, int a_Value, cPlayer & a_Pla int cEnchantingWindow::GetPropertyValue(int a_Property) { + if ((a_Property < 0) || ((size_t)a_Property >= ARRAYCOUNT(m_PropertyValue))) + { + ASSERT(!"a_Property is invalid"); + return 0; + } + return m_PropertyValue[a_Property]; } @@ -921,17 +937,6 @@ int cEnchantingWindow::GetPropertyValue(int a_Property) -void cEnchantingWindow::GetBlockPos(int & a_PosX, int & a_PosY, int & a_PosZ) -{ - a_PosX = m_BlockX; - a_PosY = m_BlockY; - a_PosZ = m_BlockZ; -} - - - - - //////////////////////////////////////////////////////////////////////////////// // cChestWindow: diff --git a/src/UI/Window.h b/src/UI/Window.h index 9fb0e3b38..3d860407f 100644 --- a/src/UI/Window.h +++ b/src/UI/Window.h @@ -291,9 +291,6 @@ public: /** Return the Value of a Property */ int GetPropertyValue(int a_Property); - /** Get the Position from the Enchantment Table */ - void GetBlockPos(int & a_PosX, int & a_PosY, int & a_PosZ); - cSlotArea * m_SlotArea; protected: From 3c1c073714e2b0542c9a79db962b6fc9e6ddd352 Mon Sep 17 00:00:00 2001 From: LO1ZB Date: Thu, 28 Aug 2014 11:36:35 +0200 Subject: [PATCH 002/226] remove y-coord from chunks --- src/Bindings/LuaChunkStay.cpp | 2 +- src/Chunk.cpp | 7 +- src/Chunk.h | 2 +- src/ChunkDef.h | 6 +- src/ChunkMap.cpp | 258 +++++++++++++++--------------- src/ChunkMap.h | 14 +- src/ChunkSender.cpp | 14 +- src/ChunkSender.h | 7 +- src/ChunkStay.cpp | 2 +- src/ClientHandle.cpp | 20 +-- src/ClientHandle.h | 2 +- src/Generating/ChunkGenerator.cpp | 14 +- src/Generating/ChunkGenerator.h | 4 +- src/World.cpp | 21 ++- src/World.h | 6 +- src/WorldStorage/WSSCompact.cpp | 6 +- src/WorldStorage/WorldStorage.cpp | 28 ++-- src/WorldStorage/WorldStorage.h | 12 +- 18 files changed, 208 insertions(+), 217 deletions(-) diff --git a/src/Bindings/LuaChunkStay.cpp b/src/Bindings/LuaChunkStay.cpp index 59b02d8f7..154bcb200 100644 --- a/src/Bindings/LuaChunkStay.cpp +++ b/src/Bindings/LuaChunkStay.cpp @@ -107,7 +107,7 @@ void cLuaChunkStay::AddChunkCoord(cLuaState & L, int a_Index) } } // for itr - m_Chunks[] - m_Chunks.push_back(cChunkCoords(ChunkX, ZERO_CHUNK_Y, ChunkZ)); + m_Chunks.push_back(cChunkCoords(ChunkX, ChunkZ)); } diff --git a/src/Chunk.cpp b/src/Chunk.cpp index 116c0f3a0..5fd6cb352 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -65,7 +65,7 @@ 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_ChunkZ, cChunkMap * a_ChunkMap, cWorld * a_World, cChunk * a_NeighborXM, cChunk * a_NeighborXP, cChunk * a_NeighborZM, cChunk * a_NeighborZP, cAllocationPool & a_Pool @@ -77,7 +77,6 @@ cChunk::cChunk( m_HasLoadFailed(false), m_StayCount(0), m_PosX(a_ChunkX), - m_PosY(a_ChunkY), m_PosZ(a_ChunkZ), m_World(a_World), m_ChunkMap(a_ChunkMap), @@ -643,7 +642,7 @@ void cChunk::MoveEntityToNewChunk(cEntity * a_Entity) cChunk * Neighbor = GetNeighborChunk(a_Entity->GetChunkX() * cChunkDef::Width, a_Entity->GetChunkZ() * cChunkDef::Width); if (Neighbor == NULL) { - Neighbor = m_ChunkMap->GetChunkNoLoad(a_Entity->GetChunkX(), ZERO_CHUNK_Y, a_Entity->GetChunkZ()); + Neighbor = m_ChunkMap->GetChunkNoLoad(a_Entity->GetChunkX(), a_Entity->GetChunkZ()); if (Neighbor == NULL) { // TODO: What to do with this? @@ -2593,7 +2592,7 @@ cChunk * cChunk::GetRelNeighborChunk(int a_RelX, int a_RelZ) int BlockZ = m_PosZ * cChunkDef::Width + a_RelZ; int ChunkX, ChunkZ; BlockToChunk(BlockX, BlockZ, ChunkX, ChunkZ); - return m_ChunkMap->GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + return m_ChunkMap->GetChunkNoLoad(ChunkX, ChunkZ); } // Walk the neighbors: diff --git a/src/Chunk.h b/src/Chunk.h index 72a1f6c95..67b208fe5 100644 --- a/src/Chunk.h +++ b/src/Chunk.h @@ -67,7 +67,7 @@ class cChunk : { public: cChunk( - int a_ChunkX, int a_ChunkY, int a_ChunkZ, // Chunk coords + int a_ChunkX, int a_ChunkZ, // Chunk coords cChunkMap * a_ChunkMap, cWorld * a_World, // Parent objects cChunk * a_NeighborXM, cChunk * a_NeighborXP, cChunk * a_NeighborZM, cChunk * a_NeighborZP, // Neighbor chunks cAllocationPool & a_Pool diff --git a/src/ChunkDef.h b/src/ChunkDef.h index 51075ab4a..b7122efe2 100644 --- a/src/ChunkDef.h +++ b/src/ChunkDef.h @@ -19,7 +19,6 @@ /** This is really only a placeholder to be used in places where we need to "make up" a chunk's Y coord. It will help us when the new chunk format comes out and we need to patch everything up for compatibility. */ -#define ZERO_CHUNK_Y 0 // Used to smoothly convert to new axis ordering. One will be removed when deemed stable. #define AXIS_ORDER_YZX 1 // Original (1.1-) @@ -377,14 +376,13 @@ class cChunkCoords { public: int m_ChunkX; - int m_ChunkY; int m_ChunkZ; - cChunkCoords(int a_ChunkX, int a_ChunkY, int a_ChunkZ) : m_ChunkX(a_ChunkX), m_ChunkY(a_ChunkY), m_ChunkZ(a_ChunkZ) {} + cChunkCoords(int a_ChunkX, int a_ChunkZ) : m_ChunkX(a_ChunkX), m_ChunkZ(a_ChunkZ) {} bool operator == (const cChunkCoords & a_Other) const { - return ((m_ChunkX == a_Other.m_ChunkX) && (m_ChunkY == a_Other.m_ChunkY) && (m_ChunkZ == a_Other.m_ChunkZ)); + return ((m_ChunkX == a_Other.m_ChunkX) && (m_ChunkZ == a_Other.m_ChunkZ)); } } ; diff --git a/src/ChunkMap.cpp b/src/ChunkMap.cpp index dd8be0631..e4ce6cbf5 100644 --- a/src/ChunkMap.cpp +++ b/src/ChunkMap.cpp @@ -143,7 +143,7 @@ cChunkMap::cChunkLayer * cChunkMap::GetLayerForChunk(int a_ChunkX, int a_ChunkZ) -cChunkPtr cChunkMap::GetChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +cChunkPtr cChunkMap::GetChunk(int a_ChunkX, int a_ChunkZ) { // No need to lock m_CSLayers, since it's already locked by the operation that called us ASSERT(m_CSLayers.IsLockedByCurrentThread()); @@ -155,14 +155,14 @@ cChunkPtr cChunkMap::GetChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) return NULL; } - cChunkPtr Chunk = Layer->GetChunk(a_ChunkX, a_ChunkY, a_ChunkZ); + cChunkPtr Chunk = Layer->GetChunk(a_ChunkX, a_ChunkZ); if (Chunk == NULL) { return NULL; } if (!(Chunk->IsValid())) { - m_World->GetStorage().QueueLoadChunk(a_ChunkX, a_ChunkY, a_ChunkZ, true); + m_World->GetStorage().QueueLoadChunk(a_ChunkX, a_ChunkZ, true); } return Chunk; } @@ -171,7 +171,7 @@ cChunkPtr cChunkMap::GetChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) -cChunkPtr cChunkMap::GetChunkNoGen( int a_ChunkX, int a_ChunkY, int a_ChunkZ) +cChunkPtr cChunkMap::GetChunkNoGen( int a_ChunkX, int a_ChunkZ) { // No need to lock m_CSLayers, since it's already locked by the operation that called us cChunkLayer * Layer = GetLayerForChunk( a_ChunkX, a_ChunkZ); @@ -181,14 +181,14 @@ cChunkPtr cChunkMap::GetChunkNoGen( int a_ChunkX, int a_ChunkY, int a_ChunkZ) return NULL; } - cChunkPtr Chunk = Layer->GetChunk(a_ChunkX, a_ChunkY, a_ChunkZ); + cChunkPtr Chunk = Layer->GetChunk(a_ChunkX, a_ChunkZ); if (Chunk == NULL) { return NULL; } if (!(Chunk->IsValid())) { - m_World->GetStorage().QueueLoadChunk(a_ChunkX, a_ChunkY, a_ChunkZ, false); + m_World->GetStorage().QueueLoadChunk(a_ChunkX, a_ChunkZ, false); } return Chunk; @@ -198,7 +198,7 @@ cChunkPtr cChunkMap::GetChunkNoGen( int a_ChunkX, int a_ChunkY, int a_ChunkZ) -cChunkPtr cChunkMap::GetChunkNoLoad( int a_ChunkX, int a_ChunkY, int a_ChunkZ) +cChunkPtr cChunkMap::GetChunkNoLoad( int a_ChunkX, int a_ChunkZ) { // No need to lock m_CSLayers, since it's already locked by the operation that called us cChunkLayer * Layer = GetLayerForChunk( a_ChunkX, a_ChunkZ); @@ -208,7 +208,7 @@ cChunkPtr cChunkMap::GetChunkNoLoad( int a_ChunkX, int a_ChunkY, int a_ChunkZ) return NULL; } - return Layer->GetChunk(a_ChunkX, a_ChunkY, a_ChunkZ); + return Layer->GetChunk(a_ChunkX, a_ChunkZ); } @@ -222,7 +222,7 @@ bool cChunkMap::LockedGetBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTY int ChunkX, ChunkZ; cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if (Chunk == NULL) { return false; @@ -244,7 +244,7 @@ bool cChunkMap::LockedGetBlockType(int a_BlockX, int a_BlockY, int a_BlockZ, BLO int ChunkX, ChunkZ; cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if (Chunk == NULL) { return false; @@ -265,7 +265,7 @@ bool cChunkMap::LockedGetBlockMeta(int a_BlockX, int a_BlockY, int a_BlockZ, NIB int ChunkX, ChunkZ; cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if (Chunk == NULL) { return false; @@ -284,7 +284,7 @@ bool cChunkMap::LockedSetBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTY // We already have m_CSLayers locked since this can be called only from within the tick thread int ChunkX, ChunkZ; cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if (Chunk == NULL) { return false; @@ -303,7 +303,7 @@ bool cChunkMap::LockedFastSetBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLO // We already have m_CSLayers locked since this can be called only from within the tick thread int ChunkX, ChunkZ; cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if (Chunk == NULL) { return false; @@ -336,7 +336,7 @@ cChunk * cChunkMap::FindChunk(int a_ChunkX, int a_ChunkZ) void cChunkMap::BroadcastAttachEntity(const cEntity & a_Entity, const cEntity * a_Vehicle) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -356,7 +356,7 @@ void cChunkMap::BroadcastBlockAction(int a_BlockX, int a_BlockY, int a_BlockZ, c x = a_BlockX; z = a_BlockZ; cChunkDef::BlockToChunk(x, z, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if (Chunk == NULL) { return; @@ -375,7 +375,7 @@ void cChunkMap::BroadcastBlockBreakAnimation(int a_entityID, int a_blockX, int a int ChunkX, ChunkZ; cChunkDef::BlockToChunk(a_blockX, a_blockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, 0, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if (Chunk == NULL) { return; @@ -393,7 +393,7 @@ void cChunkMap::BroadcastBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, c cCSLock Lock(m_CSLayers); int ChunkX, ChunkZ; cChunkDef::BlockToChunk(a_BlockX, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, 0, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return; @@ -408,7 +408,7 @@ void cChunkMap::BroadcastBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, c void cChunkMap::BroadcastChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, 0, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if (Chunk == NULL) { return; @@ -424,7 +424,7 @@ void cChunkMap::BroadcastChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataSeriali void cChunkMap::BroadcastCollectEntity(const cEntity & a_Entity, const cPlayer & a_Player, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -440,7 +440,7 @@ void cChunkMap::BroadcastCollectEntity(const cEntity & a_Entity, const cPlayer & void cChunkMap::BroadcastDestroyEntity(const cEntity & a_Entity, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -456,7 +456,7 @@ void cChunkMap::BroadcastDestroyEntity(const cEntity & a_Entity, const cClientHa void cChunkMap::BroadcastEntityEffect(const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -472,7 +472,7 @@ void cChunkMap::BroadcastEntityEffect(const cEntity & a_Entity, int a_EffectID, void cChunkMap::BroadcastEntityEquipment(const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -488,7 +488,7 @@ void cChunkMap::BroadcastEntityEquipment(const cEntity & a_Entity, short a_SlotN void cChunkMap::BroadcastEntityHeadLook(const cEntity & a_Entity, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -504,7 +504,7 @@ void cChunkMap::BroadcastEntityHeadLook(const cEntity & a_Entity, const cClientH void cChunkMap::BroadcastEntityLook(const cEntity & a_Entity, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -520,7 +520,7 @@ void cChunkMap::BroadcastEntityLook(const cEntity & a_Entity, const cClientHandl void cChunkMap::BroadcastEntityMetadata(const cEntity & a_Entity, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -536,7 +536,7 @@ void cChunkMap::BroadcastEntityMetadata(const cEntity & a_Entity, const cClientH void cChunkMap::BroadcastEntityRelMove(const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -552,7 +552,7 @@ void cChunkMap::BroadcastEntityRelMove(const cEntity & a_Entity, char a_RelX, ch void cChunkMap::BroadcastEntityRelMoveLook(const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -568,7 +568,7 @@ void cChunkMap::BroadcastEntityRelMoveLook(const cEntity & a_Entity, char a_RelX void cChunkMap::BroadcastEntityStatus(const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -584,7 +584,7 @@ void cChunkMap::BroadcastEntityStatus(const cEntity & a_Entity, char a_Status, c void cChunkMap::BroadcastEntityVelocity(const cEntity & a_Entity, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -600,7 +600,7 @@ void cChunkMap::BroadcastEntityVelocity(const cEntity & a_Entity, const cClientH void cChunkMap::BroadcastEntityAnimation(const cEntity & a_Entity, char a_Animation, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -619,7 +619,7 @@ void cChunkMap::BroadcastParticleEffect(const AString & a_ParticleName, float a_ int ChunkX, ChunkZ; cChunkDef::BlockToChunk((int) a_SrcX, (int) a_SrcZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, 0, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if (Chunk == NULL) { return; @@ -636,7 +636,7 @@ void cChunkMap::BroadcastRemoveEntityEffect(const cEntity & a_Entity, int a_Effe { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -655,7 +655,7 @@ void cChunkMap::BroadcastSoundEffect(const AString & a_SoundName, double a_X, do int ChunkX, ChunkZ; cChunkDef::BlockToChunk((int)std::floor(a_X), (int)std::floor(a_Z), ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, 0, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if (Chunk == NULL) { return; @@ -674,7 +674,7 @@ void cChunkMap::BroadcastSoundParticleEffect(int a_EffectID, int a_SrcX, int a_S int ChunkX, ChunkZ; cChunkDef::BlockToChunk(a_SrcX, a_SrcZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, 0, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if (Chunk == NULL) { return; @@ -690,7 +690,7 @@ void cChunkMap::BroadcastSoundParticleEffect(int a_EffectID, int a_SrcX, int a_S void cChunkMap::BroadcastSpawnEntity(cEntity & a_Entity, const cClientHandle * a_Exclude) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), ZERO_CHUNK_Y, a_Entity.GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkZ()); if (Chunk == NULL) { return; @@ -708,7 +708,7 @@ void cChunkMap::BroadcastThunderbolt(int a_BlockX, int a_BlockY, int a_BlockZ, c cCSLock Lock(m_CSLayers); int ChunkX, ChunkZ; cChunkDef::BlockToChunk(a_BlockX, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, 0, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if (Chunk == NULL) { return; @@ -727,7 +727,7 @@ void cChunkMap::BroadcastUseBed(const cEntity & a_Entity, int a_BlockX, int a_Bl int ChunkX, ChunkZ; cChunkDef::BlockToChunk(a_BlockX, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, 0, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if (Chunk == NULL) { return; @@ -745,7 +745,7 @@ void cChunkMap::SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClien cCSLock Lock(m_CSLayers); int ChunkX, ChunkZ; cChunkDef::BlockToChunk(a_BlockX, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, 0, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return; @@ -763,7 +763,7 @@ void cChunkMap::UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, i cCSLock Lock(m_CSLayers); int ChunkX, ChunkZ; cChunkDef::BlockToChunk(a_BlockX, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, 0, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return; @@ -778,7 +778,7 @@ void cChunkMap::UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, i bool cChunkMap::DoWithChunk(int a_ChunkX, int a_ChunkZ, cChunkCallback & a_Callback) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, a_ChunkZ); if (Chunk == NULL) { return false; @@ -795,7 +795,7 @@ void cChunkMap::WakeUpSimulators(int a_BlockX, int a_BlockY, int a_BlockZ) cCSLock Lock(m_CSLayers); int ChunkX, ChunkZ; cChunkDef::BlockToChunk(a_BlockX, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, 0, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return; @@ -824,7 +824,7 @@ void cChunkMap::WakeUpSimulatorsInArea(int a_MinBlockX, int a_MaxBlockX, int a_M int MaxZ = std::min(a_MaxBlockZ, z * cChunkDef::Width + cChunkDef::Width - 1); for (int x = MinChunkX; x <= MaxChunkX; x++) { - cChunkPtr Chunk = GetChunkNoGen(x, 0, z); + cChunkPtr Chunk = GetChunkNoGen(x, z); if ((Chunk == NULL) || !Chunk->IsValid()) { continue; @@ -852,7 +852,7 @@ void cChunkMap::WakeUpSimulatorsInArea(int a_MinBlockX, int a_MaxBlockX, int a_M void cChunkMap::MarkRedstoneDirty(int a_ChunkX, int a_ChunkZ) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return; @@ -867,7 +867,7 @@ void cChunkMap::MarkRedstoneDirty(int a_ChunkX, int a_ChunkZ) void cChunkMap::MarkChunkDirty(int a_ChunkX, int a_ChunkZ, bool a_MarkRedstoneDirty) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return; @@ -886,7 +886,7 @@ void cChunkMap::MarkChunkDirty(int a_ChunkX, int a_ChunkZ, bool a_MarkRedstoneDi void cChunkMap::MarkChunkSaving(int a_ChunkX, int a_ChunkZ) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return; @@ -901,7 +901,7 @@ void cChunkMap::MarkChunkSaving(int a_ChunkX, int a_ChunkZ) void cChunkMap::MarkChunkSaved (int a_ChunkX, int a_ChunkZ) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return; @@ -919,7 +919,7 @@ void cChunkMap::SetChunkData(cSetChunkData & a_SetChunkData) int ChunkZ = a_SetChunkData.GetChunkZ(); { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if (Chunk == NULL) { return; @@ -964,7 +964,7 @@ void cChunkMap::ChunkLighted( ) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, a_ChunkZ); if (Chunk == NULL) { return; @@ -980,7 +980,7 @@ void cChunkMap::ChunkLighted( bool cChunkMap::GetChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataCallback & a_Callback) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -996,7 +996,7 @@ bool cChunkMap::GetChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataCallback & a_ bool cChunkMap::GetChunkBlockTypes(int a_ChunkX, int a_ChunkZ, BLOCKTYPE * a_BlockTypes) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -1012,7 +1012,7 @@ bool cChunkMap::GetChunkBlockTypes(int a_ChunkX, int a_ChunkZ, BLOCKTYPE * a_Blo bool cChunkMap::IsChunkValid(int a_ChunkX, int a_ChunkZ) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, a_ChunkZ); return (Chunk != NULL) && Chunk->IsValid(); } @@ -1023,7 +1023,7 @@ bool cChunkMap::IsChunkValid(int a_ChunkX, int a_ChunkZ) bool cChunkMap::HasChunkAnyClients(int a_ChunkX, int a_ChunkZ) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); return (Chunk != NULL) && Chunk->HasAnyClients(); } @@ -1038,7 +1038,7 @@ int cChunkMap::GetHeight(int a_BlockX, int a_BlockZ) cCSLock Lock(m_CSLayers); int ChunkX, ChunkZ, BlockY = 0; cChunkDef::AbsoluteToRelative(a_BlockX, BlockY, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunk(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk(ChunkX, ChunkZ); if (Chunk == NULL) { return 0; @@ -1065,7 +1065,7 @@ bool cChunkMap::TryGetHeight(int a_BlockX, int a_BlockZ, int & a_Height) cCSLock Lock(m_CSLayers); int ChunkX, ChunkZ, BlockY = 0; cChunkDef::AbsoluteToRelative(a_BlockX, BlockY, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -1088,7 +1088,7 @@ void cChunkMap::FastSetBlocks(sSetBlockList & a_BlockList) int ChunkX = a_BlockList.front().ChunkX; int ChunkZ = a_BlockList.front().ChunkZ; cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk != NULL) && Chunk->IsValid()) { for (sSetBlockList::iterator itr = a_BlockList.begin(); itr != a_BlockList.end();) @@ -1135,7 +1135,7 @@ void cChunkMap::CollectPickupsByPlayer(cPlayer * a_Player) int BlockX = (int)(a_Player->GetPosX()); // Truncating doesn't matter much; we're scanning entire chunks anyway int BlockY = (int)(a_Player->GetPosY()); int BlockZ = (int)(a_Player->GetPosZ()); - int ChunkX, ChunkZ, ChunkY = ZERO_CHUNK_Y; + int ChunkX = 0, ChunkZ = 0; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); int OtherChunkX = ChunkX + ((BlockX > 8) ? 1 : -1); int OtherChunkZ = ChunkZ + ((BlockZ > 8) ? 1 : -1); @@ -1144,13 +1144,13 @@ void cChunkMap::CollectPickupsByPlayer(cPlayer * a_Player) // The only time the chunks are not valid is when the player is downloading the initial world and they should not call this at that moment cCSLock Lock(m_CSLayers); - GetChunkNoLoad(ChunkX, ChunkY, ChunkZ)->CollectPickupsByPlayer(a_Player); + GetChunkNoLoad(ChunkX, ChunkZ)->CollectPickupsByPlayer(a_Player); // Check the neighboring chunks as well: - GetChunkNoLoad(OtherChunkX, ChunkY, ChunkZ)->CollectPickupsByPlayer (a_Player); - GetChunkNoLoad(OtherChunkX, ChunkY, OtherChunkZ)->CollectPickupsByPlayer(a_Player); - GetChunkNoLoad(ChunkX, ChunkY, ChunkZ)->CollectPickupsByPlayer (a_Player); - GetChunkNoLoad(ChunkX, ChunkY, OtherChunkZ)->CollectPickupsByPlayer(a_Player); + GetChunkNoLoad(OtherChunkX, ChunkZ)->CollectPickupsByPlayer (a_Player); + GetChunkNoLoad(OtherChunkX, OtherChunkZ)->CollectPickupsByPlayer(a_Player); + GetChunkNoLoad(ChunkX, ChunkZ)->CollectPickupsByPlayer (a_Player); + GetChunkNoLoad(ChunkX, OtherChunkZ)->CollectPickupsByPlayer(a_Player); } @@ -1177,7 +1177,7 @@ BLOCKTYPE cChunkMap::GetBlock(int a_BlockX, int a_BlockY, int a_BlockZ) cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk(ChunkX, ChunkZ); if ((Chunk != NULL) && Chunk->IsValid()) { return Chunk->GetBlock(a_BlockX, a_BlockY, a_BlockZ); @@ -1206,7 +1206,7 @@ NIBBLETYPE cChunkMap::GetBlockMeta(int a_BlockX, int a_BlockY, int a_BlockZ) cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk( ChunkX, ChunkZ); if ((Chunk != NULL) && Chunk->IsValid()) { return Chunk->GetMeta(a_BlockX, a_BlockY, a_BlockZ); @@ -1224,7 +1224,7 @@ NIBBLETYPE cChunkMap::GetBlockSkyLight(int a_BlockX, int a_BlockY, int a_BlockZ) cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk( ChunkX, ChunkZ); if ((Chunk != NULL) && Chunk->IsValid()) { return Chunk->GetSkyLight(a_BlockX, a_BlockY, a_BlockZ); @@ -1242,7 +1242,7 @@ NIBBLETYPE cChunkMap::GetBlockBlockLight(int a_BlockX, int a_BlockY, int a_Block cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk( ChunkX, ChunkZ); if ((Chunk != NULL) && Chunk->IsValid()) { return Chunk->GetBlockLight(a_BlockX, a_BlockY, a_BlockZ); @@ -1261,7 +1261,7 @@ void cChunkMap::SetBlockMeta(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYP // a_BlockXYZ now contains relative coords! cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk(ChunkX, ChunkZ); if ((Chunk != NULL) && Chunk->IsValid()) { Chunk->SetMeta(a_BlockX, a_BlockY, a_BlockZ, a_BlockMeta); @@ -1284,7 +1284,7 @@ void cChunkMap::SetBlock(cWorldInterface & a_WorldInterface, int a_BlockX, int a cChunkDef::AbsoluteToRelative( X, Y, Z, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk( ChunkX, ChunkZ); if ((Chunk != NULL) && Chunk->IsValid()) { Chunk->SetBlock(X, Y, Z, a_BlockType, a_BlockMeta, a_SendToClients); @@ -1303,7 +1303,7 @@ void cChunkMap::QueueSetBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYP cChunkDef::AbsoluteToRelative(X, Y, Z, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk(ChunkX, ChunkZ); if ((Chunk != NULL) && Chunk->IsValid()) { Chunk->QueueSetBlock(X, Y, Z, a_BlockType, a_BlockMeta, a_Tick, a_PreviousBlockType); @@ -1320,7 +1320,7 @@ bool cChunkMap::GetBlockTypeMeta(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCK cChunkDef::AbsoluteToRelative( X, Y, Z, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk( ChunkX, ChunkZ); if ((Chunk != NULL) && Chunk->IsValid()) { Chunk->GetBlockTypeMeta(X, Y, Z, a_BlockType, a_BlockMeta); @@ -1339,7 +1339,7 @@ bool cChunkMap::GetBlockInfo(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE cChunkDef::AbsoluteToRelative( X, Y, Z, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk( ChunkX, ChunkZ); if ((Chunk != NULL) && Chunk->IsValid()) { Chunk->GetBlockInfo(X, Y, Z, a_BlockType, a_Meta, a_SkyLight, a_BlockLight); @@ -1357,7 +1357,7 @@ void cChunkMap::ReplaceBlocks(const sSetBlockVector & a_Blocks, BLOCKTYPE a_Filt cCSLock Lock(m_CSLayers); for (sSetBlockVector::const_iterator itr = a_Blocks.begin(); itr != a_Blocks.end(); ++itr) { - cChunkPtr Chunk = GetChunk(itr->ChunkX, ZERO_CHUNK_Y, itr->ChunkZ); + cChunkPtr Chunk = GetChunk(itr->ChunkX, itr->ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { continue; @@ -1378,7 +1378,7 @@ void cChunkMap::ReplaceTreeBlocks(const sSetBlockVector & a_Blocks) cCSLock Lock(m_CSLayers); for (sSetBlockVector::const_iterator itr = a_Blocks.begin(); itr != a_Blocks.end(); ++itr) { - cChunkPtr Chunk = GetChunk(itr->ChunkX, ZERO_CHUNK_Y, itr->ChunkZ); + cChunkPtr Chunk = GetChunk(itr->ChunkX, itr->ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { continue; @@ -1413,7 +1413,7 @@ EMCSBiome cChunkMap::GetBiomeAt (int a_BlockX, int a_BlockZ) cChunkDef::AbsoluteToRelative(X, Y, Z, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk(ChunkX, ChunkZ); if ((Chunk != NULL) && Chunk->IsValid()) { return Chunk->GetBiomeAt(X, Z); @@ -1434,7 +1434,7 @@ bool cChunkMap::SetBiomeAt(int a_BlockX, int a_BlockZ, EMCSBiome a_Biome) cChunkDef::AbsoluteToRelative(X, Y, Z, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk(ChunkX, ChunkZ); if ((Chunk != NULL) && Chunk->IsValid()) { Chunk->SetBiomeAt(X, Z, a_Biome); @@ -1467,7 +1467,7 @@ bool cChunkMap::SetAreaBiome(int a_MinX, int a_MaxX, int a_MinZ, int a_MaxZ, EMC { int MinRelZ = (z == MinChunkZ) ? MinZ : 0; int MaxRelZ = (z == MaxChunkZ) ? MaxZ : cChunkDef::Width - 1; - cChunkPtr Chunk = GetChunkNoLoad(x, ZERO_CHUNK_Y, z); + cChunkPtr Chunk = GetChunkNoLoad(x, z); if ((Chunk != NULL) && Chunk->IsValid()) { Chunk->SetAreaBiome(MinRelX, MaxRelX, MinRelZ, MaxRelZ, a_Biome); @@ -1491,7 +1491,7 @@ bool cChunkMap::GetBlocks(sSetBlockVector & a_Blocks, bool a_ContinueOnFailure) cCSLock Lock(m_CSLayers); for (sSetBlockVector::iterator itr = a_Blocks.begin(); itr != a_Blocks.end(); ++itr) { - cChunkPtr Chunk = GetChunk(itr->ChunkX, ZERO_CHUNK_Y, itr->ChunkZ); + cChunkPtr Chunk = GetChunk(itr->ChunkX, itr->ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { if (!a_ContinueOnFailure) @@ -1519,7 +1519,7 @@ bool cChunkMap::DigBlock(int a_X, int a_Y, int a_Z) { cCSLock Lock(m_CSLayers); - cChunkPtr DestChunk = GetChunk( ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr DestChunk = GetChunk( ChunkX, ChunkZ); if ((DestChunk == NULL) || !DestChunk->IsValid()) { return false; @@ -1542,7 +1542,7 @@ void cChunkMap::SendBlockTo(int a_X, int a_Y, int a_Z, cPlayer * a_Player) cChunkDef::AbsoluteToRelative(a_X, a_Y, a_Z, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunk(ChunkX, ChunkZ); if ((Chunk != NULL) && (Chunk->IsValid())) { Chunk->SendBlockTo(a_X, a_Y, a_Z, a_Player->GetClientHandle()); @@ -1556,12 +1556,12 @@ void cChunkMap::SendBlockTo(int a_X, int a_Y, int a_Z, cPlayer * a_Player) void cChunkMap::CompareChunkClients(int a_ChunkX1, int a_ChunkZ1, int a_ChunkX2, int a_ChunkZ2, cClientDiffCallback & a_Callback) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk1 = GetChunkNoGen(a_ChunkX1, ZERO_CHUNK_Y, a_ChunkZ1); + cChunkPtr Chunk1 = GetChunkNoGen(a_ChunkX1, a_ChunkZ1); if (Chunk1 == NULL) { return; } - cChunkPtr Chunk2 = GetChunkNoGen(a_ChunkX2, ZERO_CHUNK_Y, a_ChunkZ2); + cChunkPtr Chunk2 = GetChunkNoGen(a_ChunkX2, a_ChunkZ2); if (Chunk2 == NULL) { return; @@ -1623,7 +1623,7 @@ void cChunkMap::CompareChunkClients(cChunk * a_Chunk1, cChunk * a_Chunk2, cClien bool cChunkMap::AddChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunk(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunk(a_ChunkX, a_ChunkZ); if (Chunk == NULL) { return false; @@ -1638,7 +1638,7 @@ bool cChunkMap::AddChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Cli void cChunkMap::RemoveChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if (Chunk == NULL) { return; @@ -1667,7 +1667,7 @@ void cChunkMap::RemoveClientFromChunks(cClientHandle * a_Client) void cChunkMap::AddEntity(cEntity * a_Entity) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity->GetChunkX(), ZERO_CHUNK_Y, a_Entity->GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity->GetChunkX(), a_Entity->GetChunkZ()); if ( (Chunk == NULL) || // Chunk not present at all (!Chunk->IsValid() && !a_Entity->IsPlayer()) // Chunk present, but no valid data; players need to spawn in such chunks (#953) @@ -1688,7 +1688,7 @@ void cChunkMap::AddEntity(cEntity * a_Entity) void cChunkMap::AddEntityIfNotPresent(cEntity * a_Entity) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity->GetChunkX(), ZERO_CHUNK_Y, a_Entity->GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity->GetChunkX(), a_Entity->GetChunkZ()); if ( (Chunk == NULL) || // Chunk not present at all (!Chunk->IsValid() && !a_Entity->IsPlayer()) // Chunk present, but no valid data; players need to spawn in such chunks (#953) @@ -1729,7 +1729,7 @@ bool cChunkMap::HasEntity(int a_UniqueID) void cChunkMap::RemoveEntity(cEntity * a_Entity) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_Entity->GetChunkX(), ZERO_CHUNK_Y, a_Entity->GetChunkZ()); + cChunkPtr Chunk = GetChunkNoGen(a_Entity->GetChunkX(), a_Entity->GetChunkZ()); // Even if a chunk is not valid, it may still contain entities such as players; make sure to remove them (#1190) if (Chunk == NULL) @@ -1763,7 +1763,7 @@ bool cChunkMap::ForEachEntity(cEntityCallback & a_Callback) bool cChunkMap::ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback & a_Callback) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2011,7 +2011,7 @@ bool cChunkMap::DoWithEntityByID(int a_UniqueID, cEntityCallback & a_Callback) bool cChunkMap::ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEntityCallback & a_Callback) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2026,7 +2026,7 @@ bool cChunkMap::ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEnti bool cChunkMap::ForEachChestInChunk(int a_ChunkX, int a_ChunkZ, cChestCallback & a_Callback) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2041,7 +2041,7 @@ bool cChunkMap::ForEachChestInChunk(int a_ChunkX, int a_ChunkZ, cChestCallback & bool cChunkMap::ForEachDispenserInChunk(int a_ChunkX, int a_ChunkZ, cDispenserCallback & a_Callback) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2056,7 +2056,7 @@ bool cChunkMap::ForEachDispenserInChunk(int a_ChunkX, int a_ChunkZ, cDispenserCa bool cChunkMap::ForEachDropperInChunk(int a_ChunkX, int a_ChunkZ, cDropperCallback & a_Callback) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2071,7 +2071,7 @@ bool cChunkMap::ForEachDropperInChunk(int a_ChunkX, int a_ChunkZ, cDropperCallba bool cChunkMap::ForEachDropSpenserInChunk(int a_ChunkX, int a_ChunkZ, cDropSpenserCallback & a_Callback) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2086,7 +2086,7 @@ bool cChunkMap::ForEachDropSpenserInChunk(int a_ChunkX, int a_ChunkZ, cDropSpens bool cChunkMap::ForEachFurnaceInChunk(int a_ChunkX, int a_ChunkZ, cFurnaceCallback & a_Callback) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2104,7 +2104,7 @@ bool cChunkMap::DoWithBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cB int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2122,7 +2122,7 @@ bool cChunkMap::DoWithBeaconAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBeacon int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2140,7 +2140,7 @@ bool cChunkMap::DoWithChestAt(int a_BlockX, int a_BlockY, int a_BlockZ, cChestCa int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2158,7 +2158,7 @@ bool cChunkMap::DoWithDispenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDis int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2176,7 +2176,7 @@ bool cChunkMap::DoWithDropperAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDropp int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2194,7 +2194,7 @@ bool cChunkMap::DoWithDropSpenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cD int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2212,7 +2212,7 @@ bool cChunkMap::DoWithFurnaceAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFurna int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2229,7 +2229,7 @@ bool cChunkMap::DoWithNoteBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cNot int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2246,7 +2246,7 @@ bool cChunkMap::DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, c int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2264,7 +2264,7 @@ bool cChunkMap::DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHe int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2282,7 +2282,7 @@ bool cChunkMap::DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlo int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2300,7 +2300,7 @@ bool cChunkMap::GetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, AString & int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2312,10 +2312,10 @@ bool cChunkMap::GetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, AString & -void cChunkMap::TouchChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +void cChunkMap::TouchChunk(int a_ChunkX, int a_ChunkZ) { cCSLock Lock(m_CSLayers); - GetChunk(a_ChunkX, a_ChunkY, a_ChunkZ); + GetChunk(a_ChunkX, a_ChunkZ); } @@ -2323,11 +2323,11 @@ void cChunkMap::TouchChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) /// Loads the chunk synchronously, if not already loaded. Doesn't generate. Returns true if chunk valid (even if already loaded before) -bool cChunkMap::LoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +bool cChunkMap::LoadChunk(int a_ChunkX, int a_ChunkZ) { { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkY, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, a_ChunkZ); if (Chunk == NULL) { // Internal error @@ -2344,7 +2344,7 @@ bool cChunkMap::LoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) return false; } } - return m_World->GetStorage().LoadChunk(a_ChunkX, a_ChunkY, a_ChunkZ); + return m_World->GetStorage().LoadChunk(a_ChunkX, a_ChunkZ); } @@ -2356,7 +2356,7 @@ void cChunkMap::LoadChunks(const cChunkCoordsList & a_Chunks) { for (cChunkCoordsList::const_iterator itr = a_Chunks.begin(); itr != a_Chunks.end(); ++itr) { - LoadChunk(itr->m_ChunkX, itr->m_ChunkY, itr->m_ChunkZ); + LoadChunk(itr->m_ChunkX, itr->m_ChunkZ); } // for itr - a_Chunks[] } @@ -2364,10 +2364,10 @@ void cChunkMap::LoadChunks(const cChunkCoordsList & a_Chunks) -void cChunkMap::ChunkLoadFailed(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +void cChunkMap::ChunkLoadFailed(int a_ChunkX, int a_ChunkZ) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, a_ChunkY, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, a_ChunkZ); if (Chunk == NULL) { return; @@ -2384,7 +2384,7 @@ bool cChunkMap::SetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, const ASt cCSLock Lock(m_CSLayers); int ChunkX, ChunkZ; cChunkDef::BlockToChunk(a_BlockX, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoGen(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return false; @@ -2399,7 +2399,7 @@ bool cChunkMap::SetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, const ASt void cChunkMap::MarkChunkRegenerating(int a_ChunkX, int a_ChunkZ) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, a_ChunkZ); if (Chunk == NULL) { // Not present @@ -2415,7 +2415,7 @@ void cChunkMap::MarkChunkRegenerating(int a_ChunkX, int a_ChunkZ) bool cChunkMap::IsChunkLighted(int a_ChunkX, int a_ChunkZ) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, a_ChunkZ); if (Chunk == NULL) { // Not present @@ -2436,7 +2436,7 @@ bool cChunkMap::ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinCh { for (int x = a_MinChunkX; x <= a_MaxChunkX; x++) { - cChunkPtr Chunk = GetChunkNoLoad(x, ZERO_CHUNK_Y, z); + cChunkPtr Chunk = GetChunkNoLoad(x, z); if ((Chunk == NULL) || (!Chunk->IsValid())) { // Not present / not valid @@ -2478,7 +2478,7 @@ bool cChunkMap::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBl { for (int x = MinChunkX; x <= MaxChunkX; x++) { - cChunkPtr Chunk = GetChunkNoLoad(x, ZERO_CHUNK_Y, z); + cChunkPtr Chunk = GetChunkNoLoad(x, z); if ((Chunk == NULL) || (!Chunk->IsValid())) { // Not present / not valid @@ -2519,7 +2519,7 @@ void cChunkMap::GrowMelonPumpkin(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCK cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if (Chunk != NULL) { Chunk->GrowMelonPumpkin(a_BlockX, a_BlockY, a_BlockZ, a_BlockType, a_Rand); @@ -2536,7 +2536,7 @@ void cChunkMap::GrowSugarcane(int a_BlockX, int a_BlockY, int a_BlockZ, int a_Nu cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if (Chunk != NULL) { Chunk->GrowSugarcane(a_BlockX, a_BlockY, a_BlockZ, a_NumBlocksToGrow); @@ -2553,7 +2553,7 @@ void cChunkMap::GrowCactus(int a_BlockX, int a_BlockY, int a_BlockZ, int a_NumBl cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if (Chunk != NULL) { Chunk->GrowCactus(a_BlockX, a_BlockY, a_BlockZ, a_NumBlocksToGrow); @@ -2570,7 +2570,7 @@ void cChunkMap::SetNextBlockTick(int a_BlockX, int a_BlockY, int a_BlockZ) cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if (Chunk != NULL) { Chunk->SetNextBlockTick(a_BlockX, a_BlockY, a_BlockZ); @@ -2625,7 +2625,7 @@ void cChunkMap::TickBlock(int a_BlockX, int a_BlockY, int a_BlockZ) cCSLock Lock(m_CSLayers); int ChunkX, ChunkZ; cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if ((Chunk == NULL) || !Chunk->IsValid()) { return; @@ -2694,7 +2694,7 @@ void cChunkMap::QueueTickBlock(int a_BlockX, int a_BlockY, int a_BlockZ) // a_BlockXYZ now contains relative coords! cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ZERO_CHUNK_Y, ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(ChunkX, ChunkZ); if (Chunk != NULL) { Chunk->QueueTickBlock(a_BlockX, a_BlockY, a_BlockZ); @@ -2708,7 +2708,7 @@ void cChunkMap::QueueTickBlock(int a_BlockX, int a_BlockY, int a_BlockZ) void cChunkMap::SetChunkAlwaysTicked(int a_ChunkX, int a_ChunkZ, bool a_AlwaysTicked) { cCSLock Lock(m_CSLayers); - cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, a_ChunkZ); if (Chunk != NULL) { Chunk->SetAlwaysTicked(a_AlwaysTicked); @@ -2753,7 +2753,7 @@ cChunkMap::cChunkLayer::~cChunkLayer() -cChunkPtr cChunkMap::cChunkLayer::GetChunk( int a_ChunkX, int a_ChunkY, int a_ChunkZ) +cChunkPtr cChunkMap::cChunkLayer::GetChunk( int a_ChunkX, int a_ChunkZ) { // Always returns an assigned chunkptr, but the chunk needn't be valid (loaded / generated) - callers must check @@ -2773,7 +2773,7 @@ cChunkPtr cChunkMap::cChunkLayer::GetChunk( int a_ChunkX, int a_ChunkY, int a_Ch cChunk * neixp = (LocalX < LAYER_SIZE - 1) ? m_Chunks[Index + 1] : m_Parent->FindChunk(a_ChunkX + 1, a_ChunkZ); cChunk * neizm = (LocalZ > 0) ? m_Chunks[Index - LAYER_SIZE] : m_Parent->FindChunk(a_ChunkX, a_ChunkZ - 1); cChunk * neizp = (LocalZ < LAYER_SIZE - 1) ? m_Chunks[Index + LAYER_SIZE] : m_Parent->FindChunk(a_ChunkX, a_ChunkZ + 1); - m_Chunks[Index] = new cChunk(a_ChunkX, 0, a_ChunkZ, m_Parent, m_Parent->GetWorld(), neixm, neixp, neizm, neizp, m_Pool); + m_Chunks[Index] = new cChunk(a_ChunkX, a_ChunkZ, m_Parent, m_Parent->GetWorld(), neixm, neixp, neizm, neizp, m_Pool); } return m_Chunks[Index]; } @@ -2973,7 +2973,7 @@ void cChunkMap::cChunkLayer::Save(void) { if ((m_Chunks[i] != NULL) && m_Chunks[i]->IsValid() && m_Chunks[i]->IsDirty()) { - World->GetStorage().QueueSaveChunk(m_Chunks[i]->GetPosX(), m_Chunks[i]->GetPosY(), m_Chunks[i]->GetPosZ()); + World->GetStorage().QueueSaveChunk(m_Chunks[i]->GetPosX(), m_Chunks[i]->GetPosZ()); } } // for i - m_Chunks[] } @@ -3046,7 +3046,7 @@ void cChunkMap::AddChunkStay(cChunkStay & a_ChunkStay) const cChunkCoordsVector & WantedChunks = a_ChunkStay.GetChunks(); for (cChunkCoordsVector::const_iterator itr = WantedChunks.begin(); itr != WantedChunks.end(); ++itr) { - cChunkPtr Chunk = GetChunk(itr->m_ChunkX, itr->m_ChunkY, itr->m_ChunkZ); + cChunkPtr Chunk = GetChunk(itr->m_ChunkX, itr->m_ChunkZ); if (Chunk == NULL) { continue; @@ -3095,7 +3095,7 @@ void cChunkMap::DelChunkStay(cChunkStay & a_ChunkStay) const cChunkCoordsVector & Chunks = a_ChunkStay.GetChunks(); for (cChunkCoordsVector::const_iterator itr = Chunks.begin(), end = Chunks.end(); itr != end; ++itr) { - cChunkPtr Chunk = GetChunkNoLoad(itr->m_ChunkX, itr->m_ChunkY, itr->m_ChunkZ); + cChunkPtr Chunk = GetChunkNoLoad(itr->m_ChunkX, itr->m_ChunkZ); if (Chunk == NULL) { continue; diff --git a/src/ChunkMap.h b/src/ChunkMap.h index 1e9a0f982..6a379e51d 100644 --- a/src/ChunkMap.h +++ b/src/ChunkMap.h @@ -270,16 +270,16 @@ public: bool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4); // Lua-accessible /** Touches the chunk, causing it to be loaded or generated */ - void TouchChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + void TouchChunk(int a_ChunkX, int a_ChunkZ); /** Loads the chunk, if not already loaded. Doesn't generate. Returns true if chunk valid (even if already loaded before) */ - bool LoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + bool LoadChunk(int a_ChunkX, int a_ChunkZ); /** Loads the chunks specified. Doesn't report failure, other than chunks being !IsValid() */ void LoadChunks(const cChunkCoordsList & a_Chunks); /** Marks the chunk as failed-to-load */ - void ChunkLoadFailed(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + void ChunkLoadFailed(int a_ChunkX, int a_ChunkZ); /** Sets the sign text. Returns true if sign text changed. */ bool SetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4); @@ -363,7 +363,7 @@ private: ~cChunkLayer(); /** Always returns an assigned chunkptr, but the chunk needn't be valid (loaded / generated) - callers must check */ - cChunkPtr GetChunk( int a_ChunkX, int a_ChunkY, int a_ChunkZ); + cChunkPtr GetChunk( int a_ChunkX, int a_ChunkZ); /** Returns the specified chunk, or NULL if not created yet */ cChunk * FindChunk(int a_ChunkX, int a_ChunkZ); @@ -456,9 +456,9 @@ private: std::auto_ptr > m_Pool; - cChunkPtr GetChunk (int a_ChunkX, int a_ChunkY, int a_ChunkZ); // Also queues the chunk for loading / generating if not valid - cChunkPtr GetChunkNoGen (int a_ChunkX, int a_ChunkY, int a_ChunkZ); // Also queues the chunk for loading if not valid; doesn't generate - cChunkPtr GetChunkNoLoad(int a_ChunkX, int a_ChunkY, int a_ChunkZ); // Doesn't load, doesn't generate + cChunkPtr GetChunk (int a_ChunkX, int a_ChunkZ); // Also queues the chunk for loading / generating if not valid + cChunkPtr GetChunkNoGen (int a_ChunkX, int a_ChunkZ); // Also queues the chunk for loading if not valid; doesn't generate + cChunkPtr GetChunkNoLoad(int a_ChunkX, int a_ChunkZ); // Doesn't load, doesn't generate /** Gets a block in any chunk while in the cChunk's Tick() method; returns true if successful, false if chunk not loaded (doesn't queue load) */ bool LockedGetBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta); diff --git a/src/ChunkSender.cpp b/src/ChunkSender.cpp index ebcf0e272..95c4d03d2 100644 --- a/src/ChunkSender.cpp +++ b/src/ChunkSender.cpp @@ -81,7 +81,7 @@ void cChunkSender::ChunkReady(int a_ChunkX, int a_ChunkZ) // This is probably never gonna be called twice for the same chunk, and if it is, we don't mind, so we don't check { cCSLock Lock(m_CS); - m_ChunksReady.push_back(cChunkCoords(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ)); + m_ChunksReady.push_back(cChunkCoords(a_ChunkX, a_ChunkZ)); } m_evtQueue.Set(); } @@ -95,12 +95,12 @@ void cChunkSender::QueueSendChunkTo(int a_ChunkX, int a_ChunkZ, cClientHandle * ASSERT(a_Client != NULL); { cCSLock Lock(m_CS); - if (std::find(m_SendChunks.begin(), m_SendChunks.end(), sSendChunk(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ, a_Client)) != m_SendChunks.end()) + if (std::find(m_SendChunks.begin(), m_SendChunks.end(), sSendChunk(a_ChunkX, a_ChunkZ, a_Client)) != m_SendChunks.end()) { // Already queued, bail out return; } - m_SendChunks.push_back(sSendChunk(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ, a_Client)); + m_SendChunks.push_back(sSendChunk(a_ChunkX, a_ChunkZ, a_Client)); } m_evtQueue.Set(); } @@ -160,7 +160,7 @@ void cChunkSender::Execute(void) m_ChunksReady.pop_front(); Lock.Unlock(); - SendChunk(Coords.m_ChunkX, Coords.m_ChunkY, Coords.m_ChunkZ, NULL); + SendChunk(Coords.m_ChunkX, Coords.m_ChunkZ, NULL); } else { @@ -169,7 +169,7 @@ void cChunkSender::Execute(void) m_SendChunks.pop_front(); Lock.Unlock(); - SendChunk(Chunk.m_ChunkX, Chunk.m_ChunkY, Chunk.m_ChunkZ, Chunk.m_Client); + SendChunk(Chunk.m_ChunkX, Chunk.m_ChunkZ, Chunk.m_Client); } Lock.Lock(); int RemoveCount = m_RemoveCount; @@ -186,14 +186,14 @@ void cChunkSender::Execute(void) -void cChunkSender::SendChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ, cClientHandle * a_Client) +void cChunkSender::SendChunk(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client) { ASSERT(m_World != NULL); // Ask the client if it still wants the chunk: if (a_Client != NULL) { - if (!a_Client->WantsSendChunk(a_ChunkX, a_ChunkY, a_ChunkZ)) + if (!a_Client->WantsSendChunk(a_ChunkX, a_ChunkZ)) { return; } diff --git a/src/ChunkSender.h b/src/ChunkSender.h index 624a3a0bd..a0e9087a9 100644 --- a/src/ChunkSender.h +++ b/src/ChunkSender.h @@ -95,13 +95,11 @@ protected: struct sSendChunk { int m_ChunkX; - int m_ChunkY; int m_ChunkZ; cClientHandle * m_Client; - sSendChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ, cClientHandle * a_Client) : + sSendChunk(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client) : m_ChunkX(a_ChunkX), - m_ChunkY(a_ChunkY), m_ChunkZ(a_ChunkZ), m_Client(a_Client) { @@ -111,7 +109,6 @@ protected: { return ( (a_Other.m_ChunkX == m_ChunkX) && - (a_Other.m_ChunkY == m_ChunkY) && (a_Other.m_ChunkZ == m_ChunkZ) && (a_Other.m_Client == m_Client) ); @@ -162,7 +159,7 @@ protected: virtual void BlockEntity (cBlockEntity * a_Entity) override; /// Sends the specified chunk to a_Client, or to all chunk clients if a_Client == NULL - void SendChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ, cClientHandle * a_Client); + void SendChunk(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client); } ; diff --git a/src/ChunkStay.cpp b/src/ChunkStay.cpp index b5002a63d..38aa89a37 100644 --- a/src/ChunkStay.cpp +++ b/src/ChunkStay.cpp @@ -51,7 +51,7 @@ void cChunkStay::Add(int a_ChunkX, int a_ChunkZ) return; } } // for itr - Chunks[] - m_Chunks.push_back(cChunkCoords(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ)); + m_Chunks.push_back(cChunkCoords(a_ChunkX, a_ChunkZ)); } diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 8aa883144..18c1a32ef 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -472,13 +472,13 @@ void cClientHandle::StreamChunks(void) // For each distance touch chunks in a hollow square centered around current position: for (int i = -d; i <= d; ++i) { - World->TouchChunk(ChunkPosX + d, ZERO_CHUNK_Y, ChunkPosZ + i); - World->TouchChunk(ChunkPosX - d, ZERO_CHUNK_Y, ChunkPosZ + i); + World->TouchChunk(ChunkPosX + d, ChunkPosZ + i); + World->TouchChunk(ChunkPosX - d, ChunkPosZ + i); } // for i for (int i = -d + 1; i < d; ++i) { - World->TouchChunk(ChunkPosX + i, ZERO_CHUNK_Y, ChunkPosZ + d); - World->TouchChunk(ChunkPosX + i, ZERO_CHUNK_Y, ChunkPosZ - d); + World->TouchChunk(ChunkPosX + i, ChunkPosZ + d); + World->TouchChunk(ChunkPosX + i, ChunkPosZ - d); } // for i } // for d } @@ -501,8 +501,8 @@ void cClientHandle::StreamChunk(int a_ChunkX, int a_ChunkZ) { { cCSLock Lock(m_CSChunkLists); - m_LoadedChunks.push_back(cChunkCoords(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ)); - m_ChunksToSend.push_back(cChunkCoords(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ)); + m_LoadedChunks.push_back(cChunkCoords(a_ChunkX, a_ChunkZ)); + m_ChunksToSend.push_back(cChunkCoords(a_ChunkX, a_ChunkZ)); } World->SendChunkTo(a_ChunkX, a_ChunkZ, this); } @@ -2733,7 +2733,7 @@ bool cClientHandle::HasPluginChannel(const AString & a_PluginChannel) -bool cClientHandle::WantsSendChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +bool cClientHandle::WantsSendChunk(int a_ChunkX, int a_ChunkZ) { if (m_State >= csDestroying) { @@ -2741,7 +2741,7 @@ bool cClientHandle::WantsSendChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) } cCSLock Lock(m_CSChunkLists); - return (std::find(m_ChunksToSend.begin(), m_ChunksToSend.end(), cChunkCoords(a_ChunkX, a_ChunkY, a_ChunkZ)) != m_ChunksToSend.end()); + return (std::find(m_ChunksToSend.begin(), m_ChunksToSend.end(), cChunkCoords(a_ChunkX, a_ChunkZ)) != m_ChunksToSend.end()); } @@ -2757,9 +2757,9 @@ void cClientHandle::AddWantedChunk(int a_ChunkX, int a_ChunkZ) LOGD("Adding chunk [%d, %d] to wanted chunks for client %p", a_ChunkX, a_ChunkZ, this); cCSLock Lock(m_CSChunkLists); - if (std::find(m_ChunksToSend.begin(), m_ChunksToSend.end(), cChunkCoords(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ)) == m_ChunksToSend.end()) + if (std::find(m_ChunksToSend.begin(), m_ChunksToSend.end(), cChunkCoords(a_ChunkX, a_ChunkZ)) == m_ChunksToSend.end()) { - m_ChunksToSend.push_back(cChunkCoords(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ)); + m_ChunksToSend.push_back(cChunkCoords(a_ChunkX, a_ChunkZ)); } } diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 7ae70a07f..e98d7be99 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -209,7 +209,7 @@ public: // tolua_end /** Returns true if the client wants the chunk specified to be sent (in m_ChunksToSend) */ - bool WantsSendChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + bool WantsSendChunk(int a_ChunkX, int a_ChunkZ); /** Adds the chunk specified to the list of chunks wanted for sending (m_ChunksToSend) */ void AddWantedChunk(int a_ChunkX, int a_ChunkZ); diff --git a/src/Generating/ChunkGenerator.cpp b/src/Generating/ChunkGenerator.cpp index a1188f984..4d0cf3192 100644 --- a/src/Generating/ChunkGenerator.cpp +++ b/src/Generating/ChunkGenerator.cpp @@ -99,7 +99,7 @@ void cChunkGenerator::Stop(void) -void cChunkGenerator::QueueGenerateChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +void cChunkGenerator::QueueGenerateChunk(int a_ChunkX, int a_ChunkZ) { { cCSLock Lock(m_CS); @@ -107,7 +107,7 @@ void cChunkGenerator::QueueGenerateChunk(int a_ChunkX, int a_ChunkY, int a_Chunk // Check if it is already in the queue: for (cChunkCoordsList::iterator itr = m_Queue.begin(); itr != m_Queue.end(); ++itr) { - if ((itr->m_ChunkX == a_ChunkX) && (itr->m_ChunkY == a_ChunkY) && (itr->m_ChunkZ == a_ChunkZ)) + if ((itr->m_ChunkX == a_ChunkX) && (itr->m_ChunkZ == a_ChunkZ)) { // Already in the queue, bail out return; @@ -119,7 +119,7 @@ void cChunkGenerator::QueueGenerateChunk(int a_ChunkX, int a_ChunkY, int a_Chunk { LOGWARN("WARNING: Adding chunk [%i, %i] to generation queue; Queue is too big! (" SIZE_T_FMT ")", a_ChunkX, a_ChunkZ, m_Queue.size()); } - m_Queue.push_back(cChunkCoords(a_ChunkX, a_ChunkY, a_ChunkZ)); + m_Queue.push_back(cChunkCoords(a_ChunkX, a_ChunkZ)); } m_Event.Set(); @@ -246,7 +246,7 @@ void cChunkGenerator::Execute(void) } // Hack for regenerating chunks: if Y != 0, the chunk is considered invalid, even if it has its data set - if ((coords.m_ChunkY == 0) && m_ChunkSink->IsChunkValid(coords.m_ChunkX, coords.m_ChunkZ)) + if (m_ChunkSink->IsChunkValid(coords.m_ChunkX, coords.m_ChunkZ)) { LOGD("Chunk [%d, %d] already generated, skipping generation", coords.m_ChunkX, coords.m_ChunkZ); // Already generated, ignore request @@ -259,8 +259,8 @@ void cChunkGenerator::Execute(void) continue; } - LOGD("Generating chunk [%d, %d, %d]", coords.m_ChunkX, coords.m_ChunkY, coords.m_ChunkZ); - DoGenerate(coords.m_ChunkX, coords.m_ChunkY, coords.m_ChunkZ); + LOGD("Generating chunk [%d, %d]", coords.m_ChunkX, coords.m_ChunkZ); + DoGenerate(coords.m_ChunkX, coords.m_ChunkZ); NumChunksGenerated++; } // while (!bStop) @@ -269,7 +269,7 @@ void cChunkGenerator::Execute(void) -void cChunkGenerator::DoGenerate(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +void cChunkGenerator::DoGenerate(int a_ChunkX, int a_ChunkZ) { ASSERT(m_PluginInterface != NULL); ASSERT(m_ChunkSink != NULL); diff --git a/src/Generating/ChunkGenerator.h b/src/Generating/ChunkGenerator.h index 88d71f3f9..17ca8adce 100644 --- a/src/Generating/ChunkGenerator.h +++ b/src/Generating/ChunkGenerator.h @@ -116,7 +116,7 @@ public: void Stop(void); /// Queues the chunk for generation; removes duplicate requests - void QueueGenerateChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + void QueueGenerateChunk(int a_ChunkX, int a_ChunkZ); /// Generates the biomes for the specified chunk (directly, not in a separate thread). Used by the world loader if biomes failed loading. void GenerateBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap); @@ -154,7 +154,7 @@ private: // cIsThread override: virtual void Execute(void) override; - void DoGenerate(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + void DoGenerate(int a_ChunkX, int a_ChunkZ); }; diff --git a/src/World.cpp b/src/World.cpp index 69d1217f1..eba3a8357 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -442,7 +442,7 @@ void cWorld::InitializeSpawn(void) { for (int z = 0; z < ViewDist; z++) { - m_ChunkMap->TouchChunk(x + ChunkX-(ViewDist - 1) / 2, ZERO_CHUNK_Y, z + ChunkZ-(ViewDist - 1) / 2); // Queue the chunk in the generator / loader + m_ChunkMap->TouchChunk(x + ChunkX-(ViewDist - 1) / 2, z + ChunkZ-(ViewDist - 1) / 2); // Queue the chunk in the generator / loader } } @@ -2421,7 +2421,7 @@ void cWorld::SetChunkData(cSetChunkData & a_SetChunkData) // Save the chunk right after generating, so that we don't have to generate it again on next run if (a_SetChunkData.ShouldMarkDirty()) { - m_Storage.QueueSaveChunk(ChunkX, 0, ChunkZ); + m_Storage.QueueSaveChunk(ChunkX, ChunkZ); } } @@ -2766,18 +2766,18 @@ void cWorld::RemoveClientFromChunkSender(cClientHandle * a_Client) -void cWorld::TouchChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +void cWorld::TouchChunk(int a_ChunkX, int a_ChunkZ) { - m_ChunkMap->TouchChunk(a_ChunkX, a_ChunkY, a_ChunkZ); + m_ChunkMap->TouchChunk(a_ChunkX, a_ChunkZ); } -bool cWorld::LoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +bool cWorld::LoadChunk(int a_ChunkX, int a_ChunkZ) { - return m_ChunkMap->LoadChunk(a_ChunkX, a_ChunkY, a_ChunkZ); + return m_ChunkMap->LoadChunk(a_ChunkX, a_ChunkZ); } @@ -2793,9 +2793,9 @@ void cWorld::LoadChunks(const cChunkCoordsList & a_Chunks) -void cWorld::ChunkLoadFailed(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +void cWorld::ChunkLoadFailed(int a_ChunkX, int a_ChunkZ) { - m_ChunkMap->ChunkLoadFailed(a_ChunkX, a_ChunkY, a_ChunkZ); + m_ChunkMap->ChunkLoadFailed(a_ChunkX, a_ChunkZ); } @@ -2900,8 +2900,7 @@ void cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ) { m_ChunkMap->MarkChunkRegenerating(a_ChunkX, a_ChunkZ); - // Trick: use Y=1 to force the chunk generation even though the chunk data is already present - m_Generator.QueueGenerateChunk(a_ChunkX, 1, a_ChunkZ); + m_Generator.QueueGenerateChunk(a_ChunkX, a_ChunkZ); } @@ -2910,7 +2909,7 @@ void cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ) void cWorld::GenerateChunk(int a_ChunkX, int a_ChunkZ) { - m_Generator.QueueGenerateChunk(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); + m_Generator.QueueGenerateChunk(a_ChunkX, a_ChunkZ); } diff --git a/src/World.h b/src/World.h index 578c9682b..50b157312 100644 --- a/src/World.h +++ b/src/World.h @@ -351,16 +351,16 @@ public: void RemoveClientFromChunkSender(cClientHandle * a_Client); /** Touches the chunk, causing it to be loaded or generated */ - void TouchChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + void TouchChunk(int a_ChunkX, int a_ChunkZ); /** Loads the chunk, if not already loaded. Doesn't generate. Returns true if chunk valid (even if already loaded before) */ - bool LoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + bool LoadChunk(int a_ChunkX, int a_ChunkZ); /** Loads the chunks specified. Doesn't report failure, other than chunks being !IsValid() */ void LoadChunks(const cChunkCoordsList & a_Chunks); /** Marks the chunk as failed-to-load: */ - void ChunkLoadFailed(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + void ChunkLoadFailed(int a_ChunkX, int a_ChunkZ); /** Sets the sign text, asking plugins for permission first. a_Player is the player who this change belongs to, may be NULL. Returns true if sign text changed. Same as UpdateSign() */ bool SetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4, cPlayer * a_Player = NULL); // Exported in ManualBindings.cpp diff --git a/src/WorldStorage/WSSCompact.cpp b/src/WorldStorage/WSSCompact.cpp index 58f9e3cab..6760186b2 100644 --- a/src/WorldStorage/WSSCompact.cpp +++ b/src/WorldStorage/WSSCompact.cpp @@ -980,7 +980,7 @@ bool cWSSCompact::cPAKFile::SaveChunkToData(const cChunkCoords & a_Chunk, cWorld if (!a_World->GetChunkData(a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, Serializer)) { // Chunk not valid - LOG("cWSSCompact: Trying to save chunk [%d, %d, %d] that has no data, ignoring request.", a_Chunk.m_ChunkX, a_Chunk.m_ChunkY, a_Chunk.m_ChunkZ); + LOG("cWSSCompact: Trying to save chunk [%d, %d] that has no data, ignoring request.", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ); return false; } @@ -999,7 +999,7 @@ bool cWSSCompact::cPAKFile::SaveChunkToData(const cChunkCoords & a_Chunk, cWorld int errorcode = CompressString(Data.data(), Data.size(), CompressedData, m_CompressionFactor); if (errorcode != Z_OK) { - LOGERROR("Error %i compressing data for chunk [%d, %d, %d]", errorcode, a_Chunk.m_ChunkX, a_Chunk.m_ChunkY, a_Chunk.m_ChunkZ); + LOGERROR("Error %i compressing data for chunk [%d, %d]", errorcode, a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ); return false; } @@ -1010,7 +1010,7 @@ bool cWSSCompact::cPAKFile::SaveChunkToData(const cChunkCoords & a_Chunk, cWorld sChunkHeader * Header = new sChunkHeader; if (Header == NULL) { - LOGWARNING("Cannot create a new chunk header to save chunk [%d, %d, %d]", a_Chunk.m_ChunkX, a_Chunk.m_ChunkY, a_Chunk.m_ChunkZ); + LOGWARNING("Cannot create a new chunk header to save chunk [%d, %d]", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ); return false; } Header->m_CompressedSize = (int)CompressedData.size(); diff --git a/src/WorldStorage/WorldStorage.cpp b/src/WorldStorage/WorldStorage.cpp index 707e8f929..c4df8c379 100644 --- a/src/WorldStorage/WorldStorage.cpp +++ b/src/WorldStorage/WorldStorage.cpp @@ -141,9 +141,9 @@ size_t cWorldStorage::GetSaveQueueLength(void) -void cWorldStorage::QueueLoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ, bool a_Generate) +void cWorldStorage::QueueLoadChunk(int a_ChunkX, int a_ChunkZ, bool a_Generate) { - m_LoadQueue.EnqueueItem(sChunkLoad(a_ChunkX, a_ChunkY, a_ChunkZ, a_Generate)); + m_LoadQueue.EnqueueItem(sChunkLoad(a_ChunkX, a_ChunkZ, a_Generate)); m_Event.Set(); } @@ -151,9 +151,9 @@ void cWorldStorage::QueueLoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ, boo -void cWorldStorage::QueueSaveChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +void cWorldStorage::QueueSaveChunk(int a_ChunkX, int a_ChunkZ) { - m_SaveQueue.EnqueueItemIfNotPresent(cChunkCoords(a_ChunkX, a_ChunkY, a_ChunkZ)); + m_SaveQueue.EnqueueItemIfNotPresent(cChunkCoords(a_ChunkX, a_ChunkZ)); m_Event.Set(); } @@ -161,9 +161,9 @@ void cWorldStorage::QueueSaveChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) -void cWorldStorage::UnqueueLoad(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +void cWorldStorage::UnqueueLoad(int a_ChunkX, int a_ChunkZ) { - m_LoadQueue.Remove(sChunkLoad(a_ChunkX, a_ChunkY, a_ChunkZ, true)); + m_LoadQueue.Remove(sChunkLoad(a_ChunkX, a_ChunkZ, true)); } @@ -242,19 +242,19 @@ void cWorldStorage::Execute(void) bool cWorldStorage::LoadOneChunk(void) { - sChunkLoad ToLoad(0, 0, 0, false); + sChunkLoad ToLoad(0, 0, false); bool ShouldLoad = m_LoadQueue.TryDequeueItem(ToLoad); - if (ShouldLoad && !LoadChunk(ToLoad.m_ChunkX, ToLoad.m_ChunkY, ToLoad.m_ChunkZ)) + if (ShouldLoad && !LoadChunk(ToLoad.m_ChunkX, ToLoad.m_ChunkZ)) { if (ToLoad.m_Generate) { // The chunk couldn't be loaded, generate it: - m_World->GetGenerator().QueueGenerateChunk(ToLoad.m_ChunkX, ToLoad.m_ChunkY, ToLoad.m_ChunkZ); + m_World->GetGenerator().QueueGenerateChunk(ToLoad.m_ChunkX, ToLoad.m_ChunkZ); } else { // TODO: Notify the world that the load has failed: - // m_World->ChunkLoadFailed(ToLoad.m_ChunkX, ToLoad.m_ChunkY, ToLoad.m_ChunkZ); + // m_World->ChunkLoadFailed(ToLoad.m_ChunkX, ToLoad.m_ChunkZ); } } return ShouldLoad; @@ -266,7 +266,7 @@ bool cWorldStorage::LoadOneChunk(void) bool cWorldStorage::SaveOneChunk(void) { - cChunkCoords ToSave(0, 0, 0); + cChunkCoords ToSave(0, 0); bool ShouldSave = m_SaveQueue.TryDequeueItem(ToSave); if (ShouldSave && m_World->IsChunkValid(ToSave.m_ChunkX, ToSave.m_ChunkZ)) { @@ -283,7 +283,7 @@ bool cWorldStorage::SaveOneChunk(void) -bool cWorldStorage::LoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +bool cWorldStorage::LoadChunk(int a_ChunkX, int a_ChunkZ) { if (m_World->IsChunkValid(a_ChunkX, a_ChunkZ)) { @@ -291,7 +291,7 @@ bool cWorldStorage::LoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) return true; } - cChunkCoords Coords(a_ChunkX, a_ChunkY, a_ChunkZ); + cChunkCoords Coords(a_ChunkX, a_ChunkZ); // First try the schema that is used for saving if (m_SaveSchema->LoadChunk(Coords)) @@ -309,7 +309,7 @@ bool cWorldStorage::LoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) } // Notify the chunk owner that the chunk failed to load (sets cChunk::m_HasLoadFailed to true): - m_World->ChunkLoadFailed(a_ChunkX, a_ChunkY, a_ChunkZ); + m_World->ChunkLoadFailed(a_ChunkX, a_ChunkZ); return false; } diff --git a/src/WorldStorage/WorldStorage.h b/src/WorldStorage/WorldStorage.h index dd07ecb64..5f89ead53 100644 --- a/src/WorldStorage/WorldStorage.h +++ b/src/WorldStorage/WorldStorage.h @@ -64,13 +64,13 @@ public: cWorldStorage(void); ~cWorldStorage(); - void QueueLoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ, bool a_Generate); // Queues the chunk for loading; if not loaded, the chunk will be generated if a_Generate is true - void QueueSaveChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + void QueueLoadChunk(int a_ChunkX, int a_ChunkZ, bool a_Generate); // Queues the chunk for loading; if not loaded, the chunk will be generated if a_Generate is true + void QueueSaveChunk(int a_ChunkX, int a_ChunkZ); /// Loads the chunk specified; returns true on success, false on failure - bool LoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + bool LoadChunk(int a_ChunkX, int a_ChunkZ); - void UnqueueLoad(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + void UnqueueLoad(int a_ChunkX, int a_ChunkZ); void UnqueueSave(const cChunkCoords & a_Chunk); bool Start(cWorld * a_World, const AString & a_StorageSchemaName, int a_StorageCompressionFactor); // Hide the cIsThread's Start() method, we need to provide args @@ -87,17 +87,15 @@ protected: struct sChunkLoad { int m_ChunkX; - int m_ChunkY; int m_ChunkZ; bool m_Generate; // If true, the chunk will be generated if it cannot be loaded - sChunkLoad(int a_ChunkX, int a_ChunkY, int a_ChunkZ, bool a_Generate) : m_ChunkX(a_ChunkX), m_ChunkY(a_ChunkY), m_ChunkZ(a_ChunkZ), m_Generate(a_Generate) {} + sChunkLoad(int a_ChunkX, int a_ChunkZ, bool a_Generate) : m_ChunkX(a_ChunkX), m_ChunkZ(a_ChunkZ), m_Generate(a_Generate) {} bool operator ==(const sChunkLoad other) const { return ( (this->m_ChunkX == other.m_ChunkX) && - (this->m_ChunkY == other.m_ChunkY) && (this->m_ChunkZ == other.m_ChunkZ) ); } From 6c3b80f04c7c2cca26efb57cc9827a7a1d20fcda Mon Sep 17 00:00:00 2001 From: Hownaer Date: Thu, 28 Aug 2014 14:58:03 +0200 Subject: [PATCH 003/226] Fixed crashes and use std::swap. --- src/ClientHandle.cpp | 22 +++++++++++++++++++--- src/ClientHandle.h | 2 +- src/Item.cpp | 36 ++++++++++++++++++++---------------- src/UI/SlotArea.cpp | 9 +++------ 4 files changed, 43 insertions(+), 26 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 8aa883144..1dd8ff31c 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2857,11 +2857,27 @@ void cClientHandle::SocketClosed(void) -void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) +void cClientHandle::HandleEnchantItem(Byte & a_WindowID, Byte & a_Enchantment) { - cEnchantingWindow * Window = (cEnchantingWindow*)m_Player->GetWindow(); + if (a_Enchantment > 2) + { + LOGWARNING("%s attempt to crash the server with invalid enchanting selection!", GetUsername().c_str()); + Kick("Invalid enchanting!"); + return; + } + + if ( + (m_Player->GetWindow() == NULL) || + (m_Player->GetWindow()->GetWindowID() != a_WindowID) || + (m_Player->GetWindow()->GetWindowType() != cWindow::wtEnchantment) + ) + { + return; + } + + cEnchantingWindow * Window = (cEnchantingWindow*) m_Player->GetWindow(); cItem Item = *Window->m_SlotArea->GetSlot(0, *m_Player); - int BaseEnchantmentLevel = Window->GetPropertyValue(Enchantment); + int BaseEnchantmentLevel = Window->GetPropertyValue(a_Enchantment); if (Item.EnchantByXPLevels(BaseEnchantmentLevel)) { diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 7ae70a07f..24031119d 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -269,7 +269,7 @@ public: void RemoveFromWorld(void); /** Called when the player will enchant a Item */ - void HandleEnchantItem(Byte & WindowID, Byte & Enchantment); + void HandleEnchantItem(Byte & a_WindowID, Byte & a_Enchantment); private: diff --git a/src/Item.cpp b/src/Item.cpp index a5117c271..4d29318e6 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -291,73 +291,77 @@ int cItem::GetEnchantability() bool cItem::EnchantByXPLevels(int a_NumXPLevels) { - if (!cItem::IsEnchantable(m_ItemType) && (m_ItemType != E_ITEM_BOOK)) + if (!cItem::IsEnchantable(m_ItemType)) { return false; } int Enchantability = GetEnchantability(); + if (Enchantability == 0) + { + return false; + } cFastRandom Random; int ModifiedEnchantmentLevel = a_NumXPLevels + (int)Random.NextFloat((float)Enchantability / 4) + (int)Random.NextFloat((float)Enchantability / 4) + 1; float RandomBonus = 1.0F + (Random.NextFloat(1) + Random.NextFloat(1) - 1.0F) * 0.15F; int FinalEnchantmentLevel = (int)(ModifiedEnchantmentLevel * RandomBonus + 0.5F); - cWeightedEnchantments enchantments; - cEnchantments::AddItemEnchantmentWeights(enchantments, m_ItemType, FinalEnchantmentLevel); + cWeightedEnchantments Enchantments; + cEnchantments::AddItemEnchantmentWeights(Enchantments, m_ItemType, FinalEnchantmentLevel); if (m_ItemType == E_ITEM_BOOK) { m_ItemType = E_ITEM_ENCHANTED_BOOK; } - cEnchantments Enchantment1 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + cEnchantments Enchantment1 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments); m_Enchantments.AddFromString(Enchantment1.ToString()); - cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment1); + cEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment1); // Checking for conflicting enchantments - cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment1); + cEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment1); float NewEnchantmentLevel = (float)a_NumXPLevels; // Next Enchantment (Second) NewEnchantmentLevel = NewEnchantmentLevel / 2; float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (enchantments.empty() || (Random.NextFloat(100) > SecondEnchantmentChance)) + if (Enchantments.empty() || (Random.NextFloat(100) > SecondEnchantmentChance)) { return true; } - cEnchantments Enchantment2 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + cEnchantments Enchantment2 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments); m_Enchantments.AddFromString(Enchantment2.ToString()); - cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment2); + cEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment2); // Checking for conflicting enchantments - cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment2); + cEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment2); // Next Enchantment (Third) NewEnchantmentLevel = NewEnchantmentLevel / 2; float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (enchantments.empty() || (Random.NextFloat(100) > ThirdEnchantmentChance)) + if (Enchantments.empty() || (Random.NextFloat(100) > ThirdEnchantmentChance)) { return true; } - cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments); m_Enchantments.AddFromString(Enchantment3.ToString()); - cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment3); + cEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment3); // Checking for conflicting enchantments - cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment3); + cEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment3); // Next Enchantment (Fourth) NewEnchantmentLevel = NewEnchantmentLevel / 2; float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (enchantments.empty() || (Random.NextFloat(100) > FourthEnchantmentChance)) + if (Enchantments.empty() || (Random.NextFloat(100) > FourthEnchantmentChance)) { return true; } - cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(Enchantments); m_Enchantments.AddFromString(Enchantment4.ToString()); return true; diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 74173d087..88af257a0 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -1423,7 +1423,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio } case caDblClick: { - // DblClicked(a_Player, a_SlotNum); + DblClicked(a_Player, a_SlotNum); return; } case caMiddleClick: @@ -1470,8 +1470,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio { if (!Slot.IsEmpty()) { - DraggingItem = Slot; - Slot.Empty(); + std::swap(DraggingItem, Slot); } } else if (Slot.IsEmpty()) @@ -1487,9 +1486,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio else if ((DraggingItem.m_ItemCount == 1) && !DraggingItem.IsEqual(Slot)) { // Switch contents - cItem tmp(DraggingItem); - DraggingItem = Slot; - Slot = tmp; + std::swap(DraggingItem, Slot); } SetSlot(a_SlotNum, a_Player, Slot); From f1470fcf9f1dc907241a645614cdcd5547dc1dbd Mon Sep 17 00:00:00 2001 From: Hownaer Date: Thu, 28 Aug 2014 15:21:38 +0200 Subject: [PATCH 004/226] Fixed bad values in the IsEnchantable() method. --- src/Item.cpp | 20 ++++++++++++++++---- src/Item.h | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Item.cpp b/src/Item.cpp index 4d29318e6..ebdf99ca5 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -190,9 +190,16 @@ void cItem::FromJson(const Json::Value & a_Value) -bool cItem::IsEnchantable(short a_ItemType) +bool cItem::IsEnchantable(short a_ItemType, bool a_WithBook) { - if (ItemCategory::IsTool(a_ItemType) || ItemCategory::IsArmor(a_ItemType)) + if ( + ItemCategory::IsAxe(a_ItemType) || + ItemCategory::IsSword(a_ItemType) || + ItemCategory::IsShovel(a_ItemType) || + ItemCategory::IsPickaxe(a_ItemType) || + (a_WithBook && ItemCategory::IsHoe(a_ItemType)) || + ItemCategory::IsArmor(a_ItemType) + ) { return true; } @@ -201,12 +208,17 @@ bool cItem::IsEnchantable(short a_ItemType) { case E_ITEM_BOOK: case E_ITEM_BOW: - case E_ITEM_CARROT_ON_STICK: case E_ITEM_FISHING_ROD: - case E_ITEM_SHEARS: { return true; } + + case E_ITEM_CARROT_ON_STICK: + case E_ITEM_SHEARS: + case E_ITEM_FLINT_AND_STEEL: + { + return a_WithBook; + } } return false; diff --git a/src/Item.h b/src/Item.h index d8b9e78a0..61011d861 100644 --- a/src/Item.h +++ b/src/Item.h @@ -184,7 +184,7 @@ public: void FromJson(const Json::Value & a_Value); /** Returns true if the specified item type is enchantable (as per 1.2.5 protocol requirements) */ - static bool IsEnchantable(short a_ItemType); // tolua_export + static bool IsEnchantable(short a_ItemType, bool a_WithBook = false); // tolua_export /** Returns the enchantability of the item. When the item hasn't a enchantability, it will returns 0 */ int GetEnchantability(); // tolua_export From c0c4ac5236779af648fd64d32eb7075553e4a88a Mon Sep 17 00:00:00 2001 From: Hownaer Date: Thu, 28 Aug 2014 15:21:50 +0200 Subject: [PATCH 005/226] Added comments. --- src/UI/SlotArea.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 88af257a0..b4facb2d3 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -1468,6 +1468,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio if (DraggingItem.IsEmpty()) { + // DraggingItem is empty -> Switch draggingitem and slot if (!Slot.IsEmpty()) { std::swap(DraggingItem, Slot); @@ -1475,6 +1476,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio } else if (Slot.IsEmpty()) { + // DraggingItem isn't empty and slot is empty -> Set one dragging item in the slot Slot = DraggingItem.CopyOne(); DraggingItem.m_ItemCount -= 1; @@ -1485,7 +1487,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio } else if ((DraggingItem.m_ItemCount == 1) && !DraggingItem.IsEqual(Slot)) { - // Switch contents + // DraggingItem and slot aren't empty -> Switch items std::swap(DraggingItem, Slot); } From 4ff34b9f10368587b7d7ade58977fb8ec7692d73 Mon Sep 17 00:00:00 2001 From: Hownaer Date: Thu, 28 Aug 2014 18:18:21 +0200 Subject: [PATCH 006/226] APIDump: Added missing cItem things. --- MCServer/Plugins/APIDump/APIDesc.lua | 11 ++++++++--- src/Item.h | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/MCServer/Plugins/APIDump/APIDesc.lua b/MCServer/Plugins/APIDump/APIDesc.lua index 3e1a6e3bb..d75911666 100644 --- a/MCServer/Plugins/APIDump/APIDesc.lua +++ b/MCServer/Plugins/APIDump/APIDesc.lua @@ -1188,7 +1188,7 @@ These ItemGrids are available in the API and can be manipulated by the plugins, constructor = { { Params = "", Return = "cItem", Notes = "Creates a new empty cItem object" }, - { Params = "ItemType, Count, Damage, EnchantmentString", Return = "cItem", Notes = "Creates a new cItem object of the specified type, count (1 by default), damage (0 by default) and enchantments (non-enchanted by default)" }, + { Params = "ItemType, Count, Damage, EnchantmentString, CustomName, Lore", Return = "cItem", Notes = "Creates a new cItem object of the specified type, count (1 by default), damage (0 by default), enchantments (non-enchanted by default), CustomName (empty by default) and Lore (string, empty by default)" }, { Params = "cItem", Return = "cItem", Notes = "Creates an exact copy of the cItem object in the parameter" }, } , AddCount = { Params = "AmountToAdd", Return = "cItem", Notes = "Adds the specified amount to the item count. Returns self (useful for chaining)." }, @@ -1207,6 +1207,9 @@ These ItemGrids are available in the API and can be manipulated by the plugins, IsBothNameAndLoreEmpty = { Params = "", Return = "bool", Notes = "Returns if both the custom name and lore are not set." }, IsCustomNameEmpty = { Params = "", Return = "bool", Notes = "Returns if the custom name of the cItem is empty." }, IsLoreEmpty = { Params = "", Return = "", Notes = "Returns if the lore of the cItem is empty." }, + GetEnchantability = { Params = "", Return = "number", Notes = "Returns the enchantability of the item. When the item hasn't a enchantability, it will returns 0" }, + EnchantByXPLevels = { Params = "NumXPLevels", Return = "bool", Notes = "Enchants the item using the specified number of XP levels. Returns true if item enchanted, false if not." }, + IsEnchantable = { Params = "ItemType, WithBook", Return = "bool", Notes = "(STATIC) Returns true if the specified item type is enchantable." }, }, Variables = { @@ -1214,8 +1217,10 @@ These ItemGrids are available in the API and can be manipulated by the plugins, m_ItemCount = { Type = "number", Notes = "Number of items in this stack" }, m_ItemDamage = { Type = "number", Notes = "The damage of the item. Zero means no damage. Maximum damage can be queried with GetMaxDamage()" }, m_ItemType = { Type = "number", Notes = "The item type. One of E_ITEM_ or E_BLOCK_ constants" }, - m_CustomName = { Type = "string", Notes = "The custom name for an item." }, - m_Lore = { Type = "string", Notes = "The lore for an item. Line breaks are represented by the ` character." }, + m_CustomName = { Type = "string", Notes = "The custom name for an item." }, + m_Lore = { Type = "string", Notes = "The lore for an item. Line breaks are represented by the ` character." }, + m_RepairCost = { Type = "number", Notes = "The repair cost of the item. The anvil need this value" }, + m_Enchantments = { Type = "{{cEnchantments|cEnchantments}}}", Notes = "The enchantments of the item." }, }, AdditionalInfo = { diff --git a/src/Item.h b/src/Item.h index 61011d861..316928b9e 100644 --- a/src/Item.h +++ b/src/Item.h @@ -183,7 +183,7 @@ public: /** Loads the item data from JSON representation */ void FromJson(const Json::Value & a_Value); - /** Returns true if the specified item type is enchantable (as per 1.2.5 protocol requirements) */ + /** Returns true if the specified item type is enchantable. */ static bool IsEnchantable(short a_ItemType, bool a_WithBook = false); // tolua_export /** Returns the enchantability of the item. When the item hasn't a enchantability, it will returns 0 */ From 240ec9b4bdd70f29aea3340f8f684818022122fd Mon Sep 17 00:00:00 2001 From: Hownaer Date: Thu, 28 Aug 2014 23:02:20 +0200 Subject: [PATCH 007/226] Added speed entity effect. --- src/ClientHandle.cpp | 2 +- src/Entities/EntityEffect.cpp | 41 +++++++++++++++++++++++++++++++++++ src/Entities/EntityEffect.h | 4 ++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index f9c6a664c..5ad9dc644 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1063,7 +1063,7 @@ void cClientHandle::HandleBlockDigStarted(int a_BlockX, int a_BlockY, int a_Bloc (m_Player->GetWorld()->GetBlock(a_BlockX, a_BlockY, a_BlockZ) != E_BLOCK_FIRE) ) { - // Players can't destroy blocks with a Sword in the hand. + // Players can't destroy blocks with a sword in the hand. return; } diff --git a/src/Entities/EntityEffect.cpp b/src/Entities/EntityEffect.cpp index 3e28392f4..58b76b21b 100644 --- a/src/Entities/EntityEffect.cpp +++ b/src/Entities/EntityEffect.cpp @@ -232,6 +232,47 @@ void cEntityEffect::OnTick(cPawn & a_Target) +//////////////////////////////////////////////////////////////////////////////// +// cEntityEffectSpeed: + +void cEntityEffectSpeed::OnActivate(cPawn & a_Target) +{ + // TODO: Add SetMormalMaxSpeed to cMonster + + if (!a_Target.IsPlayer()) + { + return; + } + cPlayer * Player = (cPlayer*) &a_Target; + + Player->SetNormalMaxSpeed(1.0 + 0.2 * m_Intensity); + Player->SetSprintingMaxSpeed(1.3 + 0.26 * m_Intensity); + Player->SetFlyingMaxSpeed(1.0 + 0.2 * m_Intensity); +} + + + + + +void cEntityEffectSpeed::OnDeactivate(cPawn & a_Target) +{ + // TODO: Add SetMormalMaxSpeed to cMonster + + if (!a_Target.IsPlayer()) + { + return; + } + cPlayer * Player = (cPlayer*) &a_Target; + + Player->SetNormalMaxSpeed(1.0); + Player->SetSprintingMaxSpeed(1.3); + Player->SetFlyingMaxSpeed(1.0); +} + + + + + //////////////////////////////////////////////////////////////////////////////// // cEntityEffectInstantHealth: diff --git a/src/Entities/EntityEffect.h b/src/Entities/EntityEffect.h index 47c298f57..e123a7f77 100644 --- a/src/Entities/EntityEffect.h +++ b/src/Entities/EntityEffect.h @@ -137,6 +137,10 @@ public: super(a_Duration, a_Intensity, a_DistanceModifier) { } + + virtual void OnActivate(cPawn & a_Target) override; + + virtual void OnDeactivate(cPawn & a_Target) override; }; From 75e131638616c68d126eb64abdf903a93dd7322f Mon Sep 17 00:00:00 2001 From: LO1ZB Date: Fri, 29 Aug 2014 20:19:45 +0200 Subject: [PATCH 008/226] fix chunk regenerating --- src/Generating/ChunkGenerator.cpp | 8 -------- src/World.cpp | 8 ++++++++ src/World.h | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Generating/ChunkGenerator.cpp b/src/Generating/ChunkGenerator.cpp index 4d0cf3192..a1c3d50cc 100644 --- a/src/Generating/ChunkGenerator.cpp +++ b/src/Generating/ChunkGenerator.cpp @@ -245,14 +245,6 @@ void cChunkGenerator::Execute(void) LastReportTick = clock(); } - // Hack for regenerating chunks: if Y != 0, the chunk is considered invalid, even if it has its data set - if (m_ChunkSink->IsChunkValid(coords.m_ChunkX, coords.m_ChunkZ)) - { - LOGD("Chunk [%d, %d] already generated, skipping generation", coords.m_ChunkX, coords.m_ChunkZ); - // Already generated, ignore request - continue; - } - if (SkipEnabled && !m_ChunkSink->HasChunkAnyClients(coords.m_ChunkX, coords.m_ChunkZ)) { LOGWARNING("Chunk generator overloaded, skipping chunk [%d, %d]", coords.m_ChunkX, coords.m_ChunkZ); diff --git a/src/World.cpp b/src/World.cpp index eba3a8357..aba5bd859 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -2909,7 +2909,15 @@ void cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ) void cWorld::GenerateChunk(int a_ChunkX, int a_ChunkZ) { + if (!(m_ChunkMap->IsChunkValid(a_ChunkX, a_ChunkZ))) + { + LOGD("Chunk [%d, %d] already generated, skipping generation", a_ChunkX, a_ChunkZ); + // Already generated, ignore reques + } + else + { m_Generator.QueueGenerateChunk(a_ChunkX, a_ChunkZ); + } } diff --git a/src/World.h b/src/World.h index 50b157312..49e30694e 100644 --- a/src/World.h +++ b/src/World.h @@ -380,7 +380,7 @@ public: /** Regenerate the given chunk: */ void RegenerateChunk(int a_ChunkX, int a_ChunkZ); // tolua_export - /** Generates the given chunk, if not already generated */ + /** Generates the given chunk */ void GenerateChunk(int a_ChunkX, int a_ChunkZ); // tolua_export /** Queues a chunk for lighting; a_Callback is called after the chunk is lighted */ From e45a27add934dcdad8eadcea16ce647fb87fbf9d Mon Sep 17 00:00:00 2001 From: LO1ZB Date: Fri, 29 Aug 2014 20:26:19 +0200 Subject: [PATCH 009/226] add comments --- src/World.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/World.cpp b/src/World.cpp index aba5bd859..7c6a1af2f 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -2909,10 +2909,11 @@ void cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ) void cWorld::GenerateChunk(int a_ChunkX, int a_ChunkZ) { + /** Add a chunk to the generation queue, if it's not already present. */ if (!(m_ChunkMap->IsChunkValid(a_ChunkX, a_ChunkZ))) { LOGD("Chunk [%d, %d] already generated, skipping generation", a_ChunkX, a_ChunkZ); - // Already generated, ignore reques + /** Already generated, ignore reques */ } else { From 5a6ef8b8e5887a13b252623a584ac05f0b2bd070 Mon Sep 17 00:00:00 2001 From: LO1ZB Date: Fri, 29 Aug 2014 20:27:58 +0200 Subject: [PATCH 010/226] me being stupid --- src/World.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/World.cpp b/src/World.cpp index 7c6a1af2f..f6fed53ee 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -2913,7 +2913,7 @@ void cWorld::GenerateChunk(int a_ChunkX, int a_ChunkZ) if (!(m_ChunkMap->IsChunkValid(a_ChunkX, a_ChunkZ))) { LOGD("Chunk [%d, %d] already generated, skipping generation", a_ChunkX, a_ChunkZ); - /** Already generated, ignore reques */ + /** Already generated, ignore request */ } else { From ac95173e81028856e7dac7e751c9526d0c9d4c8a Mon Sep 17 00:00:00 2001 From: LO1ZB Date: Sat, 30 Aug 2014 00:45:05 +0200 Subject: [PATCH 011/226] remove orphaned comment. --- src/ChunkDef.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/ChunkDef.h b/src/ChunkDef.h index b7122efe2..111e081db 100644 --- a/src/ChunkDef.h +++ b/src/ChunkDef.h @@ -16,10 +16,6 @@ -/** This is really only a placeholder to be used in places where we need to "make up" a chunk's Y coord. -It will help us when the new chunk format comes out and we need to patch everything up for compatibility. -*/ - // Used to smoothly convert to new axis ordering. One will be removed when deemed stable. #define AXIS_ORDER_YZX 1 // Original (1.1-) #define AXIS_ORDER_XZY 2 // New (1.2+) From d7ee2245e89ce9e71f0172d5a0edf605060bcf2a Mon Sep 17 00:00:00 2001 From: Howaner Date: Sat, 30 Aug 2014 12:44:54 +0200 Subject: [PATCH 012/226] Added SetWalkSpeed() to cMonster. --- src/Mobs/Monster.cpp | 4 ++++ src/Mobs/Monster.h | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index f7ee0b0c0..09a22cd35 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -89,6 +89,7 @@ cMonster::cMonster(const AString & a_ConfigName, eType a_MobType, const AString , m_DropChanceBoots(0.085f) , m_CanPickUpLoot(true) , m_BurnsInDaylight(false) + , m_WalkSpeed(1.0) { if (!a_ConfigName.empty()) { @@ -302,6 +303,9 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk) Distance *= 0.25f; } + // Apply walk speed: + Distance *= m_WalkSpeed; + AddSpeedX(Distance.x); AddSpeedZ(Distance.z); diff --git a/src/Mobs/Monster.h b/src/Mobs/Monster.h index cdbd26c09..6db8435e2 100644 --- a/src/Mobs/Monster.h +++ b/src/Mobs/Monster.h @@ -138,6 +138,9 @@ public: /// Sets whether the mob burns in daylight. Only evaluated at next burn-decision tick void SetBurnsInDaylight(bool a_BurnsInDaylight) { m_BurnsInDaylight = a_BurnsInDaylight; } + double GetWalkSpeed(void) const { return m_WalkSpeed; } // tolua_export + void SetWalkSpeed(double a_WalkSpeed) { m_WalkSpeed = a_WalkSpeed; } // tolua_export + // Overridables to handle ageable mobs virtual bool IsBaby (void) const { return false; } virtual bool IsTame (void) const { return false; } @@ -248,6 +251,8 @@ protected: void HandleDaylightBurning(cChunk & a_Chunk); bool m_BurnsInDaylight; + double m_WalkSpeed; + /** Adds a random number of a_Item between a_Min and a_Max to itemdrops a_Drops*/ void AddRandomDropItem(cItems & a_Drops, unsigned int a_Min, unsigned int a_Max, short a_Item, short a_ItemHealth = 0); From 003206b1b038f4616d5318068106573cec4d4ecd Mon Sep 17 00:00:00 2001 From: Howaner Date: Sat, 30 Aug 2014 12:45:39 +0200 Subject: [PATCH 013/226] Added slowness effect and added entity support. --- src/Entities/EntityEffect.cpp | 79 +++++++++++++++++++++++++++-------- src/Entities/EntityEffect.h | 4 ++ 2 files changed, 66 insertions(+), 17 deletions(-) diff --git a/src/Entities/EntityEffect.cpp b/src/Entities/EntityEffect.cpp index 58b76b21b..9cf20095d 100644 --- a/src/Entities/EntityEffect.cpp +++ b/src/Entities/EntityEffect.cpp @@ -237,17 +237,18 @@ void cEntityEffect::OnTick(cPawn & a_Target) void cEntityEffectSpeed::OnActivate(cPawn & a_Target) { - // TODO: Add SetMormalMaxSpeed to cMonster - - if (!a_Target.IsPlayer()) + if (a_Target.IsMob()) { - return; + cMonster * Mob = (cMonster*) &a_Target; + Mob->SetWalkSpeed(Mob->GetWalkSpeed() + 0.2 * m_Intensity); + } + else if (a_Target.IsPlayer()) + { + cPlayer * Player = (cPlayer*) &a_Target; + Player->SetNormalMaxSpeed(Player->GetNormalMaxSpeed() + 0.2 * m_Intensity); + Player->SetSprintingMaxSpeed(Player->GetSprintingMaxSpeed() + 0.26 * m_Intensity); + Player->SetFlyingMaxSpeed(Player->GetFlyingMaxSpeed() + 0.2 * m_Intensity); } - cPlayer * Player = (cPlayer*) &a_Target; - - Player->SetNormalMaxSpeed(1.0 + 0.2 * m_Intensity); - Player->SetSprintingMaxSpeed(1.3 + 0.26 * m_Intensity); - Player->SetFlyingMaxSpeed(1.0 + 0.2 * m_Intensity); } @@ -256,17 +257,61 @@ void cEntityEffectSpeed::OnActivate(cPawn & a_Target) void cEntityEffectSpeed::OnDeactivate(cPawn & a_Target) { - // TODO: Add SetMormalMaxSpeed to cMonster - - if (!a_Target.IsPlayer()) + if (a_Target.IsMob()) { - return; + cMonster * Mob = (cMonster*) &a_Target; + Mob->SetWalkSpeed(Mob->GetWalkSpeed() - 0.2 * m_Intensity); } - cPlayer * Player = (cPlayer*) &a_Target; + else if (a_Target.IsPlayer()) + { + cPlayer * Player = (cPlayer*) &a_Target; + Player->SetNormalMaxSpeed(Player->GetNormalMaxSpeed() - 0.2 * m_Intensity); + Player->SetSprintingMaxSpeed(Player->GetSprintingMaxSpeed() - 0.26 * m_Intensity); + Player->SetFlyingMaxSpeed(Player->GetFlyingMaxSpeed() - 0.2 * m_Intensity); + } +} - Player->SetNormalMaxSpeed(1.0); - Player->SetSprintingMaxSpeed(1.3); - Player->SetFlyingMaxSpeed(1.0); + + + + +//////////////////////////////////////////////////////////////////////////////// +// cEntityEffectSlowness: + +void cEntityEffectSlowness::OnActivate(cPawn & a_Target) +{ + if (a_Target.IsMob()) + { + cMonster * Mob = (cMonster*) &a_Target; + Mob->SetWalkSpeed(Mob->GetWalkSpeed() - 0.15 * m_Intensity); + } + else if (a_Target.IsPlayer()) + { + cPlayer * Player = (cPlayer*) &a_Target; + Player->SetNormalMaxSpeed(Player->GetNormalMaxSpeed() - 0.15 * m_Intensity); + Player->SetSprintingMaxSpeed(Player->GetSprintingMaxSpeed() - 0.195 * m_Intensity); + Player->SetFlyingMaxSpeed(Player->GetFlyingMaxSpeed() - 0.15 * m_Intensity); + } +} + + + + + +void cEntityEffectSlowness::OnDeactivate(cPawn & a_Target) +{ + if (a_Target.IsMob()) + { + cMonster * Mob = (cMonster*) &a_Target; + Mob->SetWalkSpeed(Mob->GetWalkSpeed() + 0.15 * m_Intensity); + } + else if (a_Target.IsPlayer()) + { + cPlayer * Player = (cPlayer*) &a_Target; + Player->SetNormalMaxSpeed(Player->GetNormalMaxSpeed() + 0.15 * m_Intensity); + Player->SetSprintingMaxSpeed(Player->GetSprintingMaxSpeed() + 0.195 * m_Intensity); + Player->SetFlyingMaxSpeed(Player->GetFlyingMaxSpeed() + 0.15 * m_Intensity); + } } diff --git a/src/Entities/EntityEffect.h b/src/Entities/EntityEffect.h index e123a7f77..7cf9cd3d5 100644 --- a/src/Entities/EntityEffect.h +++ b/src/Entities/EntityEffect.h @@ -156,6 +156,10 @@ public: super(a_Duration, a_Intensity, a_DistanceModifier) { } + + virtual void OnActivate(cPawn & a_Target) override; + + virtual void OnDeactivate(cPawn & a_Target) override; }; From 0fdb1772083d7b4b8dd71c6f084acd9d2e001eec Mon Sep 17 00:00:00 2001 From: Howaner Date: Sat, 30 Aug 2014 12:46:26 +0200 Subject: [PATCH 014/226] Fixed potion removing in creative mode. --- src/Entities/Player.cpp | 6 ++---- src/Items/ItemGoldenApple.h | 1 + src/Items/ItemHandler.cpp | 1 + src/Items/ItemMilk.h | 8 ++++++-- src/Items/ItemPotion.h | 8 ++++++-- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index b0dd40615..5e0da3298 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -627,13 +627,11 @@ void cPlayer::FinishEating(void) } ItemHandler->OnFoodEaten(m_World, this, &Item); - GetInventory().RemoveOneEquippedItem(); - // if the food is mushroom soup, return a bowl to the inventory if (Item.m_ItemType == E_ITEM_MUSHROOM_SOUP) { - cItem EmptyBowl(E_ITEM_BOWL); - GetInventory().AddItem(EmptyBowl, true, true); + GetInventory().RemoveOneEquippedItem(); + GetInventory().AddItem(cItem(E_ITEM_BOWL), true, true); } } diff --git a/src/Items/ItemGoldenApple.h b/src/Items/ItemGoldenApple.h index 02ac0202c..5f6f1de6c 100644 --- a/src/Items/ItemGoldenApple.h +++ b/src/Items/ItemGoldenApple.h @@ -36,6 +36,7 @@ public: a_Player->AddEntityEffect(cEntityEffect::effFireResistance, 6000, 0); } + a_Player->GetInventory().RemoveOneEquippedItem(); return true; } diff --git a/src/Items/ItemHandler.cpp b/src/Items/ItemHandler.cpp index bceedaf69..ca0f04dcc 100644 --- a/src/Items/ItemHandler.cpp +++ b/src/Items/ItemHandler.cpp @@ -632,6 +632,7 @@ bool cItemHandler::GetEatEffect(cEntityEffect::eType & a_EffectType, int & a_Eff bool cItemHandler::EatItem(cPlayer * a_Player, cItem * a_Item) { UNUSED(a_Item); + a_Player->GetInventory().RemoveOneEquippedItem(); FoodInfo Info = GetFoodInfo(); if ((Info.FoodLevel > 0) || (Info.Saturation > 0.f)) diff --git a/src/Items/ItemMilk.h b/src/Items/ItemMilk.h index db7bc13be..c9a90865a 100644 --- a/src/Items/ItemMilk.h +++ b/src/Items/ItemMilk.h @@ -21,8 +21,12 @@ public: { UNUSED(a_Item); a_Player->ClearEntityEffects(); - a_Player->GetInventory().RemoveOneEquippedItem(); - a_Player->GetInventory().AddItem(E_ITEM_BUCKET); + + if (!a_Player->IsGameModeCreative()) + { + a_Player->GetInventory().RemoveOneEquippedItem(); + a_Player->GetInventory().AddItem(E_ITEM_BUCKET); + } return true; } }; diff --git a/src/Items/ItemPotion.h b/src/Items/ItemPotion.h index 24614cd8a..398ef6805 100644 --- a/src/Items/ItemPotion.h +++ b/src/Items/ItemPotion.h @@ -68,8 +68,12 @@ public: cEntityEffect::GetPotionEffectDuration(PotionDamage), cEntityEffect::GetPotionEffectIntensity(PotionDamage) ); - a_Player->GetInventory().RemoveOneEquippedItem(); - a_Player->GetInventory().AddItem(E_ITEM_GLASS_BOTTLE); + + if (!a_Player->IsGameModeCreative()) + { + a_Player->GetInventory().RemoveOneEquippedItem(); + a_Player->GetInventory().AddItem(E_ITEM_GLASS_BOTTLE); + } return true; } }; From 04653b45394a9e95fddcae274cca0c422f21cfdc Mon Sep 17 00:00:00 2001 From: Howaner Date: Sat, 30 Aug 2014 12:53:19 +0200 Subject: [PATCH 015/226] Added GetWalkSpeed() and SetWalkSpeed() documentation. --- MCServer/Plugins/APIDump/APIDesc.lua | 2 ++ MCServer/Plugins/SexyMotd | 1 + 2 files changed, 3 insertions(+) create mode 120000 MCServer/Plugins/SexyMotd diff --git a/MCServer/Plugins/APIDump/APIDesc.lua b/MCServer/Plugins/APIDump/APIDesc.lua index 3e1a6e3bb..434dd8a90 100644 --- a/MCServer/Plugins/APIDump/APIDesc.lua +++ b/MCServer/Plugins/APIDump/APIDesc.lua @@ -1636,6 +1636,8 @@ a_Player:OpenWindow(Window); MobTypeToString = { Params = "{{cMonster#MobType|MobType}}", Return = "string", Notes = "(STATIC) Returns the string representing the given mob type ({{cMonster#MobType|mtXXX}} constant), or empty string if unknown type." }, MoveToPosition = { Params = "Position", Return = "", Notes = "Moves mob to the specified position" }, StringToMobType = { Params = "string", Return = "{{cMonster#MobType|MobType}}", Notes = "(STATIC) Returns the mob type ({{cMonster#MobType|mtXXX}} constant) parsed from the string type (\"creeper\"), or mtInvalidType if unrecognized." }, + GetWalkSpeed = { Params = "", Return = "number", Notes = "Returns the walk speed of this mob. Standard is 1.0" }, + SetWalkSpeed = { Params = "number", Return = "", Notes = "Sets the walk speed of this mob. Standard is 1.0" }, }, Constants = { diff --git a/MCServer/Plugins/SexyMotd b/MCServer/Plugins/SexyMotd new file mode 120000 index 000000000..b6af08265 --- /dev/null +++ b/MCServer/Plugins/SexyMotd @@ -0,0 +1 @@ +/home/franz/Schreibtisch/MCServer Plugins/SexyMotd/ \ No newline at end of file From c5be3e0b6673c03c9a4dba109454af8bcaefc4e5 Mon Sep 17 00:00:00 2001 From: Howaner Date: Sat, 30 Aug 2014 12:55:43 +0200 Subject: [PATCH 016/226] Removed SexyMotd link --- MCServer/Plugins/SexyMotd | 1 - 1 file changed, 1 deletion(-) delete mode 120000 MCServer/Plugins/SexyMotd diff --git a/MCServer/Plugins/SexyMotd b/MCServer/Plugins/SexyMotd deleted file mode 120000 index b6af08265..000000000 --- a/MCServer/Plugins/SexyMotd +++ /dev/null @@ -1 +0,0 @@ -/home/franz/Schreibtisch/MCServer Plugins/SexyMotd/ \ No newline at end of file From 3ee3a59e75ac1e6eb9284983a05a459aab5be1fd Mon Sep 17 00:00:00 2001 From: Howaner Date: Sat, 30 Aug 2014 15:06:43 +0200 Subject: [PATCH 017/226] Changed the IsEnchantable() comment. --- MCServer/Plugins/APIDump/APIDesc.lua | 2 +- src/Item.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MCServer/Plugins/APIDump/APIDesc.lua b/MCServer/Plugins/APIDump/APIDesc.lua index d75911666..da8f9cd74 100644 --- a/MCServer/Plugins/APIDump/APIDesc.lua +++ b/MCServer/Plugins/APIDump/APIDesc.lua @@ -1209,7 +1209,7 @@ These ItemGrids are available in the API and can be manipulated by the plugins, IsLoreEmpty = { Params = "", Return = "", Notes = "Returns if the lore of the cItem is empty." }, GetEnchantability = { Params = "", Return = "number", Notes = "Returns the enchantability of the item. When the item hasn't a enchantability, it will returns 0" }, EnchantByXPLevels = { Params = "NumXPLevels", Return = "bool", Notes = "Enchants the item using the specified number of XP levels. Returns true if item enchanted, false if not." }, - IsEnchantable = { Params = "ItemType, WithBook", Return = "bool", Notes = "(STATIC) Returns true if the specified item type is enchantable." }, + IsEnchantable = { Params = "ItemType, WithBook", Return = "bool", Notes = "(STATIC) Returns true if the specified item type is enchantable. If WithBook is true, the function checks the enchantments with a book too." }, }, Variables = { diff --git a/src/Item.h b/src/Item.h index 316928b9e..e7fd67b9a 100644 --- a/src/Item.h +++ b/src/Item.h @@ -183,7 +183,8 @@ public: /** Loads the item data from JSON representation */ void FromJson(const Json::Value & a_Value); - /** Returns true if the specified item type is enchantable. */ + /** Returns true if the specified item type is enchantable. + If WithBook is true, the function checks the enchantments with a book too. */ static bool IsEnchantable(short a_ItemType, bool a_WithBook = false); // tolua_export /** Returns the enchantability of the item. When the item hasn't a enchantability, it will returns 0 */ From 7e5f22141f72fd1ad0ec7982df03f126e9c11244 Mon Sep 17 00:00:00 2001 From: Howaner Date: Sun, 31 Aug 2014 12:59:04 +0200 Subject: [PATCH 018/226] WebAdmin: Added "files" folder and load the login template from login_template.html --- src/WebAdmin.cpp | 106 ++++++++++++++++++++++++++++++++++++++++++----- src/WebAdmin.h | 6 +++ 2 files changed, 102 insertions(+), 10 deletions(-) diff --git a/src/WebAdmin.cpp b/src/WebAdmin.cpp index 23eedbd14..0646c9d1c 100644 --- a/src/WebAdmin.cpp +++ b/src/WebAdmin.cpp @@ -135,6 +135,20 @@ bool cWebAdmin::Start(void) m_TemplateScript.Close(); } + if (!LoadLoginTemplate()) + { + LOGWARN("Could not load WebAdmin login template \"%s\", using fallback template.", FILE_IO_PREFIX "webadmin/login_template.html"); + + // Sets the fallback template: + m_LoginTemplate = \ + "

MCServer WebAdmin

" \ + "
" \ + "
" \ + "" \ + "
" \ + "
"; + } + m_IsRunning = m_HTTPServer.Start(*this); return m_IsRunning; } @@ -159,6 +173,28 @@ void cWebAdmin::Stop(void) +bool cWebAdmin::LoadLoginTemplate(void) +{ + cFile File(FILE_IO_PREFIX "webadmin/login_template.html", cFile::fmRead); + if (!File.IsOpen()) + { + return false; + } + + AString TemplateContent; + if (File.ReadRestOfFile(TemplateContent) == -1) + { + return false; + } + + m_LoginTemplate = TemplateContent; + return true; +} + + + + + void cWebAdmin::HandleWebadminRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request) { if (!a_Request.HasAuth()) @@ -298,17 +334,11 @@ void cWebAdmin::HandleWebadminRequest(cHTTPConnection & a_Connection, cHTTPReque void cWebAdmin::HandleRootRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request) { UNUSED(a_Request); - static const char LoginForm[] = \ - "

MCServer WebAdmin

" \ - "
" \ - "
" \ - "" \ - "
" \ - "
"; + cHTTPResponse Resp; Resp.SetContentType("text/html"); a_Connection.Send(Resp); - a_Connection.Send(LoginForm, sizeof(LoginForm) - 1); + a_Connection.Send(m_LoginTemplate); a_Connection.FinishResponse(); } @@ -528,7 +558,64 @@ void cWebAdmin::OnRequestFinished(cHTTPConnection & a_Connection, cHTTPRequest & } else { - // TODO: Handle other requests + AString FileURL = URL; + std::replace(FileURL.begin(), FileURL.end(), '\\', '/'); + + // Remove all backsplashes on the first place: + if (FileURL[0] == '/') + { + size_t FirstCharToRead = FileURL.find_first_not_of('/'); + if (FirstCharToRead != AString::npos) + { + FileURL = FileURL.substr(FirstCharToRead); + } + } + + // Remove all "../" strings: + ReplaceString(FileURL, "../", ""); + + bool LoadedSuccessfull = false; + AString Content = "

404 Not Found

"; + AString Path = Printf(FILE_IO_PREFIX "webadmin/files/%s", FileURL.c_str()); + if (cFile::IsFile(Path)) + { + cFile File(Path, cFile::fmRead); + AString FileContent; + if (File.IsOpen() && (File.ReadRestOfFile(FileContent) != -1)) + { + LoadedSuccessfull = true; + Content = FileContent; + } + } + + // Find content type (The currently method is very bad. We should change it later) + AString ContentType = "text/html"; + size_t LastPointPosition = Path.find_last_of('.'); + if (LoadedSuccessfull && (LastPointPosition != AString::npos) && (LastPointPosition < Path.length())) + { + const AString & FileExtension = StrToLower(Path.substr(LastPointPosition + 1)); + if (FileExtension == "png") ContentType = "image/png"; + if (FileExtension == "fif") ContentType = "image/fif"; + if (FileExtension == "gif") ContentType = "image/gif"; + if (FileExtension == "jpeg") ContentType = "image/jpeg"; + if (FileExtension == "jpg") ContentType = "image/jpeg"; + if (FileExtension == "jpe") ContentType = "image/jpeg"; + if (FileExtension == "tiff") ContentType = "image/tiff"; + if (FileExtension == "ico") ContentType = "image/ico"; + if (FileExtension == "csv") ContentType = "text/comma-separated-values"; + if (FileExtension == "css") ContentType = "text/css"; + if (FileExtension == "js") ContentType = "text/javascript"; + if (FileExtension == "txt") ContentType = "text/plain"; + if (FileExtension == "rtx") ContentType = "text/richtext"; + if (FileExtension == "xml") ContentType = "text/xml"; + } + + // Send the response: + cHTTPResponse Resp; + Resp.SetContentType(ContentType); + a_Connection.Send(Resp); + a_Connection.Send(Content); + a_Connection.FinishResponse(); } // Delete any request data assigned to the request: @@ -551,4 +638,3 @@ void cWebAdmin::cWebadminRequestData::OnBody(const char * a_Data, size_t a_Size) - diff --git a/src/WebAdmin.h b/src/WebAdmin.h index aefc1d145..a59c69096 100644 --- a/src/WebAdmin.h +++ b/src/WebAdmin.h @@ -116,6 +116,9 @@ public: /** Stops the HTTP server, if it was started. */ void Stop(void); + /** Loads the login template. Returns true if the loading success, false if not. */ + bool LoadLoginTemplate(void); + void AddPlugin(cWebPlugin * a_Plugin); void RemovePlugin(cWebPlugin * a_Plugin); @@ -205,6 +208,9 @@ protected: /** The Lua template script to provide templates: */ cLuaState m_TemplateScript; + /** The template who provide the login side: */ + AString m_LoginTemplate; + /** The HTTP server which provides the underlying HTTP parsing, serialization and events */ cHTTPServer m_HTTPServer; From 8934ab487e92d070301617298b3856cddafab643 Mon Sep 17 00:00:00 2001 From: Howaner Date: Sun, 31 Aug 2014 14:20:42 +0200 Subject: [PATCH 019/226] WebAdmin: Added login template --- MCServer/webadmin/files/mc-logo.png | Bin 0 -> 66137 bytes MCServer/webadmin/login_template.html | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 MCServer/webadmin/files/mc-logo.png create mode 100644 MCServer/webadmin/login_template.html diff --git a/MCServer/webadmin/files/mc-logo.png b/MCServer/webadmin/files/mc-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9a77a490f773a862299c1db7c334a2fb9fa86ddc GIT binary patch literal 66137 zcmV)EK)}C=P)cPZ>|5|d!KX9y)9t@ z61@FtzjN=eYk3Uz3;e%g1K7IUZPyFoJ_pTmSkE_R@mBV;seBaaw z{w2SH&w8Hm_`J#xt{zv9Z=}QXjo}ldD^h*={lEO9k92BNLAN~HH`al2U_k8weKKz04KmWz|7eDi1KKb=Szx3TW$3OcYzxRoM@saQQ z(2sxUU4QX`$IjgMiu>0aD{d(!glGusW4Hb04}S3GfBJoY z>Eidj`n8+P5Z0P2h9l!(R&dp1_y#<#F4#A~!DMBMqEzRz`g@PQ;fAo8gxB5s>hpJc zN&IMMqxni!)?YT8rd#PeqdYGt%L-5@|3n3d)b|S$g}DiWj3$E-_4|FAj3z}opJPMh z>I?*vDVW)i{1_+Uq4B~e#*@ZpJ-_kz|MweD{WcpKpZ~}&{^4+GxQ;3D?I{1_pPj46 zf63whX%FD)arE%SA8))G(HHJ~^ILE7Z@GDE`@P?N_akq3^TqGK`@S=O^WtqAKVtmi z`vX6J&2%)mb~>IlvotUG`|=%Q_=kM%Q9AMR*`b*acg^JR3XS%5XgV4YQ$7VAnK1BS z=zEaotlt+wm=r8fq zS8f8R2%z36|4?`_B}tE>s6jyxF(+dBEehr;BGmmnS0T^rg5S&dI`c!HMxU9_CLeq8 z`N_w_(EF`__X|%y{e?d~T+moZ83Gtw!P?1H4dGAuxXJ+j6b_Y!1tcPly0nzzzK74X z{V03+ZTD{86UN?yNz;F2mgUzm!9@JZ8o5W2A5i3lSsa8E1);~k8zwpm17dzE2{j$JZ>fX+imv`2k)t z)>d-p8N8u9;-SEdxH6yRzdN7jk3aeO!6%>m;^AkXe|B`~(o>^_%i9xkLRT5WpZsyv z1o#s;taHo(Zk#Gy(%M6>zu39uwlgpP*6+FJEswqBmcMexeP{p9H8*$vsuvXB!m9mU z^I5vd#NqSza=sR1FNh7N2Qm*>g<$oa!qBk9Hu72#zj6Sz>U}0oC1$qc`P&I!Fs76V zJS~_2aRbnx`yT&{--|+r>KlAF6b4|58Gm8MoGfGI0Q4?u2si*Pzzm^i^RGAX_#fTa z3g2_%Ev;|6;pX-?-}{=)8&7X1jqX}BV-2N$xIY(-r)D0A58gB+BRAcC>W6*b`?etTUy-NgOi(0Y z9Jcb%Zxo>)7d{g>6O0%8q1OqTrW<#t7q_VuB`l$Rk??ai2PQ0#XS0IlDI_W=D;Fo= zbV@WHHH7ganIV1ZfpfV%1Zfr!zj3KI?c{8(MG~6;Jd@O zy@DmV?{zv2v$fSV+h;e;*)yB8(d$tofg0{HfrGeJYZk)vj8IILvYJ00(|FjYVgHbZ zgCR{OGfJ803-!o}89_Dk0MeeNIUDyWh54K!{yFCBh4{SH2#QK$r^5aQbEA<2)NX~; zX~)!Tu$d4?JoZ4S7N!p2gn}W{0>vfZ{~GI!&ic*kr%pfC?sY!!vX^gv>n(SldE~BF zp1bLhH(m73oa^+T_{@AxIQ!tNv#NGxypRc!$<0el7&oZZO{l>H#r8j|-L$w$PB&(9 zN@p2OMpGIduuVT4Q9d6r@lTkR)5YN|ta89(51C=bEX4yD^ZcEuI0}m_^aGaqVT%boA?87p1O+ny=7hV~~-fK5D<2%RW@ilvUqhL0hF(IT( z5ODJsxzd+)hO_z()Gk}{P@|bJLQ0tU<7P}DOV%J}=HPqk=(qREvrN={)*M*Uv$UVU zxd#HCP@b~T6echi;x?tkt{viQGs;XH%`6$+>f^_Io{mkJM#QfXi{L;AAJX5Q9-NMj zaS$AiInAbX8jmM58c*dlV_Nrvn0z)h0zUDx@qIT&(GUm>p_qC4EE679MvbOF$}{@n z{@(P{Y)U--+n?V3>};Ao@rlPT_m`GQ*d-o?wS=n-;VU?a&J0IX*imhd0K$v z#RfM_OpD6^r+Tgg?<0&C2t#Og5=cfG^jYdN!DoDZNKM)7GD`LO8375hs-Mj%n~sM8 z#U?ckzC)8|J_d!`I~NO>UJz>#dQ5zVPgb)5{!3>}7c({(=H+LN`pfk<)!9XzpE2Rj zCVkcn29)x5*z_0XQIK&oYXyF#;-`E92RP!ZkD1-2Mo$b2s2{BXLBcs5L#rjglQDh@9~^?CIEM^ zY0HIBJ?51eY7vJq&q*V0Hd@=88|{1Ao#>sfc;%V*-}UlSZ++yA*S_kFZ@GTshKs#< zryGu*{Nmw^771TLN&Zz(k~{ufYXHF1=c?8pkr1rPhp%|$=EY`j`~Hoy?Faa?5Aepm zEt{vY!fSKYH4VaY*qmenuP{Nt)Xt;?8K315f6fR2mR_vdj2lP12)AWS;4GCcr0V3TM{w^~ig(~UQ+dAHrUe*OIq zo__4j?>PUx7jJF;H^!U)NI}Ez9FIo#&nC08Y@P*){m<84I2F&ugH=U2n;ka*h z`-imK@6*9>!o)e3IJ%;1eM`AjkUIrJZ$6^IDx`r|Y7G`jBVtt_Rs(|PV`0u4e^&=C6i3ySx<-F4XVz z!crdaTD`m}`AZ=iT(EIW{4uM#y(ZhbEJY8;1D4t&Cg!=s>5X*>ifFS0h$CdxxDkca zX~fiw*kquDrG6lOvMetav_L3h_HXMIG5=r&QMn<^cQv z%?@h@4Q5WT@fFB~L$M4*&I{^U=VcjXU`8^X<;)agof~x*6grba#-h;RH_!JFWysmQ z`tsr4;ECyA_v24}Vds;Vo*ez|3(pOo`qJn7%S7+F`L$Z&pSk1Dlm;M}dKG`V3u<=! zTi$-r+<0;Q>^HyT;;X*v`|kX}gRedRH}8MV*}rlAn$BNpG{Q$&lH4#F&AW5WphE&p zVL>kvI7b>?%KK_s%xIjBdD9Jr_@Qp=hSYz~Q3gmXq*kw)&}O$uTb+c~+CH@t!-U0W zXo&{|pIdQb9c8|a(}RIbS$ZBaLG2C4bT}Hb)SszVp~kF8_EM>Vt?c}y7^TPo{rSaqtX#tkL+aiR4AZ@5B-T zF~<1}awoIPyCSrR5P#q?Q5Vc?=M!NtX_l4dL#0_1D$PC9aZNrak@9mCFL zW|aX;cvtQfs5>KygG-eAzrD9>J`u;!$3FMO&hI_{<^GG0|EH&y^B7=(D9_KoFOURVqYetzJgYm(Q!`Nlin_uY5BoeDgz0mv0_T=65jh zZwTN`cS{a0H3TWl1lCy1Gz(bDCuICK1rcoIme|yV`026|-sgk@Hc-H}bIhM>COv`6 zw)i!HZ4ID}qjFL`Rsb?0IoZZ$<};h;Bmy&M0yGgdf`k&@w2+!kCC>|MJ6qoYm`CKn zA;%=lqYaqwA?=HNQW3s{1S>y)#^*hW1k9Ll#!SI|)+B~ZP^HfyRct^YzKtqc;QRst zGoBPQ9P#(Zx!@48++rByxuDTF8c=2>bp%+g@2qdo=Jshib?z*!pW3AEdRu@_L8uqc zgrJGYp%i7lQ<_glG#VUGe}9(_4-RNB9EtQ-2cZ!ysRA@w2c!qzL`G;}sZIt|^TeIv4_Tpn%_tOp(PsHbic1caqn$x$ypT*L1$)j=N7k^s0w0 zoV(}#Z7+)b{?lJNn7I8{BYml*_>F{8{JLfUwY+#)s5-nB=f#`5(cSl)x$V(6-1vrf zzweG8y!*a0KX&?T>w`>K-!_|N_pmyDiZ_B|&j`uuEk3#8?|DUA38BBZ{PCXjU zd{(awA%d0Vx+?-E{y1#19o}K0Zt?1}q-Ej_nMj+-8msdgEJ1txew*#sn0%}1vK7IS zooF)m`4!Os3FHZYhfP+R^41xT3mQ*yv0vw@#{DJy$6_d9$=>i2d4WRw=UHg- zYcudz>iZP=UTG`4@_#Z%c8WkuNd6fy!5{K~22j`Gn5%q)qS_B9bJ}N>dUr4qQv+s4 zjI=_wr$?jA5`7^|pu!EQZ^O5!Lf=!ofQIiqT03=$PF*-hn`ci`d#%I79$LF07ycAQ zzA%AKkBPJk_%P2?s%gvP!5)qJS7~h)dSwV-R}5e& zYt9n^SR?p{UVA3GaBb(NhaWxl$XnlW;Ro-&xBGYQeEIqhZEPhU;Qjw9CiHE#9b+(H z10Ruf7QsOt1iY*)upo5;UpFZT9qMeB>CZBT(qUyOOVoQL%FbEx&M9F*k@%3nk)+A0 z2fP;N7SFwNQl&Iz3A;b+)0M-0x?-aPQ*ekJwyiIxQ)AUjUdR}t(35cB2HWCWYb{!D zH^m_rO5%@(&YVeM2P)Tr$&v8pZ?{_1>vmWIHu?92wV9yA+ohRm6&5-muV6F{{tWE? zRsz!^u+X=!8hewwDazh{{mZ)Vz4q45J8!#p{oy-a zwYhUGT+hAJUA{=@=%LfL#%8y!fqscgu~heV|h!LxbxBJE+T z@_6GIQpytsC51K?YWiAYAb@=`A+QPC-vYWRz%U@)SjCM(0os_FJ+ErAniR01N0S*H zj;GY;*O&>Y$Lew`R-*Sk=de@Ds{Xhd)+?BSv34_M?PW3&&{4|7pJ9F+mE!Z66@@(E zF>(i54Qll|)a`WzAT);aZZKemF=3+DB0|Dwe81Y1AZR=T?hEY+s4C1Gq7s2iezFl4 zCAFIAV#Mo@Y{v#O!A3JtbXT2e)*=&ie1_Cc0QM?XxHX%PG+=XSoK9K0OUvCOLExg0 z+4V!^PC;Zwe3vIihv{eiy!p}n7m80l`G-4S{M6%5E$1daavX)@H)t#N|EQ;Hl*)*?$ z&o&&Z&mItCOi)Q|q)3LRcazvQxs7c!QO!v>M{%dkJet*eOt6ca7B$Ua z0W?LjegHbb(K%1Y{ERc19}!rEez-6;Oo1fM9AsRWJoQO4$@a($orB6Tg zhtK@>moFWB>C%&*eox|6Skw z;Oo!-)f?_=|K07Intzoi{2k-b{4So;4Lhz}y|c1>M&Wl6v-Oq<6U2_!$&2}nI!qYw zxVuNOfE+7@Fbog?5@^OFR^vtkb!<&Tnlekl1{W>PY6X=?885yKRRyB(K?*?io=r1x zLRGo=c9Yo6C8S(vl1$>E;6{_$NsC`u9p#M>2|rlkg+@bYxE4ZO6W)l2)-l(grc|&- z6E=B+vAyaG`cA1=F$XH~pz=bR=CGo90}l=kX@B>S2CS6AA(<6{ERACB9mCQXyZS_c zF3hRlpNQ9e|8PiyF;sp}V)QPGu@HJQWSxzQLL`y+YBmK{TGz`2*9pHoa*dRzXWv** z;G!n7aMU6(G6avAKWj5yv_?sLgNeUwO(C0}T(iJrk7B$shn_@4t{e>M*%xQ2T%*-ni&EAQ4i6S9C6zSwwbl^6RvLgCppAJ|$0M)5zLg}w z#d}}9eRmWEkM!1(dwCz-Iv&s4cpro`h4(j~=96qz@Z@_ck?_y2)uLnj77|~w=j?(M z_1jhIweV@-@Ka5V1z?BO`NGE7Wuy6lY7aqEKq!bCm%({3T(0|+FD~t@GNtRT^&&|}LQdgb@S$n+k zVb3F0p4DKwcCLJWmVg9a*H3u zEIT}^qfkVpaVAD#H4o1{3n~*uDgeY1QA`4eKa4za?j=n?pw(fBwE~D}|DaF%Y=#W^ zXVfgH1ct6Mh(8pK&B%$dJ89+^FD+;%xpnmfs*Ot7wM4X3vU@h2PcctLIves**jz1Cu z5Idfy%Syn7s;}St?%Sh_w{2Z}^Q~L=U3q5j;qF>=A20fylUdrq`{`UayC)`;Xrhvh zfw82Je7u2Xd7*@F3Esg?OC(!;_{MqbGv35Zu&E;9@=R5Bs;iu3kikli97D${GoeD8 z;0<16Bfic+7=RToE2qhLm9q=5SA_B!afjkYOPqT|u1LnJwW%a1?DecbOnyou-iUKB z2eO3chU^?&Fg@(^AcL;gL3E%c#6Icw)ut{Pk*Rsn3rk3unj**vXmluPb!iM|;NdRK zCX*6jXl!JnWU^xC>oR*Dz%^|qsxA}$j5VqQUek#Xo@0Qk4mS(V>_ONLsm@T19fERY ztjwBZs+W0}hujN27qw4kJ1_z*&v zVbY*RtNUyicR#bgGye2+mOlPlzj5g^{K*#||CKK;n+3iFVdY;9DCsLQ0aiQiN8 zPx3r@nlo$D2a=r9w9?)#uAR`ra(`oOYN(lr6Bn}s$|w75rtdM`4%B()B=#~PXw6EI zfPUB|52i%2Cfb1N!+vgWR-#rTkhpoX$s09{#3`C(7P9NemKg%lcbiP~EoK^xxFPmE@&gjyq>(rg zBe?3Uc2jO{svA`<%%iRfjpb)9U%=uPmJdjOgcGL|77Q~ryHcb)j}M6@DX;%bwJ-4l zSM3mGomc?Or+u0Xc4>6DL&L)Znz0#(jSP2bV3hU9|Axx>#yC-Rxg9lWjhT8UZV9l< zlReYWQ_Rl5jk3O=vYtWM62ccSnLxIUR#IxVZC*wwIEq4Dh$gq#XD^8IFzMt;dyAPI zTf<(`&9dU=q!m5dYDeF7>s@ER1Etem^~iNMJoJW(-uC(K!SDah^M7Pe(nh*H z+G|a=%M$5fCoo)Cz`W6OoQ5}!WXjbgtt0q?Tnv~U7qq#l#PjM&`;?^DJe4#H%KoSP2t76EKjOV4TZ5T*H;2n0Y=3U5cfKq6LBQW7bXrL6JtZ{AJ95)I-p^ z22yY(W+vL~wyC+c$xM2~Faz)aPI4tw_r`R_E((w%SkhSvmXYx@HF-$dzIIciN5f(K&H$ytNdm<&G>{PO5^Q0!H-|!B5L<7 zDm*ysIBb5l-I%%XCdNiiSOT#<>Zh#T&#XG8YWxvNYd5D51Qt9D~Sk>}R8mW604Ge=O6_`XKfpbKmG z&of8Ywp=!S5B5IhHuN(74$Pnlzovri7iQ<2v!zF^D3hBcVT+0H%;q|s-R$w4GXrdf zyw-54>SxO+XSKETVXglJIR;XTu}B3s0@Em$FmPU)MHYUlKA=qZP0Smtv)QK2?M>P| zyUF{zL#-~)UBj1TD!VTX3set$Q500)2j(S*pc&7G;lW^cYg!EMV*dNh*WV_fq<7tZ z-^PP?+`n-;ihX7Xjlql0j3!hKf8kik03Lqb`QF2C*uML%@4D_=9(&XFU%TzD-jCdP zbNh#Q9p4s&=JwHGy0v$C&+G5+7n8wID%r9WFnppogU4#I8TM!9U~fhTdu(IwPifd^ zb!?VtY;0*gr4Wx%f{$ZXZ`&bt*O}lqnTYtc)eZ$ZDw_m2Z>X@Fo7C*}E0dZy@YCtS)zX zleC~R2Y$)4@E$hOCU2xuTkEv3-etmX*gSUYlnRY70&Fh9CK#=J1qTx{@fy7F%_g4> zPwM+Sa~ed7>mp zKr9ZZKc2{EKrVQlu*yB+4L)IpJAs*#XR@Ke3`(tL;r3SSc)pkwU<5I=1FQO~BTvSBPM>1!XsyG<7+IgFjvd-2)&T2;^kg^`L*KK$2sJ(DQ#M1`#6TId!nwlW zr()9-egZg0;TVg4Jkkv}o;2kGiKil(b{n_sSRx*(X8+EHqjjl!A+d9t0|# z0X{x5!^wenINmekX}?JGnb02=Yd*`PJT1;d4gc=A8NB_5mv!HN-L0Ls-SUdw1NXl6 z)af(ly2CI0{@#`27=XO#2g+RnBBbt+V77n!KYG#em-^i;5NKtC6Ri?)xJkueTJkIR^izEq0Lh)@iv+~ z0Z}QL3Wwq>?B+6R^My$2+N8=-`2GK+b;;g+!NVVvM*QAVduTa;~@^EFcVG@87A5-PNbOr-mA`LN!3@db(R z0cqgyJvgE-%}w`RuiRrrp%@8NhXcwJ#Z5Y0X5!6Ih+gv)+(5n3KkaI^Vx4hsTw^d| z=DdHI4%z$#Fo{&VC=arzLL&)rX?>K*9>-0x{@e99D-yroT zmTHm@zv04n?C4L-yJf9$GgimR2 zm1+Wt+cc2Odcv| zZl66b>ZQR~Q%D)QBn{=vP`V4w%uK;9?ubFSJRdzK*mh!5oJ}Py@q$997$15Srs?9H zA-$z*5g^$il}ttaxYoNrn`kb<3~~7RyfhWQB6qe6;aLZ0oqu3&P7$e*Bq&$Rv?v)f z*0{-gtb_asi&9rDL_eb=q8`NQA;@_$HYSr_QqMl&>L&$a0MwXF7TFfoS! z)+hq1C>H!da=F5WjId#0e>GY4>owOzA|8$gEbYgTLkppjYEsqf3n_&M1tFf^+@LdC zYphM=G(Mb&15RT68WLC_0QVTxwUCg4$~%)P&GaS0a!zVXR$jvPd%MYRM>LoMTvH+8 zycH@hIrUUjRH$=vmd#W7eroFjy14!-M_}pyfa8$0kT#nkp@&SojNn7b@=Bteyay!V zSVD#cLRJNE3@%!``pb2N3B*5PMl)juzu9ZkR);q+GiHgQpczR$7vGrxo@yuf70$fF z!>O2j-CjbCBox|o_=&|eF!EjB+Q_hvhs+3ec;ipm6bYsIX!ZHy8A4&rOZ9y~8yq9` znfJ;(cUosPx2SNs0Ab1^Y2`SKS{M1{ers%;5Wp)RZfu zIjg=_`=cjWYn1a`ys)!RS6Hh?0T_J3vv`Rb>sh$B+*-=fqCpF5r0a0nY8f?F2XfYQ zyqy>O|LuSO!C(F{Qk79Q#IgxcoZfCGSvr3&FLV#;2QQ-8xjdpTKRc#_Lqns9dL!b* zv#JqU376ZrDQqT|;;fpVLM5Cot9(t583CkPt{Om=ixWnPRX2wFKI}GRy=}1c-)J|e z1zbF9429Ia&lEE2s(d-GvUB(uwWa3snG}E+k6n4HnTDHeT-TW*ZYHb#cSe$GU}pnx z0|o@ORWi>^MIh4b#?F|cQ2o-R0n-`Jhipe5&|d$5b_N5jnEhOO{ zdl^Vbz<$Rd{#-S^2@r(>jm?C>x9B)(;%y%3P{Yzj{#a6KeVB@V!sR%u?;V_pw@ zLYrqe;<@uA#XQZ7C1NUjHdZ>gsZLS=8=%~6mH?oEwRTgO626y<=3QlSy5%v*!;TL zA{y@VLS3HI@K8fD$h2!T15pn*S}i)=>(JS?4ikP$QcESToJjiDwV9xh*1EJwjC$T9OihBRGkY&1qIRP%=j{SjZq5RFG_h+IuLd!C)lFI@|~Fe5lT97@jssMS^` zQ=i{^es4g}v9yB&QmP`szOh6ic^mxGOit8W_Rs@e=f!CDAXI1*Sch+=j+TzZ5CV(m zP}8{W_X^ce+c6Va(xEQDCO|vdFlQxHeA0$3v4r(__U+${hWY$1^9kTc+QMW_$zGIE zXV&Z+qloL=lb`e4vwpE+L9kRlDr5J&SEgvMF@53eh!a@rE@Wv)ArpMWXJ8syc$N=1 z4FllKi*hg?d=9Ju{PZV2^7MbEni5fGM1pj@@s^%{dOQ5p!`<;Co^LY8BrxD6QaPER zL3D+6?!^s{wznH}$IG_p%ywI{%B0ebC9*P?+}+In2i*CH)!M^xDs}QYe4WsaIkynl za$pPJwHgQS(h1wb;}M!|40w|bl;DYKaqh*#X)AIM5D?<(aZFn%B7w@YmaAxph$?3m z)t&?PE|1-sBPdO0hZ?ohV0&(MSzWZ{!^k~S>`iQ3zR^7JgcK3 zN7n&_kL8B12*M@wH5z1UKC7bk1>c&ma6^oS8SNd+SWEIqLq&@Zd+H1eFc!*%Q&VIa z%w+fS;PwB*5C8JV=olY>`@OjDHJkr>GM>D{n2G`5XmmSLOJ3E_%4VGmrqWsd{B>Qr zc+)yvdmWHwkz5U`H^LX-dYGVTsvHq&k={_L3=T9%zBtT;OM8B`lDT!FWl{--r0Y() zn0_vv(kX9dNzIjBcj{sDteFa6i)I%Yv9SvGcRL%%g$H+qCIihwbDH!9xX)B#S6l4W9_{jdas@!NI0dTzc9G^Qjy5O%jTXY>dk*>DLzb{(W?dHg|z-42qot0 z;tc$d9Kx*h8=&0xbV4b#pV?Sq;Z@~dH5-Ib16QP@Sp0q=)tYDugkZ7ggp^0bJi$)K zoYz1>Re3NY*A7c&VAIHmY$f62R)Fk2Q2>}{06h;a9NPJ(G)+6Ut=E0uEM7xes~g#q zQ(IR;)PCdk#%f4-NuFdKrDzBnI0v%St1SH@lX1>k6z{>I_E(S$BRJUWeu+Xrn{;Zs z#dPW~FaZ8}x4%Dn;P3zSU;Z4u6a#qmYft~w;9&RzJgF4};LAvs6-%szd~w)slQ~U> zQ<2KB4G}@O{>C2NaPtOrH@ZC7kT;apk#mb)(S_r*#x8`BNr?S9p+X;2Tp{{Y+gv+} zJ-VK*M0FuG=TWR;f{+b@u<2)L(D{Gbpt9g<#K_8Nej!u~sr2&*`u~WCozcH+9bI_qR__f^1YZ z4U;Ynr`E17M8oNi=CnJQNd{q361^kbqnlX?&W3F>4Y5)- zln|>rYzwPV9X|)ou9b4%C{>0v=QH5zdA9KCNs2-p`i3xVr_JMLLV(8P%s!{yA9Dqr z3!{)?lo$tMuiK5K1F{2wwL;u7Hhh^4>A{02hSEk7Ew`~Px1bJY{V)EH-?~gS zNwusi%L-qAQ|I3CX!e+Ku6_GyByad(xbOv8FyzH!p{%27IGoe7m-_U%|GYzA{L(Is zn0p}%g4lj21FL7xdDX^3;fTqQ2K@s%*x%D^EoLmKJh?Nk%9|(QM9JJk!bmRQ z4GHPk0-5ey;@>h+AUr^Ck=7YQEo9YtJ~LYUGP9my<0Njik;{Z1sB|nnn!I5;QHy%4 zmcy=WNYf21$CVX|9$Y2_tD{NnKY(Jy-_GU?%55Y31SX=g#9P7qs*sk4jL8@&!(Gt? zkQ*TVb#j$Zjt|!7&rlT?z&uY=fP;`a43nbCo3|ll%c_wcJ)DOdvkd9gZWgrGVJ6mX zF!3~{M^uBt&cAEcSLMTdtYZ5e+MEGIEg7Ue>jrGkvW=(iKI|o>&W#=IABZ8vM2`<>I@o0`Vvo7q zfp)mfHNggUJsMohW)neR>7qF&mwL1{_Kh}GBgq2H3Qe;Wn+<-7KpjA#-D%E?FR)#< z|JqT)#M+j#g`Rbi#;e_UkaY(lZt`cO4xsU@q*K*1WTw$%A_1|3=#l#$OS-IQH-;~j zew%y^TnCy#;rtAkQ@#hr)}E5HwMSu)$fED4)Yk24GpJ;Rez6PfpJiEw(=nzJsk4}e+6V3 zT1LCU#Gm9+fW@OKb5oLrm;eREm}r+DB}Qee2oQ`jv?$BP89B{sCV*8JB{u;Y6`tSD zfe<|zDW0;n)}>RY)@f^NjoR&oI*;r75w#eSSb#{eEwmzG%Rw%<>|U% z#F5F2crX}?BNL5JCun>Mv&1$`L5VdWDdEgS4F@!Wl`9y9|4J9AbS%tZg8dA*aFLZ7 zB~0bR!GL!5uF&qm6&kT1L@2iv#gYcTcof0_^5x7+9&`x6Q73Z0>eOlW-EaNVAOHA= z?AnzKU|AQE_}~MtKlAqf-ss=fJt>%|h*jdG-CEcb#@hMt1FYIBV|32392XObFx#m! z>vaA?mo_(f<1|4?s@@k?2XZl6cV8zpu;C&AQo22X!;YszUbtz6$$yCexqDa#Vv2&M zWZ^jpx2o`p(-;&jCb@wEi9O(Zqd;d@GQ~n=M@3b)-z;5&3VR(-F#_ae(isT(3|X31 zYV|SdX(i=6fs@7!w)K-HZ`MFG6)9CmtMLWZWmPQ{i~uqw3sl@i*sLiINtJ>{<)}Pz z4JC*|P;soGuvCLHaia~VU?kpld~ex_x|~gk1GNcE3K*2z}P-STRb+K#8D zNt4f>XTYp&f{q>|HCEJ$GE)aii7KJg!1_<%i znTFLEgu!LQ{>YzC$N%&neDK%)>v9nGSg8TTEpL;8;`_3!PyR$M39czTGsFU2WRLCh6}<|t?`yK_#Gt(>ETjiMz3=G+IY(hUS$ zluHv26pEZl;)ks?WBeNPvQuO%5-#>wCG`aFkBYx7w(+5&0x@PvoOwON(B-+~yD_!b z)@c3oDcU%5in?2y)atgV-C?QLVhtfy4}$`!3M(Xx&9hLocZP7~v@fB`0c%>r>4bkD zi$p>JQ>_Q!m0frWYm~cO4WKp=?i@(CbDuQ@R*k3HwMcp)iWX?Z?1Bd9N{+cciV{*} zjZZrI^amnUaUet|@p@qX$))C2CY!^_!$F4(x^{#2Ky!myOdLqd1*#G?coB2g5*1qU zNJDH@KL#9Wrsdd&Lv^g7H9#N@L|7QaRq~QE2XeCE)BRdSYPb4^HOj=+msmUsS)WDn#TXlGW(~C-#1oY8U{w&#M6%EyaEA`o`_Ot>E#=I9+F=Ej$fb z3U(TmUDXRwyD@CG!KA9YRy#l-l033-AH`JpRx5zR0#Sq0XB%>EY#}D!lq8QxGRu_9 z>OC+Xf$zcH4whfa%G`A^T40hzO-ct6QAon3NLbu(GDB2Au?;TyXj$8G zWoh691Fi#()HNPA@cw}Jjz%M~t+U)YGFQ2A^*;f;Wa3{V3pP(8FkZ4H*a1(OsY!XEc^WOO^->{))2?t>5eIXLF=#U`A=&za)Mfl}M z$k33+Jzd)4c%0JCi(`83S+=|Jn0R6v=a5^ z?zrlxNV>w(gYc&!@qyq=Ettq77uGSgZ<_^C566rLuP<`?k*SuD&HOt`_zRtca20rU2!&6@6+DS9^2O=DJVi@N(bI*O;OyA*8dVo zUVjL`3hGd@Dh>vzCCGETzg7&y%?m0xRJQh5c)U(LkG8-lLvq01eS9 zkBri30Co@LfGp3@MQMljnfOx{f}Sl+h&rA7d$XT;;xh-oM@t&OG6Rqiw7Nl&wES;n z25`YBg(=U4nwmoq+*lD;R)$xAsThH#YOBp#9w$eenwi^rbKC z@&ZmIehg@1ENOaFs$}qNqw@|r`}D^iZ+1`W4QTy4i+uB9D;n&AooF67;?9NBH&CDh zKoigAIFvJ2l$#hZ(IjfCTH4s)*De4(K*GNhYa;PkB>jwS3vbPhsE}Vy8^8g41U?5R z9G+t|g^lV<`Lw|yQmIjdL>*I@BQLNSY}RuO?=-sdKKJ}(y7bKR^z4^kq=Umlfh9Y} zuyV6osjbdXUmTz)hSB3^Xhn&_mOW1#n60QO6^jDvFUc%?T3mf-a)J_NOzh{+ouTWl zIY;NVPf6-DFaU7_MPa&P!X&M>I5oAha=K8;3)g5ep?5o4^AHY0*xA14keE3&LXDLh z<1!ST&&Ve5u*9A+)0+%-Xg1oFv|V95h%hl@oKDrDoM*1YnSZ2m6Dk{JY+oz7(&h;Q z7l7yxueHx7a|JC%O6ugJqAYbMpHEX=_ep9bvLOO0XdIyrBkMP1K{H+&gN6eEwpz7z zg8IacWRonLp&C|SLa)-N5v)TKnvg1NqQsm3&ZqZ(>V+>)zJw}4br;XF2~buXz3YMQ zzZ)FR-{#e^0I=10BWPBiZerN=@I0cdayHM8gqWa0&usW(;a)@(nj`a}i(=DVrRYYE zT>F5|U(=zRZ{48n3rt{*hIpzcQ_Vb+>#f8F=$({%A&CfGWC#3^>UTInARig4sB`?^ z1V9y@k&rh5<|06uC~q-4ZuxM32CxG>EDlo?L1Q&Hl(3t&BeS5DV}w#!Yy`ay8b~b- zc^p&P**joj?`wmNEH4?uf~RNUQkCfdZ4OOIq%nyX3bB%na2zv}*5`wE+-znb*WKi7 zvh^f;6A3V`gKx3mk6AL=K)mq0qe02u9*vnCKmu53z2 z79`CS4lGvZhqI|9Bgumro8+@{4Eg{L;3AtE@hZfE`871?JQOQH#`BJ4ChADknV9kY z4@N_}a=_|&e?a|7DlvK~oFR_470_Wf4oB3?@n*2?4@WdQ7}0Pr7V|5&VFuMKmY=Ay zmjkP@pphxgCjTt81xf~1ZQJ7yqoF;1emJS{>e~u(S`pin&!F zvo?cKQ$fq0xoaJ_!s@t;d_@lSM`K$9V{zoJ%-m5103X0ew15RkUyx*^BK(X^4Bm_! z5IB%oNup7IU(lAz&zj~{T|-@X$>n+R(o>^<{Ni(yzC&zu}#Ei<890{6DCoR92 z$)R!&PDCu~&NdKzWQ(mv67~$rb*ki)nn{AVE7arT*@r#0KEHbko8k)%B21XUv{<47 z^p!+f_`-e$&cHDHAyMPDdwN2m9;Owc%>|7Ufl%^Y4f_` zB7vQ_>3#O&zjoz;-}%(u5SV~^)!<_pz`d_s|LgmElOH!yWwFu#LO+oTuqQGAckx0; zFwG`fDR)V_Ad0z4Q;AhORd0EN zIG&zary4>!9oEkgjv9|<5=ki4u9bVMrUDkiXa$4cXs$_HvY}-D!Fg7-7F(9grT1TY z1?V)#0rCO5V*BMbHMB~wIbp6XV*@}a5Us2LTwca%A_BCMQfSDu3&f!} z9P~w_b7(q;`L91xJ*oo2_oO0nTTBcfO^cb$Q*isjX&TGVR^#|u>%U800Nh6=#7|{K zZ@mt>3ZXLAs)<3%c@uVNnQrim`=cuY5OU7~?I$vkWX^8(60$v7t^CqrA(vmgEJA64 z0Th-2RJV{##q;@VAO6?RJ@&%0%MssIy=}M(sNJm(9=&o&-UO%V8Fl@_@TCl zuE*r-<)2aQrpLDHX0JmVeD>OHTc%25@-8la)MH%{5)hIRkb-;y=%j@$bI}3vqMq4j zmM>we!x$+*fhL_O1iIM?B||a}G`GS!*eyDZXqjzS5y3)g3wBugZglxt9W?z6ZR&Jk zd-+xKusG*c(MljMC&PVd(><9m;iAciXfBEoIL@i)9KwK1BmBG9Kcp9ScW8(0`~j=R zX|DT6QI5wM8in=dhmvETdo5;W3C*&QudC4&=|Cio5u3eO{8&$JXBZ2PrSn{@X2 z^K|ywbF^`Ki@F=@6t`M}lmvalIhfnB?q(ThErawWe3#}8Celz$hDMm$_iARZc=J;U zL$B0oCF?L=`NWX^(3C^zB9#cZtP?f`D+0;Cp!3=LjE1Ad>yw(>>7um_(4-lU(ocQj z*LMD|Rrfxg0h~*=(k%ZTI1yYV0B-_}5%^yr1E^h47e1^dMM$$P%K(nLdE7=jaxFt; zA(HBErUV%s?u=>Y%Okq{?2v6kI3MAK_SIKFn#cj7M{f0*wXW13*g`4n#OD9=g#kQ5 zU4S;9z#@RS(lnzo3zD>68-ODXc+8tUky2m+F1I1J5Mp2gB4L;oSYok)*nAN>^EP=L z>m53WaiAitRR6Uw;#y(KFrZRZcFascHYA@Ba1rdohDY_~@qNv*OeE8?u$6hp`fOZN zj9fDKrX%&9Poz!vsFZ+ka-rS=nra{}4#}hb6TfCa6yoe1OhmTBw=_|YXmL<-Hn#-B0=wx z0mxo2f*^!g_?6Fm`pSoC1C2FpcTZn$s~`X!NlI}@P00}~A za3YO{hcxP6mOKndeyZUG$_v&cKGbg%TS1Zxl3Rdv$i0Gg_&WRJzEls^+K?+u9{Y+t ziZWf3TN16e8A|)`MuR$=YqZANL8G_E8V@ijA5o4BQCh+P;5fnn+~6CHAlleWKH%l1i}*Y830&5f67P{`{HhLB^L$&vNwe0J zCAvKRubu(m5}NwSli*i*+mqp(cAgv1<>zK}xUY60w1OnjO`~`Y-Do;4uS^t~@b&ur zk)-6JIAj4PP>%nE8u@NOM7BnvwgE?qbLK^(yPH2tIrOgcmYBkx; zZ?n1zh6=qdm8wF=!?I27#9Tr%n53CRYUa|5v4SM8o?l}l0hutZ>F|JU`#v+YDKq*J zYkqy{@QXP`@|r6_<{HhoK}g45{$Vms>B{p5^z4^jq{}a`4G+yDux7^6kysqUsxhI` z5&QtFfL7!+h$Q4_gy_-ZqRp?sn2Zl5709YwGc6S#_$wFyn;8>nI%Dd0P_s5@Qlqs& zNo$=or3RY-Y>;N@&wldpr+W+~JF!N4fvNj}73hfO9Ie_iNEu z*m85E`bv#`8&l2ar5F6jHwv=vt>!>=VO&b#K#N77%gi4!5e&K1yGOcfSUMKfW0OlaVXe?RBW(g| z$IbT{j54u{eP3IFOUh~#mYrw{>!&~=Qe^T?Z4s5aFJmSZiai<{b-Dp4lemH(>cZE? zp=k0koeK^hU4yf%s!xD<$3G;TX~I^fO;6J*C&4w)Xtflg-IVlRm(8ajFBCIDL6y^M zIoq^zIt1o_h*D`&%1^*w)m&J7PpuTq>{cQph*(JEB8(SOXW>{yGg2XX6q&WH*zgan z(#C@!?OnbsK7c0rIIz0k>2+BmCQ9_iNTle1&BZIv@6pclS7_KD2yhB;>qfiUn@0wF zg5cAHwdKER6df4-W;c=Y@4iimmuHzee>{*AQL_S!t z3h2_4`#Z;t`N$nynBexix59H5njhZZ9lgPah_DWO3>&rKfWkvGz%xD_4?Fpz9LlK! zUzM*kJ9=H%yxvO03`wdcQaX=LXdxYL0q4}srv3mV6`jA(rkj}&tZxMxwv#f@Hr;b& zh{+i)S`J!DKqF9jwW?{yRcRJdW#v7^~RdCo!pjgc-x8=HFy`$J`t3w;7PeU)D z=Po@@`@5_;%%)bWvj4DcNt+))kBVydG>*W_l*^M`K-!z?OcQ1wljg*Um{g+D({piT9iH`H903`9@sOT*>VOXRM&d34 z+797HGyBXNbMbV?`+)pz2y)aCQyrl@&^b+l38>XzB@uNbc@h#|=@Y(K)>KIpfxFEl7rK^h&fM8hUwHGfubp7|2#(#Cb+&C7XonVDc9prxu9#?h)s zLP$0=hnP6Zi|r0rlbTFd`ZkU~ijpaUv7+lTP?ul?a0F^3Ah6H{*Hhvsb5mclV)`SW zzYj1DGyWHzeO|(7$QX1Lnw5VP;(Lmd&atMQYFMl14i%`OElN_EpYT|LO^FoZ+--1mIDboMC)wuKCDORul{#2CIlV( z%@b}~b?K>>bvB~@RMu+AZ^nP0{99TUnj#Z>@RxE%UapTS5RSHS0sDZnSn zru#0-$!JRU;mB4GMk(}JYUA3+19jYA%YF$)flCRRY@)^?P=*$IE=(6@7faN*(UlM$ zT9czoFiZkL#*u3%0*$I6*Fb*%k|X^C3j`+YSZInM(GzaIzMw>+Q~Gh12!ARrs`6lpYmv_Z-HL5pgm@0yS2Y9 z949dVvBiw=o^Wa0Z6SfplTd-f~|vgq{ko=_s)(d5r9soORY{*3W);VJf6YKv8xA87HFwB>{#0yCJ722cY<7-{P-bu1U+ zh^*C0@9gX-&j+iF2%K~n1^%EV_9F(lL@Rr*)Zkmke@2Wk&sx64+rs<;nM7c7@os=r?$6J2&9 zCVkk?X!pfAUAYWeOG0L^N3+FpgUiM=Oa9K&ig z(yym^ERM>uRhkz6)4jOlsTOHz!<`T$%{Z1`66ZI2bP70#Ml7Cj?X7q`aH+bey%(%4 zpuJNg<;PmBdKl5&U7zcaRp?dT`oj8&z)+4pIf=>8OqBS<`8qXh-gxrt+B_&b%I*q< ztv5TXG69)+4B2cLS3WD3q$Z7H3z!u})fGzoD(K@dIWji&leDSUHVSRUJ=W-c@8^H! zxBj_&ZUwJ7kpaBo{$z46e|8qRA>wJwJ))>!h56@LAHKp=F9liL3q3CmN4I z>7Co=Su$r-#d;P(cdQ1(6TY^-#;+Zzi-*qvYwx`K(#<#s%QYJu zv_)~NCk)ldbwY7KC2`A^S<}WZdG6Z4Y5X4&KW4!Im@B|f+k6568TeY?-uE);kI0Io zyt;YK>u65TGAQ^frfdeF`xBcT^Vviy62nOx9IM+Jsq2Su=qg7s`YXVvv%Ckao(nlE z>F1-Vrk*>-uel!VGZbIJ{8LmD6v`YBfg3F`0AVsR z|LywU3O3oi@p$&hPk;33e?`X--Ej;+1o!rZRy&{P?`H`f*BGc)%b70{nQ$Q+(ptWf zaLnMHBJ$GrBM#HHvKeS8BSu#(D{I@<6{rEtNl)4PHlcaRLv4}uAQDXrGF!;

Q7ahF0^7HXuEj$1koFDH&eW-CLwrP~Ito}&xVWFo!*=@@P2H%~Q2{kSDVsUS3^4n?#5CJ36J_-XC4PY>n;vKn!HV3@7hT_XWs&)`86%PTk zXNC%})$&c?D**$p{vy~AGZ~G4={G<2>@U#@3;>Sf_@sPrJjr&a8TENbbt})OIpPD* zzb?in7p`O_KkQEe&;zBVB-=_sK*x;jk9HKsR!b=)>j9Vb3OB<4vU`*g)z=c@_<8U0 zKJC1)N1yxMr)lFws9ZGa9L=YCQXbI61zXCR1z-L;3%MYZug<$Z_ zQB+<1a8D*sP!NbTj8T+Z(rns{I<==ya>k3a5hC!YVPdO}f}x@!aiSGytTXQ9d9oFh zSZm>@qL3MKg9q7Q`?wAB(A1ombi6+3l3xVn2xlp98M~+@=-F;QZekbBjF)l&os`g| zH3B>-*orc0C?GPG!nSiMk$znG`J}^Jk}7U5Agd2P3sl7}%7~GD9-g~mY0Eli;EGX~ zy$qbc1BqNxB`BR~hsn((*CKf?q=QCao)%7nL2ef*BMi-`0*?b+MxM;lTDjL{9tj z&kpIu7a}SAxp^w2(`Q5KtpzH%axSgcBKss40)1 ziSh+4!d(g93gMxL$>o#9y%P=Ly=S69msoi38;O>~c5}2G%ZId|%@i;MEJT*Oa4JhF z6rV7fpyPRo6u3~XQXh%cRpD@(jU|$S=!8Z<3~Ne-bT-1AK^tkHAS#<8LA~B1=_N|! zBCE&!!!hkK;g3fn5i&_*O?^4Xc^8k_AgaV$2jDTEfZ!NTSlZ9}(!)_=X+}e+Quu|A z+a||dlbn4(&YGIBR2>ailC$)m4G#tQR@EKAi>tY~bhpAbvZX~Joc<2xJlBX&E@kyi zp@`Y%jvE$^l?=c}kLdS)`^Dk4H?8fcZLMlIUd2{MDI>VzO*ItpXcl?h5n-oQi*w`) z?B4z$+$t06N;Cr7mgzW&U2gy5R>IoX%e<-ZG+s(!BNaWc%9n+(GNJA2aP6JyrCdftMTv+|nuyZ}TwN%<(ZW=@ocN1su) zt1mJBg6D5Gny|L8Sje=xFEhSmO_E)X8(*jGYZ~p5keCq$cj?j#7G%Xj386OIH}b?$ z@_uT@J?b{sS7^Q{{>el96w}#yWX;U)hc8v?EYX0?4SKC%-hJFMRR$>D1|G=(-zD(fR8(skh#gxzzfH z4ya=F9P4P4jWXp0o)5`nQ%bDl5S7_ewBm7N6W>6pni~2KG&b5=X}HPvwUVi|wkFWh z;lZI`>C^el+VCrqvFz&%jb33gU~K6BN4h5h{ud*6z%1v{9lef*wU{t6LxU;8TToy7 z)U~Czy@f@uebbtDt1i4?Z7v-SvxN5I8A7<|5WV`NE05!aSEYA3d?!~o=Kyr@TQ zh{DBkb+VBp6f+}0w-;A>slGsZp_lghFWp-30|>Psb`bbgnC@gUH1yRJ{FM6dOjM|# zlNFJcf?g4Q_{x~h(YrbZ?n(DoBO#w>pLtQv&Tltq`}`)|aMKw&v%N-fBh>ge;@N;& zvpPx+;b$Wo3r??GD+XzG6x9++AVZQa~0oaN|qv3=;_rxXo;^&{Ety4X^=K9lg;Tou!s53W` z&aeU%HC5T`qeHhPu`>0gh$LpBM+Bg~zQ)qMM=^-rD7dD`70$fu$0)3p@c$F{rpuBf z%XyebF14SnyQimTpSxkXfCz{pK~W|_d;tB|KfRb9fhNgJKV&9qp^T(t27?F?3vq$F z%)Qey-F^D3wO8dDa`%YHH6kmkP6LXW>eGEHGcqDF+{4$;hp3B>rV~ceA;8Yn{Q~Cm zC4;F(d0u%V_SG%yLHIX{dWfVlN>as~2})UH_gzM~M^aTaS%nH~qaOf>L$9sth=&I4 z2o*lA>LSwLJyjdAqx-IotrC$?aWMoFc1B<$$HfMQfQ?6^nI zhuMxO#5EFeRT{K}o9hR7kDs6a)fhg1g_6PNLu3j=#w?%_b-5Ew`7pAskJ$C6K2*z* z318zQ6su#UTq8LsPfijeGfV;$m(TJ25vmbxz;wgd`ngU3>yG6x?}H?P5qSB4sx6=n zyMT3)aG0G-*A=x#+v8}cHN-lD5r(NraZDqDE3+DHOUy!muggg@@$HXc3jrD z)GhClM)m1kd#Os7Qc;=dhEt?X-2uVq&CNqk)oLt^3+A_ijq(qF`v2SzAFcs`R$GSz zz%iC|azEgBwvrfl<=ZaZsZ7U|T;JZKiYy|BGF+~2vtMgOSe0y(=?W<-xuXhf@f1^m zxtD@INXjN=Af!<*Tw3j+PAf#HTLIS{D#PhM&f)cUF}!&j!P!}Ws=*LG{d5SIS0OVZ zl@L{m?;LzJ9dr3Ga;*h{4xc3T2}O9o4@m?b)lj79KZPv@#`s3fUG9Z9XN&ph`vm@tR46S;sO&2jA#-KG%uB z9Ed(=kfNBs4|Emewlpn^KaZD4O*}@dk)ElVk16@>i&@*~2o*`d#<=U5x%wt`K*amU z0(si}zVIiuI;vA68y|5omW!n70XR(sz|-RvAC7v2nAE;->1U$-Z>iB)%S{6P7(pY_ ztlhEFjg&h@#S{RCpq|#$)9hd)xh^_M&{bfJF18nV>a%587$gjpgtc6x@c5X*uYa|J z=PyF|^s^y+^w9vOvw;2Q3`9B_arm|8l}Rpz?ZvD&axkhuob7j<1mxqr^dZJT^V)6_ z_DSzHREoXK1u$xx8k@EkP@TT<5GJE@7EQ_HLZ4Jad=Dw~M~2J*gq9NXlix^dm7vZ% zL3^Y$cH%(riMw6tD_gIz#8m8Q&n==Rx!k=>VZOQJxC~CK7iFyj&$AgU_5ENWTM3o@ z-7?rXu>jS0CNaFGWZL3Q8yO zJCq3i?EhWCzx_9l@YjEZr%ycL@ZQLNV8`#|3!rkld;q5o? z;QIR|EanM=kC>t!uJ@=4cqnfLMaG?vpTkGzpTVo=pTSjl1><}SzEsjoUew2_-~W_1 zZyF7e2>$HM=MUi{sxW7xS~%JP_i%BURCNfb(CJ4PXYhlMUm&yG!X{d3V`d%3&Dbz% zO&B__k48x)!kj9-n<`XdlK@OSfr`f6M~T>O2{<%*d#KODMnC}zB&-G3{>u{;OHZH| z!UK~}Uc27aPpe-OO~^CTB7LKfXQ!0l(gk&nKb};QgGw?^%uzrnheW?a#4Bn&s5vN! zL+YTY>aeYAW8}g<_Jm451|4>{&ERK0Tf(n?wS`YUo57ENatU93eGZqG3Y=6S9hLf^ z*=#0Lk|55=s4UEq(U@a&5;N>*~hmWKRhdUPLb2RgqO_xUW;6 z+s)Ju1!M2v_khfHzXXwP57<$f6YyG#qvoFLEZAIwxF}wM>d@&DfQc=6^LkIU93Gj& z<*7`m_F06wPZBvi7+vVJ?JszP`h?$4Nh2dA#_N7%EuFK`SLf-jOIU-)Rg4HtW*Cgw z#b?Ao`=reVIqr;7CqTgZ_;?aB1i3-^ZR>^IeY>`&>5DcRO9hhR3KsBx{BN(}fB2U_ z=bzvHX34}q90sfl8$yhunBlK(-o1z0>l=lCm*s4PCvEQ`UBAK4TgdnGN_eVQ z8yr_t!oDf0aXdpoe=PWw<&1flADG{<5|S*8TONfUVZq zSSi(!~Wz?3782*)Ks)Q?aWg#w4MTt4SF@(ya=(!L1D?-ZDg}4_yO27#w92LjTZO-gU zJBhrzRgPq1ccG-EK%Mq4F9J58akVBB=1qqNm$|pULdHiBqV;eiosj1wi&hZtw+s?% z-osJ*j!Dngb`J$jJ{hSR1=mXzzU>?JTyg-~`ufez2?lD~A^C%ch@9j*%dh#NByz^F zLM_R)RmQE~A2MJV^baVmFrXRxvL1}Yg7oF8w=|nkIq*Z!gK4sKdbG_bz``CxY za)&4WTZp!l@mH2>FMICah|!G0990wbp;T#lkOI!F*dQd+?EL0B;vgVTx$mv*5Vkj; z*&lrz{x+Us|4nn$sx+6*1`7)z}2cBg8k@3#$SH2_$Mv>#^w7U211jq_X2WF8 zgfC#d_h1(XD1oiH%97gO<(=&93HmSqmQfg|fC}5pCaS=TnJ>B87t3|EPN0&f1^nt) zf4BVaAMWB999x#hap38EBb66!+bX06a;#pdKn^K;i+sgd*3fZWwgKrf+!#?UWr%Ca zFjF-Hv`f)xYdCxk8TSq+>VyG`eqOZev782;=p_VAbgaR+bTqP`eOM$PeyfPD(j4Ph7I zrp50lkSk+Xm+bTkG?$?JyUI-UN$h(AK7|R=`h5Bv27KCAxYH5OQ2pAjP@9+F+Nt!` zv)RX-Zq1c=Dq*x;)6DaB8nJoh1`&IUL_c5qu-y90JgYX06DGoYld?vK<4XoXRfgbd zppk)2t49IqpSQRNIIXeE9-W0YxdNoKng95gzD6xOGyf$(}|eD z?Og_U_ZfQ>2n7hl02wx_a$H+JFUD#bS-EGI7Y8MP-D=P7NGl{eD575{D%F;ZveV%O zs$-WL^4ssl`zVfSOcNGHFSLo@jXv)RCi%*8w3S56_qZkn}(do!p+a%t-e7 zWH6tvt6DJ;h8Kk5|NdA1^Y#Bkzm-;eG8yMt(U0B{dQ%4iUeUWg?Yq$XwOtX6y>f&=w>{|H^WYRS(fn zwT0`zb3B{# zF9?~Tpf#7Vt+kT`6BTXm&{kE!^kvu*s5=Wn*n5{$jfHGOJ?TDi_MfIjrSJI9>VVW7SzfIc&2b81e0B~=RJZ^;Cw<`cE0*SoV198vdmx}lWCq2<>=<)) z%)k!wSqIVdd||9=NzSQHjFIhtKi~C@*Rn0Be~@YrqYmkLSw|&aJs8)7gweLi`LE1JY1Q-xJ?C4E-1*YEyS4em`yk z*zQn$%hyWuZ>@E=UB|Y}e9B76Q1kXNxiU2c7?h`Gw@j!~5k4i^tO)*FDo9b^vCb|q zZH3;f)UM(9jLMpc>G^ZKHhk}#Xtm!y7vXqU`0zOqKQaMH$g$zTp#C&prsh@FkVO}1 zJ!JKL~me-?#GP}OZ-H! zu)c5AWG5qQ@(ROPs9Mx&nZb6SI_yngWdLP_V%zXZCFRpFge4I^h?-xl8e&{+o&}?V z_8!^)2BQm@UVZ|T^N*w-4h7Nx>O6%C(76>lsY~kB{N@*P8Athp85sGL&yfjCrz30s zoyaMU;SBs7hJjQC5xNFddrrsLbCL#joTx(CTV;4`*JeB%r(ObSswzSz3B~t6>?UtE zc3XymD-|)2kL)v_?q-Wrv^QaYZ$cRxX#@m!mE;6rKIBvXSjOF}2^DaYpuWA@d+@OK zVYSux{GuvWyVS;RbY%lJL#o$yo5K<6Ros9HUL)Hg3x=P#M*?S zSAq~`Q-(}dp|AxfEcC919%E!&%M59W2HGu^vHq(8EUa#wzD|toH6_)c@PL5yEtV(+hNK!qB7B zsOy}wV9}h6IKv@jZBCg1u#HNVW!2kLb*lhG_=IJ+T<+NSPbJ-^m#^5B*N`+;xc^Kl zaObAzWd!641OH7iv&MkQz(?hLNjpvh4AycZeIDk-uYW*vdDUEr}W|D*2_Iw^&|itqrJ^ae-LJ%DvnngVX?>TK zKW*O$Jr}~WCu~h(0t{>#csjSHk1-8;EL?TnQ&k-&^BEyYNn-)H>o*+HD$W^#v)-%{ z7WcDM9l_#*6Ta?^OJr>s2$k>=wLRKla4QE}6l%4apiD}-#~y+x-g5t|}0 zqwrem!BLA*djF^Y?sX9a)b;**GXNC#uL;l+%6cWjJfPKR&_qPOLM9XyH>K4^BWpiu zzxMP^gca{=0#bMaaH7~-KAfe>1YfR@x)>;w$DJd9t6E~b^9lN1PSH$M=3O{6!7fiA z8L4QYJ_6HU&Xt!?LBLlKpm>hr=Xg+L1s=l)OpmlS1l)OhLwNsE*Q)z_@Jtv4WU|*J zs_HSLqZaR3YxjrVc?a_}k$?Lb#b+uhj?a=py=WplXGWi9%Jyw5wA4!lN_YHWxH@_l z-pJ}DgG!=N{TtJlxh6)bHBt!K8mYNTM=GJHWEd<$F(bcbo8^ly$aQ#IRozKxFPEJ6#4n#ReVpWGeq<;r77>)p#Tmz8RwcmmyR(!o9c)Syn~L*=7|%Sua4e z7?3a%E3g~NK_Pv%jA*%Cjl2;pd=j6vl4vQmTa;Z zx|a-4bh1%pnJi6upKd~RVEv90nX+yPyhlQs{kersE15V^E}#?-t-BwNGCbjl{6G1L z)71*~b)VtChvOkbh|zne5B!+UC9OmT6m( z(4Coz$rs}>Gn1HO?yL8=HytxAX2^A$25@dbVxasFzO_CQ06#e#1j{7%?s0Ft^a{*P z>4e>~NmI-*sqiFjz&J^Ga~jp^P{BqQSyEYQs*ppNcN9u%Ko$ge4sLGf-`<~*IGr|t zLyYFolA9Mx%m%eVLVp#xrx*cM$8qAmwY%vai7ZbEt(y|&f4qwruYjP!$#q06!SA*> z4$1{cE4pg+8MbV7R&`=0oj;r8qS=TStFC)u+8bCQ_-qP!t*aVmg86XH!;j@9rO4YPG>JY&Oq8 zgz5dvDu~=dwB8*A0x|6fBVe{pGjXSaErbjLh3Bp$wYH(bwIn3QtHg!@6D}n)WXuS1 zFxh#{dtBkYCeT7vkR5Olj7%pXIgK{ZEyAm7+?(w1y@y)+3I*vDYl(`$CkJc|e#%p9 zETVw3j!``z06^R<%TEQ2(y>c1Ix4qKzI&O=Mu3lFA3P^f#9hh;6z;(qZr_dD$H zmc`0kYgRk<07p~MLIGztQ%eM~VJ*Dz)6@3a`i2*~eB6>;5@JIy1{l0gmy z_)->~!k$ICuiLd6lAGB#BDoG#Yw&V=95BvxwoLotKXXhcj{A3EVbAilf z$##%-m~NkO>p!Y%ucbpe{jzug`z`ADu?hw6yKagP)jdqc<4ds};MSbUq!z4`022PoJG5@drhqklirYw%M4H@{B(aKcY1CsM6)t9osaO59ZQC zqdX`9Nb@urN1oqQPiV%dXHnaB+StX^3LsN4Mq&h{&&PNudATXVQR%BYUJ>e7tAA6_ z&ya*{PUxvGZs)2TP4S<)QE_F$+&_#+&j1TTyOo z;K5`X!ekb*E0p}zF*~L{RD_^V230DYL6&!!aBz(=q*=%29CLY35#&ZFOG6cT8RKC` z1%r>~`ISCNydPj+!;w%0X`xNO(ToQ}}$Ksm+}D&6dmd@yIjMzbC>Ujiy{Op5Vb!D#Ko0Yi^ul z_xF|Gb+)6}@pv3w%SN`#p(UwKm9N#-<>p!%b%? z^wqx+@rRVeLt(lmfv3{NVa?S2Jg%unDarc{SIv>dX(uZ8_90C>p=dt95DAs)!t>Izy9(KtB#?!zNd8S5Z2Y7Wgq83f~!36yAO9)0+IN_bLAvE69 zu|h>b__(Le19HJ>!iP4Iy5PW@O^NjY8$1Q}*olHKhh7##^o-;YMMl5fHhcV&fA>C7<33CrM@axUm}}HUqxxjrBohjSe>Wg_XQA-bjSHl2 zGix^)50L{-aZyJMLuNbx_RvBzG?y}{OHqeP&!eApN$T*J+)dSX%i^741aVZrY=L%B z9irC0tHbsPP+$_N?0;WEyu-Qf&!yt4Kp2lpT8m>yWlC5aFO?v@>nAY13NX--C4nJ$;Q^R`i zu4gHHvmr_XjJHQt=S&6d*o183(yVJhpj|P_eK_VomJkvY4fgx^M0>tg9fT7289X!K zas(>N>|nhHH`5WiPi9=?-Xm~Slm;mB&-aHPCWO{vhhafUDrJewZ66q?r5kHw&xDq` z;&jhRGZ7NJ0iiIsiCsV^M%8n!)V=0bl)M6iT-r6n;T6_!KaH*MlvDBL}Y5?1xfv~ydwp#dAQj7h@x#YG>= z24Hd>Zmw5z;pcPquU2Da9gAlcPHjWMkXPeyq>5%}u+VZ!2gGj)#i>uy#Arkk!Gzs? zu6cI70G7_pZBjD=U5k&4oj6aKBad1WorR}ng5q)-?|Le#-P@=TGO1)k zA=jQisMs@(W0VSQmLk+bI2(t2(m!r)VHdBpUTQ4QrJaSEb!vK{UB<8CvS7$3zCU`V ziQhJEcMmoR#FXxujAw8$9Kej=*}ZmsOBZA2bC$+k`I;fb1F{)RVTTv2DE36w_b(L} z=~J810DCT$8(6KV=3@gRQRiK>iM@=gm-=v=PA712F?$0?w06Y;poLWA5weVBpWrKWIPj-@fe<6U5Ybg zNTX4BlnQW^4dCzo`f=-f;(dafc!&D!HrnDzu3@01tt*S@1Pc0^KtI;|JuEgmWCW2C z@mOfbS#nb8~}%X4s-@$Aux1;SspSY_INKJia$t2ut6|_a5!bC z>9SyotXx)N%b%lU^~Lim_`%B;@bdDEt>Z?5>l|(myGCIP(UvYEe2xT)LmzFmC z>pM>wH)Mih?RK|;U9?yJ_4b|i4z+&7;tz7YH8KEV1p6pDTBkqdfR@^@U`_aI>}L8~ z5&!M=6YHK%z=t|GX3~mi7&RGB*uiMV%z!Ea^S4AWC>>BN`VU?{hp#_=4$sb~oK|Xd z|9%Qfx6W%sY+64*4Edu7|CqUTNidRQg2eVu(LRfcCMN%jFEA>P2m1v4ofEdv>^PZcgr-dB83_+D#a>XT#Von ziGMg$s#4C3Ppn^myPB)}+~vTk?HD5zfe6T zl)RBeIPioEV^GDIdVY2n+P>u(pxtu0E(Bt^#@biM(8+74=9YqjDs!aA7A9p2SMM=) z0#y+tS#?5?pJGf@PiKQ9gVfXMW%vt|6W8+zh#4uyRCj;eC*auY=z}!b=?}kGV;Q+?|24tGH`c#ng z7JH0<0)v5r&?tO7A{aM79Y0p6RIM`OW`Yg#y6_4{!bMTWJ~Du6S#)(HDd9Mt2m17$ zI2`E(P!kd+8n9u)Q?T6h33Yus*LybLjI|)4V*PUl@f1{)!yj-g0jU?RlgJ%dCpZ`* z&6W3=VembT`!A()OP8*D0XCUYX%(4@gC>9pf-KTW8MTSHnmNQe^ksu%C~}`qHLp?@ z+Kk~8@~;m97{lyrI)=$GL;}j3i6aN)5kmy#JqWGi5Eg6(P#X{53>J8dclr7N>| zN+(uaPy9;~9YGnS6lC>#pxd72S~l@UF?aXbM9hvXhdg9+cSZIMns(xWLU$*mjL9@KG-6!lY-QgHW3^!qgu zew=ERzmGw+&uj#*3Hir~@N=E<=f>yPV{}9zD*Ye0c&j%agBT2WoeL^65M$N8Ks_(h z$Uaqxmuy=D>`P`Itkx-)T;u1M1J1>WOsqjcO%(nevY~Ny=JUSoh$Pexfq4+>D8QZ@ zqc;OE2jZJ=H@BlRFWT?3VV9mk3r>KMcm}YmE?|s0(^;=4@}Fclic+esiZ4fm9Cv@} zrstALxw3St(t#e7QDx01AJZ{yk{Gy%DHp&vae$7N>;47ToeQ{1k$&(gqb*vUCOZ1+ zB7SL927KR90^7w7qD{n1pa>u;Iyt~;9O4`w%tGNOP~i_c`D?dW|Is}Op|4K}SQS+v z|Lg*M%FN62lFIZ@?8i$zL^$Wl(qv1a;-ga(_dQPLYI+xKhh8ZZDhekW6>j`ccz{J;LyYj)4&cB5RY9peSy4pEf35uR9Czic+4Ht(K{g?O6Bd8!3C z@3>Qv^e9#h1aefBEF>%6+4gNiU2J{F5Z083Js4Va?GuTLm`NV7v=WB4exKG9u_de? zaH%q3iikcz-spX6oAKs4po4d!}U%Yq* zlhL3k*WD~7UJj!n-H-}Hm7=K<@c0D;qf6zg)!gsU8Nvof6b-jK2{*U#yY8#o?Fa^- zrZXB2mlOO9{8H!Ze65WMXIdg4?l#am^Wkl)%RHO#NKkPBlr2afC(M(uoI=I0DuzH3 zQz>!_nE>g4#`Plmc~aVa>pwZV&<|la7{OpLQf?`*ou#KX#R!Jsm_NQ>G6M78Q=TL% zKb0*^0y2O2h+KvrzkttQT*8zrZ=hXReT?`Az9%Euc#t7sWpK`fucpN7)@im8ohkrH zqFai%i&Ku-SBjt7A6)j_b#KE~WF&}PBw#io;(vxeOIMsq;&F|&BJAr6Mza}Qeew#1 zvnx&bN}V#M&MtmR-;s^s-CZiayN+P7&fdDOcJ$HzQZ?XT{@s0)Ch0vHI>w<710C|% zcdJ#+0Ha{YpFsEyK3jcuTN6`8EMNt3Xe^{PYq=}uK$Ic9H62n*1cXwAVjKZCoTd)6 zXF`D?#0cnPTstSXVp3*olJ(DFFlMPBpqzsOB;sk0QFJA-?*Lw1opXTDr_V3>#BXP2 zp8hPlcZkbPqW<}W3~B29lzmDqqPrjBJ_smYKZi}46>3XybV-G+=Zs>|QitI$Bz-Qn zKFqfst6@y=m4nI5#YO*8O9#Wr1g>6vjKu#E1}G_JX;xQ?rKtwgmPF}yWXrmHOyKqP z9v+veAcN>=;`b^DTI;Ltg|dQUET!PWgY*wN5ypXcxNLU4w}PbU1RJBiJf=8s;S!Y% z!FIfSudLHoc+I54KmbtqP+c#c5QQk;fIfb3w6nz70+Ir7fEqde3C+ebC8u8xf)O(U z0eMU0Z1-Zmw;MtuDl;hu@WWTnkpZ0H`uZ)xKW@zKMq)k_KGibRu_Q@wOnoha@EGtWq)$f5C1Q|)D zB!xZ9BY6F85APqy1xns-NvKQNyVuL!V4$WQYo*dNhwrN{9pXq7KTp99Y0^;4T`F1Q z-ysqOrw&u?z9aUQY;;C^h#0{@SJUk(RNDC%eOo{bZb*zkr6E7H87@kzL`gg3C2Gc# z_v@uH$kuln^IoP5pdk(9c8_KZ@wDNWTPnawxf?zkHalI0hc$p6Qja@*)~Gbr?+i0P z!V6ITPO$U@&4X6EH3?sk)?to>zmE$zY;%d@QDsjCIzNgc*zWgm`SHgvIX{C!ZQ{!f zqpo*o#D4>dJD+di+t=^m?e&U{;U#>M z6F?QNC}(XB?&e}OH>A@4)XT`@m|0V`-dtHTuiaX&Rw_6rvW*RLd}(p6N-@=*-w)`) z=<^f;O6k0mz>zSddFI~mu7R3X`Hn6n!xS+AVlN-I$gtKG$mj|QN*?5*RPf`i6JIEc zL7aH7iv0o}n^b4yGd- zSg#|ve^_$1Akhs+D3&gn=#Oayj`5?=)w;}u~kMu zapVj=-4!V19AQV}3{H|6eI2x<(SfnIZRDZ2?=cjcS>~!y{g98LG;h^g85|UIV3TXq zZe^|VjEb(EX@VJz29yE|lko^P8#{a#8!>H_eYDiVfUA`7C4ETnXkFhw!U{hG<`T?4 zQZXZS^_-z_ov)tu8|Aocx3F5TkO?H5IAqeyo01H9Ph?(hZT4v3bqOAX@2)p^^6N}N zT?z~=HY8k|JN#A4J%6Yjr2?1%-dyht-pZ@CdcQ9@5>GW(=f0&Fj_Yd2~m5^bkgQu! z{ZbXBz(x!H2erP8#alFEw;kEXtgUr_fi@7BB^Sw=7^x)IlI=hJsOpx$bt2r!I zkE&dD*O(7*03|BtycdY@KYsZPKL6|`TwR{AA+M96J45Iw1|Z~G0uS%5;rf@~z{B-5 zqaKOCQKiV7Lk+b-NyT_#<4OJg<~=+--g7^m=B8vzYIdg#*+y*>tml(KaE{W)_4n`K z;bFy+YF(^v9Gg5IaT^YTb=UgY+OakOp0DS74>*xUb4{CeK;Ae~h2Y98;E>j0@D5X{ zap%~$q$e^wadU9h?Q3@is+L6MS9H3X6knM+D#;$`zDmS&;>7rZB3)Id-^hBL-Lx6} z5T&RQuIm7VH7ERujVk0OD!}T17p->_I`S{Z({r_agyrG^#ptb8`3^kbKxH6W>+xs= zuReYTUwn>)e>Kyw@pc`$+FTKMgjBVkFW}A3e+7@o0O-^$GVu6(u#ZX0sm0%wR4Cwa zgtLIb6Sf4fER@t`Xt2FeyZ9opkKQ-Cz94 zTTXlFg9T{XNug>@HhXu3r6}(4fgfutefdQsuF#(SkB?K@bMz z9JOtXA`nTPS+5q^eyG``? z_>j(hFZha(PleX~$$(p>KHA>EvPRv$lP>b&iRkb!FW+F?ywc2>8 zw9nrKxDf9tVI^i?Y>0X!fl0J1!i@#serc)(mAX1c9biOWh%_s!`_#td=)1EqA^7Yz z%_*zS^EwTq|4_{sgDK5*xmu#G9~J9;ESi#y|B_9Df^I0_>uNUQ1HcZS?e3S?Nei6h z@h7yWk*{+0**;(*0c)M8tF5c6)m@UDHjy%%mitfVMl|=LP!fPqJ&i}{;cf}9fAJO; zw~u^}C(0dS`m2wr#9<^nfz5IycAEt(9(G5E0aH8C!7Y}km(Mr*2t^%VPA4G@CxN!w zH=Zx;i3~)vl-1?2b=6Yk)FPLwikx?Kt};KC?G37!N2arfr8Kqb4!@%=!lrzF#$7-uC?<72|9fTub{Z(WK2*kR zwcO+S?JOc|rH`&*RuhLrN%(ZSaup`g4Nf9mR!Att|A|l4d_4u$0f(hAVa8PqQT;tb z^=5-oW1LPDh^#OlwWpP>qhYHe8vvCS<4QL^td~1@^X)aVwWORU64JQ4B&yo>D+btw06_7+g(ts`DQMrJ+S%BG#G#1ZO z)q`jwoATpNKe<%^%g9p}aZ10=T8#F?G6qAO^qfTJxu=0Tsk-Sfrr~U zp8jjjKOkH|X^It8`_MNDQSK#e=|>vdqYA!NAST8LhtmrJadZ?QwNs3M{8T)BYVgA* z)G?!U-4$-`y&gR2hz`oNtv!oR1czlSlib6&NrNN3o024wSQZO+RI7;TL{KD#QsL6- zkeoR9#(v=7cXS6yN|%!{Oh*GYMjnWAwl<^PR2%Jw0fVrRYV`D!BcsRDdhT{PtX3Ip zw>ebmUQ`Bj+yqQG@n8_b<;6K%;fEp)^W4Hv3d4<sU^M#Wyv&U~28)afeo?wF4z zTabEubhbsi6>R43V83|)Ss)s@!AJ7k-~^WYZnsV0@oodJfAt17>kS(NjVs#4-9+X7 za_CYA3{{>j`EXj@-^INv0$1C~57PxHBUNk$I7NmgWlWruW=I>*6@yG(iHulaJoRWM(zA zmQ(60wdfNc2S{+%_r=3@s%UL^e8 z`c9vGj|F<|)8ho_#2+x4?X#;(F7sAG!*zEqEZUqI&yHgBQCz1}pF+@~@lFi7v3*2P zNU4mmKbyddmoMPiv#TPqwK;L+9c-!qnn_4flTc5e?_v44SHv&Oes7P%Hf#2f*~Uu0 zZy0*G-%Q@&JKkC+c%U8605qkom)YF&MXKi`^>?=GA&US-pFM20JB1e0)xT{o5C^6- zN<7VIK~+d(zunjc3ew%&R7fv~%AH+J$9#&LqNM=+)$ZzJRKW?{e4~&7CZ;1(73Yb~ z9E7}aB&3M~ZdIq;at#)HXJ6aI^5oL9g&l3Ba_RyoT0`jG*fLWdvk9$@*f zgJ_%8c}I_l(WA(qn`x9G+f5A@sCtt=ynXu}CD5pd`NK~t+tCcb49WL{x$hOoK;`$2 z9?94dM+vM5|DOth=={f42x;-BW%Bq!?(f%dkNQ-SG>R#luuF?bE$8Xb!301_DpTAn zq|eWY5qM?wVyy=DZ_-$;J+8__MZR)Q;`xx0jnW|vdNaQQ3bju5uwCBbiGPh7cg`{U zW$7<~(y-Anc5_{$<;biPuCOv-!soaeM^xTH$wzljgufudU;CWDpwt7qovG~H{%cZ? zo`3YbAbhAu3(oAv!T_SA1`5Pk+~2|N_rHPF{6Rs5_u^zca7FkeUFM~fX3OX^`wEQZ zm^@T*0Ae-0uJm|RJH-aTLkPog9*)F)l1I;pZAsZlyNVn7D#>TJPgw6AW&V!uM54r@p!R1gwmr_2{P&6HnA_6xK#TD7rs-(TxXas?q0--n#{ zKuJA1lJrz*UYK%M3~J8ANw87HN_EvX>)G;*5I-_2;UCouL#z;fb=rrLCT)kbVR$jB zCK0}yB%8KegypsFzMFb;^BGo&L;{QA?ce9D|L-}Be4+gDY&ucIU)Bn696H)`5Um8P z-g^*Ea+rNomtOb)WJ9y8EsXTE5qvuYu^HjQ;Eod%ex97<0;F~_19-UIZ!VslJ*WW- z$v#b=V3w<}O_fDxtfhHjF%@;#WL))RJoJ?Xw}W7eo@d-7LdYl)gn}mc zXb!*=QCu!8(p_w zB%czW6O>AJ(F)b64M&Qynk77^7UI%6jmns&T@rwML@M`0ox(vF!gw@;(P)f^P68&$ zsW}DflLWcV1#BLC*xm_3j%P`Lfr$L_nsQ7=jZpO~;z+{XH!19HP{O1VL8cUwWc72i zT*Wu~K6$K~^(3%6Ply%_F~{dK6!ri)+#a%cXAOy-3exG6@Y5R zY~Cy4XQB_vOPVm4(nt%T-~(j-CWD9XGT1J2n2y6%s6F<+glF#tSyt|RvE zSN9u{vC>z4S~LP%i1s*{NWI9){WiA^8~@1Xk1I784Y{UVo>tTf%ZoJXI=yrwk+C~P zhXvb`6!lQ8qI}se5p9GUA;ozNRQ-Bk!*sE=cBfn|i6kANasw!#r!#QlfE}?&WI~mN z>=z-PQbUR^^!t?I>ffq85y9tqRPj)#^Vcn&t5RdRq$$#=dd zFd+;D;YWK4f-NeaQ&`{UeBhHB$spC0qlz9Rg~Ti6W94^8wI?xvG|Ap7K!%Dn zN&plP2&})LUOy(?4Hwa0IeNQR70|pC62OS1R<5CB zm0VW{ZqtN>B3{|Lv-IXBpD;-?C~^~ej9~;Pthaiqq+pSlH)s$j5xzOJLxf{StTw-L zr$)#K63qxk<3XWbIeU}NnODY|>y4dqMIz&ws0!Yl_v@dYsGqbdoi>B{dIt}y4eV1B zC}tJr!L3~AD+H~n3R#YmQmWLJ9`}6}Rgw2HPHn#0!`*5PXW@*Y;j6^1q>H>I0T`)6 zDab)yl&;{8Tp+&xjyChK$@MI0BAW@-E3$Jz}mj9|IkaA|ZuG(knjF)IU@ zdVYS!uGW~v@)!<^C9bjQ@ez>`Q@)w6;hXDwc>Azmx2Y$(%%r8H(floae35g!{c@Et z@gKG~)W_xNGG;4O`F{QW0e*dZ58EhF%&4_&!VV@Y6p@k_gv9rP2Ke`aQP^xAEtXm` zWrV(bbq*i@;JK<3K)AR@RggyY6^;7^N`L9y>$i)9*W&~u(32QIx|Vl%9&TEz)J&1o zi$luVXz0WFG=T9?J-R5+VQUTjpNO9%f{a2x8wgX%0`DltRQYW!2cat-*>qo9biE1j zZ4%_w-qa~{2@gFR>6H6jgr`@;hR~XjcS0-lW_-QjV2W!tMJC#>j$p2%SkBL;@Y$y? z;nPoFu$#6Qq?c_hpluR5ZTWV-fp6a5DZ)>Z-cg;^YYgENJlu2;!#IrDZltcW-EE(< zLZS9xyHDV|n@1%6dzkNb+(%Ft9ozR-1B6UOBSrpgwuzmh`1G+bFD(H~ucq+w>*sL( z5lYGdsvrB*TD`gvO2AOGRp&CNuQqZ_ z#y*@)d~F$TyK$_jFQ7!WJjO+$jKfG1q*<6Frq89Wq=sXb4kJ~^sU&nCgbK4y6eD;_ zt!f5GqEHYa7UHHil1MeFUGpdX9e| zsk@%wS2S+2*5u3EwLeHd3$S;w}e*M)87@ZCIBr%>F zx{N$VP~p!;x+SJb(Wc|kkUc)?K$Rzl0aJUD5l|`@#El-M43H7{gcd`VT~R+|7`M+N z2GNNgZ&8O^BUeA8$SAKUdQimSR9aClO|KAV9Io+Yk=tbKuxdFhjpmi_3EnBmU>F8m z+Bqny1PgnA+Q7*oK*fk;BmxdRE8LszT!ZeW?xW4=<;tk!Kh?6Yhe2Vi1W_$>obLoh z{m)*&AQ*7;nJPhUUBF%sU>g|zHwi~D3&(u=Ga;qNsYON8OHC*JY`6!2tTm#}<*n&_ zCNr@7icxH=QAILG-=2(PKw zRM%y*eSN$%lG)h^rsE;2EEVm8q7_ee0a81O0qAH0@tb$^^!I-7;=1}`iPMjff+u*0 zY+_&_4fDN(MlgpaaE_3|Yj^V;;+=%yOu%65D8ofB!Y}VPYnR6aLXv?k=_U1PCdV#8?0e)5;j>Sk!?Vj7Ga(*-5n))|L3?O{pZm_i9B5BW z0VC+C;94(8$pG{pX2{6Q-~v^GF_mx1ycXB?{KkvW7FNo~*=`b;KkgY#mA?{Tt(i`( z{+?O(Di}eUm6qE+%@}n^pB+%u;$ef>j19nbe`S&?7ELmC{${&TR(`WO9TsX=D=N*P zYB5A6Kq;-Bu37m1XX~O1*H0u%Z=cjrc0+w3U7D1~j5*AI_MGm^J$ zTqI!b*AZM_FOYHXb>G@zBu&jq%VDOC*zwwf)pr4`-{Lz-$|AX~0r-{5R3scmxaZ&a z@N9GrV^l$_UWF=ZQjsN@rgQu;udl*!?I{d^ALx7DH4ex)EsTazI|cY}9%|+!0c=r3 zjQmm>Fe-rU&FVSR#vlxU#eB~j#PixrgfGt>s~|I2qa-n3#vFuFvsoONq3Mre!WFTN zY8hb1G~+X-iaEsf29v2O9B`y~+_XxNYC+>7dxPh>vhn_&TQ|pQy%^)Q8TuhSA78*w z44g?jE@`Ro#q0R^-9CrMbpq>su0c7v(Tr>~8Q_gWf|w^8PM$d=NBat=k%0BP09LO< zNY`F*SScHjtef>|3;Fs(H8S2K1N;RtiW?;MB*l<`F`^9YCawhmS*gyv?ogd z8OUoK@H(q;Z2?XEITp7}Rnxt%7(t?Bd6OJbTWhHZn!nd4H)Z^hG(dnNP6pr*6REB7 zWVnBfV7*D4CxfNe+P{d{I3<*_vZ^n&^~~Dj~42*$G+gyS)^vpkM#N+Jk(Y|IFn zStd{E_^CF>Mq@N!FNCYn89bj{!elUVUkgSBsNSzW1O!7rS9sdbHze+7?1n9k&WFcg z8Xd-i6c4GaGTp`osfGL2JK`Ar4HEzUPOrP>(#!y?0HVqWD3?h1ze0L>jYLoG?4~qq zI@5;-l^ef2pTK|hpZ_lW{_lSI@E`u}4KGoCqR;lp62NRcdce7_qkUE>gJn0mDE(S1 z-6S&*BiMxy(q=}6VnxzUGu0m=v4s+uCe2|sRB3QrsPmYWpr7cp#i2DhzGK3i?t z?1!b2VpK?^85dqxh#b8bI|*)%0WyH`*$e_?2--5&kLX&1R=-e8N&}2qs?_vp1=B?l zHi{43f4Kh~l&2-YcYQfL<5Pb+n6PMHb(ps?Jg><0G&JS?kg_$h&8w)HpLWgQ0Qqz|rezwaH^QiD$6AR(_UhS3g^YOjs z?}+&E9nl$1hoH6{)Sjs4L~$YXK7a4Gzl4ABU;MuK(U%|Ndr42K22^cNmH@U3pL8 zcXBN)Rxvy-BSKZRZsD%ldkoehDeG*CGaps0tF2}=Y4o`~)w zRnxaigDoe?%0Ncx*ipw!TDPh7Nd+vn9#^|H)q|b)loN4$uS&9?Bf-DG6Mr_EXjMg) z_jhoBqEauXczdwhCGhjVy@kK{^Y7pW^>m)Ab$s>Ial@DieQF=2Y+xQ{R8F_`$i}>? zUl}b|GB}H*)L=gF1b-SrEK2}^Mn^KiKI6%d^ZIi#-w}VV#QayEYHBjXNc=BfT)-dy z^Pj?h`g>n<6d+~cVu#f*;FH?P48WXt+kLVbgu$<4DrIqyQ_L8^UV+)-ULj7w7Q% zzx5e>^~oi3cxD79f~xg!s83mxh_FtAZRmr>#lMepj^qj)RmWZR=oGCh;{`?TMcXy( zkP%RMY4hSc_0Q&pS387_dBf=h)q*Jq(d~WcEwxbUE;E9-^4$8lXb3+=VqfiiCj4Dw zu=h?=O*}2ltm7>QzFdya8BVJ?cXhJ6pF!_#Fz}ga|N5Id`161N8ovF_Ek{Zc64fEQ zhxv}f&hc=%zTLvlzInt0VDF6fbh0Cg#~`9-OaR3>xCi=c*6z#K1};{6!T@H3`aB-0 zz6xNE){Oa2BK*-XfIs}{m+)Wzv)_eRFD^MvnfVBXSck!z=AFm3lj8tPFwoDwxz2v) z>lfDw5x4l32k-4EHPz?*bkmx^4qSi&IVri_Mz}yf_~IqJcs7IAZysU3+w?rQKrb?I z9`)p0m*J`{ti2aC9L1SE&gOzf>2m3KM~Y$!2t?-ADP)^9ss}09CD&86@p6{zAKnE;7fxekD^ZK_=BRkSE{&pC3* z-^Gdl=<}Bx{#tvnylM{WAqKF>VSb&#Ze=z{WuTTOtHwr9Ou(;*gzT zJ4hpV+%DiAKf5eeQlG<*uLlLKFZCEas`t3u!O#Eh8i{|$*a@}bDcU~ZR6p=50*?LV z>jnJ$+c_-o@4kkNbDsWYPnf;qQMzu$2~e~7d&=EKx@H9()eqd}1Vn?L?N;01#SwsWmS7r7N>g2NX9=fB%R=AV*`n+s*OLS#Ls#cYUA1@-~N9 z$5p$6hxqxHerQSkOag}mT-@sZ5r`oI{o*R)~Z^RO3Ks%L9yfpT-7g6 z{c|9WL(X`7wtDM)M@KLYVFGTq5fgJ;EOu|8s zlrbnzx5(e-uw0=ehD2Lr`&F*R7a62FC{QOyM!PA zqd$V*{zv~5&dx7U4T!9RZ$&5KSVp4>`~(@mXcUr#UyY;vj-`(Kf86img&NoC{^JkA z0CsV9JH|od;uL}L5^M{lHuhvV;*>^XH;_6Wy*X9ms!_!^JY)m`XP1E}b*Qe!YnPK+ zfMPB(0};d75{1Sl0eEH`(a@6T%sbwYa*0}$FgyxGNf z&#%r_^em;c(0eP}fuK~v_OVQqli6fK*#^a$b!&F}=237U^)}c**e|B{SUw!_95p2|p zIV4l-54lg*^zjrtuK+8DwsxVJ8)5Ekw|kZhPH8MQ$H>KR=5YW15%#-SZKld%^`T|M z`e*}FRa{~O{;{}0Gu^4FivbbAjRq;UJVhWo{q*L=C& znJhprcb0uV+@8t+^lHEZa^eLI19f#tR?pc?1$)#EXaTJVE2;dMu-m8bFkkD%DJ}oB zAWadD{I4ViO^|VX_UZ~geR+YBM4&D12X>=5^-(p;SNNO_0XDhi|m^d;)>s=Y09u3wZu)X8fc*2Cc>fd*rT5$zq?;ubY>3b;6;^u_|U#d#>3- zjaM$Ufw?j9adyiXbKn@y`|CfhDS>23RN0Q);6zTAxuQC4XdFFJ6aS7Aj=* zA!Hmk4A)bBem?adm)pwql6?YklC_HRoYI~M38t3pSKr;GS7+n|@V1{#zqBU9GdkMpy zLY-N!sESOE>WI%(iBv{bkERDf?n2TCXp@i{SNNFw3_{PH`dHx$-{D$KP=XS|S1ztD z;^<&99)m{?APWKoPLdr~S-+@w*Oe81MRf20g_aJ+qAS?WKX1BkXWK*N>GvOnXzyB_S z#cPx_O_2|wt_l25VMfSirYZd+Ya5j&tAM~4G?SKW!FD^GIl^0UjS0-H3Pwtc9p#n$52dK`<5iH}Z-q-k!#+acbKm{t&^niQKVR$5o zfa(%19+oH-P>#VK`j#zsH4;zB)-oKq;mM3>8O0IY&2RDKxrY6It&L@;ZWD@z8=$&1 zMCO))`^CG&Bqip^+=Jb1$ftg~_KTC;oXjm^GPfJefhsjW`jC8w%n+ppt{kOyb8Fd{OA4Kj@GHe1-P*NjeMzT+_)0pkcApFk;@5ex@Kh8i_4g_Xo8>fbTpZ+1)ltXg=d zy|rjszwpbA2oOgjt;5?Y1C>rqMWtQmiazl6;wS|I|0%QaOURdK*sNkOxdQIlJH9e*La+O}jvjPmV~U$`jf`N!E~X+f>_h_}r819(iV@J<9+!`B z^Y|X6t_ADn%@e=Z&0H6i6Z2` z2gw5x|99YJCP>dRXdQe-2ORzU;a4x=Kl_6p;`<2MxZEY}v7`|A%kQrr_yJD^i2Wc& zKx&i8@OC(2G+rK&nS%>r+8AhLgYaz4i2q}62v^|@&ipaoXtVHgXlV76kSc|gDyveu zF zy5kU5A&%!%CK^!Y$YA3ke;_}Sf$&~X`5;vJY4U6aqpK;NxXS(^Q-{6;I>g&ZGJ#+i zx!cz%{2E2}`)_k~09$ssXEO0>gTy_x58&O;a(MT*Nm-r?!1{b8i4sCp071To!S;Iy z;`g{sQu{+etre-4MEuXMW=#0M`;*T(VW?0$J64JwiqCvZl5AD{?g{P548U-!*Y6%4 zC!;}zOh6!q;z3nQf19R$Ra#xy1JDu6BP(>r5rO#gEEuyiU<>V42X0#=q(-j7vkBq* z1>Hwd?PmSclN=UW&%5Zq_61ioC(!}>g0&BAIE|wiC6g6OD7%9vMt9SI8KOIk$37M% zZE=+3DpRL^c04Yj89JS!0+wId|n6q2okDkyZT zdG)^&tbBBj4DogV$r{+W=&Ju}q%T_g$z%+#E`1p8zXy?R;E=dS;yxL+fBIXW!$19l zAHj=f=iCpuA$ycxlgcS52~ak zX}&n3F(b&SAm$zx%MEO_wfOHX643H|!d9fP*}Iz!1GgSpI@|YL8ayF5DG6gd^#_wd z?IvR$bkyQhMzVkaJe98g`Y#jMJ}SZ&70JNbSa?!E9?3j}==~7#wW`uw5Wa)>IcgQJ zdG*mb{Nx9pz}4AM5wF8os)?3^h^{WC@CQHr3V!tU$I9SqQhY%dWI6B(HJ#l2$zS|B z0_LAjd*@FEj?*H)d~r1!oXQi(0JsS<`z>LLibXP^TwOpyi`jNV}2)gtVa*sGX8mKmR}ZE>8B=j-E* zU?53P`+@0kngX`OflKx!oi>&2T-cPIgIf8 zFFtz)U*LUY2TM~G2T=z0AS2wx-2>P3?|b53|F8e{KmISkuK;pDjlbq;pB*JD+N)*w`oRYm8n2kWDoGYqvfP%?vlgC7ojn4((XgYQ0# zU43a>0%s&ql+QnT20!}pB^T_-b5sAqK6(=E>HCjRt@-UAe*z!BxF~+# zJe)Yn@IXWVpG!Qe;+JoTivpoSb7Db7K8k;Or4l1D>3u20u%Z_SNkCF9! zU7JDut~tZ<9oRZiIUN8|BH>|?aGXU}wPCszOgL14>KY4q*dro!uoy~A7iVKe*tvh) z!X{6w>Zq9!XvRwO{p#~)@ci&UjSW1$s*FOA;x+X^mJ&dH zKmZrWozIX7+}^J^AKaB*S#3OlL@3+>d-_Pgxx+y2_oQx3FheF0M#PB z5Z^Fi2YmMN73*tv4@(qZBj_p=QJls!kw`HDhK%#wxq`0KOA(pzO*wq_d~f@e^ZvnS zlS&}2D9FUUEgT*$-H%|K@t*P&aJ`2EfqJM9rbdNRssiA!-)R`aC{TEgg{W_1+QmUw z|I*WW?aS4gRg*zD(uCihOW}QNSbIt5XS_(-m;nb7bf+;9QZ(DCCEjnEI{+ zIwD5$6#W1R`0LMKu>MZJOKsuhqLhe?v_v^ABz+Q?4I2zCuTV*z>R^2Peh$m+o`FD| z+N4yrusBY)_&$va@Fe}8+6Pkss8KLbGi+6OqP928-)W%|k?EqD-KGc*h9L=JpTHo^ zIl9kdOSl^g#l(Q0qa;99|HtJ9=JRzS(%GI-{sTCKJKG61lV+qAjNB57)oj3oEVz$g zENlMigH1CQ)>&DgFrwq}DxatO+3gij>uBIHGbl=|>qg9k@E0e@I47t+1fEx{;lXiN z2-CzyY?0y4=S!6O)|@Ca8jd?}uZ~7&rb$(JZ?0Dyh38k%I}S9H8$x$Na!vRip7dT6ylNolLHB{>l*@Cu30G!yVd z5*Y!^ym|kK2h#ZTZ)R2fN z^Eyv*7@wv#~{07lH$N z(p($5Q6df^2jvRL|?14?`{^j7w2rSRoDdW@OZNxBr#v#%;oj_g$R7H zyuMpLR=Rvr`=AU!O7WiIkaKAmx~Rf>)wXSwsFRYY4cv20im2Wx)QjHkRCzGM5-|6; z2d3^JXy%KHDZp~4v*Rj}R}M8)xyw)mnd3Nj*vGjCqiI!@I6#byMug06L#5Ag!N;Up zn6)@gzppWZ6FtDZaWe_o7UzWjel9(DJ|3Z_W3v(T?2`xt*N6yzv7~h7ls9g-p%;qv z=CFOL1rg9*DRXbfqEuD&DC~BP#>m4U*b_0Gj*CPgenDN-B-HaLv1@&o zGtg+f*T1(h4Jdyn%pY2}Pgc0m$>o>1K*d{Kw0|${Vr<`L^!YfUe07whC^zGPUBKE8 z?;Z~}s|4P@yN3IR2TnO|p*XuF79uF0yMV`s4Se&98+iNu1MB=;!~@(+$#h9NHtjD; z9slH`3(otno%-dCszWyN;ZJe_|L}{K@YSc!dEaFPR$pVNdVS3Igg^1m{_&6D(~qy% zSXi}faQJy>;L9Z&`7)U!AwR(1{^BhYKO0ml4`~5`;PoV}{_>mmutDPYHS`%uSnvP* zXWvl}5IhA5sCe#EJE%4s_!7D2yg4j#y`0UI7*~V`x9(MzS8`jC+hn4FL=4Gra1eKHimqXmgy z0ngV-%m=uG(P~fK1qzEK?PMgfke91=9c}R15-`UQ*0&j_5t~#0VAHx2pZc2|-u`+4 zuYY|HJ7nbK^$``-r0M7>0%vq=09p25y|{p9DDwNl>v19qRrMF=@afA-`0-aSQC%1p z41s}IEO%vW3rP8SfAD)>!SDahmoOO(VZV=cQco#L(g-Nrm)3*&qk0Cv_~sg3zkOiI zqAIa+WKSidkyEl!m3SZ^koiW9N!iF44LJV)+WQVTsp@P0-@SKwpV`?qy9+EVAczG) zV+V;X=5L~jCceZZCjXR|Vw$nVyr-!m_9PlxY*7YTjEX2lLsH28Ys!-m8|OtrV_EHU%Y7 zQd8#ldjX}`!*aY;2vwfxp>BajEdpvzXC%u=uk8R6zP}SD}%Z5q{!vtB8DwlwE#^YO*0%)Y7P4i>TiRFx4m(j$W^` z_}sev;mk%w>ECy%AP~V$Sw}F8R5yTNx)7O%2su8&JxkmVV(2|OwHUHw>#7v#*_cB- z{n8TO((?se1~Hzj1Sqfj4Mr~;Av0KAfir-?aapo zARvgX=$a;Q0LG92;Ke}e{@sbmmm&iK4muX62#r8rm`v5!`_G(!m5x~$Ij7q6VQ^xFK-5(T`AJh_9sL== z6s>C0f@;K(bk-#q4EU+i3KJg{(y))nGzjSo0c^7?E=>Btp%kX=L?4Sa^E06YSb+Up z>le;%2mqa0hiWpFcElp#tfY8WnXmK1(oT&500n$?mmM^7=0CIfoRj)YIzpJ4Ze9ei zJe2tpO%YOG7hu(XToRfGZ{YU)A4nB?sYT#M;6%>*_|rag1(k3h2-3N{p(R-Bs|87g z5zbKf0nub;nvW34E+GJ@%?`?#{sXcvWEPffao`d(OoR#`aGC53gtPH&}j5U z!7n9rVNy-KNh9e_7mgIPgbc7@Vi7olRBF!#YVNP1E?N(R5-+NYsKmf3gMdHckm=;m zIaBf3Ahx8&-n_`oo1asm)m+Cl(^wy)>nw~wC=jq?!QgTdg<{NFbyLO4F1)4%;=Wj1NE& z5v2Wc!wzb)1{e~pB|f~>bu)hx0!+b>m$-av5|ZVqD_oAmkCjfPNGb{W^hyO#1+62B zRG{%^T_if6dWmE>R0mrmjh1|4njK;{(hs+=o zTIz5tw`iXw{M~A%=PK?Gg27IwOk%MhX=;cub6-RgO&ZpUz}yFGAr=W@U4WP?AeAt) zsNB!9aot6PnJ*hWN}UJw04z5`-98XXS9M+VQ0~ zR&W0D&#%1`FgL4h5v!VZx(h(BUgJ4U`HqK|{%>bbYQcf~%(^NXiez&1rr-vJHDIh| zo_+x)i$wygT(|T>OVJ<+F)F>X`Qq)(j8BUG&K@?@TsxiR&HuImH@X0ziV&j45Ui`J z00UhL7Af}mgCyS6O2V-QD!d%VXlP;fS0c7BW#S9Di8ts*m@MNvQeibng^ff(P9~ip zsi9%&J7)}S&jMd;fXnvnLuBphPO^DZFPlxEuti_-61f2(o~@rUYfHVKBwkldJ^z8(2}n36nBVrx&Q!z0tFdCL1g*K7hdkU`Tiy6#AD5$ zN;D>3Po*=ms;kTzC{l*(O+ruvMu}%~`J!W52A#M?0CU}7pVIPGJLZBHUO+7>q@L{K zD$LXbMg%J*(HJ3qzne#(D?bay0L*L+MPel0+)9}_!mn`z2&m%VGI3Id0zu&Rvmug} zsmBV0f1>>0hg?)&WBn*2*o(0 z(8g;QLorNw!qRA7Y9)n&VJbL0hQlaZ#B9up1A=gHy|bpbkp)NXN7~yO@w|`)V&MTR z|Ip;gLzk(;f#st*(6}9`Kz5}dPa7X-pq4iCdqT_Rh zE7CI5le}CzHu&C*}qdLRFhujIYO9TKA*fG@4r`7-{eM!FU z!6i?n)6&O3ba<7uU=qi zFv%RQ%3X;lOj!LWN^1}tFoXmw7Nf4gazB=L7K;$#9!@7+4Dm+8Ef|eZ7g`(Q0)FZi z2xxDck_YS9oXA?Jd6G+~$=0pCY>s=UZsYc`R$R&T;)C#Qo&M9nsmP72lv+zV*^ zF#7to>qG-VOs!sJ_NQ%!EQHb=KE?w~J|Qq?TBQF* zNDmq3BNC>Rm^Dy=nZ-#+L8FC&UR;1+4G1&1cqa@Umi&on1)o1aLeY9$7^BYUY77BK z)nqcTUBej!QaPWDKx|{EWK+?)kt$kE#rMFFZk*mA3Di#{;kr0+J7n9D?IIh1j4QD^ zduYf?P$Bx6<7bm8tqJ3Lbh8$K(1Bcz45f3cBTfbI;Ro-7J@=48!vZjwi3cpyDY+Vr zOHgEdXhoNc-Acuxl2ODLKA>9vwUryNbr;T|h#)iw6O%blP^y7^v6^Fd=KD$t5AVkgip7XT*GlBqPF^YU94KhWKuJ!=1{ z``#4v`?XXiEps7Y@R^|m=ufZ&z$HM9SL(l6SO&1bpgALx$yd!=@IswV#V|{&A$X}! z$_ofH07Bw)I?7(OZWP&<2Ax=t4_alx9g(euOIE>*nPFkf%#Xx`vDnF za;>iyTuiBO03&@G3;ReU8nj#w;&N0~MNgqAUjJMw<2?R5KfmFs+yDA_USW+C>dvV1 zuZDJ~007d#p8=QPf1Z1B+jW0=>|5br!{?_?Y+nb#4~TxUAYnPd^8hXFEE#smw2H;{ z)B=EcgoE^B3))#i$oq&>RjN+y--TERP_+mtLssQjFe4e5rnpjTVmOGbFThHmRlZ&> zB>QyIw@oLhL7t%6X>V3AKGe@Uh&S9o!VQy%ClD28mub6VLSDpR01mT6;c?)MHgeXf zhm&Iun?V9zH%U`p-L@!)5UlUVWAQ*SXjFK{PK6;lV-%$<+DnK~o`NYw01kvl8O*rI zF3D0skWc~)iOrq8WMD9f&r`9=9vQ+wN5K}SzCKunB1>WMNa*cq5>$#97nn;p)U8vuKquMM==QfIu9}_xC?Fo&G}i8ZtSs`=v3 z-@^0ytn|33ToN7-ruV1?k>9st+7-)|zkkxDH{SmW-H!fA+GP>`YG{uM03a?AHSl}x zf8uHBTbEq<=f+se{DWrfcRxfxv$?EfjtvwOOXYcBz=xy!Hj35>XN+uC!y0XPxw=Ki zpdDr)^VJpfH?5>VX@7yJ?|}j*uY)f3e5yE#SOtMA0!YQ`fP}U8w)rWmzj6*r4@2OE zUUODvsjpGQHem6){XXIeg^Al6AcR!FA1Ez^LEDagvQ&U=_mZg%EmT8#5iy5dU*UOS zh@`~o%|lvIQpiM4J!$kuSom3P1Xep{mp$U?b#=oI4f;X*_jjx?e)j z{Q@fyfMiQyyUXG_`~!hL@b}G`AXZl)_LVS#uW5NX(a^A>t!d&Zr+jDLYfZ^rLj>XYr+o@K`7fcVu_8|hPrKYkg^g_F+rdaSskLELCPn&qCIrOh^=td zRCcI+bm1nY@)K4%xg@L-i7{fDesUv70DeTLfL8K4@>>5E&dy8XB)sJX{EBs1Ns225}0jqYx^vyD!{Grp&KUAt0;6 zybEw-jci!B^se34CYQ61B(cF&gebFh@1U-ptI-exk{+eAEy6Y3}{x_Ba11MjbYIEACN0XWvq zl4G~YECOU?MMn5AaJMSnp@=y^X*R4gx{qZ*kX;Wnoaj*J(h#p(-P5O@e%ATF|G|Ar z|Iq_$n^ILxrn`&Ai~taXrNk&fC3)FvE8bnU{GBr8k_a+xsUf&i=np1+nTgSrAi;t7X{!|fvF;2I;uFl3D#uZx=8 z-5%z0@aemDARFe?A_V$cTro1u*Gyur05ZO6nACPtc3HI@WD&Lldd@%+tqi*qoY zJ$YSDTr09{k$yGr2Z26b1qxPz+gX5-E8UddsYYE|aP0L1_nC29caJvz;%o1D1fCEC zy){-FH)fb0Xv_%!Aj}hBra+O`Zu~d7?V+WAY>YK8ICQ@Qo`l$8E}tuk4VX=Tv<6@* zjvI!5vYG9rCaiglNZfP;oVKB%jO|jldTr3j<%PL;xR9*-1Ih)1gyW+Xa0~KD`vkag zp(VaG95YR?hq?t)T2$^;l0G)y<>;%Y@>G#M#2XG1r`N7vrTp5&U!c_9<srw{toWJrE@;T~os{`O2#BDf z-BXZxMgjbMP!O()T3=izvkYM^d3o8m)zf5U?Yf@L=j6I*WK&!7q%$9U;5ATs&=`~JxpU#00>g)QY$JPs6JZPLtO%_3KG^p>8l4% zz#EJbZwMN26jIdSVG;a;Ws*#0@GHwcZW|_peE}V|u|ACH$?|SN%O!*V%6b+&U)%ea z?BWBU$*5Z(Q>_cpXSYiTI@?28TsQND6@>~fh?0*&F$woNPA&Z@af$df8K)|hj=vG5 z%b>;0-+=oBSo^EjZzF5gZ6h9;U%y4Z#LUz}>jOgWzc=?_9H(@fQW8EpG?;DJ)I~Ob z&^zKB3c@oWZeBP9DP0>GjS>EAE{9-KQ`;v$Fr0GCJL~+b|8o0-Phbf=fs&M6Sjzih zX-o?MARZ-E!GC)A>1CO#?zr!oM19+WIs49fBA-{~d_FH>$+XoAqAT1Jh>$=ufn}=# zh{0~Th_X+JIy;J{?Am3z3#ldW3!57vxL^R{YIg*8fnh+405*3UXnOkUVcB4eLZXY23dTS$Dzp)Fe_(ZLR)xP4;upb0% zp%i!1mL4qkt_UT@_lKI=p1vWncHIZ$gRQ+rYS{K3bym+24Ejhk3Y~inR$^@RIM7g4 z<>vbM*7mk3-~7|V|2SjOE%&~MMLp>2kBvZIB^vVrK#+(H&|j55KKR(1FRys-(bxQE^5z>k1rjp)b;yDDP z5D0)zq0lAZcaskb>t#NJ-8VWHPLPTMApnAimEG<<0fZ7*hgpGyv_vTL#|epeB?3*@ zBN?`0at>%=D9?Ut%@(p^&1Q_fI2>}tnT>2;R#?;5KTNfLHzMT%$#Mm$LkeZQ8~)uz z*1g|}efwDGQ|eZk?^9^~Sb$n}qQ65VsERBR@b%HOiALfNz4+$8=binl8*hGP#cGI8 zVNp+h4;1z62#p&70HiV}TZOuTH&?%#{nd?kT|WQd!;d?7*8a~?cR``181zjSmL#9c zCQM6@KSca7ZVkZq7EEHsCxo96DF%#pp6jx{Fq6xR(B{-6Z>S4nvx-%X!f2@4V82+S zkeUkM%!BfI^+nr@Uu3CbLP9hw*HIULGG+XRAOlv-n^SWmEOl^yH&Ctp`pQi>5r<8} zk&2$R6+taTCYK{ysOE+#IuNT-O7Qc`_Tjw)0IR)b-Bz-VS{uTG5M{xodx^dbKw!dZ zJ}USHHm$Ckfoho%1ny@z80ep~-~K;*WA&EPANl)>YZYG9Gaj_QnaWWy#sR@o=4Pex zzb`J|G^K6geY2)c%?zhghjjP$x}8oZs(49uNDjBZXkSHf5Qoc$W}TMLGDq07kbq%} zCma{%5}E-eTSLV*crK3S@iWVE?YLeO`u#9_LH42MMyK`uq9Fi(%i z0D^H33D&s{Ak(5_Q-jK>I!LoSNSZ=W2vrD%nm2`+0BSy8#E?3VN%(wTGL*`b&6I&5 zaOWuUzgbtE+g-d2F`!C!9vsS$UAG1G?TAyA=CuMqY6SBsDkpe;H zhC#gX>*QJ=CPu+HZ!3bqvRJCCX&^=9Y3-AiWwOpMQLX>rJL@*WJxQvzr%QTvjK-w^ z0OHRYA;{idw?6;MTdSTq?y$rD(NteI^MkJKZFx1XI~;DE3II#K1M^jJc(BPuS93$ucEC4fFPVEV;k@&766(_ z4g%xL)Uo$vTqKZ&@{o=(p*8kx5cR%_*G1_*=BkMC7S1y1RX)IlcF{WD{cy!rN zQa%3QSqJ_i7LE+3Gbt7uu$az{o}i)-Pq2=-0x`N+oa}Ae1f;}1&}t0+E1(Sv6IM4Y zM2mem?*gq!!{>wN0`g!!pXrKUF;-@$TtA$$nLwm($2^(@c06NfS{YOwGaJ% zS+*0Hg_dFA>j$7*ShAhUi@tm|o0TUfT3#4R$tV0|(e0PsyX3hfhv-trQc=&2(6|=> zK)j0z127Li{oK%P4=ufT=9C$qIB3Sqms6RvqLnlj8RjIf3Uj!j=Dm(6^k=og9L6_+ zX^(h>l6Ah?r~~A2CpdPBBNUgypWBf+9wAE#3W5UHRCNe`4a|KhvqJdoLJzi6lS!B| zekkc74ppfr49z5}>)dWPsjrWcXf(v2-bLWF!a+oqV3=A7TRR7+07w}=d4+Ht5#5^L z>u=iJgQMYa*e17ZiqFZ9M6Err@Pbt1LxjHqniIyFKf0ZB z2{VyuXQ>UHBF_s#MZg-#tXmD1qB^= z{wQ&IgGSFlB@)Os&{zZ?FriB$+Gv)P`mTgo5s=1$=`n(NDx9h8yuupLi6j6et0uTc z=vD-@W1;nd)dCqOi41#)Co3x5bc?gw91{krP;h+Z=@&=|%2(a-=l*MN`_m7PpL@V5 zGbgsK$ma4g_2VIKpp}D2uv~$|>A`}Y5l4=b!rBC%bz65oS_DPGDxGa5^5EwEbiSV( zYs*>6u-cpNuSlMuYVZq>cMBZ&fOML|Z=i_+34NIBL7B0RFHkca-%n3F8;gC;FG&EoL__B9C{-txTehMBJFX7!O!#Ktg?R5e`kk0A` z;8*$L-~Qo$wr|@y|FBupuZ;x#xfFfL&{$;EJjl#X8GS??A6}(301@ZTu0hh>H^gAg z`Jy!31B+vzsRE;|BYuRmt^gcqNl@X~Oik{VhA1{dl~*B-TqxsF9mJKBiDe;`?S9Pq zfl}N)`mw9OH^`Jm$9tApUA>og)7ez}8xld{=LBEBo0|On^qeAyXL&Bd-4abDu0S1$ zw9X>_x>nvhp%RPdg4O3x$KT$XSku*$JN>NlulwFz4?o?*P*$~F_+IH+^|Go3M^E* zfp#(iV0H{5@hFnchNHkt1V9uLy$vJs6-T#$xruE}G13qVVmfj(L1`BFBO^NdV*SHU zaCv(A2Ki77dr#dUQ=re|bPzvUSRB%;LNA2K-@`W0;}5Pv8gU-&gM0*oiPR-foFvfD zPQoqw5U1DAEP-;XqJYJ(C~Bg<`KBe$uAF!AwSRdSPEG$NF;w31QPi^|v{wrNAkkPP zGbd5L{eegR*4|Jz|J0)ozscoPFwnzs2=#*J%ZW3#um)^n15!cLi@tOKmgu6NJo=|L zk69;1Z#vUx5(z;GDvU*UD7?z9(%NI+i7G^xS)ryjYXCm~Fl;vwRu7L35g+fiaDI-r5mq^Cb= z6y=E1vu$j4=1BmLleOL|7Ol5d*M@^eupmpJF4b`1oMu|c%WNeWsvpO=8qTbmOP_Vj8CKKb=a?kAx29f|~L5I&du{-y^fH#N-r_}l~j1Oc@q4l;!Rp|#pYm@JpIHDJX9*lL_t4cKZcvWnp| z7;P9w#^w$H3a)06EznK>n)d}08Da`;%`t3Ff|$l=*R!}>0LX;g{E&gJT)j%V#Os1ANT^z$Q{oqiT0fsB-cTcHn)WdgOLVaBw6cMl1icCBbg7yu zH^u9=HpCL&yk+sTXPkfeAK#NWSVum;_iKGKeWV0{AidC7B;T<3fz8jn_|jK85)Ee_ zFm>{K8R`%Im&qbgBfaiXRx?N{N3u@rESabTRyK7sClY%KC^=Y+d)7SW-rzO ze7D14xB=D|32FU2RoQN;@%JOm(+(!yV1%gD5)cDGN*@We2qfzE$&qmM;isNoGw&am< zCQ;T}hz;zxr(HTQxcppPT~AlnD`Cx7=48 zH<`+lzWy`@+{E82lIeRmA51E$2L3|g+rvfpeJ;e*_hUW2Zd|*qfP}zlxQQfC>rZBN z5nSt+>;n#+3V}Yi%h4B)Hhu5T2VXdC@!y_XD(p4?d>v(y1^^#%J6Jy3 zQrVU6tKm7K;Q*PCh*S5#&)VAbLO2alWSN{s`iC;Sc3-d9s#|;yOpsNh^>IILFd&4N zB2lf+0-t4RP?P^|{7GlNe5`RIX_`8hxcwot1kAZc!Ox;?ms<78w6>#u)`$I=iH&Uw-XhA3yZa$LeFzww{5$8L3Q~ zI2{fn=2f~sD_CQ->{hF(QneqZ#@s9|R;?WYkY@k_0?Y#%-8Rcmb{$M$!KiZx7D8S< zNQGA<*7)dk7!6NF+cCU9 z5dhSAL=mj6NYF!~P3_pjfy{62LWFYbREqlYd7U!8To(xrPO1<8{MqN8`~DR-+_sTm z8G1u8Z*K~AanrA4AOEiFCm?=@biIB6$!H+r8xP( zwBWCUYoTJ7EC0Oe-SrUsMX#gA`UU#Py8xwR)D2J} z@aoEU)J3=c<(7eAef~b}Qy+osunCaVAW;J#Vgoot#37IDJM)DI2ZNL$RJlQqKqXjf zV^?lf&W?to-5iiqGeeLuAy8Pw zps}difQ>S?yd@QWV0kUI1fb9chEnEL>wfm){R`CQ7zic;UWCp#F`sV4N;`%o>clLk!WBboJuPz$v zPiG-hU_ZzdNDP&L@?I+{U7^5qs$mTzZ3~ISU(6MG@H;dn0p5NVLh{vG0~Vz5ab6Ae zAu@GJGu8ef_IJJVP&4>DRQ;tWV*?}_Fu&s9=(?thDQ$ohS|3n)5S!1%vI16>50Wfn zjecI&<(7unn)bN=^fSKppWpf6#S4377D!RY3oz%Nq?!Pzl6W^5FuDA?s%pM0HeeS44Snek$(|K&z z!MS`@-zg7T(tZ3sFPSu$9jiq(&YldXK*-${SXY(ko7v0Ujq-0>a6q<0+LX< z2<^pS;oF=}2j-_TQ4RV&%BO;0WTpQAtj_3!_cpur(aALYFMXldl}C^af24J(AG z=DGW^Ctf*d=JZd_KX~qUm%qK@r`xu7McghIta$J{t=2pGzlujjjC+XS3*Xw#%xAUu z8n(a!egLHKzyv2kGghoXBshRW)v{Pw=i({DO1%LLxKknZjWFXNh!u~FpX?i&%-0H~ z!!UsvTo};!h@EJAjchI;;_y?g@AY|bVvrFRD8EkhqtdyY+!FGw@7}WE+_M*6`2d`n zL3CkJPfhEOf@%U_2Z;NX*k=6N+pE*`bNN;0p8d>=Z@hl(8>`e{eX%3Xf#j=pwYfE;dsD(21f^7fyIK;~D6rs80f(HRSds z>ex%Orghxc6!o2Z>IIio@CtFjD$;m)XoaCJ z1y}-LMTpt~;2kI^s*gty$yZU>?7fmkMav@tgJ-C4>F-Zb?JrW8g*_OMY4H(c7Pcot z)UEOQ-CP)yHZ`&8LKwIS_Xlm;b&<%{L}TmEo_+Q0JMMn;rabrcp@FBy`8!BEUc_Fb zQUc@{z>?FycIqeR4Gi@yeCNHjheFK^H1tr0va|*el?Tjhy4rJ;sjIbMbsp&l__ERV zBET5{&l=&#V2}vazH!R@Fz8e>MdsiK2!>eHkFelHH%qw~gce{P03xqilD0&YBq|v8 zot7Z`O>aYY2P-ByvQOVo5`%=cU6Pb~dx!O8DlJhfL27TE@aX2wp>r4BeD7*DeTOAq zMs?#gDx+EuaOV-_VGT21xBm5S&#u|9^@OA69{QW0KafeLQV=#M8(n55@VkMTf#Iql zVGZnv%PUNN(7;gTH=(tWcwOArFY>#stDoWAP`wAkH@bTU`Ah+8Miy=g!}HTg|4@o_ z_6{PfdWEZ2Yb|PW%kjx;+R;+z* z@DGb0xoGx`{Xcd1?1NUMGZ`h9&m$nI)xM&@1@hi*F^YN@8n&V#N8yD^73*X;p9-zN zy=#DM{-6gl6l^euWd{U{0dN>{a1*xo4v`)}6VkLwu>nlqWpY_%-|5qz$mCqdeCHQ` z_}wcjR_7%?cdu5|v-7A{2(*()SkIKP!1q^PUAb!A@kbnf-=su~r*EKtcJIJ|)8%jo zRAT(6bVz2Q0EmpJ;c<%bDEk2L#M}>u^4e&~&%r**x5F9+FKav+8cO5XEeQ4zNiy*I zaKdlNvEkMrP62=>UaymE?-|1Fn82{SUX1&tvstAs92)Lun{>&$8+w26>l^ObLU;p@ zzLx@X?n$ay0K15|mO^;)MYrD7{o8vU{K1ro9j6{JW9B>QYz}$~3~QjYAV!ec8mQ3q zze^)IXdS33;_q+S+Q-InOB@2kB1kBN7T^cAG%+-zPRjh6Zto@#LKp-W%-x$f>E-?b z>BLjNd)cKI|L%^gn7~u(-rF@)69BuI%z&hKJiKJd;IKOX&;w@QP#2D>sdR>cj@Uqu z0f7c)v4OJY7lU>M|BJ>ZFyXgs>!rRv%*C+42rvmRQFj1V$*g@^$q{p>Vh@0wbwOCW zfu?Dy9P;~<0e|F|OP*bM{DoKE{ybqtJ$uarp0P?b0k9hgD$~G(g%$ny^Dl0{c9{a*um)T%7P{G)jBm8r5;k@l24_NX zj`+@QAD}#+d^~G<3ps2~2bS}~5LClzFG=wefauEQa5&4+2hIK63(Ma>?pHS~UPd2{ z;$SlcYg&IdQB45sW>V1_VDRME-nF=M(QS*rG5?SwzBHk^WfQa+Lj>F|Qy>W30gs1g z3P_dx0V5F9>O)mtIP4>#kgrfOY>Q;XzJekm=+!@T&J;4EBZ2XOywSW=G7?S9-J^1_ zwYhn9eKc|UF<<`g@87@l`F?mFl=0PkEyBNBsU`sS0BI(8a{5zVc*|Y)G}X1tJ975H z_XNCNgeT{XMYhZ!ih$%QG6j}ouHmO2f51(mu^`p@762b5m4+-Z$V~ew6YI$lbEcAp zx{%T1Z;VCbeGVW8prQ{1Tqx+%8tWQw0aV_vUT_Ug-~q@rQp@Y_5vr8}??GbIjAaSB zjsLLtukYi5@AbSR3(@GNxeo&ucK!y@kB7E}u-hQu{E6d=K< zY+3XNSj-+UmjgjD50n%``mik#BlXcBG~Ofg+gKvlNSRf$@`OZU{d*gG&i}>lufGqk zUtsaq+IIIC)k=ZK2tnYBYjW)qM;$gX5_BzEzh&d+ayh8ocWJzzpzM9Y=qzXu0<8;G zgidF9?Y$M@&=M**W=?G-2ktuwk5kIPuuUqJ#iAckbqGFsV||z;8X_1dgl%Bzj|Jge z#t*vsoa2tnXW=HqFWEc@q%&!2eg z7r%JYr=D8+{Byt9(z&h4<#bwF0|lnlk%?7RLinuetpNd8YTr?W*n^Z;!$GR`o1^rn z53L7K+)nFJX{hycsw&q-qgy@h$oUUF`O=^6dGu+lk_5p})B0nBY64&kk;cI5bm|t! z_dW4qo z7$u3O2nGsO4(?%L@}neCsT88;mKx%Xe_OG-^V}a_y6_#s=k7tg`4-pI;@xf@`HA}dAs!lIsFaJ$pt`_-?nf9%F*UVbw}1qg&Xv|8Kl*rS>N7`uep z6ar<--(H=6b>*t-&N}6!XD2i#7QMb|_}p0G2UUd-G@L;Nz=0zO zfS^Tf0BC*K$L(^+?QJbDIUK=rj{f3>Si=vQg1n{4P@}O%H32ZrNC1-3U)9r&KPC_h z`+xNA`|HoyynSof#bN_R5M(%B3z!@JM`w9_zy%Bjz4-miDG6o)|K(zn${mbR1*N>l_cu>Gt^A|%#%+zSW`2LR;*by9|DLl zkw^pxiv$2Cum%8-6ma+F?l+mt-nZRW0Jyjdz=vFuV?$!4<5B%gO3vYjxFkin` z!#@tGRth{`iE3eBVgTK_>(R$wd1w8WPtHH&@c#<>11T6*Lcib;WENvJ5NeztxG3WC zRaylSKN}3%$meCZ%axtbGV$sw{n`#!oUO-}yDg9OX`5$h5u0Gy$?8(O*w=fooq=%A8#L=q+NNPja zz>~}6v8b@4eafv{w&xZA^UEx+Un}LUQH{nLNyHf2N4{~|$qPw|i0Lr|U4 zTBo)rqB?vgx5V@o`u9_ho2_4U(HZ)}b5GMRJMVP-EIRLV>ZL#VtorMpd`7=x(YM}P zdh5k!7{{l~uj~j2VU223quoP%UWVotCMBEde8Bj5`q69zfVSxT z&#Axs(JA^hKl?)d_RGF^`{z$Os?9j8R54mmqZ-v{tPqyqF+qUZ`s^>9cI;=5J>p+2 z^#Ofi0S^K2{!>`(pw>XK061Nx0zkdw`zPzSFZ$2TS6=Y7FB->UJxVpLU!xk0H*(-~ zPG$}K*SEh`_q{KC=K6gmHsum=KXnU2>SvCdtzCW5f2hCy@nhic-`1HLB5GL)?c)jef!rA8S7IlgHig#s7C`?#|1<`}ieipE*lxri=<& zs75ua(YPUQ4IqQh>gZ7Jxa@)>&;0a)7=Fi4d23p~Mm5^o2?K<@^2g + + MCServer WebAdmin - Login + + + + + +

+ +

MCServer - WebAdmin

+
+ +
+
+ + + From 9a95b006488e2813cf5f7fc73c5bff1b2fb54964 Mon Sep 17 00:00:00 2001 From: Howaner Date: Sun, 31 Aug 2014 14:39:58 +0200 Subject: [PATCH 020/226] WebAdmin: Exported stylesheet in a own file. --- MCServer/webadmin/files/style.css | 326 +++++++++++++++++++++++++++++ MCServer/webadmin/template.lua | 336 +----------------------------- 2 files changed, 329 insertions(+), 333 deletions(-) create mode 100644 MCServer/webadmin/files/style.css diff --git a/MCServer/webadmin/files/style.css b/MCServer/webadmin/files/style.css new file mode 100644 index 000000000..044204084 --- /dev/null +++ b/MCServer/webadmin/files/style.css @@ -0,0 +1,326 @@ +/* reset CSS */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remove textarea resize at Safari */ +textarea { + resize: none; +} + +/* remember to highlight inserts somehow! */ +ins { + text-decoration: none; +} +del { + text-decoration: line-through; +} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} + + +/* + Origional from http://www.perspectived.com/ + Modified by Ben Phelps + Made for FakeTruth - MCServer +*/ + +/* Basic ---------------------------------------- */ + +.clear { clear: both; } + +body { + background: white; + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + color: #646464; + text-align: center; +} + +#wrapper { + text-align: left; + width: 930px; + margin: 0 auto; +} + +/* Logo ---------------------------------------- */ + +h1 { + margin: 15px 0 10px 5px; + width: 180px; + height: 36px; + background: url(data:image/png;base64,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) no-repeat left top; +} + +h1 a { + display: block; + width: 225px; + height: 28px; +} + +h1 span { display: none; } + +a { + color: #646464; +} + +/* Container ---------------------------------------- */ + +#containerHolder { + background: #eee; + padding: 5px; +} + + +#container { + background: #fff url(data:image/gif;base64,R0lGODlhtAABAIAAAN3d3f///yH5BAAAAAAALAAAAAC0AAEAAAIMjI+py+0Po5y0WgYKADs%3D) repeat-y left top; + border: 1px solid #ddd; + width: 918px; + +} + +#connectHolder { + background: #eee; + padding: 5px; + margin-bottom:8px; +} + + +#connect { + border: 1px solid #ddd; + background-color: #fff; + padding:5px; + width: 908px; +} + +.pics { + height: 375px; + width: 600px; +} + +.pics img { + padding: 5px; + border: 1px solid #ddd; + background-color: #eee; + width: 600px; + height: 375px; + margin-left: 15px; +} + +/* Login -------------------------------------- */ + +#loginLogo { + margin: 0 auto; + margin-top:100px; + width: 180px; + height: 36px; + background-image: url(data:image/png;base64,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); +} + +#loginHolder { + background: #eee; + padding: 5px; + width: 310px; + margin: 0 auto; + height: 90px; + margin-top:20px; +} + +#login { + padding:10px; + width: 288px; + height: 68px; + border: 1px solid #ddd; + background:#fff; + text-align: left; +} + + +/* Sidebar ---------------------------------------- */ + +#sidebar { + width: 179px; + float: left; +} + +#sidebar .sideNav { width: 179px; } + +#sidebar .sideNav li { border-bottom: 1px solid #ddd; width: 179px; } + +#sidebar .sideNav li a { + display: block; + color: #646464; + background: #f6f6f6; + text-decoration: none; + height: 29px; + line-height: 29px; + padding: 0 19px; + width: 141px; +} + +#sidebar .sideNav li a:hover { background: #fdfcf6; } + +#sidebar .sideNav li a.active, #sidebar .sideNav li a.active:hover { + background: #f0f7fa; + color: #c66653; +} + +/* Breadcrumb ---------------------------------------- */ + +h2 { + width: 718px; + float: right; + color: #646464; + font-size: 16px; + line-height: 16px; + font-weight: bold; + margin: 20px 0 0 0; + padding: 0 0 10px 0; + border-bottom: 1px solid #ddd; +} + +h2 a { + color: #646464; + text-decoration: none; +} + +h2 a.active { color: #c66653; } + +h2 a:hover { text-decoration: underline; } + +/* Content ---------------------------------------- */ + +#main { + width: 700px; + float: right; + padding: 0 19px 0 0; +} + +#main p { + + padding: 10px; + +} + +h3 { + font-size: 14px; + line-height: 14px; + font-weight: bold; + color: #5494af; + padding: 0 0 0 10px; + margin: 20px 0 10px; +} + +h4 { + padding: 0 0 0 10px; + margin: 20px 0 10px; +} + +#main ul { + padding: 0 0 0 10px; + list-style-type: circle; + list-style-position: inside; +} + +#main table { + border-top: 1px solid #ddd; + width: 700px; +} + +#main table tr th { + text-align: left; + background: #f6f6f6; + padding: 0px 20px; + height: 20px; + line-height: 20px; + border-bottom: 1px solid #ddd; +} + +#main table tr td { + background: #f6f6f6; + padding: 0px 20px; + height: 29px; + line-height: 29px; + border-bottom: 1px solid #ddd; +} + +#main table tr.odd td { + background: #fbfbfb; +} + +#main table tr:hover td { background: #fdfcf6; } + +#main table .action { + text-align: right; + padding: 0 20px 0 10px; +} + +#main table tr .action a { margin: 0 0 0 10px; text-decoration: none; color: #9b9b9b; } +#main table tr:hover .action .edit { color: #c5a059; } +#main table tr:hover .action .delete { color: #a02b2b; } +#main table tr:hover .action .view { color: #55a34a; } + +#main table tr:hover .action a:hover { text-decoration: underline; } + +fieldset { + border: 1px solid #ddd; + padding: 19px; + margin: 0 0 20px 0; + background: #fbfbfb; +} + +form p { margin: 0 0 14px 0; float: left; width: 100%; } + +label { + display: block; + width: 100%; + margin: 0 0 7px 0; + line-height: 12px; +} + +/* Footer ---------------------------------------- */ + +#footer { + margin: 10px 0 30px 0; + font-size: 11px; + line-height: 11px; + color: #9B9B9B; + padding: 0 0 0 5px; +} + +#footer a { color: #9B9B9B; } + +#footer a:hover { text-decoration: none; } diff --git a/MCServer/webadmin/template.lua b/MCServer/webadmin/template.lua index a066d8b33..5d5ac7b20 100644 --- a/MCServer/webadmin/template.lua +++ b/MCServer/webadmin/template.lua @@ -57,7 +57,7 @@ end function ShowPage(WebAdmin, TemplateRequest) SiteContent = {} local BaseURL = WebAdmin:GetBaseURL(TemplateRequest.Request.Path) - local Title = "MCServer" + local Title = "MCServer WebAdmin" local MemoryUsageKiB = cRoot:GetPhysicalRAMUsage() local NumChunks = cRoot:Get():GetTotalChunkCount() local PluginPage = WebAdmin:GetPage(TemplateRequest.Request) @@ -76,337 +76,7 @@ function ShowPage(WebAdmin, TemplateRequest) ]] .. Title .. [[ - - - + @@ -464,4 +134,4 @@ function ShowPage(WebAdmin, TemplateRequest) ]]) return table.concat(SiteContent) -end \ No newline at end of file +end From fca986ec7139100939c3290a5f211d868320510f Mon Sep 17 00:00:00 2001 From: Howaner Date: Sun, 31 Aug 2014 14:51:07 +0200 Subject: [PATCH 021/226] WebAdmin: Exported favicon. --- MCServer/webadmin/files/favicon.ico | Bin 0 -> 32038 bytes MCServer/webadmin/template.lua | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 MCServer/webadmin/files/favicon.ico diff --git a/MCServer/webadmin/files/favicon.ico b/MCServer/webadmin/files/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ea4bde926a8cc6c0111e712b28a8d4cf92f01372 GIT binary patch literal 32038 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 A_y7O^ literal 0 HcmV?d00001 diff --git a/MCServer/webadmin/template.lua b/MCServer/webadmin/template.lua index 5d5ac7b20..a7480f83e 100644 --- a/MCServer/webadmin/template.lua +++ b/MCServer/webadmin/template.lua @@ -74,7 +74,7 @@ function ShowPage(WebAdmin, TemplateRequest) - + ]] .. Title .. [[ @@ -91,16 +91,16 @@ function ShowPage(WebAdmin, TemplateRequest)
    ]]) - + local AllPlugins = WebAdmin:GetPlugins() for key,value in pairs(AllPlugins) do local PluginWebTitle = value:GetWebTitle() local TabNames = value:GetTabNames() if (GetTableSize(TabNames) > 0) then - Output("
  • "..PluginWebTitle.."
  • "); + Output("
  • "..PluginWebTitle.."
  • \n"); for webname,prettyname in pairs(TabNames) do - Output("
  • " .. prettyname .. "
  • ") + Output("
  • " .. prettyname .. "
  • \n") end end end From ceb1a464497ad8babf079278b1b6eca446eaf141 Mon Sep 17 00:00:00 2001 From: Howaner Date: Sun, 31 Aug 2014 14:52:44 +0200 Subject: [PATCH 022/226] WebAdmin: Added favicon to the login template. --- MCServer/webadmin/login_template.html | 1 + 1 file changed, 1 insertion(+) diff --git a/MCServer/webadmin/login_template.html b/MCServer/webadmin/login_template.html index dd456607c..913a85db0 100644 --- a/MCServer/webadmin/login_template.html +++ b/MCServer/webadmin/login_template.html @@ -2,6 +2,7 @@ MCServer WebAdmin - Login +