From 0c2b307eab67b7f37d82a7862a6acbcd96b45adb Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Mon, 20 Jan 2014 18:22:08 +0100 Subject: [PATCH 001/188] first changes for enchanting (not finished) - added enchanting table block handler and added it to the blockhandler - added enchanting window - drop item in the slot 0 when the player close the window - added enchanting packet (1.7 only) - some more... --- src/Blocks/BlockEnchantmentTable.h | 37 +++++++++++++ src/Blocks/BlockHandler.cpp | 2 + src/Protocol/Protocol17x.cpp | 17 ++++++ src/Protocol/Protocol17x.h | 1 + src/UI/SlotArea.cpp | 86 ++++++++++++++++++++++++++++++ src/UI/SlotArea.h | 28 ++++++++++ src/UI/Window.cpp | 15 ++++++ src/UI/Window.h | 12 +++++ 8 files changed, 198 insertions(+) create mode 100644 src/Blocks/BlockEnchantmentTable.h diff --git a/src/Blocks/BlockEnchantmentTable.h b/src/Blocks/BlockEnchantmentTable.h new file mode 100644 index 000000000..e8a87179b --- /dev/null +++ b/src/Blocks/BlockEnchantmentTable.h @@ -0,0 +1,37 @@ + +#pragma once + +#include "BlockHandler.h" +#include "../UI/Window.h" +#include "../Entities/Player.h" + + + + + +class cBlockEnchantmentTableHandler : + public cBlockHandler +{ +public: + cBlockEnchantmentTableHandler(BLOCKTYPE a_BlockType) + : cBlockHandler(a_BlockType) + { + } + + + virtual void OnUse(cWorld * a_World, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) override + { + cWindow * Window = new cEnchantingWindow(a_BlockX, a_BlockY, a_BlockZ); + a_Player->OpenWindow(Window); + } + + + virtual bool IsUseable(void) override + { + return true; + } +}; + + + + diff --git a/src/Blocks/BlockHandler.cpp b/src/Blocks/BlockHandler.cpp index b9c0887ce..8d09b5559 100644 --- a/src/Blocks/BlockHandler.cpp +++ b/src/Blocks/BlockHandler.cpp @@ -21,6 +21,7 @@ #include "BlockDirt.h" #include "BlockDoor.h" #include "BlockDropSpenser.h" +#include "BlockEnchantmentTable.h" #include "BlockEnderchest.h" #include "BlockEntity.h" #include "BlockFarmland.h" @@ -132,6 +133,7 @@ cBlockHandler * cBlockHandler::CreateBlockHandler(BLOCKTYPE a_BlockType) case E_BLOCK_DOUBLE_WOODEN_SLAB: return new cBlockDoubleSlabHandler (a_BlockType); case E_BLOCK_DROPPER: return new cBlockDropSpenserHandler (a_BlockType); case E_BLOCK_EMERALD_ORE: return new cBlockOreHandler (a_BlockType); + case E_BLOCK_ENCHANTMENT_TABLE: return new cBlockEnchantmentTableHandler(a_BlockType); case E_BLOCK_ENDER_CHEST: return new cBlockEnderchestHandler (a_BlockType); case E_BLOCK_FARMLAND: return new cBlockFarmlandHandler ( ); case E_BLOCK_FENCE_GATE: return new cBlockFenceGateHandler (a_BlockType); diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index e5a380f8a..d120d8d91 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -1143,6 +1143,7 @@ bool cProtocol172::HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType) case 0x0e: HandlePacketWindowClick (a_ByteBuffer); return true; case 0x0f: // Confirm transaction - not used in MCS case 0x10: HandlePacketCreativeInventoryAction(a_ByteBuffer); return true; + case 0x11: HandlePacketEnchanting (a_ByteBuffer); return true; case 0x12: HandlePacketUpdateSign (a_ByteBuffer); return true; case 0x13: HandlePacketPlayerAbilities (a_ByteBuffer); return true; case 0x14: HandlePacketTabComplete (a_ByteBuffer); return true; @@ -1545,6 +1546,22 @@ void cProtocol172::HandlePacketUseEntity(cByteBuffer & a_ByteBuffer) +void cProtocol172::HandlePacketEnchanting(cByteBuffer & a_ByteBuffer) +{ + HANDLE_READ(a_ByteBuffer, ReadByte, Byte, WindowID); + HANDLE_READ(a_ByteBuffer, ReadByte, Byte, Enchantment); + + //TODO: EnchantItem (getWindow, getItem, Enchant) + + + + LOG("Enchantment Paket empfangen!"); +} + + + + + void cProtocol172::HandlePacketWindowClick(cByteBuffer & a_ByteBuffer) { HANDLE_READ(a_ByteBuffer, ReadChar, char, WindowID); diff --git a/src/Protocol/Protocol17x.h b/src/Protocol/Protocol17x.h index 3ae774c18..04d65910c 100644 --- a/src/Protocol/Protocol17x.h +++ b/src/Protocol/Protocol17x.h @@ -258,6 +258,7 @@ protected: void HandlePacketTabComplete (cByteBuffer & a_ByteBuffer); void HandlePacketUpdateSign (cByteBuffer & a_ByteBuffer); void HandlePacketUseEntity (cByteBuffer & a_ByteBuffer); + void HandlePacketEnchanting (cByteBuffer & a_ByteBuffer); void HandlePacketWindowClick (cByteBuffer & a_ByteBuffer); void HandlePacketWindowClose (cByteBuffer & a_ByteBuffer); diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index bfcad3d92..ae6bfccb5 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -562,6 +562,92 @@ cCraftingRecipe & cSlotAreaCrafting::GetRecipeForPlayer(cPlayer & a_Player) +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// cSlotAreaEnchanting: + +cSlotAreaEnchanting::cSlotAreaEnchanting(int a_NumSlots, cWindow & a_ParentWindow) : +cSlotAreaTemporary(a_NumSlots, a_ParentWindow) +{ +} + + + + + +void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) +{ + LOG("Clicked"); + // Check if Slot is in the Enchantment Table + if (a_SlotNum == 0) + { + if ((a_ClickAction == caShiftLeftClick) || (a_ClickAction == caShiftRightClick)) + { + ShiftClickedResult(a_Player); + } + else + { + ClickedResult(a_Player); + } + return; + } + super::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem); +} + + + + + +void cSlotAreaEnchanting::OnPlayerRemoved(cPlayer & a_Player) +{ + // Toss the item in the enchanting slot + TossItems(a_Player, 0, 0); + // Player not found - that is acceptable +} + + + + + +void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) +{ + LOG("Click!"); + + if (a_Player.GetDraggingItem().IsEmpty()) + { + LOG("EMPTY"); + this->m_ParentWindow.SetProperty(0, NULL); + this->m_ParentWindow.SetProperty(1, NULL); + this->m_ParentWindow.SetProperty(2, NULL); + } + else if (a_Player.GetDraggingItem().IsEnchantable) + { + LOG("Enchantable"); + this->m_ParentWindow.SetProperty(0, 30); + this->m_ParentWindow.SetProperty(1, 20); + this->m_ParentWindow.SetProperty(2, 10); + } + else + { + LOG("Not Enchantable"); + this->m_ParentWindow.SetProperty(0, NULL); + this->m_ParentWindow.SetProperty(1, NULL); + this->m_ParentWindow.SetProperty(2, NULL); + } +} + + + + + +void cSlotAreaEnchanting::ShiftClickedResult(cPlayer & a_Player) +{ + LOG("Shift Click!"); +} + + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cSlotAreaEnderChest: diff --git a/src/UI/SlotArea.h b/src/UI/SlotArea.h index d31c87e0c..bd5c66c77 100644 --- a/src/UI/SlotArea.h +++ b/src/UI/SlotArea.h @@ -252,6 +252,34 @@ protected: +class cSlotAreaEnchanting : + public cSlotAreaTemporary +{ + typedef cSlotAreaTemporary super; + +public: + /// a_GridSize is allowed to be only 2 or 3 + cSlotAreaEnchanting(int a_NumSlots, cWindow & a_ParentWindow); + + // cSlotAreaTemporary overrides: + virtual void Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override; + virtual void OnPlayerRemoved(cPlayer & a_Player) override; + + // Distributing items into this area is completely disabled + virtual void DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots) override {} + +protected: + /// Handles a click in the result slot. Crafts using the current recipe, if possible + void ClickedResult(cPlayer & a_Player); + + /// Handles a shift-click in the result slot. Crafts using the current recipe until it changes or no more space for result. + void ShiftClickedResult(cPlayer & a_Player); +}; + + + + + class cSlotAreaChest : public cSlotArea { diff --git a/src/UI/Window.cpp b/src/UI/Window.cpp index 3ffeff7a0..fcfe6faf3 100644 --- a/src/UI/Window.cpp +++ b/src/UI/Window.cpp @@ -781,6 +781,21 @@ cCraftingWindow::cCraftingWindow(int a_BlockX, int a_BlockY, int a_BlockZ) : +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// cEnchantingWindow: + +cEnchantingWindow::cEnchantingWindow(int a_BlockX, int a_BlockY, int a_BlockZ) : +cWindow(wtEnchantment, "Enchantment Table") +{ + m_SlotAreas.push_back(new cSlotAreaEnchanting(1, *this)); + m_SlotAreas.push_back(new cSlotAreaInventory(*this)); + m_SlotAreas.push_back(new cSlotAreaHotBar(*this)); +} + + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cChestWindow: diff --git a/src/UI/Window.h b/src/UI/Window.h index 030182888..cdaec5aaa 100644 --- a/src/UI/Window.h +++ b/src/UI/Window.h @@ -231,6 +231,18 @@ public: +class cEnchantingWindow : + public cWindow +{ + typedef cWindow super; +public: + cEnchantingWindow(int a_BlockX, int a_BlockY, int a_BlockZ); +}; + + + + + class cFurnaceWindow : public cWindow { From bfac00f2807a6740e876adebd689cc3ae6e075ed Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Fri, 24 Jan 2014 20:01:21 +0100 Subject: [PATCH 002/188] Some updates for enchanting --- src/Entities/Player.cpp | 4 ++++ src/Protocol/Protocol17x.cpp | 14 +++++++++++--- src/Protocol/Protocol17x.h | 2 +- src/UI/SlotArea.cpp | 24 ++++++++++++------------ src/UI/Window.cpp | 2 +- 5 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index c1f2456eb..abdd792e0 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -120,6 +120,8 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName) cPlayer::~cPlayer(void) { + cRoot::Get()->GetPluginManager()->CallHookPlayerDestroying(*this); + LOGD("Deleting cPlayer \"%s\" at %p, ID %d", m_PlayerName.c_str(), this, GetUniqueID()); // Notify the server that the player is being destroyed @@ -134,6 +136,8 @@ cPlayer::~cPlayer(void) delete m_InventoryWindow; LOGD("Player %p deleted", this); + + cRoot::Get()->GetPluginManager()->CallHookPlayerDestroyed(*this); } diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index d120d8d91..f302da2ad 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -1143,7 +1143,7 @@ bool cProtocol172::HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType) case 0x0e: HandlePacketWindowClick (a_ByteBuffer); return true; case 0x0f: // Confirm transaction - not used in MCS case 0x10: HandlePacketCreativeInventoryAction(a_ByteBuffer); return true; - case 0x11: HandlePacketEnchanting (a_ByteBuffer); return true; + case 0x11: HandlePacketEnchanting (a_ByteBuffer); return true; case 0x12: HandlePacketUpdateSign (a_ByteBuffer); return true; case 0x13: HandlePacketPlayerAbilities (a_ByteBuffer); return true; case 0x14: HandlePacketTabComplete (a_ByteBuffer); return true; @@ -1551,11 +1551,19 @@ void cProtocol172::HandlePacketEnchanting(cByteBuffer & a_ByteBuffer) HANDLE_READ(a_ByteBuffer, ReadByte, Byte, WindowID); HANDLE_READ(a_ByteBuffer, ReadByte, Byte, Enchantment); - //TODO: EnchantItem (getWindow, getItem, Enchant) + LOGWARN("Enchantment Packet received!"); + //Get Item from Window Slot + cItem EnchantItem = *m_Client->GetPlayer()->GetWindow()->GetSlot(*m_Client->GetPlayer(), 0); + //Enchant item with Sharpness 5 + EnchantItem.m_Enchantments.SetLevel(cEnchantments::enchSharpness, 5); - LOG("Enchantment Paket empfangen!"); + //Set Enchanted Item to Window Slot + m_Client->GetPlayer()->GetWindow()->SetSlot(*m_Client->GetPlayer(), 0, EnchantItem); + + LOGWARN("Item enchanted!"); + } diff --git a/src/Protocol/Protocol17x.h b/src/Protocol/Protocol17x.h index 04d65910c..7877e783a 100644 --- a/src/Protocol/Protocol17x.h +++ b/src/Protocol/Protocol17x.h @@ -258,7 +258,7 @@ protected: void HandlePacketTabComplete (cByteBuffer & a_ByteBuffer); void HandlePacketUpdateSign (cByteBuffer & a_ByteBuffer); void HandlePacketUseEntity (cByteBuffer & a_ByteBuffer); - void HandlePacketEnchanting (cByteBuffer & a_ByteBuffer); + void HandlePacketEnchanting (cByteBuffer & a_ByteBuffer); void HandlePacketWindowClick (cByteBuffer & a_ByteBuffer); void HandlePacketWindowClose (cByteBuffer & a_ByteBuffer); diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index ae6bfccb5..a226d027b 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -576,7 +576,7 @@ cSlotAreaTemporary(a_NumSlots, a_ParentWindow) void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) { - LOG("Clicked"); + LOGWARN("Clicked"); // Check if Slot is in the Enchantment Table if (a_SlotNum == 0) { @@ -610,28 +610,28 @@ void cSlotAreaEnchanting::OnPlayerRemoved(cPlayer & a_Player) void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) { - LOG("Click!"); + LOGWARN("Click!"); if (a_Player.GetDraggingItem().IsEmpty()) { - LOG("EMPTY"); - this->m_ParentWindow.SetProperty(0, NULL); - this->m_ParentWindow.SetProperty(1, NULL); - this->m_ParentWindow.SetProperty(2, NULL); + LOGWARN("EMPTY"); + this->m_ParentWindow.SetProperty(0, 0); + this->m_ParentWindow.SetProperty(1, 0); + this->m_ParentWindow.SetProperty(2, 0); } else if (a_Player.GetDraggingItem().IsEnchantable) { - LOG("Enchantable"); + LOGWARN("Enchantable"); this->m_ParentWindow.SetProperty(0, 30); this->m_ParentWindow.SetProperty(1, 20); this->m_ParentWindow.SetProperty(2, 10); } else { - LOG("Not Enchantable"); - this->m_ParentWindow.SetProperty(0, NULL); - this->m_ParentWindow.SetProperty(1, NULL); - this->m_ParentWindow.SetProperty(2, NULL); + LOGWARN("Not Enchantable"); + this->m_ParentWindow.SetProperty(0, 0); + this->m_ParentWindow.SetProperty(1, 0); + this->m_ParentWindow.SetProperty(2, 0); } } @@ -641,7 +641,7 @@ void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) void cSlotAreaEnchanting::ShiftClickedResult(cPlayer & a_Player) { - LOG("Shift Click!"); + LOGWARN("Shift Click!"); } diff --git a/src/UI/Window.cpp b/src/UI/Window.cpp index fcfe6faf3..9188b47a7 100644 --- a/src/UI/Window.cpp +++ b/src/UI/Window.cpp @@ -785,7 +785,7 @@ cCraftingWindow::cCraftingWindow(int a_BlockX, int a_BlockY, int a_BlockZ) : // cEnchantingWindow: cEnchantingWindow::cEnchantingWindow(int a_BlockX, int a_BlockY, int a_BlockZ) : -cWindow(wtEnchantment, "Enchantment Table") +cWindow(wtEnchantment, "Enchant") { m_SlotAreas.push_back(new cSlotAreaEnchanting(1, *this)); m_SlotAreas.push_back(new cSlotAreaInventory(*this)); From 5609fed3602b4da3c22ca042819561c2b9b21715 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Fri, 24 Jan 2014 21:53:27 +0100 Subject: [PATCH 003/188] removed hook from enchanting commit --- src/Entities/Player.cpp | 4 ---- src/Protocol/Protocol17x.cpp | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index abdd792e0..c1f2456eb 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -120,8 +120,6 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName) cPlayer::~cPlayer(void) { - cRoot::Get()->GetPluginManager()->CallHookPlayerDestroying(*this); - LOGD("Deleting cPlayer \"%s\" at %p, ID %d", m_PlayerName.c_str(), this, GetUniqueID()); // Notify the server that the player is being destroyed @@ -136,8 +134,6 @@ cPlayer::~cPlayer(void) delete m_InventoryWindow; LOGD("Player %p deleted", this); - - cRoot::Get()->GetPluginManager()->CallHookPlayerDestroyed(*this); } diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index f302da2ad..949498734 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -1563,7 +1563,7 @@ void cProtocol172::HandlePacketEnchanting(cByteBuffer & a_ByteBuffer) m_Client->GetPlayer()->GetWindow()->SetSlot(*m_Client->GetPlayer(), 0, EnchantItem); LOGWARN("Item enchanted!"); - + } From 36120db400691be75199ff404e35f5c289b8818f Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Fri, 31 Jan 2014 19:46:51 +0100 Subject: [PATCH 004/188] Some updates for enchanting (2) --- src/ClientHandle.cpp | 36 ++++++++++++ src/ClientHandle.h | 3 + src/Enchantments.h | 5 +- src/Item.cpp | 106 +++++++++++++++++++++++++++++++++++ src/Item.h | 3 + src/Protocol/Protocol125.cpp | 15 +++++ src/Protocol/Protocol125.h | 1 + src/Protocol/Protocol17x.cpp | 17 ++---- src/Protocol/Protocol17x.h | 2 +- 9 files changed, 173 insertions(+), 15 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 74d192129..979298c59 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2453,4 +2453,40 @@ void cClientHandle::SocketClosed(void) +void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) +{ + //Get Item + cItem EnchantItem = m_Player->GetDraggingItem(); + + cEnchantmentsArray enchantments; + cItem::GetApplicableEnchantmentsForType(EnchantItem.m_ItemType, enchantments); + + m_Player->SendMessage(Printf("ItemType: %d", EnchantItem.m_ItemType)); + + + m_Player->SendMessage(enchantments[1].ToString()); + + //shuffle enchantments (i don't know if this is good) + std::random_shuffle(enchantments.begin(), enchantments.end()); + + m_Player->SendMessage(enchantments[1].ToString()); + + + + + + + //Enchant Item + EnchantItem.m_Enchantments.AddFromString(enchantments[1].ToString()); + + //Set Enchanted Item to Window Slot + m_Player->GetWindow()->SetSlot(*m_Player, 0, EnchantItem); + + LOGWARN("Item enchanted!"); +} + + + + + diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 4add022a6..1a1e22a19 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -214,6 +214,9 @@ public: /// Handles the block placing packet when it is a real block placement (not block-using, item-using or eating) void HandlePlaceBlock(int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, cItemHandler & a_ItemHandler); + + ///Handle item enchanting + void HandleEnchantItem(Byte & WindowID, Byte & Enchantment); private: diff --git a/src/Enchantments.h b/src/Enchantments.h index e984df92e..e0861aa1e 100644 --- a/src/Enchantments.h +++ b/src/Enchantments.h @@ -29,6 +29,9 @@ mapping each enchantment's id onto its level. ID may be either a number or the e Level value of 0 means no such enchantment, and it will not be stored in the m_Enchantments. Serialization will never put zero-level enchantments into the stringspec and will always use numeric IDs. */ + +typedef std::vector cEnchantmentsArray; + // tolua_begin class cEnchantments { @@ -62,7 +65,7 @@ public: enchLuckOfTheSea = 61, enchLure = 62, } ; - + /// Creates an empty enchantments container cEnchantments(void); diff --git a/src/Item.cpp b/src/Item.cpp index 9170006b6..fb561d7b2 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -189,6 +189,112 @@ bool cItem::IsEnchantable(short item) +void cItem::GetApplicableEnchantmentsForType(short a_ItemType, cEnchantmentsArray & a_Enchantments) +{ + LOGWARN("Get Enchantments"); + + if (ItemCategory::IsSword(a_ItemType)) + { + a_Enchantments.push_back(cEnchantments("Sharpness=4")); + a_Enchantments.push_back(cEnchantments("Smite=5")); + a_Enchantments.push_back(cEnchantments("BaneOfArthropods=5")); + a_Enchantments.push_back(cEnchantments("Knockback=2")); + a_Enchantments.push_back(cEnchantments("FireAspect=2")); + a_Enchantments.push_back(cEnchantments("Looting=3")); + a_Enchantments.push_back(cEnchantments("Unbreaking=3")); + } + + else if (ItemCategory::IsPickaxe(a_ItemType)) + { + a_Enchantments.push_back(cEnchantments("Efficiency=4")); + a_Enchantments.push_back(cEnchantments("SilkTouch=1")); + a_Enchantments.push_back(cEnchantments("Unbreaking=3")); + a_Enchantments.push_back(cEnchantments("Fortune=3")); + } + + else if (ItemCategory::IsAxe(a_ItemType)) + { + a_Enchantments.push_back(cEnchantments("Efficiency=4")); + a_Enchantments.push_back(cEnchantments("SilkTouch=1")); + a_Enchantments.push_back(cEnchantments("Unbreaking=3")); + a_Enchantments.push_back(cEnchantments("Fortune=3")); + } + + else if (ItemCategory::IsShovel(a_ItemType)) + { + a_Enchantments.push_back(cEnchantments("Efficiency=4")); + a_Enchantments.push_back(cEnchantments("SilkTouch=1")); + a_Enchantments.push_back(cEnchantments("Unbreaking=3")); + a_Enchantments.push_back(cEnchantments("Fortune=3")); + } + + else if (ItemCategory::IsHoe(a_ItemType)) + { + a_Enchantments.push_back(cEnchantments("Unbreaking=3")); + } + + else if (ItemCategory::IsArmor(a_ItemType)) + { + a_Enchantments.push_back(cEnchantments("Protection=4")); + a_Enchantments.push_back(cEnchantments("FireProtection=4")); + a_Enchantments.push_back(cEnchantments("BlastProtection=4")); + a_Enchantments.push_back(cEnchantments("ProjectileProtection=4")); + a_Enchantments.push_back(cEnchantments("Thorns=3")); + a_Enchantments.push_back(cEnchantments("Unbreaking=3")); + + if (ItemCategory::IsHelmet(a_ItemType)) + { + a_Enchantments.push_back(cEnchantments("Respiration=3")); + a_Enchantments.push_back(cEnchantments("AquaAffinity=1")); + } + + else if (ItemCategory::IsBoots(a_ItemType)) + { + a_Enchantments.push_back(cEnchantments("FeatherFalling=4")); + } + } + + //Bow + else if (a_ItemType == 261) + { + a_Enchantments.push_back(cEnchantments("Power=4")); + a_Enchantments.push_back(cEnchantments("Punch=2")); + a_Enchantments.push_back(cEnchantments("Flame=1")); + a_Enchantments.push_back(cEnchantments("Infinity=1")); + a_Enchantments.push_back(cEnchantments("Unbreaking=3")); + } + + //Fishing Rod + else if (a_ItemType == 346) + { + a_Enchantments.push_back(cEnchantments("LuckOfTheSea=3")); + a_Enchantments.push_back(cEnchantments("Lure=3")); + a_Enchantments.push_back(cEnchantments("Unbreaking=3")); + } + + //Shears + else if (a_ItemType == 359) + { + a_Enchantments.push_back(cEnchantments("Unbreaking=3")); + } + + //Flint and Steel + else if (a_ItemType == 259) + { + a_Enchantments.push_back(cEnchantments("Unbreaking=3")); + } + + //Carrot on a Stick + else if (a_ItemType == 398) + { + a_Enchantments.push_back(cEnchantments("Unbreaking=3")); + } +} + + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cItems: diff --git a/src/Item.h b/src/Item.h index 727965112..1a070eafd 100644 --- a/src/Item.h +++ b/src/Item.h @@ -169,6 +169,9 @@ public: /// Returns true if the specified item type is enchantable (as per 1.2.5 protocol requirements) static bool IsEnchantable(short a_ItemType); + /** Fills a_Enchantments with the list of enchantments applicable to the specified item type */ + static void cItem::GetApplicableEnchantmentsForType(short a_ItemType, cEnchantmentsArray & a_Enchantments); + // tolua_begin short m_ItemType; diff --git a/src/Protocol/Protocol125.cpp b/src/Protocol/Protocol125.cpp index 323a13992..b2b61acc9 100644 --- a/src/Protocol/Protocol125.cpp +++ b/src/Protocol/Protocol125.cpp @@ -1535,6 +1535,21 @@ int cProtocol125::ParseUseEntity(void) +int cProtocol125::ParseEnchantItem(void) +{ + HANDLE_PACKET_READ(ReadByte, byte, WindowID); + HANDLE_PACKET_READ(ReadByte, byte, Enchantment); + + // TODO: Enchant Handling for older Protocols + + + return PARSE_OK; +} + + + + + int cProtocol125::ParseWindowClick(void) { HANDLE_PACKET_READ(ReadChar, char, WindowID); diff --git a/src/Protocol/Protocol125.h b/src/Protocol/Protocol125.h index 310f9dd78..e3c8765b1 100644 --- a/src/Protocol/Protocol125.h +++ b/src/Protocol/Protocol125.h @@ -133,6 +133,7 @@ protected: virtual int ParseSlotSelected (void); virtual int ParseUpdateSign (void); virtual int ParseUseEntity (void); + virtual int ParseEnchantItem (void); virtual int ParseWindowClick (void); virtual int ParseWindowClose (void); diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index 949498734..05b7ebd45 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -1143,7 +1143,7 @@ bool cProtocol172::HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType) case 0x0e: HandlePacketWindowClick (a_ByteBuffer); return true; case 0x0f: // Confirm transaction - not used in MCS case 0x10: HandlePacketCreativeInventoryAction(a_ByteBuffer); return true; - case 0x11: HandlePacketEnchanting (a_ByteBuffer); return true; + case 0x11: HandlePacketEnchantItem (a_ByteBuffer); return true; case 0x12: HandlePacketUpdateSign (a_ByteBuffer); return true; case 0x13: HandlePacketPlayerAbilities (a_ByteBuffer); return true; case 0x14: HandlePacketTabComplete (a_ByteBuffer); return true; @@ -1546,23 +1546,14 @@ void cProtocol172::HandlePacketUseEntity(cByteBuffer & a_ByteBuffer) -void cProtocol172::HandlePacketEnchanting(cByteBuffer & a_ByteBuffer) +void cProtocol172::HandlePacketEnchantItem(cByteBuffer & a_ByteBuffer) { HANDLE_READ(a_ByteBuffer, ReadByte, Byte, WindowID); HANDLE_READ(a_ByteBuffer, ReadByte, Byte, Enchantment); - LOGWARN("Enchantment Packet received!"); + LOGWARN("Protocol 1.7: Enchantment Packet received!"); - //Get Item from Window Slot - cItem EnchantItem = *m_Client->GetPlayer()->GetWindow()->GetSlot(*m_Client->GetPlayer(), 0); - - //Enchant item with Sharpness 5 - EnchantItem.m_Enchantments.SetLevel(cEnchantments::enchSharpness, 5); - - //Set Enchanted Item to Window Slot - m_Client->GetPlayer()->GetWindow()->SetSlot(*m_Client->GetPlayer(), 0, EnchantItem); - - LOGWARN("Item enchanted!"); + m_Client->HandleEnchantItem(WindowID, Enchantment); } diff --git a/src/Protocol/Protocol17x.h b/src/Protocol/Protocol17x.h index 7877e783a..1f3039edb 100644 --- a/src/Protocol/Protocol17x.h +++ b/src/Protocol/Protocol17x.h @@ -258,7 +258,7 @@ protected: void HandlePacketTabComplete (cByteBuffer & a_ByteBuffer); void HandlePacketUpdateSign (cByteBuffer & a_ByteBuffer); void HandlePacketUseEntity (cByteBuffer & a_ByteBuffer); - void HandlePacketEnchanting (cByteBuffer & a_ByteBuffer); + void HandlePacketEnchantItem (cByteBuffer & a_ByteBuffer); void HandlePacketWindowClick (cByteBuffer & a_ByteBuffer); void HandlePacketWindowClose (cByteBuffer & a_ByteBuffer); From 7735a1104ff4861fd02609aefaa63ea4587c3649 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sat, 1 Feb 2014 13:09:28 +0100 Subject: [PATCH 005/188] added EnchantItemPacket to older Protocols --- src/Protocol/Protocol125.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Protocol/Protocol125.cpp b/src/Protocol/Protocol125.cpp index b2b61acc9..2df2a695b 100644 --- a/src/Protocol/Protocol125.cpp +++ b/src/Protocol/Protocol125.cpp @@ -94,6 +94,7 @@ enum PACKET_INVENTORY_WHOLE = 0x68, PACKET_WINDOW_PROPERTY = 0x69, PACKET_CREATIVE_INVENTORY_ACTION = 0x6B, + PACKET_ENCHANT_ITEM = 0x6C, PACKET_UPDATE_SIGN = 0x82, PACKET_PLAYER_LIST_ITEM = 0xC9, PACKET_PLAYER_ABILITIES = 0xca, @@ -1170,6 +1171,7 @@ int cProtocol125::ParsePacket(unsigned char a_PacketType) case PACKET_SLOT_SELECTED: return ParseSlotSelected(); case PACKET_UPDATE_SIGN: return ParseUpdateSign(); case PACKET_USE_ENTITY: return ParseUseEntity(); + case PACKET_ENCHANT_ITEM: return ParseEnchantItem(); case PACKET_WINDOW_CLICK: return ParseWindowClick(); case PACKET_WINDOW_CLOSE: return ParseWindowClose(); } @@ -1540,8 +1542,9 @@ int cProtocol125::ParseEnchantItem(void) HANDLE_PACKET_READ(ReadByte, byte, WindowID); HANDLE_PACKET_READ(ReadByte, byte, Enchantment); - // TODO: Enchant Handling for older Protocols + LOGWARN("Older Protocol: Enchantment Packet received!"); + m_Client->HandleEnchantItem(WindowID, Enchantment); return PARSE_OK; } From 830a9c3bb46485f9d961078cff6c7055f4e9d569 Mon Sep 17 00:00:00 2001 From: Tycho Date: Sat, 22 Mar 2014 08:16:07 -0700 Subject: [PATCH 006/188] FIrst attempt at adding override support to tolua --- lib/tolua++/src/bin/lua/container.lua | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/tolua++/src/bin/lua/container.lua b/lib/tolua++/src/bin/lua/container.lua index 2d11db7df..97e7b58fd 100644 --- a/lib/tolua++/src/bin/lua/container.lua +++ b/lib/tolua++/src/bin/lua/container.lua @@ -606,14 +606,15 @@ function classContainer:doparse (s) -- try function do --local b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&:<>]*[_%w])%s*(%b())%s*(c?o?n?s?t?)%s*=?%s*0?%s*;%s*") - local b,e,decl,arg,const,virt = strfind(s,"^%s*([^%(\n]+)%s*(%b())%s*(c?o?n?s?t?)%s*(=?%s*0?)%s*;%s*") + local b,e,decl,arg,const,virt = strfind(s,"^%s*([^%(\n]+)%s*(%b())%s*(c?o?n?s?t?)%s*o?v?e?r?i?d?e?%s*(=?%s*0?)%s*;%s*") + warning("trace" .. b .. "," .. e "," .. decl) if not b then -- try function with template - b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&:<>]*[_%w]%b<>)%s*(%b())%s*(c?o?n?s?t?)%s*=?%s*0?%s*;%s*") + b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&:<>]*[_%w]%b<>)%s*(%b())%s*(c?o?n?s?t?)%s*o?v?e?r?i?d?e?%s*=?%s*0?%s*;%s*") end if not b then -- try a single letter function name - b,e,decl,arg,const = strfind(s,"^%s*([_%w])%s*(%b())%s*(c?o?n?s?t?)%s*;%s*") + b,e,decl,arg,const = strfind(s,"^%s*([_%w])%s*(%b())%s*(c?o?n?s?t?)%s*o?v?e?r?i?d?e?%s*;%s*") end if not b then -- try function pointer @@ -636,11 +637,11 @@ function classContainer:doparse (s) -- try inline function do - local b,e,decl,arg,const = strfind(s,"^%s*([^%(\n]+)%s*(%b())%s*(c?o?n?s?t?)[^;{]*%b{}%s*;?%s*") + local b,e,decl,arg,const = strfind(s,"^%s*([^%(\n]+)%s*(%b())%s*(c?o?n?s?t?)%s*o?v?e?r?i?d?e?[^;{]*%b{}%s*;?%s*") --local b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&:<>]*[_%w>])%s*(%b())%s*(c?o?n?s?t?)[^;]*%b{}%s*;?%s*") if not b then -- try a single letter function name - b,e,decl,arg,const = strfind(s,"^%s*([_%w])%s*(%b())%s*(c?o?n?s?t?).-%b{}%s*;?%s*") + b,e,decl,arg,const = strfind(s,"^%s*([_%w])%s*(%b())%s*(c?o?n?s?t?)%s*o?v?e?r?i?d?e?.-%b{}%s*;?%s*") end if b then _curr_code = strsub(s,b,e) From 5653997bcc1f04936f07d220999b8339661cbbb7 Mon Sep 17 00:00:00 2001 From: Tycho Date: Sat, 22 Mar 2014 08:43:54 -0700 Subject: [PATCH 007/188] Added override specifier to functions declared in cWorld --- src/World.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/World.h b/src/World.h index 46aece18f..b85171e4e 100644 --- a/src/World.h +++ b/src/World.h @@ -126,15 +126,15 @@ public: int GetTicksUntilWeatherChange(void) const { return m_WeatherInterval; } - virtual Int64 GetWorldAge (void) const { return m_WorldAge; } // override, cannot specify due to tolua - virtual Int64 GetTimeOfDay(void) const { return m_TimeOfDay; } // override, cannot specify due to tolua + virtual Int64 GetWorldAge (void) const override { return m_WorldAge; } + virtual Int64 GetTimeOfDay(void) const override { return m_TimeOfDay; } void SetTicksUntilWeatherChange(int a_WeatherInterval) { m_WeatherInterval = a_WeatherInterval; } - virtual void SetTimeOfDay(Int64 a_TimeOfDay) // override, cannot specify due to tolua + virtual void SetTimeOfDay(Int64 a_TimeOfDay) override { m_TimeOfDay = a_TimeOfDay; m_TimeOfDaySecs = (double)a_TimeOfDay / 20.0; @@ -430,10 +430,10 @@ public: // tolua_begin /** Spawns item pickups for each item in the list. May compress pickups if too many entities: */ - virtual void SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double a_BlockY, double a_BlockZ, double a_FlyAwaySpeed = 1.0, bool IsPlayerCreated = false); // override; cannot specify it here due to tolua + virtual void SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double a_BlockY, double a_BlockZ, double a_FlyAwaySpeed = 1.0, bool IsPlayerCreated = false) override; /** Spawns item pickups for each item in the list. May compress pickups if too many entities. All pickups get the speed specified: */ - virtual void SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double a_BlockY, double a_BlockZ, double a_SpeedX, double a_SpeedY, double a_SpeedZ, bool IsPlayerCreated = false); // override; cannot specify it here due to tolua + virtual void SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double a_BlockY, double a_BlockZ, double a_SpeedX, double a_SpeedY, double a_SpeedZ, bool IsPlayerCreated = false) override; /** Spawns an falling block entity at the given position. It returns the UniqueID of the spawned falling block. */ int SpawnFallingBlock(int a_X, int a_Y, int a_Z, BLOCKTYPE BlockType, NIBBLETYPE BlockMeta); @@ -457,7 +457,7 @@ public: // tolua_begin bool DigBlock (int a_X, int a_Y, int a_Z); - virtual void SendBlockTo(int a_X, int a_Y, int a_Z, cPlayer * a_Player); // override, cannot specify due to tolua + virtual void SendBlockTo(int a_X, int a_Y, int a_Z, cPlayer * a_Player) override; double GetSpawnX(void) const { return m_SpawnX; } double GetSpawnY(void) const { return m_SpawnY; } @@ -508,7 +508,7 @@ public: | esWitherBirth | TBD | | esPlugin | void * | */ - virtual void DoExplosionAt(double a_ExplosionSize, double a_BlockX, double a_BlockY, double a_BlockZ, bool a_CanCauseFire, eExplosionSource a_Source, void * a_SourceData); // tolua_export // override, cannot specify due to tolua + virtual void DoExplosionAt(double a_ExplosionSize, double a_BlockX, double a_BlockY, double a_BlockZ, bool a_CanCauseFire, eExplosionSource a_Source, void * a_SourceData) override; // tolua_export /** Calls the callback for the block entity at the specified coords; returns false if there's no block entity at those coords, true if found */ bool DoWithBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBlockEntityCallback & a_Callback); // Exported in ManualBindings.cpp @@ -707,7 +707,7 @@ public: bool IsBlockDirectlyWatered(int a_BlockX, int a_BlockY, int a_BlockZ); // tolua_export /** Spawns a mob of the specified type. Returns the mob's EntityID if recognized and spawned, <0 otherwise */ - virtual int SpawnMob(double a_PosX, double a_PosY, double a_PosZ, cMonster::eType a_MonsterType); // tolua_export // override, cannot specify due to tolua + virtual int SpawnMob(double a_PosX, double a_PosY, double a_PosZ, cMonster::eType a_MonsterType) override; // tolua_export int SpawnMobFinalize(cMonster* a_Monster); /** Creates a projectile of the specified type. Returns the projectile's EntityID if successful, <0 otherwise */ From efc89b2c430c94de03bdb519470d7cb6c3b5d661 Mon Sep 17 00:00:00 2001 From: Howaner Date: Fri, 28 Mar 2014 22:22:29 +0100 Subject: [PATCH 008/188] Add tall flower handler. --- src/Blocks/BlockBigFlower.h | 97 +++++++++++++++++++++++++++++++++++++ src/Blocks/BlockHandler.cpp | 2 + 2 files changed, 99 insertions(+) create mode 100644 src/Blocks/BlockBigFlower.h diff --git a/src/Blocks/BlockBigFlower.h b/src/Blocks/BlockBigFlower.h new file mode 100644 index 000000000..46f16c4a2 --- /dev/null +++ b/src/Blocks/BlockBigFlower.h @@ -0,0 +1,97 @@ + +#pragma once + +#include "BlockHandler.h" + + + + + +class cBlockBigFlowerHandler : + public cBlockHandler +{ +public: + typedef cBlockHandler super; + + cBlockBigFlowerHandler(BLOCKTYPE a_BlockType) + : cBlockHandler(a_BlockType) + { + } + + + virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ) override + { + NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); + if (Meta & 0x8) + { + super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, a_BlockY - 1, a_BlockZ); + } + else + { + super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, a_BlockY, a_BlockZ); + } + } + + + virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override + { + NIBBLETYPE Meta = a_BlockMeta & 0x7; + + if ((Meta == 2) || (Meta == 3)) + { + return; + } + + a_Pickups.push_back(cItem(E_BLOCK_BIG_FLOWER, 1, Meta)); + } + + virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override + { + return ((a_RelY > 0) && (a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) != E_BLOCK_AIR)); + } + + + virtual void OnPlacedByPlayer( + cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, + int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, + int a_CursorX, int a_CursorY, int a_CursorZ, + BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta + ) override + { + int Meta = (((int)floor(a_Player->GetYaw() * 4.0 / 360.0 + 0.5) & 0x3) + 2) % 4; + a_ChunkInterface.SetBlock(a_WorldInterface, a_BlockX, a_BlockY + 1, a_BlockZ, m_BlockType, 0x8 | Meta); + } + + + virtual void OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ) override + { + NIBBLETYPE OldMeta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); + + if (OldMeta & 0x8) + { + // Was upper part of door + if (a_ChunkInterface.GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ) == m_BlockType) + { + a_ChunkInterface.FastSetBlock(a_BlockX, a_BlockY - 1, a_BlockZ, E_BLOCK_AIR, 0); + } + } + else + { + // Was lower part + if (a_ChunkInterface.GetBlock(a_BlockX, a_BlockY + 1, a_BlockZ) == m_BlockType) + { + a_ChunkInterface.FastSetBlock(a_BlockX, a_BlockY + 1, a_BlockZ, E_BLOCK_AIR, 0); + } + } + } + + + virtual const char * GetStepSound(void) override + { + return "step.grass"; + } +} ; + + + + diff --git a/src/Blocks/BlockHandler.cpp b/src/Blocks/BlockHandler.cpp index 4f74e2f45..09e00e77d 100644 --- a/src/Blocks/BlockHandler.cpp +++ b/src/Blocks/BlockHandler.cpp @@ -8,6 +8,7 @@ #include "../Chunk.h" #include "BlockAnvil.h" #include "BlockBed.h" +#include "BlockBigFlower.h" #include "BlockBrewingStand.h" #include "BlockButton.h" #include "BlockCactus.h" @@ -89,6 +90,7 @@ cBlockHandler * cBlockHandler::CreateBlockHandler(BLOCKTYPE a_BlockType) case E_BLOCK_ACTIVATOR_RAIL: return new cBlockRailHandler (a_BlockType); case E_BLOCK_ANVIL: return new cBlockAnvilHandler (a_BlockType); case E_BLOCK_BED: return new cBlockBedHandler (a_BlockType); + case E_BLOCK_BIG_FLOWER: return new cBlockBigFlowerHandler (a_BlockType); case E_BLOCK_BIRCH_WOOD_STAIRS: return new cBlockStairsHandler (a_BlockType); case E_BLOCK_BREWING_STAND: return new cBlockBrewingStandHandler (a_BlockType); case E_BLOCK_BRICK_STAIRS: return new cBlockStairsHandler (a_BlockType); From f2f6096ee5b92b21924348975c923f74dd23786b Mon Sep 17 00:00:00 2001 From: Howaner Date: Fri, 28 Mar 2014 22:24:54 +0100 Subject: [PATCH 009/188] door -> flower --- src/Blocks/BlockBigFlower.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Blocks/BlockBigFlower.h b/src/Blocks/BlockBigFlower.h index 46f16c4a2..fabc4c4ed 100644 --- a/src/Blocks/BlockBigFlower.h +++ b/src/Blocks/BlockBigFlower.h @@ -69,7 +69,7 @@ public: if (OldMeta & 0x8) { - // Was upper part of door + // Was upper part of flower if (a_ChunkInterface.GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ) == m_BlockType) { a_ChunkInterface.FastSetBlock(a_BlockX, a_BlockY - 1, a_BlockZ, E_BLOCK_AIR, 0); From a78bacac3cb915a82b73bf8fe0ccc0a153190df9 Mon Sep 17 00:00:00 2001 From: Howaner Date: Fri, 28 Mar 2014 23:14:58 +0100 Subject: [PATCH 010/188] Add tallgrass drop to big flowers. Add tallgrass drop, when a players break a tallgrass with the shear. --- src/Blocks/BlockBigFlower.h | 43 ++++++++++++++++++++++++++++++++++--- src/Blocks/BlockTallGrass.h | 24 ++++++++++++++++----- 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/Blocks/BlockBigFlower.h b/src/Blocks/BlockBigFlower.h index fabc4c4ed..194a79a67 100644 --- a/src/Blocks/BlockBigFlower.h +++ b/src/Blocks/BlockBigFlower.h @@ -44,10 +44,47 @@ public: a_Pickups.push_back(cItem(E_BLOCK_BIG_FLOWER, 1, Meta)); } - + + + virtual void OnDestroyedByPlayer(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) override + { + NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); + if (Meta & 0x8) + { + Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY - 1, a_BlockZ); + } + + NIBBLETYPE FlowerMeta = Meta & 0x7; + if (!a_Player->IsGameModeCreative()) + { + if (((FlowerMeta == 2) || (FlowerMeta == 3)) && (a_Player->GetEquippedItem().m_ItemType == E_ITEM_SHEARS)) + { + MTRand r1; + if (r1.randInt(10) == 5) + { + cItems Pickups; + if (FlowerMeta == 2) + { + Pickups.Add(E_BLOCK_TALL_GRASS, 2, 1); + } + else if (FlowerMeta == 3) + { + Pickups.Add(E_BLOCK_TALL_GRASS, 2, 2); + } + a_WorldInterface.SpawnItemPickups(Pickups, a_BlockX, a_BlockY, a_BlockZ); + } + a_Player->UseEquippedItem(); + } + } + } + + virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override { - return ((a_RelY > 0) && (a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) != E_BLOCK_AIR)); + return ( + a_RelY > 0 + && a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) != E_BLOCK_AIR + ); } @@ -59,7 +96,7 @@ public: ) override { int Meta = (((int)floor(a_Player->GetYaw() * 4.0 / 360.0 + 0.5) & 0x3) + 2) % 4; - a_ChunkInterface.SetBlock(a_WorldInterface, a_BlockX, a_BlockY + 1, a_BlockZ, m_BlockType, 0x8 | Meta); + a_ChunkInterface.FastSetBlock(a_BlockX, a_BlockY + 1, a_BlockZ, m_BlockType, 0x8 | Meta); } diff --git a/src/Blocks/BlockTallGrass.h b/src/Blocks/BlockTallGrass.h index b8af1f1da..ba1f2e0f6 100644 --- a/src/Blocks/BlockTallGrass.h +++ b/src/Blocks/BlockTallGrass.h @@ -15,14 +15,14 @@ public: : cBlockHandler(a_BlockType) { } - - + + virtual bool DoesIgnoreBuildCollision(void) override { return true; } - - + + virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override { // Drop seeds, sometimes @@ -34,11 +34,25 @@ public: } + virtual void OnDestroyedByPlayer(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) override + { + NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); + + if ((!a_Player->IsGameModeCreative()) && (a_Player->GetEquippedItem().m_ItemType == E_ITEM_SHEARS)) + { + cItems Pickups; + Pickups.Add(E_BLOCK_TALL_GRASS, 1, Meta); + a_WorldInterface.SpawnItemPickups(Pickups, a_BlockX, a_BlockY, a_BlockZ); + } + a_Player->UseEquippedItem(); + } + + virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override { return ((a_RelY > 0) && (a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) != E_BLOCK_AIR)); } - + virtual const char * GetStepSound(void) override { From 736c7950a2b56d2f5296b4cc3695857dced65d51 Mon Sep 17 00:00:00 2001 From: Howaner Date: Sat, 29 Mar 2014 13:11:49 +0100 Subject: [PATCH 011/188] Add "a_RelY < cChunkDef::Height" to BlockBigFlower --- src/Blocks/BlockBigFlower.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Blocks/BlockBigFlower.h b/src/Blocks/BlockBigFlower.h index 194a79a67..98d6502ab 100644 --- a/src/Blocks/BlockBigFlower.h +++ b/src/Blocks/BlockBigFlower.h @@ -84,6 +84,7 @@ public: return ( a_RelY > 0 && a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) != E_BLOCK_AIR + && a_RelY < cChunkDef::Height ); } From 1795cca5522476006d33d0c276e27a50659c867a Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Tue, 1 Apr 2014 16:36:00 +0200 Subject: [PATCH 012/188] Rewritten HTTPServer to use size_t for data lengths. --- src/HTTPServer/EnvelopeParser.cpp | 4 ++-- src/HTTPServer/EnvelopeParser.h | 29 +++++++++++++---------- src/HTTPServer/HTTPConnection.cpp | 14 +++++------ src/HTTPServer/HTTPConnection.h | 4 ++-- src/HTTPServer/HTTPFormParser.cpp | 2 +- src/HTTPServer/HTTPFormParser.h | 4 ++-- src/HTTPServer/HTTPMessage.cpp | 28 +++++++++++----------- src/HTTPServer/HTTPMessage.h | 14 ++++++----- src/HTTPServer/HTTPServer.cpp | 6 ++--- src/HTTPServer/HTTPServer.h | 10 ++++---- src/HTTPServer/MultipartParser.cpp | 8 +++---- src/HTTPServer/MultipartParser.h | 38 ++++++++++++++++-------------- src/HTTPServer/NameValueParser.cpp | 8 +++---- src/HTTPServer/NameValueParser.h | 4 ++-- src/WebAdmin.cpp | 4 ++-- src/WebAdmin.h | 10 ++++---- 16 files changed, 97 insertions(+), 90 deletions(-) diff --git a/src/HTTPServer/EnvelopeParser.cpp b/src/HTTPServer/EnvelopeParser.cpp index 8dbe05f14..fd4f3836d 100644 --- a/src/HTTPServer/EnvelopeParser.cpp +++ b/src/HTTPServer/EnvelopeParser.cpp @@ -20,7 +20,7 @@ cEnvelopeParser::cEnvelopeParser(cCallbacks & a_Callbacks) : -int cEnvelopeParser::Parse(const char * a_Data, int a_Size) +size_t cEnvelopeParser::Parse(const char * a_Data, size_t a_Size) { if (!m_IsInHeaders) { @@ -55,7 +55,7 @@ int cEnvelopeParser::Parse(const char * a_Data, int a_Size) { // An error has occurred m_IsInHeaders = false; - return -1; + return AString::npos; } Last = idxCRLF + 2; idxCRLF = m_IncomingData.find("\r\n", idxCRLF + 2); diff --git a/src/HTTPServer/EnvelopeParser.h b/src/HTTPServer/EnvelopeParser.h index 6430fbebf..9b6c7f369 100644 --- a/src/HTTPServer/EnvelopeParser.h +++ b/src/HTTPServer/EnvelopeParser.h @@ -19,7 +19,9 @@ public: class cCallbacks { public: - /// Called when a full header line is parsed + virtual ~cCallbacks() {} + + /** Called when a full header line is parsed */ virtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) = 0; } ; @@ -27,40 +29,41 @@ public: cEnvelopeParser(cCallbacks & a_Callbacks); /** Parses the incoming data. - Returns the number of bytes consumed from the input. The bytes not consumed are not part of the envelope header + Returns the number of bytes consumed from the input. The bytes not consumed are not part of the envelope header. + Returns AString::npos on error */ - int Parse(const char * a_Data, int a_Size); + size_t Parse(const char * a_Data, size_t a_Size); - /// Makes the parser forget everything parsed so far, so that it can be reused for parsing another datastream + /** Makes the parser forget everything parsed so far, so that it can be reused for parsing another datastream */ void Reset(void); - /// Returns true if more input is expected for the envelope header + /** Returns true if more input is expected for the envelope header */ bool IsInHeaders(void) const { return m_IsInHeaders; } - /// Sets the IsInHeaders flag; used by cMultipartParser to simplify the parser initial conditions + /** Sets the IsInHeaders flag; used by cMultipartParser to simplify the parser initial conditions */ void SetIsInHeaders(bool a_IsInHeaders) { m_IsInHeaders = a_IsInHeaders; } public: - /// Callbacks to call for the various events + /** Callbacks to call for the various events */ cCallbacks & m_Callbacks; - /// Set to true while the parser is still parsing the envelope headers. Once set to true, the parser will not consume any more data. + /** Set to true while the parser is still parsing the envelope headers. Once set to true, the parser will not consume any more data. */ bool m_IsInHeaders; - /// Buffer for the incoming data until it is parsed + /** Buffer for the incoming data until it is parsed */ AString m_IncomingData; - /// Holds the last parsed key; used for line-wrapped values + /** Holds the last parsed key; used for line-wrapped values */ AString m_LastKey; - /// Holds the last parsed value; used for line-wrapped values + /** Holds the last parsed value; used for line-wrapped values */ AString m_LastValue; - /// Notifies the callback of the key/value stored in m_LastKey/m_LastValue, then erases them + /** Notifies the callback of the key/value stored in m_LastKey/m_LastValue, then erases them */ void NotifyLast(void); - /// Parses one line of header data. Returns true if successful + /** Parses one line of header data. Returns true if successful */ bool ParseLine(const char * a_Data, size_t a_Size); } ; diff --git a/src/HTTPServer/HTTPConnection.cpp b/src/HTTPServer/HTTPConnection.cpp index 78b7ce4d9..b8635d893 100644 --- a/src/HTTPServer/HTTPConnection.cpp +++ b/src/HTTPServer/HTTPConnection.cpp @@ -67,7 +67,7 @@ void cHTTPConnection::Send(const cHTTPResponse & a_Response) -void cHTTPConnection::Send(const void * a_Data, int a_Size) +void cHTTPConnection::Send(const void * a_Data, size_t a_Size) { ASSERT(m_State == wcsSendingResp); AppendPrintf(m_OutgoingData, "%x\r\n", a_Size); @@ -155,8 +155,8 @@ void cHTTPConnection::DataReceived(const char * a_Data, int a_Size) m_CurrentRequest = new cHTTPRequest; } - int BytesConsumed = m_CurrentRequest->ParseHeaders(a_Data, a_Size); - if (BytesConsumed < 0) + size_t BytesConsumed = m_CurrentRequest->ParseHeaders(a_Data, a_Size); + if (BytesConsumed == AString::npos) { delete m_CurrentRequest; m_CurrentRequest = NULL; @@ -174,16 +174,16 @@ void cHTTPConnection::DataReceived(const char * a_Data, int a_Size) m_State = wcsRecvBody; m_HTTPServer.NewRequest(*this, *m_CurrentRequest); m_CurrentRequestBodyRemaining = m_CurrentRequest->GetContentLength(); - if (m_CurrentRequestBodyRemaining < 0) + if (m_CurrentRequestBodyRemaining == AString::npos) { // The body length was not specified in the request, assume zero m_CurrentRequestBodyRemaining = 0; } // Process the rest of the incoming data into the request body: - if (a_Size > BytesConsumed) + if (a_Size > (int)BytesConsumed) { - DataReceived(a_Data + BytesConsumed, a_Size - BytesConsumed); + DataReceived(a_Data + BytesConsumed, a_Size - (int)BytesConsumed); } else { @@ -197,7 +197,7 @@ void cHTTPConnection::DataReceived(const char * a_Data, int a_Size) ASSERT(m_CurrentRequest != NULL); if (m_CurrentRequestBodyRemaining > 0) { - int BytesToConsume = std::min(m_CurrentRequestBodyRemaining, a_Size); + size_t BytesToConsume = std::min(m_CurrentRequestBodyRemaining, (size_t)a_Size); m_HTTPServer.RequestBody(*this, *m_CurrentRequest, a_Data, BytesToConsume); m_CurrentRequestBodyRemaining -= BytesToConsume; } diff --git a/src/HTTPServer/HTTPConnection.h b/src/HTTPServer/HTTPConnection.h index 5b8103554..0ad409c51 100644 --- a/src/HTTPServer/HTTPConnection.h +++ b/src/HTTPServer/HTTPConnection.h @@ -51,7 +51,7 @@ public: void Send(const cHTTPResponse & a_Response); /** Sends the data as the response (may be called multiple times) */ - void Send(const void * a_Data, int a_Size); + void Send(const void * a_Data, size_t a_Size); /** Sends the data as the response (may be called multiple times) */ void Send(const AString & a_Data) { Send(a_Data.data(), a_Data.size()); } @@ -87,7 +87,7 @@ protected: /** Number of bytes that remain to read for the complete body of the message to be received. Valid only in wcsRecvBody */ - int m_CurrentRequestBodyRemaining; + size_t m_CurrentRequestBodyRemaining; // cSocketThreads::cCallback overrides: diff --git a/src/HTTPServer/HTTPFormParser.cpp b/src/HTTPServer/HTTPFormParser.cpp index e661ea6f9..14d97bb7d 100644 --- a/src/HTTPServer/HTTPFormParser.cpp +++ b/src/HTTPServer/HTTPFormParser.cpp @@ -243,7 +243,7 @@ void cHTTPFormParser::OnPartHeader(const AString & a_Key, const AString & a_Valu -void cHTTPFormParser::OnPartData(const char * a_Data, int a_Size) +void cHTTPFormParser::OnPartData(const char * a_Data, size_t a_Size) { if (m_CurrentPartName.empty()) { diff --git a/src/HTTPServer/HTTPFormParser.h b/src/HTTPServer/HTTPFormParser.h index a554ca5a4..b8e6d246c 100644 --- a/src/HTTPServer/HTTPFormParser.h +++ b/src/HTTPServer/HTTPFormParser.h @@ -40,7 +40,7 @@ public: virtual void OnFileStart(cHTTPFormParser & a_Parser, const AString & a_FileName) = 0; /// Called when more file data has come for the current file in the form data - virtual void OnFileData(cHTTPFormParser & a_Parser, const char * a_Data, int a_Size) = 0; + virtual void OnFileData(cHTTPFormParser & a_Parser, const char * a_Data, size_t a_Size) = 0; /// Called when the current file part has ended in the form data virtual void OnFileEnd(cHTTPFormParser & a_Parser) = 0; @@ -103,7 +103,7 @@ protected: // cMultipartParser::cCallbacks overrides: virtual void OnPartStart (void) override; virtual void OnPartHeader(const AString & a_Key, const AString & a_Value) override; - virtual void OnPartData (const char * a_Data, int a_Size) override; + virtual void OnPartData (const char * a_Data, size_t a_Size) override; virtual void OnPartEnd (void) override; } ; diff --git a/src/HTTPServer/HTTPMessage.cpp b/src/HTTPServer/HTTPMessage.cpp index 98627eb8e..4a3611050 100644 --- a/src/HTTPServer/HTTPMessage.cpp +++ b/src/HTTPServer/HTTPMessage.cpp @@ -25,7 +25,7 @@ cHTTPMessage::cHTTPMessage(eKind a_Kind) : m_Kind(a_Kind), - m_ContentLength(-1) + m_ContentLength(AString::npos) { } @@ -81,23 +81,23 @@ cHTTPRequest::cHTTPRequest(void) : -int cHTTPRequest::ParseHeaders(const char * a_Data, int a_Size) +size_t cHTTPRequest::ParseHeaders(const char * a_Data, size_t a_Size) { if (!m_IsValid) { - return -1; + return AString::npos; } if (m_Method.empty()) { // The first line hasn't been processed yet - int res = ParseRequestLine(a_Data, a_Size); - if ((res < 0) || (res == a_Size)) + size_t res = ParseRequestLine(a_Data, a_Size); + if ((res == AString::npos) || (res == a_Size)) { return res; } - int res2 = m_EnvelopeParser.Parse(a_Data + res, a_Size - res); - if (res2 < 0) + size_t res2 = m_EnvelopeParser.Parse(a_Data + res, a_Size - res); + if (res2 == AString::npos) { m_IsValid = false; return res2; @@ -107,8 +107,8 @@ int cHTTPRequest::ParseHeaders(const char * a_Data, int a_Size) if (m_EnvelopeParser.IsInHeaders()) { - int res = m_EnvelopeParser.Parse(a_Data, a_Size); - if (res < 0) + size_t res = m_EnvelopeParser.Parse(a_Data, a_Size); + if (res == AString::npos) { m_IsValid = false; } @@ -138,7 +138,7 @@ AString cHTTPRequest::GetBareURL(void) const -int cHTTPRequest::ParseRequestLine(const char * a_Data, int a_Size) +size_t cHTTPRequest::ParseRequestLine(const char * a_Data, size_t a_Size) { m_IncomingHeaderData.append(a_Data, a_Size); size_t IdxEnd = m_IncomingHeaderData.size(); @@ -158,7 +158,7 @@ int cHTTPRequest::ParseRequestLine(const char * a_Data, int a_Size) if (LineStart >= IdxEnd) { m_IsValid = false; - return -1; + return AString::npos; } int NumSpaces = 0; @@ -186,7 +186,7 @@ int cHTTPRequest::ParseRequestLine(const char * a_Data, int a_Size) { // Too many spaces in the request m_IsValid = false; - return -1; + return AString::npos; } } NumSpaces += 1; @@ -198,13 +198,13 @@ int cHTTPRequest::ParseRequestLine(const char * a_Data, int a_Size) { // LF too early, without a CR, without two preceeding spaces or too soon after the second space m_IsValid = false; - return -1; + return AString::npos; } // Check that there's HTTP/version at the end if (strncmp(a_Data + URLEnd + 1, "HTTP/1.", 7) != 0) { m_IsValid = false; - return -1; + return AString::npos; } m_Method = m_IncomingHeaderData.substr(LineStart, MethodEnd - LineStart); m_URL = m_IncomingHeaderData.substr(MethodEnd + 1, URLEnd - MethodEnd - 1); diff --git a/src/HTTPServer/HTTPMessage.h b/src/HTTPServer/HTTPMessage.h index ab3338db7..d4d96f7cb 100644 --- a/src/HTTPServer/HTTPMessage.h +++ b/src/HTTPServer/HTTPMessage.h @@ -42,7 +42,7 @@ public: void SetContentLength(int a_ContentLength) { m_ContentLength = a_ContentLength; } const AString & GetContentType (void) const { return m_ContentType; } - int GetContentLength(void) const { return m_ContentLength; } + size_t GetContentLength(void) const { return m_ContentLength; } protected: typedef std::map cNameValueMap; @@ -54,8 +54,10 @@ protected: /** Type of the content; parsed by AddHeader(), set directly by SetContentLength() */ AString m_ContentType; - /** Length of the content that is to be received. -1 when the object is created, parsed by AddHeader() or set directly by SetContentLength() */ - int m_ContentLength; + /** Length of the content that is to be received. + AString::npos when the object is created. + Parsed by AddHeader() or set directly by SetContentLength() */ + size_t m_ContentLength; } ; @@ -72,9 +74,9 @@ public: cHTTPRequest(void); /** Parses the request line and then headers from the received data. - Returns the number of bytes consumed or a negative number for error + Returns the number of bytes consumed or AString::npos number for error */ - int ParseHeaders(const char * a_Data, int a_Size); + size_t ParseHeaders(const char * a_Data, size_t a_Size); /** Returns true if the request did contain a Content-Length header */ bool HasReceivedContentLength(void) const { return (m_ContentLength >= 0); } @@ -145,7 +147,7 @@ protected: /** Parses the incoming data for the first line (RequestLine) Returns the number of bytes consumed, or -1 for an error */ - int ParseRequestLine(const char * a_Data, int a_Size); + size_t ParseRequestLine(const char * a_Data, size_t a_Size); // cEnvelopeParser::cCallbacks overrides: virtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) override; diff --git a/src/HTTPServer/HTTPServer.cpp b/src/HTTPServer/HTTPServer.cpp index 4e9195a00..eaf8405a3 100644 --- a/src/HTTPServer/HTTPServer.cpp +++ b/src/HTTPServer/HTTPServer.cpp @@ -38,7 +38,7 @@ class cDebugCallbacks : } - virtual void OnRequestBody(cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, int a_Size) override + virtual void OnRequestBody(cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, size_t a_Size) override { UNUSED(a_Connection); @@ -100,7 +100,7 @@ class cDebugCallbacks : } - virtual void OnFileData(cHTTPFormParser & a_Parser, const char * a_Data, int a_Size) override + virtual void OnFileData(cHTTPFormParser & a_Parser, const char * a_Data, size_t a_Size) override { // TODO } @@ -242,7 +242,7 @@ void cHTTPServer::NewRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Re -void cHTTPServer::RequestBody(cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, int a_Size) +void cHTTPServer::RequestBody(cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, size_t a_Size) { m_Callbacks->OnRequestBody(a_Connection, a_Request, a_Data, a_Size); } diff --git a/src/HTTPServer/HTTPServer.h b/src/HTTPServer/HTTPServer.h index 383abb4b6..8eff7d879 100644 --- a/src/HTTPServer/HTTPServer.h +++ b/src/HTTPServer/HTTPServer.h @@ -44,8 +44,9 @@ public: */ virtual void OnRequestBegun(cHTTPConnection & a_Connection, cHTTPRequest & a_Request) = 0; - /// Called when another part of request body has arrived. - virtual void OnRequestBody(cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, int a_Size) = 0; + /** Called when another part of request body has arrived. + May be called multiple times for a single request. */ + virtual void OnRequestBody(cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, size_t a_Size) = 0; /// Called when the request body has been fully received in previous calls to OnRequestBody() virtual void OnRequestFinished(cHTTPConnection & a_Connection, cHTTPRequest & a_Request) = 0; @@ -90,8 +91,9 @@ protected: /// Called by cHTTPConnection when it finishes parsing the request header void NewRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request); - /// Called by cHTTPConenction when it receives more data for the request body - void RequestBody(cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, int a_Size); + /** Called by cHTTPConenction when it receives more data for the request body. + May be called multiple times for a single request. */ + void RequestBody(cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, size_t a_Size); /// Called by cHTTPConnection when it detects that the request has finished (all of its body has been received) void RequestFinished(cHTTPConnection & a_Connection, cHTTPRequest & a_Request); diff --git a/src/HTTPServer/MultipartParser.cpp b/src/HTTPServer/MultipartParser.cpp index 14c2c00fa..309495dd7 100644 --- a/src/HTTPServer/MultipartParser.cpp +++ b/src/HTTPServer/MultipartParser.cpp @@ -97,8 +97,6 @@ cMultipartParser::cMultipartParser(const AString & a_ContentType, cCallbacks & a m_EnvelopeParser(*this), m_HasHadData(false) { - static AString s_Multipart = "multipart/"; - // Check that the content type is multipart: AString ContentType(a_ContentType); if (strncmp(ContentType.c_str(), "multipart/", 10) != 0) @@ -146,7 +144,7 @@ cMultipartParser::cMultipartParser(const AString & a_ContentType, cCallbacks & a -void cMultipartParser::Parse(const char * a_Data, int a_Size) +void cMultipartParser::Parse(const char * a_Data, size_t a_Size) { // Skip parsing if invalid if (!m_IsValid) @@ -160,8 +158,8 @@ void cMultipartParser::Parse(const char * a_Data, int a_Size) { if (m_EnvelopeParser.IsInHeaders()) { - int BytesConsumed = m_EnvelopeParser.Parse(m_IncomingData.data(), m_IncomingData.size()); - if (BytesConsumed < 0) + size_t BytesConsumed = m_EnvelopeParser.Parse(m_IncomingData.data(), m_IncomingData.size()); + if (BytesConsumed == AString::npos) { m_IsValid = false; return; diff --git a/src/HTTPServer/MultipartParser.h b/src/HTTPServer/MultipartParser.h index d853929ed..a7395c1cb 100644 --- a/src/HTTPServer/MultipartParser.h +++ b/src/HTTPServer/MultipartParser.h @@ -22,50 +22,52 @@ public: class cCallbacks { public: - /// Called when a new part starts + virtual ~cCallbacks() {} + + /** Called when a new part starts */ virtual void OnPartStart(void) = 0; - /// Called when a complete header line is received for a part + /** Called when a complete header line is received for a part */ virtual void OnPartHeader(const AString & a_Key, const AString & a_Value) = 0; - /// Called when body for a part is received - virtual void OnPartData(const char * a_Data, int a_Size) = 0; + /** Called when body for a part is received */ + virtual void OnPartData(const char * a_Data, size_t a_Size) = 0; - /// Called when the current part ends + /** Called when the current part ends */ virtual void OnPartEnd(void) = 0; } ; - /// Creates the parser, expects to find the boundary in a_ContentType + /** Creates the parser, expects to find the boundary in a_ContentType */ cMultipartParser(const AString & a_ContentType, cCallbacks & a_Callbacks); - /// Parses more incoming data - void Parse(const char * a_Data, int a_Size); + /** Parses more incoming data */ + void Parse(const char * a_Data, size_t a_Size); protected: - /// The callbacks to call for various parsing events + /** The callbacks to call for various parsing events */ cCallbacks & m_Callbacks; - /// True if the data parsed so far is valid; if false, further parsing is skipped + /** True if the data parsed so far is valid; if false, further parsing is skipped */ bool m_IsValid; - /// Parser for each part's envelope + /** Parser for each part's envelope */ cEnvelopeParser m_EnvelopeParser; - /// Buffer for the incoming data until it is parsed + /** Buffer for the incoming data until it is parsed */ AString m_IncomingData; - /// The boundary, excluding both the initial "--" and the terminating CRLF + /** The boundary, excluding both the initial "--" and the terminating CRLF */ AString m_Boundary; - /// Set to true if some data for the current part has already been signalized to m_Callbacks. Used for proper CRLF inserting. + /** Set to true if some data for the current part has already been signalized to m_Callbacks. Used for proper CRLF inserting. */ bool m_HasHadData; - /// Parse one line of incoming data. The CRLF has already been stripped from a_Data / a_Size - void ParseLine(const char * a_Data, int a_Size); + /** Parse one line of incoming data. The CRLF has already been stripped from a_Data / a_Size */ + void ParseLine(const char * a_Data, size_t a_Size); - /// Parse one line of incoming data in the headers section of a part. The CRLF has already been stripped from a_Data / a_Size - void ParseHeaderLine(const char * a_Data, int a_Size); + /** Parse one line of incoming data in the headers section of a part. The CRLF has already been stripped from a_Data / a_Size */ + void ParseHeaderLine(const char * a_Data, size_t a_Size); // cEnvelopeParser overrides: virtual void OnHeaderLine(const AString & a_Key, const AString & a_Value) override; diff --git a/src/HTTPServer/NameValueParser.cpp b/src/HTTPServer/NameValueParser.cpp index 9ea8594ae..3f6c17dda 100644 --- a/src/HTTPServer/NameValueParser.cpp +++ b/src/HTTPServer/NameValueParser.cpp @@ -24,7 +24,7 @@ public: // Now try parsing char-by-char, to debug transitions across datachunk boundaries: cNameValueParser Parser2; - for (int i = 0; i < sizeof(Data) - 1; i++) + for (size_t i = 0; i < sizeof(Data) - 1; i++) { Parser2.Parse(Data + i, 1); } @@ -82,7 +82,7 @@ cNameValueParser::cNameValueParser(bool a_AllowsKeyOnly) : -cNameValueParser::cNameValueParser(const char * a_Data, int a_Size, bool a_AllowsKeyOnly) : +cNameValueParser::cNameValueParser(const char * a_Data, size_t a_Size, bool a_AllowsKeyOnly) : m_State(psKeySpace), m_AllowsKeyOnly(a_AllowsKeyOnly) { @@ -93,12 +93,12 @@ cNameValueParser::cNameValueParser(const char * a_Data, int a_Size, bool a_Allow -void cNameValueParser::Parse(const char * a_Data, int a_Size) +void cNameValueParser::Parse(const char * a_Data, size_t a_Size) { ASSERT(m_State != psFinished); // Calling Parse() after Finish() is wrong! int Last = 0; - for (int i = 0; i < a_Size;) + for (size_t i = 0; i < a_Size;) { switch (m_State) { diff --git a/src/HTTPServer/NameValueParser.h b/src/HTTPServer/NameValueParser.h index 07dc0b942..9794614fa 100644 --- a/src/HTTPServer/NameValueParser.h +++ b/src/HTTPServer/NameValueParser.h @@ -21,10 +21,10 @@ public: cNameValueParser(bool a_AllowsKeyOnly = true); /// Creates an empty parser, then parses the data given. Doesn't call Finish(), so more data can be parsed later - cNameValueParser(const char * a_Data, int a_Size, bool a_AllowsKeyOnly = true); + cNameValueParser(const char * a_Data, size_t a_Size, bool a_AllowsKeyOnly = true); /// Parses the data given - void Parse(const char * a_Data, int a_Size); + void Parse(const char * a_Data, size_t a_Size); /// Notifies the parser that no more data will be coming. Returns true if the parser state is valid bool Finish(void); diff --git a/src/WebAdmin.cpp b/src/WebAdmin.cpp index 402cd3035..cd141f7eb 100644 --- a/src/WebAdmin.cpp +++ b/src/WebAdmin.cpp @@ -490,7 +490,7 @@ void cWebAdmin::OnRequestBegun(cHTTPConnection & a_Connection, cHTTPRequest & a_ -void cWebAdmin::OnRequestBody(cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, int a_Size) +void cWebAdmin::OnRequestBody(cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, size_t a_Size) { UNUSED(a_Connection); cRequestData * Data = (cRequestData *)(a_Request.GetUserData()); @@ -537,7 +537,7 @@ void cWebAdmin::OnRequestFinished(cHTTPConnection & a_Connection, cHTTPRequest & /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cWebAdmin::cWebadminRequestData -void cWebAdmin::cWebadminRequestData::OnBody(const char * a_Data, int a_Size) +void cWebAdmin::cWebadminRequestData::OnBody(const char * a_Data, size_t a_Size) { m_Form.Parse(a_Data, a_Size); } diff --git a/src/WebAdmin.h b/src/WebAdmin.h index a2a07a543..d5e45828f 100644 --- a/src/WebAdmin.h +++ b/src/WebAdmin.h @@ -151,7 +151,7 @@ protected: virtual ~cRequestData() {} // Force a virtual destructor in all descendants /** Called when a new chunk of body data is received */ - virtual void OnBody(const char * a_Data, int a_Size) = 0; + virtual void OnBody(const char * a_Data, size_t a_Size) = 0; } ; /** The body handler for requests in the "/webadmin" and "/~webadmin" paths */ @@ -169,14 +169,14 @@ protected: } // cRequestData overrides: - virtual void OnBody(const char * a_Data, int a_Size) override; + virtual void OnBody(const char * a_Data, size_t a_Size) override; // cHTTPFormParser::cCallbacks overrides. Files are ignored: - virtual void OnFileStart(cHTTPFormParser &, const AString & a_FileName) override + virtual void OnFileStart(cHTTPFormParser &, const AString & a_FileName) override { UNUSED(a_FileName); } - virtual void OnFileData(cHTTPFormParser &, const char * a_Data, int a_Size) override + virtual void OnFileData(cHTTPFormParser &, const char * a_Data, size_t a_Size) override { UNUSED(a_Data); UNUSED(a_Size); @@ -216,7 +216,7 @@ protected: // cHTTPServer::cCallbacks overrides: virtual void OnRequestBegun (cHTTPConnection & a_Connection, cHTTPRequest & a_Request) override; - virtual void OnRequestBody (cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, int a_Size) override; + virtual void OnRequestBody (cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, size_t a_Size) override; virtual void OnRequestFinished(cHTTPConnection & a_Connection, cHTTPRequest & a_Request) override; } ; // tolua_export From 93bb5369a89eeda9c456574d8a72ebcac095ddd0 Mon Sep 17 00:00:00 2001 From: Tycho Date: Wed, 2 Apr 2014 05:06:38 -0700 Subject: [PATCH 013/188] Fixed Comparison to -1 in HTTPMessage.h --- src/HTTPServer/HTTPMessage.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HTTPServer/HTTPMessage.h b/src/HTTPServer/HTTPMessage.h index d4d96f7cb..c2d310839 100644 --- a/src/HTTPServer/HTTPMessage.h +++ b/src/HTTPServer/HTTPMessage.h @@ -79,7 +79,7 @@ public: size_t ParseHeaders(const char * a_Data, size_t a_Size); /** Returns true if the request did contain a Content-Length header */ - bool HasReceivedContentLength(void) const { return (m_ContentLength >= 0); } + bool HasReceivedContentLength(void) const { return (m_ContentLength != AString::npos); } /** Returns the method used in the request */ const AString & GetMethod(void) const { return m_Method; } From 7ece0cc8369a7600ea8667188e83a2cb9ef6570b Mon Sep 17 00:00:00 2001 From: Tycho Date: Wed, 2 Apr 2014 05:10:08 -0700 Subject: [PATCH 014/188] Fixed format string in HTTPConnection --- src/HTTPServer/HTTPConnection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HTTPServer/HTTPConnection.cpp b/src/HTTPServer/HTTPConnection.cpp index b8635d893..6d238f028 100644 --- a/src/HTTPServer/HTTPConnection.cpp +++ b/src/HTTPServer/HTTPConnection.cpp @@ -70,7 +70,7 @@ void cHTTPConnection::Send(const cHTTPResponse & a_Response) void cHTTPConnection::Send(const void * a_Data, size_t a_Size) { ASSERT(m_State == wcsSendingResp); - AppendPrintf(m_OutgoingData, "%x\r\n", a_Size); + AppendPrintf(m_OutgoingData, SIZE_T_FMT "\r\n", a_Size); m_OutgoingData.append((const char *)a_Data, a_Size); m_OutgoingData.append("\r\n"); m_HTTPServer.NotifyConnectionWrite(*this); From 298c0b409ac01f17968ed3ff5dd6e2e901627e04 Mon Sep 17 00:00:00 2001 From: Tycho Date: Wed, 2 Apr 2014 06:04:17 -0700 Subject: [PATCH 015/188] Fixed tolua++ override support --- lib/tolua++/CMakeLists.txt | 7 +- lib/tolua++/src/bin/function_lua.h | 285 +++--- lib/tolua++/src/bin/lua/container.lua | 21 +- lib/tolua++/src/bin/lua/function.lua | 4 +- lib/tolua++/src/bin/toluabind.c | 1166 +------------------------ 5 files changed, 164 insertions(+), 1319 deletions(-) diff --git a/lib/tolua++/CMakeLists.txt b/lib/tolua++/CMakeLists.txt index 75a301a53..4df698e89 100644 --- a/lib/tolua++/CMakeLists.txt +++ b/lib/tolua++/CMakeLists.txt @@ -24,8 +24,11 @@ if(UNIX) COMMAND xxd -i lua/declaration.lua | sed 's/unsigned char/static const unsigned char/g' >declaration_lua.h WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src/bin/ DEPENDS ${PROJECT_SOURCE_DIR}/src/bin/lua/declaration.lua) - set_property(SOURCE src/bin/toluabind.c APPEND PROPERTY OBJECT_DEPENDS ${PROJECT_SOURCE_DIR}/src/bin/enumerate_lua.h ${PROJECT_SOURCE_DIR}/src/bin/basic_lua.h ${PROJECT_SOURCE_DIR}/src/bin/function_lua.h ${PROJECT_SOURCE_DIR}/src/bin/declaration_lua.h) - message(hello) + add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/src/bin/container_lua.h + COMMAND xxd -i lua/container.lua | sed 's/unsigned char/static const unsigned char/g' >container_lua.h + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src/bin/ + DEPENDS ${PROJECT_SOURCE_DIR}/src/bin/lua/container.lua) + set_property(SOURCE src/bin/toluabind.c APPEND PROPERTY OBJECT_DEPENDS ${PROJECT_SOURCE_DIR}/src/bin/enumerate_lua.h ${PROJECT_SOURCE_DIR}/src/bin/basic_lua.h ${PROJECT_SOURCE_DIR}/src/bin/function_lua.h ${PROJECT_SOURCE_DIR}/src/bin/declaration_lua.h ${PROJECT_SOURCE_DIR}/src/bin/container_lua.h) endif() diff --git a/lib/tolua++/src/bin/function_lua.h b/lib/tolua++/src/bin/function_lua.h index bcb0bfca2..b34f106d2 100644 --- a/lib/tolua++/src/bin/function_lua.h +++ b/lib/tolua++/src/bin/function_lua.h @@ -990,14 +990,15 @@ static const unsigned char lua_function_lua[] = { 0x5f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x2c, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x0a, 0x20, 0x69, - 0x66, 0x20, 0x74, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7e, 0x3d, - 0x20, 0x27, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x27, 0x20, 0x61, 0x6e, 0x64, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x20, 0x69, 0x66, 0x20, 0x74, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7e, 0x3d, 0x20, - 0x27, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x28, 0x22, 0x23, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x20, 0x27, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x27, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x27, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x74, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7e, 0x3d, 0x20, 0x27, + 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x22, 0x23, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x20, 0x27, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x27, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x69, 0x66, 0x20, 0x74, 0x3a, 0x69, 0x6e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x29, 0x20, 0x74, @@ -1072,139 +1073,139 @@ static const unsigned char lua_function_lua[] = { 0x0a, 0x20, 0x2d, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x61, 0x2c, - 0x32, 0x2c, 0x2d, 0x32, 0x29, 0x29, 0x0a, 0x0a, 0x09, 0x69, 0x66, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x5b, 0x27, 0x57, - 0x27, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x61, 0x2c, 0x20, 0x22, 0x25, - 0x2e, 0x25, 0x2e, 0x25, 0x2e, 0x25, 0x73, 0x2a, 0x25, 0x29, 0x22, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x09, 0x09, 0x77, 0x61, 0x72, - 0x6e, 0x69, 0x6e, 0x67, 0x28, 0x22, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x76, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x20, 0x28, 0x60, 0x2e, 0x2e, 0x2e, 0x27, 0x29, 0x20, - 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x49, 0x67, 0x6e, 0x6f, 0x72, - 0x69, 0x6e, 0x67, 0x20, 0x22, 0x2e, 0x2e, 0x64, 0x2e, 0x2e, 0x61, 0x2e, - 0x2e, 0x63, 0x29, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x3d, 0x31, 0x0a, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x20, 0x3d, 0x20, 0x7b, 0x6e, - 0x3d, 0x30, 0x7d, 0x0a, 0x0a, 0x20, 0x09, 0x61, 0x20, 0x3d, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x61, - 0x2c, 0x20, 0x22, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x25, 0x28, 0x25, 0x29, - 0x5d, 0x29, 0x25, 0x73, 0x2a, 0x22, 0x2c, 0x20, 0x22, 0x25, 0x31, 0x22, - 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x2c, 0x73, - 0x74, 0x72, 0x69, 0x70, 0x2c, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x28, 0x73, - 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x61, 0x2c, 0x32, 0x2c, 0x2d, 0x32, - 0x29, 0x29, 0x3b, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x70, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x2d, 0x2d, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x72, - 0x73, 0x75, 0x62, 0x28, 0x61, 0x2c, 0x31, 0x2c, 0x2d, 0x32, 0x29, 0x2c, - 0x20, 0x31, 0x2c, 0x20, 0x2d, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x6c, 0x65, 0x6e, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x29, 0x2b, 0x31, - 0x29, 0x29, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, - 0x73, 0x20, 0x3d, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x74, 0x2c, 0x20, - 0x22, 0x2c, 0x22, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, - 0x2d, 0x31, 0x29, 0x0a, 0x0a, 0x09, 0x09, 0x6e, 0x73, 0x20, 0x3d, 0x20, - 0x22, 0x28, 0x22, 0x2e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x67, 0x73, 0x75, 0x62, 0x28, 0x6e, 0x73, 0x2c, 0x20, 0x22, 0x25, 0x73, - 0x2a, 0x2c, 0x25, 0x73, 0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, - 0x2e, 0x2e, 0x27, 0x29, 0x27, 0x0a, 0x09, 0x09, 0x2d, 0x2d, 0x6e, 0x73, - 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x28, 0x6e, 0x73, 0x29, 0x0a, 0x0a, 0x09, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x2c, 0x20, 0x6e, - 0x73, 0x2c, 0x20, 0x63, 0x29, 0x0a, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, - 0x69, 0x3d, 0x31, 0x2c, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, 0x5b, - 0x69, 0x5d, 0x2c, 0x20, 0x22, 0x3d, 0x2e, 0x2a, 0x24, 0x22, 0x2c, 0x20, - 0x22, 0x22, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, - 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, - 0x5b, 0x69, 0x5d, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x2e, 0x6e, - 0x20, 0x3d, 0x20, 0x6c, 0x2e, 0x6e, 0x2b, 0x31, 0x0a, 0x20, 0x20, 0x6c, - 0x5b, 0x6c, 0x2e, 0x6e, 0x5d, 0x20, 0x3d, 0x20, 0x44, 0x65, 0x63, 0x6c, - 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x5b, 0x69, 0x5d, - 0x2c, 0x27, 0x76, 0x61, 0x72, 0x27, 0x2c, 0x74, 0x72, 0x75, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x2b, 0x31, 0x0a, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x20, 0x3d, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x64, 0x2c, 0x27, 0x66, 0x75, 0x6e, 0x63, 0x27, 0x29, - 0x0a, 0x20, 0x66, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6c, - 0x0a, 0x20, 0x66, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3d, 0x20, - 0x63, 0x0a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x66, 0x29, 0x0a, 0x65, - 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x70, - 0x2c, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x0a, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, - 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x0a, - 0x09, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x61, 0x73, 0x74, - 0x20, 0x6f, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x67, 0x65, - 0x74, 0x6e, 0x28, 0x74, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6c, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x09, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, - 0x22, 0x22, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, - 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x09, - 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, - 0x74, 0x2c, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x0a, 0x09, - 0x09, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x74, 0x2e, 0x2e, - 0x6c, 0x73, 0x65, 0x70, 0x2e, 0x2e, 0x74, 0x5b, 0x69, 0x5d, 0x0a, 0x09, - 0x09, 0x6c, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x70, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, - 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x70, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x28, 0x73, 0x29, 0x0a, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x73, - 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x28, 0x73, 0x2c, 0x20, 0x27, 0x2c, 0x27, 0x29, 0x0a, 0x09, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, 0x20, 0x3d, - 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x0a, 0x0a, 0x09, 0x66, 0x6f, 0x72, - 0x20, 0x69, 0x3d, 0x74, 0x2e, 0x6e, 0x2c, 0x31, 0x2c, 0x2d, 0x31, 0x20, - 0x64, 0x6f, 0x0a, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, - 0x74, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, - 0x09, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x0a, 0x09, - 0x09, 0x09, 0x73, 0x74, 0x72, 0x69, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x2d, - 0x2d, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x2d, 0x2d, 0x09, 0x74, 0x5b, 0x69, 0x5d, - 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, - 0x75, 0x62, 0x28, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x22, 0x3d, 0x2e, - 0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x09, 0x09, 0x2d, - 0x2d, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2c, 0x73, 0x74, 0x72, - 0x69, 0x70, 0x2c, 0x6c, 0x61, 0x73, 0x74, 0x0a, 0x0a, 0x65, 0x6e, 0x64, - 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x70, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x28, 0x73, 0x29, 0x0a, 0x0a, 0x09, 0x73, 0x20, 0x3d, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, - 0x2c, 0x20, 0x22, 0x5e, 0x25, 0x28, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, - 0x0a, 0x09, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x25, 0x29, - 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x0a, 0x09, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x6c, 0x69, - 0x74, 0x5f, 0x63, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x28, 0x73, - 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x73, 0x65, 0x70, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, - 0x20, 0x22, 0x22, 0x2c, 0x22, 0x22, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, - 0x69, 0x3d, 0x31, 0x2c, 0x74, 0x2e, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x09, - 0x09, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, 0x5b, 0x69, 0x5d, - 0x2c, 0x20, 0x22, 0x3d, 0x2e, 0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, - 0x29, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, - 0x74, 0x2e, 0x2e, 0x73, 0x65, 0x70, 0x2e, 0x2e, 0x74, 0x5b, 0x69, 0x5d, - 0x0a, 0x09, 0x09, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x22, 0x2c, 0x22, - 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x22, 0x28, 0x22, 0x2e, 0x2e, 0x72, 0x65, 0x74, 0x2e, - 0x2e, 0x22, 0x29, 0x22, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a + 0x32, 0x2c, 0x2d, 0x32, 0x29, 0x29, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x5b, 0x27, 0x57, 0x27, + 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x61, 0x2c, 0x20, 0x22, 0x25, 0x2e, + 0x25, 0x2e, 0x25, 0x2e, 0x25, 0x73, 0x2a, 0x25, 0x29, 0x22, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x09, 0x09, 0x77, 0x61, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x28, 0x22, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x20, 0x28, 0x60, 0x2e, 0x2e, 0x2e, 0x27, 0x29, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x22, 0x2e, 0x2e, 0x64, 0x2e, 0x2e, 0x61, 0x2e, 0x2e, + 0x63, 0x29, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x3d, 0x31, 0x0a, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x3d, + 0x30, 0x7d, 0x0a, 0x0a, 0x20, 0x09, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x61, 0x2c, + 0x20, 0x22, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x25, 0x28, 0x25, 0x29, 0x5d, + 0x29, 0x25, 0x73, 0x2a, 0x22, 0x2c, 0x20, 0x22, 0x25, 0x31, 0x22, 0x29, + 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x2c, 0x73, 0x74, + 0x72, 0x69, 0x70, 0x2c, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x70, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x28, 0x73, 0x74, + 0x72, 0x73, 0x75, 0x62, 0x28, 0x61, 0x2c, 0x32, 0x2c, 0x2d, 0x32, 0x29, + 0x29, 0x3b, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x2d, 0x2d, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x72, 0x73, + 0x75, 0x62, 0x28, 0x61, 0x2c, 0x31, 0x2c, 0x2d, 0x32, 0x29, 0x2c, 0x20, + 0x31, 0x2c, 0x20, 0x2d, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x6c, 0x65, 0x6e, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x29, 0x2b, 0x31, 0x29, + 0x29, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x73, + 0x20, 0x3d, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x74, 0x2c, 0x20, 0x22, + 0x2c, 0x22, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x2d, + 0x31, 0x29, 0x0a, 0x0a, 0x09, 0x09, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x22, + 0x28, 0x22, 0x2e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, + 0x73, 0x75, 0x62, 0x28, 0x6e, 0x73, 0x2c, 0x20, 0x22, 0x25, 0x73, 0x2a, + 0x2c, 0x25, 0x73, 0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x2e, + 0x2e, 0x27, 0x29, 0x27, 0x0a, 0x09, 0x09, 0x2d, 0x2d, 0x6e, 0x73, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x28, 0x6e, 0x73, 0x29, 0x0a, 0x0a, 0x09, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x2c, 0x20, 0x6e, 0x73, + 0x2c, 0x20, 0x63, 0x29, 0x0a, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x3d, 0x31, 0x2c, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x09, + 0x09, 0x09, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, 0x5b, 0x69, + 0x5d, 0x2c, 0x20, 0x22, 0x3d, 0x2e, 0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, + 0x22, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x5b, + 0x69, 0x5d, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x2e, 0x6e, 0x20, + 0x3d, 0x20, 0x6c, 0x2e, 0x6e, 0x2b, 0x31, 0x0a, 0x20, 0x20, 0x6c, 0x5b, + 0x6c, 0x2e, 0x6e, 0x5d, 0x20, 0x3d, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x5b, 0x69, 0x5d, 0x2c, + 0x27, 0x76, 0x61, 0x72, 0x27, 0x2c, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x2b, 0x31, 0x0a, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, + 0x3d, 0x20, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x64, 0x2c, 0x27, 0x66, 0x75, 0x6e, 0x63, 0x27, 0x29, 0x0a, + 0x20, 0x66, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x0a, + 0x20, 0x66, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x63, + 0x0a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x66, 0x29, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x70, 0x2c, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x0a, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x0a, 0x09, + 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x67, 0x65, 0x74, + 0x6e, 0x28, 0x74, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x09, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x22, + 0x22, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x6f, + 0x70, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x66, + 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x2c, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x0a, 0x09, 0x09, + 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x74, 0x2e, 0x2e, 0x6c, + 0x73, 0x65, 0x70, 0x2e, 0x2e, 0x74, 0x5b, 0x69, 0x5d, 0x0a, 0x09, 0x09, + 0x6c, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x70, 0x0a, 0x09, + 0x09, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x70, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x28, 0x73, 0x29, 0x0a, 0x0a, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x70, + 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x28, 0x73, 0x2c, 0x20, 0x27, 0x2c, 0x27, 0x29, 0x0a, 0x09, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x0a, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, + 0x69, 0x3d, 0x74, 0x2e, 0x6e, 0x2c, 0x31, 0x2c, 0x2d, 0x31, 0x20, 0x64, + 0x6f, 0x0a, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x74, + 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, + 0x09, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x0a, 0x09, 0x09, + 0x09, 0x73, 0x74, 0x72, 0x69, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x2d, 0x2d, + 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x09, 0x09, 0x2d, 0x2d, 0x09, 0x74, 0x5b, 0x69, 0x5d, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, + 0x62, 0x28, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x22, 0x3d, 0x2e, 0x2a, + 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x09, 0x09, 0x2d, 0x2d, + 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2c, 0x73, 0x74, 0x72, 0x69, + 0x70, 0x2c, 0x6c, 0x61, 0x73, 0x74, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x70, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x28, 0x73, 0x29, 0x0a, 0x0a, 0x09, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, + 0x20, 0x22, 0x5e, 0x25, 0x28, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, + 0x09, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x25, 0x29, 0x24, + 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x0a, 0x09, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x5f, 0x63, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x28, 0x73, 0x2c, + 0x20, 0x22, 0x2c, 0x22, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x65, 0x70, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, + 0x22, 0x22, 0x2c, 0x22, 0x22, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x3d, 0x31, 0x2c, 0x74, 0x2e, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x09, + 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, 0x5b, 0x69, 0x5d, 0x2c, + 0x20, 0x22, 0x3d, 0x2e, 0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, + 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x74, + 0x2e, 0x2e, 0x73, 0x65, 0x70, 0x2e, 0x2e, 0x74, 0x5b, 0x69, 0x5d, 0x0a, + 0x09, 0x09, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x22, 0x2c, 0x22, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x22, 0x28, 0x22, 0x2e, 0x2e, 0x72, 0x65, 0x74, 0x2e, 0x2e, + 0x22, 0x29, 0x22, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a }; -unsigned int lua_function_lua_len = 14483; +unsigned int lua_function_lua_len = 14494; diff --git a/lib/tolua++/src/bin/lua/container.lua b/lib/tolua++/src/bin/lua/container.lua index 97e7b58fd..99488479e 100644 --- a/lib/tolua++/src/bin/lua/container.lua +++ b/lib/tolua++/src/bin/lua/container.lua @@ -58,7 +58,7 @@ function classContainer:hasvar () while self[i] do if self[i]:isvariable() then return 1 - end + end i = i+1 end return 0 @@ -568,7 +568,7 @@ function classContainer:doparse (s) -- Enumerate(name,body) -- return strsub(s,e+1) -- end --- end +-- end do local b,e,body,name = strfind(s,"^%s*typedef%s+enum[^{]*(%b{})%s*([%w_][^%s]*)%s*;%s*") @@ -606,15 +606,14 @@ function classContainer:doparse (s) -- try function do --local b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&:<>]*[_%w])%s*(%b())%s*(c?o?n?s?t?)%s*=?%s*0?%s*;%s*") - local b,e,decl,arg,const,virt = strfind(s,"^%s*([^%(\n]+)%s*(%b())%s*(c?o?n?s?t?)%s*o?v?e?r?i?d?e?%s*(=?%s*0?)%s*;%s*") - warning("trace" .. b .. "," .. e "," .. decl) + local b,e,decl,arg,const,virt = strfind(s,"^%s*([^%(\n]+)%s*(%b())%s*(c?o?n?s?t?)v?e?r?r?i?d?e?%s*o?v?e?r?r?i?d?e?%s*(=?%s*0?)%s*;%s*") if not b then -- try function with template - b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&:<>]*[_%w]%b<>)%s*(%b())%s*(c?o?n?s?t?)%s*o?v?e?r?i?d?e?%s*=?%s*0?%s*;%s*") + b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&:<>]*[_%w]%b<>)%s*(%b())%s*(c?o?n?s?t?)v?e?r?r?i?d?e?%s*o?v?e?r?r?i?d?e?%s*=?%s*0?%s*;%s*") end if not b then -- try a single letter function name - b,e,decl,arg,const = strfind(s,"^%s*([_%w])%s*(%b())%s*(c?o?n?s?t?)%s*o?v?e?r?i?d?e?%s*;%s*") + b,e,decl,arg,const = strfind(s,"^%s*([_%w])%s*(%b())%s*(c?o?n?s?t?)v?e?r?r?i?d?e?%s*o?v?e?r?r?i?d?e?%s*;%s*") end if not b then -- try function pointer @@ -630,6 +629,9 @@ function classContainer:doparse (s) end end _curr_code = strsub(s,b,e) + if const == 'o' then + const = '' + end Function(decl,arg,const) return strsub(s,e+1) end @@ -637,14 +639,17 @@ function classContainer:doparse (s) -- try inline function do - local b,e,decl,arg,const = strfind(s,"^%s*([^%(\n]+)%s*(%b())%s*(c?o?n?s?t?)%s*o?v?e?r?i?d?e?[^;{]*%b{}%s*;?%s*") + local b,e,decl,arg,const = strfind(s,"^%s*([^%(\n]+)%s*(%b())%s*(c?o?n?s?t?)v?e?r?r?i?d?e?%s*o?v?e?r?r?i?d?e?[^;{]*%b{}%s*;?%s*") --local b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&:<>]*[_%w>])%s*(%b())%s*(c?o?n?s?t?)[^;]*%b{}%s*;?%s*") if not b then -- try a single letter function name - b,e,decl,arg,const = strfind(s,"^%s*([_%w])%s*(%b())%s*(c?o?n?s?t?)%s*o?v?e?r?i?d?e?.-%b{}%s*;?%s*") + b,e,decl,arg,const = strfind(s,"^%s*([_%w])%s*(%b())%s*(c?o?n?s?t?)v?e?r?r?i?d?e?%s*o?v?e?r?r?i?d?e?.-%b{}%s*;?%s*") end if b then _curr_code = strsub(s,b,e) + if const == 'o' then + const = '' + end Function(decl,arg,const) return strsub(s,e+1) end diff --git a/lib/tolua++/src/bin/lua/function.lua b/lib/tolua++/src/bin/lua/function.lua index 3b6b53c5e..9338e0fbc 100644 --- a/lib/tolua++/src/bin/lua/function.lua +++ b/lib/tolua++/src/bin/lua/function.lua @@ -458,9 +458,8 @@ end -- Internal constructor function _Function (t) setmetatable(t,classFunction) - if t.const ~= 'const' and t.const ~= '' then - error("#invalid 'const' specification") + error("#invalid 'const' specification: " .. t.const) end append(t) @@ -489,7 +488,6 @@ end function Function (d,a,c) --local t = split(strsub(a,2,-2),',') -- eliminate braces --local t = split_params(strsub(a,2,-2)) - if not flags['W'] and string.find(a, "%.%.%.%s*%)") then warning("Functions with variable arguments (`...') are not supported. Ignoring "..d..a..c) diff --git a/lib/tolua++/src/bin/toluabind.c b/lib/tolua++/src/bin/toluabind.c index 06b371f70..e72b4b13c 100644 --- a/lib/tolua++/src/bin/toluabind.c +++ b/lib/tolua++/src/bin/toluabind.c @@ -1013,1170 +1013,8 @@ TOLUA_API int tolua_tolua_open (lua_State* tolua_S) { /* begin embedded lua code */ int top = lua_gettop(tolua_S); - static unsigned char B[] = { - 45, 45, 32,116,111,108,117, 97, 58, 32, 99,111,110,116, 97, - 105,110,101,114, 32, 97, 98,115,116,114, 97, 99,116, 32, 99, - 108, 97,115,115, 10, 45, 45, 32, 87,114,105,116,116,101,110, - 32, 98,121, 32, 87, 97,108,100,101,109, 97,114, 32, 67,101, - 108,101,115, 10, 45, 45, 32, 84,101, 67, 71,114, 97,102, 47, - 80, 85, 67, 45, 82,105,111, 10, 45, 45, 32, 74,117,108, 32, - 49, 57, 57, 56, 10, 45, 45, 32, 36, 73,100, 58, 32, 36, 10, - 10, 45, 45, 32, 84,104,105,115, 32, 99,111,100,101, 32,105, - 115, 32,102,114,101,101, 32,115,111,102,116,119, 97,114,101, - 59, 32,121,111,117, 32, 99, 97,110, 32,114,101,100,105,115, - 116,114,105, 98,117,116,101, 32,105,116, 32, 97,110,100, 47, - 111,114, 32,109,111,100,105,102,121, 32,105,116, 46, 10, 45, - 45, 32, 84,104,101, 32,115,111,102,116,119, 97,114,101, 32, - 112,114,111,118,105,100,101,100, 32,104,101,114,101,117,110, - 100,101,114, 32,105,115, 32,111,110, 32, 97,110, 32, 34, 97, - 115, 32,105,115, 34, 32, 98, 97,115,105,115, 44, 32, 97,110, - 100, 10, 45, 45, 32,116,104,101, 32, 97,117,116,104,111,114, - 32,104, 97,115, 32,110,111, 32,111, 98,108,105,103, 97,116, - 105,111,110, 32,116,111, 32,112,114,111,118,105,100,101, 32, - 109, 97,105,110,116,101,110, 97,110, 99,101, 44, 32,115,117, - 112,112,111,114,116, 44, 32,117,112,100, 97,116,101,115, 44, - 10, 45, 45, 32,101,110,104, 97,110, 99,101,109,101,110,116, - 115, 44, 32,111,114, 32,109,111,100,105,102,105, 99, 97,116, - 105,111,110,115, 46, 10, 10, 45, 45, 32,116, 97, 98,108,101, - 32,116,111, 32,115,116,111,114,101, 32,110, 97,109,101,115, - 112, 97, 99,101,100, 32,116,121,112,101,100,101,102,115, 47, - 101,110,117,109,115, 32,105,110, 32,103,108,111, 98, 97,108, - 32,115, 99,111,112,101, 10,103,108,111, 98, 97,108, 95,116, - 121,112,101,100,101,102,115, 32, 61, 32,123,125, 10,103,108, - 111, 98, 97,108, 95,101,110,117,109,115, 32, 61, 32,123,125, - 10, 10, 45, 45, 32, 67,111,110,116, 97,105,110,101,114, 32, - 99,108, 97,115,115, 10, 45, 45, 32, 82,101,112,114,101,115, - 101,110,116,115, 32, 97, 32, 99,111,110,116, 97,105,110,101, - 114, 32,111,102, 32,102,101, 97,116,117,114,101,115, 32,116, - 111, 32, 98,101, 32, 98,111,117,110,100, 10, 45, 45, 32,116, - 111, 32,108,117, 97, 46, 10, 99,108, 97,115,115, 67,111,110, - 116, 97,105,110,101,114, 32, 61, 10,123, 10, 32, 99,117,114, - 114, 32, 61, 32,110,105,108, 44, 10,125, 10, 99,108, 97,115, - 115, 67,111,110,116, 97,105,110,101,114, 46, 95, 95,105,110, - 100,101,120, 32, 61, 32, 99,108, 97,115,115, 67,111,110,116, - 97,105,110,101,114, 10,115,101,116,109,101,116, 97,116, 97, - 98,108,101, 40, 99,108, 97,115,115, 67,111,110,116, 97,105, - 110,101,114, 44, 99,108, 97,115,115, 70,101, 97,116,117,114, - 101, 41, 10, 10, 45, 45, 32,111,117,116,112,117,116, 32,116, - 97,103,115, 10,102,117,110, 99,116,105,111,110, 32, 99,108, - 97,115,115, 67,111,110,116, 97,105,110,101,114, 58,100,101, - 99,108,116,121,112,101, 32, 40, 41, 10, 32,112,117,115,104, - 40,115,101,108,102, 41, 10, 32,108,111, 99, 97,108, 32,105, - 61, 49, 10, 32,119,104,105,108,101, 32,115,101,108,102, 91, - 105, 93, 32,100,111, 10, 32, 32,115,101,108,102, 91,105, 93, - 58,100,101, 99,108,116,121,112,101, 40, 41, 10, 32, 32,105, - 32, 61, 32,105, 43, 49, 10, 32,101,110,100, 10, 32,112,111, - 112, 40, 41, 10,101,110,100, 10, 10, 10, 45, 45, 32,119,114, - 105,116,101, 32,115,117,112,112,111,114,116, 32, 99,111,100, - 101, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115, - 115, 67,111,110,116, 97,105,110,101,114, 58,115,117,112, 99, - 111,100,101, 32, 40, 41, 10, 10, 9,105,102, 32,110,111,116, - 32,115,101,108,102, 58, 99,104,101, 99,107, 95,112,117, 98, - 108,105, 99, 95, 97, 99, 99,101,115,115, 40, 41, 32,116,104, - 101,110, 10, 9, 9,114,101,116,117,114,110, 10, 9,101,110, - 100, 10, 10, 32,112,117,115,104, 40,115,101,108,102, 41, 10, - 32,108,111, 99, 97,108, 32,105, 61, 49, 10, 32,119,104,105, - 108,101, 32,115,101,108,102, 91,105, 93, 32,100,111, 10, 32, - 32,105,102, 32,115,101,108,102, 91,105, 93, 58, 99,104,101, - 99,107, 95,112,117, 98,108,105, 99, 95, 97, 99, 99,101,115, - 115, 40, 41, 32,116,104,101,110, 10, 32, 32, 9,115,101,108, - 102, 91,105, 93, 58,115,117,112, 99,111,100,101, 40, 41, 10, - 32, 32,101,110,100, 10, 32, 32,105, 32, 61, 32,105, 43, 49, - 10, 32,101,110,100, 10, 32,112,111,112, 40, 41, 10,101,110, - 100, 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97, - 115,115, 67,111,110,116, 97,105,110,101,114, 58,104, 97,115, - 118, 97,114, 32, 40, 41, 10, 32,108,111, 99, 97,108, 32,105, - 61, 49, 10, 32,119,104,105,108,101, 32,115,101,108,102, 91, - 105, 93, 32,100,111, 10, 32, 32,105,102, 32,115,101,108,102, - 91,105, 93, 58,105,115,118, 97,114,105, 97, 98,108,101, 40, - 41, 32,116,104,101,110, 10, 9, 9, 32,114,101,116,117,114, - 110, 32, 49, 10, 9, 9,101,110,100, 10, 32, 32,105, 32, 61, - 32,105, 43, 49, 10, 32,101,110,100, 10, 9,114,101,116,117, - 114,110, 32, 48, 10,101,110,100, 10, 10, 45, 45, 32, 73,110, - 116,101,114,110, 97,108, 32, 99,111,110,116, 97,105,110,101, - 114, 32, 99,111,110,115,116,114,117, 99,116,111,114, 10,102, - 117,110, 99,116,105,111,110, 32, 95, 67,111,110,116, 97,105, - 110,101,114, 32, 40,115,101,108,102, 41, 10, 32,115,101,116, - 109,101,116, 97,116, 97, 98,108,101, 40,115,101,108,102, 44, - 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, 41, - 10, 32,115,101,108,102, 46,110, 32, 61, 32, 48, 10, 32,115, - 101,108,102, 46,116,121,112,101,100,101,102,115, 32, 61, 32, - 123,116,111,108,117, 97, 95,110, 61, 48,125, 10, 32,115,101, - 108,102, 46,117,115,101,114,116,121,112,101,115, 32, 61, 32, - 123,125, 10, 32,115,101,108,102, 46,101,110,117,109,115, 32, - 61, 32,123,116,111,108,117, 97, 95,110, 61, 48,125, 10, 32, - 115,101,108,102, 46,108,110, 97,109,101,115, 32, 61, 32,123, - 125, 10, 32,114,101,116,117,114,110, 32,115,101,108,102, 10, - 101,110,100, 10, 10, 45, 45, 32,112,117,115,104, 32, 99,111, - 110,116, 97,105,110,101,114, 10,102,117,110, 99,116,105,111, - 110, 32,112,117,115,104, 32, 40,116, 41, 10, 9,116, 46,112, - 114,111,120, 32, 61, 32, 99,108, 97,115,115, 67,111,110,116, - 97,105,110,101,114, 46, 99,117,114,114, 10, 32, 99,108, 97, - 115,115, 67,111,110,116, 97,105,110,101,114, 46, 99,117,114, - 114, 32, 61, 32,116, 10,101,110,100, 10, 10, 45, 45, 32,112, - 111,112, 32, 99,111,110,116, 97,105,110,101,114, 10,102,117, - 110, 99,116,105,111,110, 32,112,111,112, 32, 40, 41, 10, 45, - 45,112,114,105,110,116, 40, 34,110, 97,109,101, 34, 44, 99, - 108, 97,115,115, 67,111,110,116, 97,105,110,101,114, 46, 99, - 117,114,114, 46,110, 97,109,101, 41, 10, 45, 45,102,111,114, - 101, 97, 99,104, 40, 99,108, 97,115,115, 67,111,110,116, 97, - 105,110,101,114, 46, 99,117,114,114, 46,117,115,101,114,116, - 121,112,101,115, 44,112,114,105,110,116, 41, 10, 45, 45,112, - 114,105,110,116, 40, 34, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 34, 41, 10, 32, 99,108, 97,115,115, 67, - 111,110,116, 97,105,110,101,114, 46, 99,117,114,114, 32, 61, - 32, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, - 46, 99,117,114,114, 46,112,114,111,120, 10,101,110,100, 10, - 10, 45, 45, 32,103,101,116, 32, 99,117,114,114,101,110,116, - 32,110, 97,109,101,115,112, 97, 99,101, 10,102,117,110, 99, - 116,105,111,110, 32,103,101,116, 99,117,114,114,110, 97,109, - 101,115,112, 97, 99,101, 32, 40, 41, 10, 9,114,101,116,117, - 114,110, 32,103,101,116,110, 97,109,101,115,112, 97, 99,101, - 40, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, - 46, 99,117,114,114, 41, 10,101,110,100, 10, 10, 45, 45, 32, - 97,112,112,101,110,100, 32,116,111, 32, 99,117,114,114,101, - 110,116, 32, 99,111,110,116, 97,105,110,101,114, 10,102,117, - 110, 99,116,105,111,110, 32, 97,112,112,101,110,100, 32, 40, - 116, 41, 10, 32,114,101,116,117,114,110, 32, 99,108, 97,115, - 115, 67,111,110,116, 97,105,110,101,114, 46, 99,117,114,114, - 58, 97,112,112,101,110,100, 40,116, 41, 10,101,110,100, 10, - 10, 45, 45, 32, 97,112,112,101,110,100, 32,116,121,112,101, - 100,101,102, 32,116,111, 32, 99,117,114,114,101,110,116, 32, - 99,111,110,116, 97,105,110,101,114, 10,102,117,110, 99,116, - 105,111,110, 32, 97,112,112,101,110,100,116,121,112,101,100, - 101,102, 32, 40,116, 41, 10, 32,114,101,116,117,114,110, 32, - 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, 46, - 99,117,114,114, 58, 97,112,112,101,110,100,116,121,112,101, - 100,101,102, 40,116, 41, 10,101,110,100, 10, 10, 45, 45, 32, - 97,112,112,101,110,100, 32,117,115,101,114,116,121,112,101, - 32,116,111, 32, 99,117,114,114,101,110,116, 32, 99,111,110, - 116, 97,105,110,101,114, 10,102,117,110, 99,116,105,111,110, - 32, 97,112,112,101,110,100,117,115,101,114,116,121,112,101, - 32, 40,116, 41, 10, 32,114,101,116,117,114,110, 32, 99,108, - 97,115,115, 67,111,110,116, 97,105,110,101,114, 46, 99,117, - 114,114, 58, 97,112,112,101,110,100,117,115,101,114,116,121, - 112,101, 40,116, 41, 10,101,110,100, 10, 10, 45, 45, 32, 97, - 112,112,101,110,100, 32,101,110,117,109, 32,116,111, 32, 99, - 117,114,114,101,110,116, 32, 99,111,110,116, 97,105,110,101, - 114, 10,102,117,110, 99,116,105,111,110, 32, 97,112,112,101, - 110,100,101,110,117,109, 32, 40,116, 41, 10, 32,114,101,116, - 117,114,110, 32, 99,108, 97,115,115, 67,111,110,116, 97,105, - 110,101,114, 46, 99,117,114,114, 58, 97,112,112,101,110,100, - 101,110,117,109, 40,116, 41, 10,101,110,100, 10, 10, 45, 45, - 32,115,117, 98,115,116,105,116,117,116,101, 32,116,121,112, - 101,100,101,102, 10,102,117,110, 99,116,105,111,110, 32, 97, - 112,112,108,121,116,121,112,101,100,101,102, 32, 40,109,111, - 100, 44,116,121,112,101, 41, 10, 32,114,101,116,117,114,110, - 32, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, - 46, 99,117,114,114, 58, 97,112,112,108,121,116,121,112,101, - 100,101,102, 40,109,111,100, 44,116,121,112,101, 41, 10,101, - 110,100, 10, 10, 45, 45, 32, 99,104,101, 99,107, 32,105,102, - 32,105,115, 32,116,121,112,101, 10,102,117,110, 99,116,105, - 111,110, 32,102,105,110,100,116,121,112,101, 32, 40,116,121, - 112,101, 41, 10, 32,108,111, 99, 97,108, 32,116, 32, 61, 32, - 99,108, 97,115,115, 67,111,110,116, 97,105,110,101,114, 46, - 99,117,114,114, 58,102,105,110,100,116,121,112,101, 40,116, - 121,112,101, 41, 10, 9,114,101,116,117,114,110, 32,116, 10, - 101,110,100, 10, 10, 45, 45, 32, 99,104,101, 99,107, 32,105, - 102, 32,105,115, 32,116,121,112,101,100,101,102, 10,102,117, - 110, 99,116,105,111,110, 32,105,115,116,121,112,101,100,101, - 102, 32, 40,116,121,112,101, 41, 10, 32,114,101,116,117,114, - 110, 32, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101, - 114, 46, 99,117,114,114, 58,105,115,116,121,112,101,100,101, - 102, 40,116,121,112,101, 41, 10,101,110,100, 10, 10, 45, 45, - 32,103,101,116, 32,102,117,108,108,116,121,112,101, 32, 40, - 119,105,116,104, 32,110, 97,109,101,115,112, 97, 99,101, 41, - 10,102,117,110, 99,116,105,111,110, 32,102,117,108,108,116, - 121,112,101, 32, 40,116, 41, 10, 32,108,111, 99, 97,108, 32, - 99,117,114,114, 32, 61, 32, 32, 99,108, 97,115,115, 67,111, - 110,116, 97,105,110,101,114, 46, 99,117,114,114, 10, 9,119, - 104,105,108,101, 32, 99,117,114,114, 32,100,111, 10, 9, 32, - 105,102, 32, 99,117,114,114, 32,116,104,101,110, 10, 9, 9, - 32,105,102, 32, 99,117,114,114, 46,116,121,112,101,100,101, - 102,115, 32, 97,110,100, 32, 99,117,114,114, 46,116,121,112, - 101,100,101,102,115, 91,116, 93, 32,116,104,101,110, 10, 9, - 9, 32, 32,114,101,116,117,114,110, 32, 99,117,114,114, 46, - 116,121,112,101,100,101,102,115, 91,116, 93, 10, 9, 9, 32, - 101,108,115,101,105,102, 32, 99,117,114,114, 46,117,115,101, - 114,116,121,112,101,115, 32, 97,110,100, 32, 99,117,114,114, - 46,117,115,101,114,116,121,112,101,115, 91,116, 93, 32,116, - 104,101,110, 10, 9, 9, 32, 32,114,101,116,117,114,110, 32, - 99,117,114,114, 46,117,115,101,114,116,121,112,101,115, 91, - 116, 93, 10, 9, 9, 9,101,110,100, 10, 9, 9,101,110,100, - 10, 9, 32, 99,117,114,114, 32, 61, 32, 99,117,114,114, 46, - 112,114,111,120, 10, 9,101,110,100, 10, 9,114,101,116,117, - 114,110, 32,116, 10,101,110,100, 10, 10, 45, 45, 32, 99,104, - 101, 99,107,115, 32,105,102, 32,105,116, 32,114,101,113,117, - 105,114,101,115, 32, 99,111,108,108,101, 99,116,105,111,110, - 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, - 67,111,110,116, 97,105,110,101,114, 58,114,101,113,117,105, - 114,101, 99,111,108,108,101, 99,116,105,111,110, 32, 40,116, - 41, 10, 32,112,117,115,104, 40,115,101,108,102, 41, 10, 32, - 108,111, 99, 97,108, 32,105, 61, 49, 10, 9,108,111, 99, 97, - 108, 32,114, 32, 61, 32,102, 97,108,115,101, 10, 32,119,104, - 105,108,101, 32,115,101,108,102, 91,105, 93, 32,100,111, 10, - 32, 32,114, 32, 61, 32,115,101,108,102, 91,105, 93, 58,114, - 101,113,117,105,114,101, 99,111,108,108,101, 99,116,105,111, - 110, 40,116, 41, 32,111,114, 32,114, 10, 32, 32,105, 32, 61, - 32,105, 43, 49, 10, 32,101,110,100, 10, 9,112,111,112, 40, - 41, 10, 9,114,101,116,117,114,110, 32,114, 10,101,110,100, - 10, 10, 10, 45, 45, 32,103,101,116, 32,110, 97,109,101,115, - 97,112, 99,101, 10,102,117,110, 99,116,105,111,110, 32,103, - 101,116,110, 97,109,101,115,112, 97, 99,101, 32, 40, 99,117, - 114,114, 41, 10, 9,108,111, 99, 97,108, 32,110, 97,109,101, - 115,112, 97, 99,101, 32, 61, 32, 39, 39, 10, 9,119,104,105, - 108,101, 32, 99,117,114,114, 32,100,111, 10, 9, 32,105,102, - 32, 99,117,114,114, 32, 97,110,100, 10, 9, 9, 32, 32, 32, - 40, 32, 99,117,114,114, 46, 99,108, 97,115,115,116,121,112, - 101, 32, 61, 61, 32, 39, 99,108, 97,115,115, 39, 32,111,114, - 32, 99,117,114,114, 46, 99,108, 97,115,115,116,121,112,101, - 32, 61, 61, 32, 39,110, 97,109,101,115,112, 97, 99,101, 39, - 41, 10, 9, 9,116,104,101,110, 10, 9, 9, 32,110, 97,109, - 101,115,112, 97, 99,101, 32, 61, 32, 40, 99,117,114,114, 46, - 111,114,105,103,105,110, 97,108, 95,110, 97,109,101, 32,111, - 114, 32, 99,117,114,114, 46,110, 97,109,101, 41, 32, 46, 46, - 32, 39, 58, 58, 39, 32, 46, 46, 32,110, 97,109,101,115,112, - 97, 99,101, 10, 9, 9, 32, 45, 45,110, 97,109,101,115,112, - 97, 99,101, 32, 61, 32, 99,117,114,114, 46,110, 97,109,101, - 32, 46, 46, 32, 39, 58, 58, 39, 32, 46, 46, 32,110, 97,109, - 101,115,112, 97, 99,101, 10, 9, 9,101,110,100, 10, 9, 32, - 99,117,114,114, 32, 61, 32, 99,117,114,114, 46,112,114,111, - 120, 10, 9,101,110,100, 10, 9,114,101,116,117,114,110, 32, - 110, 97,109,101,115,112, 97, 99,101, 10,101,110,100, 10, 10, - 45, 45, 32,103,101,116, 32,110, 97,109,101,115,112, 97, 99, - 101, 32, 40,111,110,108,121, 32,110, 97,109,101,115,112, 97, - 99,101, 41, 10,102,117,110, 99,116,105,111,110, 32,103,101, - 116,111,110,108,121,110, 97,109,101,115,112, 97, 99,101, 32, - 40, 41, 10, 32,108,111, 99, 97,108, 32, 99,117,114,114, 32, - 61, 32, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101, - 114, 46, 99,117,114,114, 10, 9,108,111, 99, 97,108, 32,110, - 97,109,101,115,112, 97, 99,101, 32, 61, 32, 39, 39, 10, 9, - 119,104,105,108,101, 32, 99,117,114,114, 32,100,111, 10, 9, - 9,105,102, 32, 99,117,114,114, 46, 99,108, 97,115,115,116, - 121,112,101, 32, 61, 61, 32, 39, 99,108, 97,115,115, 39, 32, - 116,104,101,110, 10, 9, 9, 32,114,101,116,117,114,110, 32, - 110, 97,109,101,115,112, 97, 99,101, 10, 9, 9,101,108,115, - 101,105,102, 32, 99,117,114,114, 46, 99,108, 97,115,115,116, - 121,112,101, 32, 61, 61, 32, 39,110, 97,109,101,115,112, 97, - 99,101, 39, 32,116,104,101,110, 10, 9, 9, 32,110, 97,109, - 101,115,112, 97, 99,101, 32, 61, 32, 99,117,114,114, 46,110, - 97,109,101, 32, 46, 46, 32, 39, 58, 58, 39, 32, 46, 46, 32, - 110, 97,109,101,115,112, 97, 99,101, 10, 9, 9,101,110,100, - 10, 9, 32, 99,117,114,114, 32, 61, 32, 99,117,114,114, 46, - 112,114,111,120, 10, 9,101,110,100, 10, 9,114,101,116,117, - 114,110, 32,110, 97,109,101,115,112, 97, 99,101, 10,101,110, - 100, 10, 10, 45, 45, 32, 99,104,101, 99,107, 32,105,102, 32, - 105,115, 32,101,110,117,109, 10,102,117,110, 99,116,105,111, - 110, 32,105,115,101,110,117,109, 32, 40,116,121,112,101, 41, - 10, 32,114,101,116,117,114,110, 32, 99,108, 97,115,115, 67, - 111,110,116, 97,105,110,101,114, 46, 99,117,114,114, 58,105, - 115,101,110,117,109, 40,116,121,112,101, 41, 10,101,110,100, - 10, 10, 45, 45, 32, 97,112,112,101,110,100, 32,102,101, 97, - 116,117,114,101, 32,116,111, 32, 99,111,110,116, 97,105,110, - 101,114, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97, - 115,115, 67,111,110,116, 97,105,110,101,114, 58, 97,112,112, - 101,110,100, 32, 40,116, 41, 10, 32,115,101,108,102, 46,110, - 32, 61, 32,115,101,108,102, 46,110, 32, 43, 32, 49, 10, 32, - 115,101,108,102, 91,115,101,108,102, 46,110, 93, 32, 61, 32, - 116, 10, 32,116, 46,112, 97,114,101,110,116, 32, 61, 32,115, - 101,108,102, 10,101,110,100, 10, 10, 45, 45, 32, 97,112,112, - 101,110,100, 32,116,121,112,101,100,101,102, 10,102,117,110, - 99,116,105,111,110, 32, 99,108, 97,115,115, 67,111,110,116, - 97,105,110,101,114, 58, 97,112,112,101,110,100,116,121,112, - 101,100,101,102, 32, 40,116, 41, 10, 32,108,111, 99, 97,108, - 32,110, 97,109,101,115,112, 97, 99,101, 32, 61, 32,103,101, - 116,110, 97,109,101,115,112, 97, 99,101, 40, 99,108, 97,115, - 115, 67,111,110,116, 97,105,110,101,114, 46, 99,117,114,114, - 41, 10, 32,115,101,108,102, 46,116,121,112,101,100,101,102, - 115, 46,116,111,108,117, 97, 95,110, 32, 61, 32,115,101,108, - 102, 46,116,121,112,101,100,101,102,115, 46,116,111,108,117, - 97, 95,110, 32, 43, 32, 49, 10, 32,115,101,108,102, 46,116, - 121,112,101,100,101,102,115, 91,115,101,108,102, 46,116,121, - 112,101,100,101,102,115, 46,116,111,108,117, 97, 95,110, 93, - 32, 61, 32,116, 10, 9,115,101,108,102, 46,116,121,112,101, - 100,101,102,115, 91,116, 46,117,116,121,112,101, 93, 32, 61, - 32,110, 97,109,101,115,112, 97, 99,101, 32, 46, 46, 32,116, - 46,117,116,121,112,101, 10, 9,103,108,111, 98, 97,108, 95, - 116,121,112,101,100,101,102,115, 91,110, 97,109,101,115,112, - 97, 99,101, 46, 46,116, 46,117,116,121,112,101, 93, 32, 61, - 32,116, 10, 9,116, 46,102,116,121,112,101, 32, 61, 32,102, - 105,110,100,116,121,112,101, 40,116, 46,116,121,112,101, 41, - 32,111,114, 32,116, 46,116,121,112,101, 10, 9, 45, 45,112, - 114,105,110,116, 40, 34, 97,112,112,101,110,100,105,110,103, - 32,116,121,112,101,100,101,102, 32, 34, 46, 46,116, 46,117, - 116,121,112,101, 46, 46, 34, 32, 97,115, 32, 34, 46, 46,110, - 97,109,101,115,112, 97, 99,101, 46, 46,116, 46,117,116,121, - 112,101, 46, 46, 34, 32,119,105,116,104, 32,102,116,121,112, - 101, 32, 34, 46, 46,116, 46,102,116,121,112,101, 41, 10, 9, - 97,112,112,101,110,100, 95,103,108,111, 98, 97,108, 95,116, - 121,112,101, 40,110, 97,109,101,115,112, 97, 99,101, 46, 46, - 116, 46,117,116,121,112,101, 41, 10, 9,105,102, 32,116, 46, - 102,116,121,112,101, 32, 97,110,100, 32,105,115,101,110,117, - 109, 40,116, 46,102,116,121,112,101, 41, 32,116,104,101,110, - 10, 10, 9, 9,103,108,111, 98, 97,108, 95,101,110,117,109, - 115, 91,110, 97,109,101,115,112, 97, 99,101, 46, 46,116, 46, - 117,116,121,112,101, 93, 32, 61, 32,116,114,117,101, 10, 9, - 101,110,100, 10,101,110,100, 10, 10, 45, 45, 32, 97,112,112, - 101,110,100, 32,117,115,101,114,116,121,112,101, 58, 32,114, - 101,116,117,114,110, 32,102,117,108,108, 32,116,121,112,101, - 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, - 67,111,110,116, 97,105,110,101,114, 58, 97,112,112,101,110, - 100,117,115,101,114,116,121,112,101, 32, 40,116, 41, 10, 9, - 108,111, 99, 97,108, 32, 99,111,110,116, 97,105,110,101,114, - 10, 9,105,102, 32,116, 32, 61, 61, 32, 40,115,101,108,102, - 46,111,114,105,103,105,110, 97,108, 95,110, 97,109,101, 32, - 111,114, 32,115,101,108,102, 46,110, 97,109,101, 41, 32,116, - 104,101,110, 10, 9, 9, 99,111,110,116, 97,105,110,101,114, - 32, 61, 32,115,101,108,102, 46,112,114,111,120, 10, 9,101, - 108,115,101, 10, 9, 9, 99,111,110,116, 97,105,110,101,114, - 32, 61, 32,115,101,108,102, 10, 9,101,110,100, 10, 9,108, - 111, 99, 97,108, 32,102,116, 32, 61, 32,103,101,116,110, 97, - 109,101,115,112, 97, 99,101, 40, 99,111,110,116, 97,105,110, - 101,114, 41, 32, 46, 46, 32,116, 10, 9, 99,111,110,116, 97, - 105,110,101,114, 46,117,115,101,114,116,121,112,101,115, 91, - 116, 93, 32, 61, 32,102,116, 10, 9, 95,117,115,101,114,116, - 121,112,101, 91,102,116, 93, 32, 61, 32,102,116, 10, 9,114, - 101,116,117,114,110, 32,102,116, 10,101,110,100, 10, 10, 45, - 45, 32, 97,112,112,101,110,100, 32,101,110,117,109, 10,102, - 117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 67,111, - 110,116, 97,105,110,101,114, 58, 97,112,112,101,110,100,101, - 110,117,109, 32, 40,116, 41, 10, 32,108,111, 99, 97,108, 32, - 110, 97,109,101,115,112, 97, 99,101, 32, 61, 32,103,101,116, - 110, 97,109,101,115,112, 97, 99,101, 40, 99,108, 97,115,115, - 67,111,110,116, 97,105,110,101,114, 46, 99,117,114,114, 41, - 10, 32,115,101,108,102, 46,101,110,117,109,115, 46,116,111, - 108,117, 97, 95,110, 32, 61, 32,115,101,108,102, 46,101,110, - 117,109,115, 46,116,111,108,117, 97, 95,110, 32, 43, 32, 49, - 10, 32,115,101,108,102, 46,101,110,117,109,115, 91,115,101, - 108,102, 46,101,110,117,109,115, 46,116,111,108,117, 97, 95, - 110, 93, 32, 61, 32,116, 10, 9,103,108,111, 98, 97,108, 95, - 101,110,117,109,115, 91,110, 97,109,101,115,112, 97, 99,101, - 46, 46,116, 46,110, 97,109,101, 93, 32, 61, 32,116, 10,101, - 110,100, 10, 10, 45, 45, 32,100,101,116,101,114,109,105,110, - 101, 32,108,117, 97, 32,102,117,110, 99,116,105,111,110, 32, - 110, 97,109,101, 32,111,118,101,114,108,111, 97,100, 10,102, - 117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 67,111, - 110,116, 97,105,110,101,114, 58,111,118,101,114,108,111, 97, - 100, 32, 40,108,110, 97,109,101, 41, 10, 32,105,102, 32,110, - 111,116, 32,115,101,108,102, 46,108,110, 97,109,101,115, 91, - 108,110, 97,109,101, 93, 32,116,104,101,110, 10, 32, 32,115, - 101,108,102, 46,108,110, 97,109,101,115, 91,108,110, 97,109, - 101, 93, 32, 61, 32, 48, 10, 32,101,108,115,101, 10, 32, 32, - 115,101,108,102, 46,108,110, 97,109,101,115, 91,108,110, 97, - 109,101, 93, 32, 61, 32,115,101,108,102, 46,108,110, 97,109, - 101,115, 91,108,110, 97,109,101, 93, 32, 43, 32, 49, 10, 32, - 101,110,100, 10, 32,114,101,116,117,114,110, 32,102,111,114, - 109, 97,116, 40, 34, 37, 48, 50,100, 34, 44,115,101,108,102, - 46,108,110, 97,109,101,115, 91,108,110, 97,109,101, 93, 41, - 10,101,110,100, 10, 10, 45, 45, 32, 97,112,112,108,105,101, - 115, 32,116,121,112,101,100,101,102, 58, 32,114,101,116,117, - 114,110,115, 32,116,104,101, 32, 39,116,104,101, 32,102, 97, - 99,116,111, 39, 32,109,111,100,105,102,105,101,114, 32, 97, - 110,100, 32,116,121,112,101, 10,102,117,110, 99,116,105,111, - 110, 32, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101, - 114, 58, 97,112,112,108,121,116,121,112,101,100,101,102, 32, - 40,109,111,100, 44,116,121,112,101, 41, 10, 9,105,102, 32, - 103,108,111, 98, 97,108, 95,116,121,112,101,100,101,102,115, - 91,116,121,112,101, 93, 32,116,104,101,110, 10, 9, 9, 45, - 45,112,114,105,110,116, 40, 34,102,111,117,110,100, 32,116, - 121,112,101,100,101,102, 32, 34, 46, 46,103,108,111, 98, 97, - 108, 95,116,121,112,101,100,101,102,115, 91,116,121,112,101, - 93, 46,116,121,112,101, 41, 10, 9, 9,108,111, 99, 97,108, - 32,109,111,100, 49, 44, 32,116,121,112,101, 49, 32, 61, 32, - 103,108,111, 98, 97,108, 95,116,121,112,101,100,101,102,115, - 91,116,121,112,101, 93, 46,109,111,100, 44, 32,103,108,111, - 98, 97,108, 95,116,121,112,101,100,101,102,115, 91,116,121, - 112,101, 93, 46,102,116,121,112,101, 10, 9, 9,108,111, 99, - 97,108, 32,109,111,100, 50, 44, 32,116,121,112,101, 50, 32, - 61, 32, 97,112,112,108,121,116,121,112,101,100,101,102, 40, - 109,111,100, 46, 46, 34, 32, 34, 46, 46,109,111,100, 49, 44, - 32,116,121,112,101, 49, 41, 10, 9, 9, 45, 45,114,101,116, - 117,114,110, 32,109,111,100, 50, 32, 46, 46, 32, 39, 32, 39, - 32, 46, 46, 32,109,111,100, 49, 44, 32,116,121,112,101, 50, - 10, 9, 9,114,101,116,117,114,110, 32,109,111,100, 50, 44, - 32,116,121,112,101, 50, 10, 9,101,110,100, 10, 9,100,111, - 32,114,101,116,117,114,110, 32,109,111,100, 44,116,121,112, - 101, 32,101,110,100, 10,101,110,100, 10, 10, 45, 45, 32, 99, - 104,101, 99,107, 32,105,102, 32,105,116, 32,105,115, 32, 97, - 32,116,121,112,101,100,101,102, 10,102,117,110, 99,116,105, - 111,110, 32, 99,108, 97,115,115, 67,111,110,116, 97,105,110, - 101,114, 58,105,115,116,121,112,101,100,101,102, 32, 40,116, - 121,112,101, 41, 10, 32,108,111, 99, 97,108, 32,101,110,118, - 32, 61, 32,115,101,108,102, 10, 32,119,104,105,108,101, 32, - 101,110,118, 32,100,111, 10, 32, 32,105,102, 32,101,110,118, - 46,116,121,112,101,100,101,102,115, 32,116,104,101,110, 10, - 32, 32, 32,108,111, 99, 97,108, 32,105, 61, 49, 10, 32, 32, - 32,119,104,105,108,101, 32,101,110,118, 46,116,121,112,101, - 100,101,102,115, 91,105, 93, 32,100,111, 10, 32, 32, 32, 32, - 105,102, 32,101,110,118, 46,116,121,112,101,100,101,102,115, - 91,105, 93, 46,117,116,121,112,101, 32, 61, 61, 32,116,121, - 112,101, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, - 32, 32,114,101,116,117,114,110, 32,116,121,112,101, 10, 32, - 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, - 32, 32, 32, 32,105, 32, 61, 32,105, 43, 49, 10, 32, 32, 32, - 101,110,100, 10, 32, 32,101,110,100, 10, 32, 32,101,110,118, - 32, 61, 32,101,110,118, 46,112, 97,114,101,110,116, 10, 32, - 101,110,100, 10, 32,114,101,116,117,114,110, 32,110,105,108, - 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32, - 102,105,110,100, 95,101,110,117,109, 95,118, 97,114, 40,118, - 97,114, 41, 10, 10, 9,105,102, 32,116,111,110,117,109, 98, - 101,114, 40,118, 97,114, 41, 32,116,104,101,110, 32,114,101, - 116,117,114,110, 32,118, 97,114, 32,101,110,100, 10, 10, 9, - 108,111, 99, 97,108, 32, 99, 32, 61, 32, 99,108, 97,115,115, - 67,111,110,116, 97,105,110,101,114, 46, 99,117,114,114, 10, - 9,119,104,105,108,101, 32, 99, 32,100,111, 10, 9, 9,108, - 111, 99, 97,108, 32,110,115, 32, 61, 32,103,101,116,110, 97, - 109,101,115,112, 97, 99,101, 40, 99, 41, 10, 9, 9,102,111, - 114, 32,107, 44,118, 32,105,110, 32,112, 97,105,114,115, 40, - 95,103,108,111, 98, 97,108, 95,101,110,117,109,115, 41, 32, - 100,111, 10, 9, 9, 9,105,102, 32,109, 97,116, 99,104, 95, - 116,121,112,101, 40,118, 97,114, 44, 32,118, 44, 32,110,115, - 41, 32,116,104,101,110, 10, 9, 9, 9, 9,114,101,116,117, - 114,110, 32,118, 10, 9, 9, 9,101,110,100, 10, 9, 9,101, - 110,100, 10, 9, 9,105,102, 32, 99, 46, 98, 97,115,101, 32, - 97,110,100, 32, 99, 46, 98, 97,115,101, 32,126, 61, 32, 39, - 39, 32,116,104,101,110, 10, 9, 9, 9, 99, 32, 61, 32, 95, - 103,108,111, 98, 97,108, 95, 99,108, 97,115,115,101,115, 91, - 99, 58,102,105,110,100,116,121,112,101, 40, 99, 46, 98, 97, - 115,101, 41, 93, 10, 9, 9,101,108,115,101, 10, 9, 9, 9, - 99, 32, 61, 32,110,105,108, 10, 9, 9,101,110,100, 10, 9, - 101,110,100, 10, 10, 9,114,101,116,117,114,110, 32,118, 97, - 114, 10,101,110,100, 10, 10, 45, 45, 32, 99,104,101, 99,107, - 32,105,102, 32,105,115, 32, 97, 32,114,101,103,105,115,116, - 101,114,101,100, 32,116,121,112,101, 58, 32,114,101,116,117, - 114,110, 32,102,117,108,108, 32,116,121,112,101, 32,111,114, - 32,110,105,108, 10,102,117,110, 99,116,105,111,110, 32, 99, - 108, 97,115,115, 67,111,110,116, 97,105,110,101,114, 58,102, - 105,110,100,116,121,112,101, 32, 40,116, 41, 10, 10, 9,116, - 32, 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40, - 116, 44, 32, 34, 61, 46, 42, 34, 44, 32, 34, 34, 41, 10, 9, - 105,102, 32, 95, 98, 97,115,105, 99, 91,116, 93, 32,116,104, - 101,110, 10, 9, 32,114,101,116,117,114,110, 32,116, 10, 9, - 101,110,100, 10, 10, 9,108,111, 99, 97,108, 32, 95, 44, 95, - 44,101,109, 32, 61, 32,115,116,114,105,110,103, 46,102,105, - 110,100, 40,116, 44, 32, 34, 40, 91, 38, 37, 42, 93, 41, 37, - 115, 42, 36, 34, 41, 10, 9,116, 32, 61, 32,115,116,114,105, - 110,103, 46,103,115,117, 98, 40,116, 44, 32, 34, 37,115, 42, - 40, 91, 38, 37, 42, 93, 41, 37,115, 42, 36, 34, 44, 32, 34, - 34, 41, 10, 9,112, 32, 61, 32,115,101,108,102, 10, 9,119, - 104,105,108,101, 32,112, 32, 97,110,100, 32,116,121,112,101, - 40,112, 41, 61, 61, 39,116, 97, 98,108,101, 39, 32,100,111, - 10, 9, 9,108,111, 99, 97,108, 32,115,116, 32, 61, 32,103, - 101,116,110, 97,109,101,115,112, 97, 99,101, 40,112, 41, 10, - 10, 9, 9,102,111,114, 32,105, 61, 95,103,108,111, 98, 97, - 108, 95,116,121,112,101,115, 46,110, 44, 49, 44, 45, 49, 32, - 100,111, 32, 45, 45, 32,105,110, 32,114,101,118,101,114,115, - 101, 32,111,114,100,101,114, 10, 10, 9, 9, 9,105,102, 32, - 109, 97,116, 99,104, 95,116,121,112,101, 40,116, 44, 32, 95, - 103,108,111, 98, 97,108, 95,116,121,112,101,115, 91,105, 93, - 44, 32,115,116, 41, 32,116,104,101,110, 10, 9, 9, 9, 9, - 114,101,116,117,114,110, 32, 95,103,108,111, 98, 97,108, 95, - 116,121,112,101,115, 91,105, 93, 46, 46, 40,101,109, 32,111, - 114, 32, 34, 34, 41, 10, 9, 9, 9,101,110,100, 10, 9, 9, - 101,110,100, 10, 9, 9,105,102, 32,112, 46, 98, 97,115,101, - 32, 97,110,100, 32,112, 46, 98, 97,115,101, 32,126, 61, 32, - 39, 39, 32, 97,110,100, 32,112, 46, 98, 97,115,101, 32,126, - 61, 32,116, 32,116,104,101,110, 10, 9, 9, 9, 45, 45,112, - 114,105,110,116, 40, 34,116,121,112,101, 32,105,115, 32, 34, - 46, 46,116, 46, 46, 34, 44, 32,112, 32,105,115, 32, 34, 46, - 46,112, 46, 98, 97,115,101, 46, 46, 34, 32,115,101,108,102, - 46,116,121,112,101, 32,105,115, 32, 34, 46, 46,115,101,108, - 102, 46,116,121,112,101, 46, 46, 34, 32,115,101,108,102, 46, - 110, 97,109,101, 32,105,115, 32, 34, 46, 46,115,101,108,102, - 46,110, 97,109,101, 41, 10, 9, 9, 9,112, 32, 61, 32, 95, - 103,108,111, 98, 97,108, 95, 99,108, 97,115,115,101,115, 91, - 112, 58,102,105,110,100,116,121,112,101, 40,112, 46, 98, 97, - 115,101, 41, 93, 10, 9, 9,101,108,115,101, 10, 9, 9, 9, - 112, 32, 61, 32,110,105,108, 10, 9, 9,101,110,100, 10, 9, - 101,110,100, 10, 10, 9,114,101,116,117,114,110, 32,110,105, - 108, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, - 32, 97,112,112,101,110,100, 95,103,108,111, 98, 97,108, 95, - 116,121,112,101, 40,116, 44, 32, 99,108, 97,115,115, 41, 10, - 9, 95,103,108,111, 98, 97,108, 95,116,121,112,101,115, 46, - 110, 32, 61, 32, 95,103,108,111, 98, 97,108, 95,116,121,112, - 101,115, 46,110, 32, 43, 49, 10, 9, 95,103,108,111, 98, 97, - 108, 95,116,121,112,101,115, 91, 95,103,108,111, 98, 97,108, - 95,116,121,112,101,115, 46,110, 93, 32, 61, 32,116, 10, 9, - 95,103,108,111, 98, 97,108, 95,116,121,112,101,115, 95,104, - 97,115,104, 91,116, 93, 32, 61, 32, 49, 10, 9,105,102, 32, - 99,108, 97,115,115, 32,116,104,101,110, 32, 97,112,112,101, - 110,100, 95, 99,108, 97,115,115, 95,116,121,112,101, 40,116, - 44, 32, 99,108, 97,115,115, 41, 32,101,110,100, 10,101,110, - 100, 10, 10,102,117,110, 99,116,105,111,110, 32, 97,112,112, - 101,110,100, 95, 99,108, 97,115,115, 95,116,121,112,101, 40, - 116, 44, 99,108, 97,115,115, 41, 10, 9,105,102, 32, 95,103, - 108,111, 98, 97,108, 95, 99,108, 97,115,115,101,115, 91,116, - 93, 32,116,104,101,110, 10, 9, 9, 99,108, 97,115,115, 46, - 102,108, 97,103,115, 32, 61, 32, 95,103,108,111, 98, 97,108, - 95, 99,108, 97,115,115,101,115, 91,116, 93, 46,102,108, 97, - 103,115, 10, 9, 9, 99,108, 97,115,115, 46,108,110, 97,109, - 101,115, 32, 61, 32, 95,103,108,111, 98, 97,108, 95, 99,108, - 97,115,115,101,115, 91,116, 93, 46,108,110, 97,109,101,115, - 10, 9, 9,105,102, 32, 95,103,108,111, 98, 97,108, 95, 99, - 108, 97,115,115,101,115, 91,116, 93, 46, 98, 97,115,101, 32, - 97,110,100, 32, 40, 95,103,108,111, 98, 97,108, 95, 99,108, - 97,115,115,101,115, 91,116, 93, 46, 98, 97,115,101, 32,126, - 61, 32, 39, 39, 41, 32,116,104,101,110, 10, 9, 9, 9, 99, - 108, 97,115,115, 46, 98, 97,115,101, 32, 61, 32, 95,103,108, - 111, 98, 97,108, 95, 99,108, 97,115,115,101,115, 91,116, 93, - 46, 98, 97,115,101, 32,111,114, 32, 99,108, 97,115,115, 46, - 98, 97,115,101, 10, 9, 9,101,110,100, 10, 9,101,110,100, - 10, 9, 95,103,108,111, 98, 97,108, 95, 99,108, 97,115,115, - 101,115, 91,116, 93, 32, 61, 32, 99,108, 97,115,115, 10, 9, - 99,108, 97,115,115, 46,102,108, 97,103,115, 32, 61, 32, 99, - 108, 97,115,115, 46,102,108, 97,103,115, 32,111,114, 32,123, - 125, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, - 32,109, 97,116, 99,104, 95,116,121,112,101, 40, 99,104,105, - 108,100,116,121,112,101, 44, 32,114,101,103,116,121,112,101, - 44, 32,115,116, 41, 10, 45, 45,112,114,105,110,116, 40, 34, - 102,105,110,100,116,121,112,101, 32, 34, 46, 46, 99,104,105, - 108,100,116,121,112,101, 46, 46, 34, 44, 32, 34, 46, 46,114, - 101,103,116,121,112,101, 46, 46, 34, 44, 32, 34, 46, 46,115, - 116, 41, 10, 9,108,111, 99, 97,108, 32, 98, 44,101, 32, 61, - 32,115,116,114,105,110,103, 46,102,105,110,100, 40,114,101, - 103,116,121,112,101, 44, 32, 99,104,105,108,100,116,121,112, - 101, 44, 32, 45,115,116,114,105,110,103, 46,108,101,110, 40, - 99,104,105,108,100,116,121,112,101, 41, 44, 32,116,114,117, - 101, 41, 10, 9,105,102, 32, 98, 32,116,104,101,110, 10, 10, - 9, 9,105,102, 32,101, 32, 61, 61, 32,115,116,114,105,110, - 103, 46,108,101,110, 40,114,101,103,116,121,112,101, 41, 32, - 97,110,100, 10, 9, 9, 9, 9, 40, 98, 32, 61, 61, 32, 49, - 32,111,114, 32, 40,115,116,114,105,110,103, 46,115,117, 98, - 40,114,101,103,116,121,112,101, 44, 32, 98, 45, 49, 44, 32, - 98, 45, 49, 41, 32, 61, 61, 32, 39, 58, 39, 32, 97,110,100, - 10, 9, 9, 9, 9,115,116,114,105,110,103, 46,115,117, 98, - 40,114,101,103,116,121,112,101, 44, 32, 49, 44, 32, 98, 45, - 49, 41, 32, 61, 61, 32,115,116,114,105,110,103, 46,115,117, - 98, 40,115,116, 44, 32, 49, 44, 32, 98, 45, 49, 41, 41, 41, - 32,116,104,101,110, 10, 9, 9, 9,114,101,116,117,114,110, - 32,116,114,117,101, 10, 9, 9,101,110,100, 10, 9,101,110, - 100, 10, 10, 9,114,101,116,117,114,110, 32,102, 97,108,115, - 101, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, - 32,102,105,110,100,116,121,112,101, 95,111,110, 95, 99,104, - 105,108,100,115, 40,115,101,108,102, 44, 32,116, 41, 10, 10, - 9,108,111, 99, 97,108, 32,116, 99,104,105,108,100, 10, 9, - 105,102, 32,115,101,108,102, 46, 99,108, 97,115,115,116,121, - 112,101, 32, 61, 61, 32, 39, 99,108, 97,115,115, 39, 32,111, - 114, 32,115,101,108,102, 46, 99,108, 97,115,115,116,121,112, - 101, 32, 61, 61, 32, 39,110, 97,109,101,115,112, 97, 99,101, - 39, 32,116,104,101,110, 10, 9, 9,102,111,114, 32,107, 44, - 118, 32,105,110, 32,105,112, 97,105,114,115, 40,115,101,108, - 102, 41, 32,100,111, 10, 9, 9, 9,105,102, 32,118, 46, 99, - 108, 97,115,115,116,121,112,101, 32, 61, 61, 32, 39, 99,108, - 97,115,115, 39, 32,111,114, 32,118, 46, 99,108, 97,115,115, - 116,121,112,101, 32, 61, 61, 32, 39,110, 97,109,101,115,112, - 97, 99,101, 39, 32,116,104,101,110, 10, 9, 9, 9, 9,105, - 102, 32,118, 46,116,121,112,101,100,101,102,115, 32, 97,110, - 100, 32,118, 46,116,121,112,101,100,101,102,115, 91,116, 93, - 32,116,104,101,110, 10, 9, 9, 9, 9, 32,114,101,116,117, - 114,110, 32,118, 46,116,121,112,101,100,101,102,115, 91,116, - 93, 10, 9, 9, 9, 9,101,108,115,101,105,102, 32,118, 46, - 117,115,101,114,116,121,112,101,115, 32, 97,110,100, 32,118, - 46,117,115,101,114,116,121,112,101,115, 91,116, 93, 32,116, - 104,101,110, 10, 9, 9, 9, 9, 32,114,101,116,117,114,110, - 32,118, 46,117,115,101,114,116,121,112,101,115, 91,116, 93, - 10, 9, 9, 9, 9,101,110,100, 10, 9, 9, 9, 9,116, 99, - 104,105,108,100, 32, 61, 32,102,105,110,100,116,121,112,101, - 95,111,110, 95, 99,104,105,108,100,115, 40,118, 44, 32,116, - 41, 10, 9, 9, 9, 9,105,102, 32,116, 99,104,105,108,100, - 32,116,104,101,110, 32,114,101,116,117,114,110, 32,116, 99, - 104,105,108,100, 32,101,110,100, 10, 9, 9, 9,101,110,100, - 10, 9, 9,101,110,100, 10, 9,101,110,100, 10, 9,114,101, - 116,117,114,110, 32,110,105,108, 10, 10,101,110,100, 10, 10, - 102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 67, - 111,110,116, 97,105,110,101,114, 58,105,115,101,110,117,109, - 32, 40,116,121,112,101, 41, 10, 32,105,102, 32,103,108,111, - 98, 97,108, 95,101,110,117,109,115, 91,116,121,112,101, 93, - 32,116,104,101,110, 10, 9,114,101,116,117,114,110, 32,116, - 121,112,101, 10, 32,101,108,115,101, 10, 32, 9,114,101,116, - 117,114,110, 32,102, 97,108,115,101, 10, 32,101,110,100, 10, - 10, 32,108,111, 99, 97,108, 32, 98, 97,115,101,116,121,112, - 101, 32, 61, 32,103,115,117, 98, 40,116,121,112,101, 44, 34, - 94, 46, 42, 58, 58, 34, 44, 34, 34, 41, 10, 32,108,111, 99, - 97,108, 32,101,110,118, 32, 61, 32,115,101,108,102, 10, 32, - 119,104,105,108,101, 32,101,110,118, 32,100,111, 10, 32, 32, - 105,102, 32,101,110,118, 46,101,110,117,109,115, 32,116,104, - 101,110, 10, 32, 32, 32,108,111, 99, 97,108, 32,105, 61, 49, - 10, 32, 32, 32,119,104,105,108,101, 32,101,110,118, 46,101, - 110,117,109,115, 91,105, 93, 32,100,111, 10, 32, 32, 32, 32, - 105,102, 32,101,110,118, 46,101,110,117,109,115, 91,105, 93, - 46,110, 97,109,101, 32, 61, 61, 32, 98, 97,115,101,116,121, - 112,101, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, - 32, 32,114,101,116,117,114,110, 32,116,114,117,101, 10, 32, - 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, - 32, 32, 32, 32,105, 32, 61, 32,105, 43, 49, 10, 32, 32, 32, - 101,110,100, 10, 32, 32,101,110,100, 10, 32, 32,101,110,118, - 32, 61, 32,101,110,118, 46,112, 97,114,101,110,116, 10, 32, - 101,110,100, 10, 32,114,101,116,117,114,110, 32,102, 97,108, - 115,101, 10,101,110,100, 10, 10,109,101,116,104,111,100,105, - 115,118,105,114,116,117, 97,108, 32, 61, 32,102, 97,108,115, - 101, 32, 45, 45, 32, 97, 32,103,108,111, 98, 97,108, 10, 10, - 45, 45, 32,112, 97,114,115,101, 32, 99,104,117,110,107, 10, - 102,117,110, 99,116,105,111,110, 32, 99,108, 97,115,115, 67, - 111,110,116, 97,105,110,101,114, 58,100,111,112, 97,114,115, - 101, 32, 40,115, 41, 10, 45, 45,112,114,105,110,116, 32, 40, - 34,112, 97,114,115,101, 32, 34, 46, 46,115, 41, 10, 10, 32, - 45, 45, 32,116,114,121, 32,116,104,101, 32,112, 97,114,115, - 101,114, 32,104,111,111,107, 10, 32,100,111, 10, 32, 9,108, - 111, 99, 97,108, 32,115,117, 98, 32, 61, 32,112, 97,114,115, - 101,114, 95,104,111,111,107, 40,115, 41, 10, 32, 9,105,102, - 32,115,117, 98, 32,116,104,101,110, 10, 32, 9, 9,114,101, - 116,117,114,110, 32,115,117, 98, 10, 32, 9,101,110,100, 10, - 32,101,110,100, 10, 10, 32, 45, 45, 32,116,114,121, 32,116, - 104,101, 32,110,117,108,108, 32,115,116, 97,116,101,109,101, - 110,116, 10, 32,100,111, 10, 32, 9,108,111, 99, 97,108, 32, - 98, 44,101, 44, 99,111,100,101, 32, 61, 32,115,116,114,105, - 110,103, 46,102,105,110,100, 40,115, 44, 32, 34, 94, 37,115, - 42, 59, 34, 41, 10, 32, 9,105,102, 32, 98, 32,116,104,101, - 110, 10, 32, 9, 9,114,101,116,117,114,110, 32,115,116,114, - 115,117, 98, 40,115, 44,101, 43, 49, 41, 10, 32, 9,101,110, - 100, 10, 32,101,110,100, 10, 10, 32, 45, 45, 32,116,114,121, - 32,101,109,112,116,121, 32,118,101,114, 98, 97,116,105,109, - 32,108,105,110,101, 10, 32,100,111, 10, 32, 9,108,111, 99, - 97,108, 32, 98, 44,101, 44, 99,111,100,101, 32, 61, 32,115, - 116,114,105,110,103, 46,102,105,110,100, 40,115, 44, 32, 34, - 94, 37,115, 42, 36, 92,110, 34, 41, 10, 32, 9,105,102, 32, - 98, 32,116,104,101,110, 10, 32, 9, 9,114,101,116,117,114, - 110, 32,115,116,114,115,117, 98, 40,115, 44,101, 43, 49, 41, - 10, 32, 9,101,110,100, 10, 32,101,110,100, 10, 10, 32, 45, - 45, 32,116,114,121, 32, 76,117, 97, 32, 99,111,100,101, 10, - 32,100,111, 10, 32, 32,108,111, 99, 97,108, 32, 98, 44,101, - 44, 99,111,100,101, 32, 61, 32,115,116,114,102,105,110,100, - 40,115, 44, 34, 94, 37,115, 42, 40, 37, 98, 92, 49, 92, 50, - 41, 34, 41, 10, 32, 32,105,102, 32, 98, 32,116,104,101,110, - 10, 32, 32, 32, 67,111,100,101, 40,115,116,114,115,117, 98, - 40, 99,111,100,101, 44, 50, 44, 45, 50, 41, 41, 10, 32, 32, - 32,114,101,116,117,114,110, 32,115,116,114,115,117, 98, 40, - 115, 44,101, 43, 49, 41, 10, 32, 32,101,110,100, 10, 32,101, - 110,100, 10, 10, 32, 45, 45, 32,116,114,121, 32, 67, 32, 99, - 111,100,101, 10, 32,100,111, 10, 32, 32,108,111, 99, 97,108, - 32, 98, 44,101, 44, 99,111,100,101, 32, 61, 32,115,116,114, - 102,105,110,100, 40,115, 44, 34, 94, 37,115, 42, 40, 37, 98, - 92, 51, 92, 52, 41, 34, 41, 10, 32, 32,105,102, 32, 98, 32, - 116,104,101,110, 10, 9, 99,111,100,101, 32, 61, 32, 39,123, - 39, 46, 46,115,116,114,115,117, 98, 40, 99,111,100,101, 44, - 50, 44, 45, 50, 41, 46, 46, 39, 92,110,125, 92,110, 39, 10, - 9, 86,101,114, 98, 97,116,105,109, 40, 99,111,100,101, 44, - 39,114, 39, 41, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 32, - 118,101,114, 98, 97,116,105,109, 32, 99,111,100,101, 32,102, - 111,114, 32, 39,114, 39,101,103,105,115,116,101,114, 32,102, - 114, 97,103,109,101,110,116, 10, 9,114,101,116,117,114,110, - 32,115,116,114,115,117, 98, 40,115, 44,101, 43, 49, 41, 10, - 32, 32,101,110,100, 10, 32,101,110,100, 10, 10, 32, 45, 45, - 32,116,114,121, 32, 67, 32, 99,111,100,101, 32,102,111,114, - 32,112,114,101, 97,109, 98,108,101, 32,115,101, 99,116,105, - 111,110, 10, 32,100,111, 10, 32, 9,108,111, 99, 97,108, 32, - 98, 44,101, 44, 99,111,100,101, 32, 61, 32,115,116,114,105, - 110,103, 46,102,105,110,100, 40,115, 44, 32, 34, 94, 37,115, - 42, 40, 37, 98, 92, 53, 92, 54, 41, 34, 41, 10, 32, 9,105, - 102, 32, 98, 32,116,104,101,110, 10, 32, 9, 9, 99,111,100, - 101, 32, 61, 32,115,116,114,105,110,103, 46,115,117, 98, 40, - 99,111,100,101, 44, 32, 50, 44, 32, 45, 50, 41, 46, 46, 34, - 92,110, 34, 10, 9, 9, 86,101,114, 98, 97,116,105,109, 40, - 99,111,100,101, 44, 32, 39, 39, 41, 10, 9, 9,114,101,116, - 117,114,110, 32,115,116,114,105,110,103, 46,115,117, 98, 40, - 115, 44, 32,101, 43, 49, 41, 10, 32, 9,101,110,100, 10, 32, - 101,110,100, 10, 10, 32, 45, 45, 32,116,114,121, 32,100,101, - 102, 97,117,108,116, 95,112,114,111,112,101,114,116,121, 32, - 100,105,114,101, 99,116,105,118,101, 10, 32,100,111, 10, 32, - 9,108,111, 99, 97,108, 32, 98, 44,101, 44,112,116,121,112, - 101, 32, 61, 32,115,116,114,102,105,110,100, 40,115, 44, 32, - 34, 94, 37,115, 42, 84, 79, 76, 85, 65, 95, 80, 82, 79, 80, - 69, 82, 84, 89, 95, 84, 89, 80, 69, 37,115, 42, 37, 40, 43, - 37,115, 42, 40, 91, 94, 37, 41, 37,115, 93, 42, 41, 37,115, - 42, 37, 41, 43, 37,115, 42, 59, 63, 34, 41, 10, 32, 9,105, - 102, 32, 98, 32,116,104,101,110, 10, 32, 9, 9,105,102, 32, - 110,111,116, 32,112,116,121,112,101, 32,111,114, 32,112,116, - 121,112,101, 32, 61, 61, 32, 34, 34, 32,116,104,101,110, 10, - 32, 9, 9, 9,112,116,121,112,101, 32, 61, 32, 34,100,101, - 102, 97,117,108,116, 34, 10, 32, 9, 9,101,110,100, 10, 32, - 9, 9,115,101,108,102, 58,115,101,116, 95,112,114,111,112, - 101,114,116,121, 95,116,121,112,101, 40,112,116,121,112,101, - 41, 10, 9, 32, 9,114,101,116,117,114,110, 32,115,116,114, - 115,117, 98, 40,115, 44, 32,101, 43, 49, 41, 10, 32, 9,101, - 110,100, 10, 32,101,110,100, 10, 10, 32, 45, 45, 32,116,114, - 121, 32,112,114,111,116,101, 99,116,101,100, 95,100,101,115, - 116,114,117, 99,116,111,114, 32,100,105,114,101, 99,116,105, - 118,101, 10, 32,100,111, 10, 32, 9,108,111, 99, 97,108, 32, - 98, 44,101, 32, 61, 32,115,116,114,105,110,103, 46,102,105, - 110,100, 40,115, 44, 32, 34, 94, 37,115, 42, 84, 79, 76, 85, - 65, 95, 80, 82, 79, 84, 69, 67, 84, 69, 68, 95, 68, 69, 83, - 84, 82, 85, 67, 84, 79, 82, 37,115, 42, 59, 63, 34, 41, 10, - 9,105,102, 32, 98, 32,116,104,101,110, 10, 9, 9,105,102, - 32,115,101,108,102, 46,115,101,116, 95,112,114,111,116,101, - 99,116,101,100, 95,100,101,115,116,114,117, 99,116,111,114, - 32,116,104,101,110, 10, 9, 32, 9, 9,115,101,108,102, 58, - 115,101,116, 95,112,114,111,116,101, 99,116,101,100, 95,100, - 101,115,116,114,117, 99,116,111,114, 40,116,114,117,101, 41, - 10, 9, 32, 9,101,110,100, 10, 32, 9, 9,114,101,116,117, - 114,110, 32,115,116,114,115,117, 98, 40,115, 44, 32,101, 43, - 49, 41, 10, 32, 9,101,110,100, 10, 32,101,110,100, 10, 10, - 32, 45, 45, 32,116,114,121, 32, 39,101,120,116,101,114,110, - 39, 32,107,101,121,119,111,114,100, 10, 32,100,111, 10, 32, - 9,108,111, 99, 97,108, 32, 98, 44,101, 32, 61, 32,115,116, - 114,105,110,103, 46,102,105,110,100, 40,115, 44, 32, 34, 94, - 37,115, 42,101,120,116,101,114,110, 37,115, 43, 34, 41, 10, - 32, 9,105,102, 32, 98, 32,116,104,101,110, 10, 9, 9, 45, - 45, 32,100,111, 32,110,111,116,104,105,110,103, 10, 32, 9, - 9,114,101,116,117,114,110, 32,115,116,114,115,117, 98, 40, - 115, 44, 32,101, 43, 49, 41, 10, 32, 9,101,110,100, 10, 32, - 101,110,100, 10, 10, 32, 45, 45, 32,116,114,121, 32, 39,118, - 105,114,116,117, 97,108, 39, 32,107,101,121,119,111,114,107, - 100, 10, 32,100,111, 10, 32, 9,108,111, 99, 97,108, 32, 98, - 44,101, 32, 61, 32,115,116,114,105,110,103, 46,102,105,110, - 100, 40,115, 44, 32, 34, 94, 37,115, 42,118,105,114,116,117, - 97,108, 37,115, 43, 34, 41, 10, 32, 9,105,102, 32, 98, 32, - 116,104,101,110, 10, 32, 9, 9,109,101,116,104,111,100,105, - 115,118,105,114,116,117, 97,108, 32, 61, 32,116,114,117,101, - 10, 32, 9, 9,114,101,116,117,114,110, 32,115,116,114,115, - 117, 98, 40,115, 44, 32,101, 43, 49, 41, 10, 32, 9,101,110, - 100, 10, 32,101,110,100, 10, 10, 32, 45, 45, 32,116,114,121, - 32,108, 97, 98,101,108,115, 32, 40,112,117, 98,108,105, 99, - 44, 32,112,114,105,118, 97,116,101, 44, 32,101,116, 99, 41, - 10, 32,100,111, 10, 32, 9,108,111, 99, 97,108, 32, 98, 44, - 101, 32, 61, 32,115,116,114,105,110,103, 46,102,105,110,100, - 40,115, 44, 32, 34, 94, 37,115, 42, 37,119, 42, 37,115, 42, - 58, 91, 94, 58, 93, 34, 41, 10, 32, 9,105,102, 32, 98, 32, - 116,104,101,110, 10, 32, 9, 9,114,101,116,117,114,110, 32, - 115,116,114,115,117, 98, 40,115, 44, 32,101, 41, 32, 45, 45, - 32,112,114,101,115,101,114,118,101, 32,116,104,101, 32, 91, - 94, 58, 93, 10, 32, 9,101,110,100, 10, 32,101,110,100, 10, - 10, 32, 45, 45, 32,116,114,121, 32,109,111,100,117,108,101, - 10, 32,100,111, 10, 32, 32,108,111, 99, 97,108, 32, 98, 44, - 101, 44,110, 97,109,101, 44, 98,111,100,121, 32, 61, 32,115, - 116,114,102,105,110,100, 40,115, 44, 34, 94, 37,115, 42,109, - 111,100,117,108,101, 37,115, 37,115, 42, 40, 91, 95, 37,119, - 93, 91, 95, 37,119, 93, 42, 41, 37,115, 42, 40, 37, 98,123, - 125, 41, 37,115, 42, 34, 41, 10, 32, 32,105,102, 32, 98, 32, - 116,104,101,110, 10, 32, 32, 32, 95, 99,117,114,114, 95, 99, - 111,100,101, 32, 61, 32,115,116,114,115,117, 98, 40,115, 44, - 98, 44,101, 41, 10, 32, 32, 32, 77,111,100,117,108,101, 40, - 110, 97,109,101, 44, 98,111,100,121, 41, 10, 32, 32, 32,114, - 101,116,117,114,110, 32,115,116,114,115,117, 98, 40,115, 44, - 101, 43, 49, 41, 10, 32, 32,101,110,100, 10, 32,101,110,100, - 10, 10, 32, 45, 45, 32,116,114,121, 32,110, 97,109,101,115, - 97,112, 99,101, 10, 32,100,111, 10, 32, 32,108,111, 99, 97, - 108, 32, 98, 44,101, 44,110, 97,109,101, 44, 98,111,100,121, - 32, 61, 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, - 37,115, 42,110, 97,109,101,115,112, 97, 99,101, 37,115, 37, - 115, 42, 40, 91, 95, 37,119, 93, 91, 95, 37,119, 93, 42, 41, - 37,115, 42, 40, 37, 98,123,125, 41, 37,115, 42, 59, 63, 34, - 41, 10, 32, 32,105,102, 32, 98, 32,116,104,101,110, 10, 32, - 32, 32, 95, 99,117,114,114, 95, 99,111,100,101, 32, 61, 32, - 115,116,114,115,117, 98, 40,115, 44, 98, 44,101, 41, 10, 32, - 32, 32, 78, 97,109,101,115,112, 97, 99,101, 40,110, 97,109, - 101, 44, 98,111,100,121, 41, 10, 32, 32, 32,114,101,116,117, - 114,110, 32,115,116,114,115,117, 98, 40,115, 44,101, 43, 49, - 41, 10, 32, 32,101,110,100, 10, 32,101,110,100, 10, 10, 32, - 45, 45, 32,116,114,121, 32,100,101,102,105,110,101, 10, 32, - 100,111, 10, 32, 32,108,111, 99, 97,108, 32, 98, 44,101, 44, - 110, 97,109,101, 32, 61, 32,115,116,114,102,105,110,100, 40, - 115, 44, 34, 94, 37,115, 42, 35,100,101,102,105,110,101, 37, - 115, 37,115, 42, 40, 91, 94, 37,115, 93, 42, 41, 91, 94, 92, - 110, 93, 42, 92,110, 37,115, 42, 34, 41, 10, 32, 32,105,102, - 32, 98, 32,116,104,101,110, 10, 32, 32, 32, 95, 99,117,114, - 114, 95, 99,111,100,101, 32, 61, 32,115,116,114,115,117, 98, - 40,115, 44, 98, 44,101, 41, 10, 32, 32, 32, 68,101,102,105, - 110,101, 40,110, 97,109,101, 41, 10, 32, 32, 32,114,101,116, - 117,114,110, 32,115,116,114,115,117, 98, 40,115, 44,101, 43, - 49, 41, 10, 32, 32,101,110,100, 10, 32,101,110,100, 10, 10, - 32, 45, 45, 32,116,114,121, 32,101,110,117,109,101,114, 97, - 116,101,115, 10, 10, 32,100,111, 10, 32, 32,108,111, 99, 97, - 108, 32, 98, 44,101, 44,110, 97,109,101, 44, 98,111,100,121, - 44,118, 97,114,110, 97,109,101, 32, 61, 32,115,116,114,102, - 105,110,100, 40,115, 44, 34, 94, 37,115, 42,101,110,117,109, - 37,115, 43, 40, 37, 83, 42, 41, 37,115, 42, 40, 37, 98,123, - 125, 41, 37,115, 42, 40, 91, 94, 37,115, 59, 93, 42, 41, 37, - 115, 42, 59, 63, 37,115, 42, 34, 41, 10, 32, 32,105,102, 32, - 98, 32,116,104,101,110, 10, 32, 32, 32, 45, 45,101,114,114, - 111,114, 40, 34, 35, 83,111,114,114,121, 44, 32,100,101, 99, - 108, 97,114, 97,116,105,111,110, 32,111,102, 32,101,110,117, - 109,115, 32, 97,110,100, 32,118, 97,114,105, 97, 98,108,101, - 115, 32,111,110, 32,116,104,101, 32,115, 97,109,101, 32,115, - 116, 97,116,101,109,101,110,116, 32,105,115, 32,110,111,116, - 32,115,117,112,112,111,114,116,101,100, 46, 92,110, 68,101, - 99,108, 97,114,101, 32,121,111,117,114, 32,118, 97,114,105, - 97, 98,108,101, 32,115,101,112, 97,114, 97,116,101,108,121, - 32, 40,101,120, 97,109,112,108,101, 58, 32, 39, 34, 46, 46, - 110, 97,109,101, 46, 46, 34, 32, 34, 46, 46,118, 97,114,110, - 97,109,101, 46, 46, 34, 59, 39, 41, 34, 41, 10, 32, 32, 32, - 95, 99,117,114,114, 95, 99,111,100,101, 32, 61, 32,115,116, - 114,115,117, 98, 40,115, 44, 98, 44,101, 41, 10, 32, 32, 32, - 69,110,117,109,101,114, 97,116,101, 40,110, 97,109,101, 44, - 98,111,100,121, 44,118, 97,114,110, 97,109,101, 41, 10, 32, - 32, 32,114,101,116,117,114,110, 32,115,116,114,115,117, 98, - 40,115, 44,101, 43, 49, 41, 10, 32, 32,101,110,100, 10, 32, - 101,110,100, 10, 10, 45, 45, 32,100,111, 10, 45, 45, 32, 32, - 108,111, 99, 97,108, 32, 98, 44,101, 44,110, 97,109,101, 44, - 98,111,100,121, 32, 61, 32,115,116,114,102,105,110,100, 40, - 115, 44, 34, 94, 37,115, 42,101,110,117,109, 37,115, 43, 40, - 37, 83, 42, 41, 37,115, 42, 40, 37, 98,123,125, 41, 37,115, - 42, 59, 63, 37,115, 42, 34, 41, 10, 45, 45, 32, 32,105,102, - 32, 98, 32,116,104,101,110, 10, 45, 45, 32, 32, 32, 95, 99, - 117,114,114, 95, 99,111,100,101, 32, 61, 32,115,116,114,115, - 117, 98, 40,115, 44, 98, 44,101, 41, 10, 45, 45, 32, 32, 32, - 69,110,117,109,101,114, 97,116,101, 40,110, 97,109,101, 44, - 98,111,100,121, 41, 10, 45, 45, 32, 32,114,101,116,117,114, - 110, 32,115,116,114,115,117, 98, 40,115, 44,101, 43, 49, 41, - 10, 45, 45, 32, 32,101,110,100, 10, 45, 45, 32,101,110,100, - 10, 10, 32,100,111, 10, 32, 32,108,111, 99, 97,108, 32, 98, - 44,101, 44, 98,111,100,121, 44,110, 97,109,101, 32, 61, 32, - 115,116,114,102,105,110,100, 40,115, 44, 34, 94, 37,115, 42, - 116,121,112,101,100,101,102, 37,115, 43,101,110,117,109, 91, - 94,123, 93, 42, 40, 37, 98,123,125, 41, 37,115, 42, 40, 91, - 37,119, 95, 93, 91, 94, 37,115, 93, 42, 41, 37,115, 42, 59, - 37,115, 42, 34, 41, 10, 32, 32,105,102, 32, 98, 32,116,104, - 101,110, 10, 32, 32, 32, 95, 99,117,114,114, 95, 99,111,100, - 101, 32, 61, 32,115,116,114,115,117, 98, 40,115, 44, 98, 44, - 101, 41, 10, 32, 32, 32, 69,110,117,109,101,114, 97,116,101, - 40,110, 97,109,101, 44, 98,111,100,121, 41, 10, 32, 32, 32, - 114,101,116,117,114,110, 32,115,116,114,115,117, 98, 40,115, - 44,101, 43, 49, 41, 10, 32, 32,101,110,100, 10, 32,101,110, - 100, 10, 10, 32, 45, 45, 32,116,114,121, 32,111,112,101,114, - 97,116,111,114, 10, 32,100,111, 10, 32, 32,108,111, 99, 97, - 108, 32, 98, 44,101, 44,100,101, 99,108, 44,107,105,110,100, - 44, 97,114,103, 44, 99,111,110,115,116, 32, 61, 32,115,116, - 114,102,105,110,100, 40,115, 44, 34, 94, 37,115, 42, 40, 91, - 95, 37,119, 93, 91, 95, 37,119, 37,115, 37, 42, 38, 58, 60, - 62, 44, 93, 45, 37,115, 43,111,112,101,114, 97,116,111,114, - 41, 37,115, 42, 40, 91, 94, 37,115, 93, 91, 94, 37,115, 93, - 42, 41, 37,115, 42, 40, 37, 98, 40, 41, 41, 37,115, 42, 40, - 99, 63,111, 63,110, 63,115, 63,116, 63, 41, 37,115, 42, 59, - 37,115, 42, 34, 41, 10, 32, 32,105,102, 32,110,111,116, 32, - 98, 32,116,104,101,110, 10, 9, 9, 32, 45, 45, 32,116,114, - 121, 32,105,110,108,105,110,101, 10, 32, 32, 32, 98, 44,101, - 44,100,101, 99,108, 44,107,105,110,100, 44, 97,114,103, 44, - 99,111,110,115,116, 32, 61, 32,115,116,114,102,105,110,100, - 40,115, 44, 34, 94, 37,115, 42, 40, 91, 95, 37,119, 93, 91, - 95, 37,119, 37,115, 37, 42, 38, 58, 60, 62, 44, 93, 45, 37, - 115, 43,111,112,101,114, 97,116,111,114, 41, 37,115, 42, 40, - 91, 94, 37,115, 93, 91, 94, 37,115, 93, 42, 41, 37,115, 42, - 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, 63,111, 63,110, - 63,115, 63,116, 63, 41, 91, 37,115, 92,110, 93, 42, 37, 98, - 123,125, 37,115, 42, 59, 63, 37,115, 42, 34, 41, 10, 32, 32, - 101,110,100, 10, 32, 32,105,102, 32,110,111,116, 32, 98, 32, - 116,104,101,110, 10, 32, 32, 9, 45, 45, 32,116,114,121, 32, - 99, 97,115,116, 32,111,112,101,114, 97,116,111,114, 10, 32, - 32, 9, 98, 44,101, 44,100,101, 99,108, 44,107,105,110,100, - 44, 97,114,103, 44, 99,111,110,115,116, 32, 61, 32,115,116, - 114,102,105,110,100, 40,115, 44, 32, 34, 94, 37,115, 42, 40, - 111,112,101,114, 97,116,111,114, 41, 37,115, 43, 40, 91, 37, - 119, 95, 58, 37,100, 60, 62, 37, 42, 37, 38, 37,115, 93, 43, - 41, 37,115, 42, 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, - 63,111, 63,110, 63,115, 63,116, 63, 41, 34, 41, 59, 10, 32, - 32, 9,105,102, 32, 98, 32,116,104,101,110, 10, 32, 32, 9, - 9,108,111, 99, 97,108, 32, 95, 44,105,101, 32, 61, 32,115, - 116,114,105,110,103, 46,102,105,110,100, 40,115, 44, 32, 34, - 94, 37,115, 42, 37, 98,123,125, 34, 44, 32,101, 43, 49, 41, - 10, 32, 32, 9, 9,105,102, 32,105,101, 32,116,104,101,110, - 10, 32, 32, 9, 9, 9,101, 32, 61, 32,105,101, 10, 32, 32, - 9, 9,101,110,100, 10, 32, 32, 9,101,110,100, 10, 32, 32, - 101,110,100, 10, 32, 32,105,102, 32, 98, 32,116,104,101,110, - 10, 32, 32, 32, 95, 99,117,114,114, 95, 99,111,100,101, 32, - 61, 32,115,116,114,115,117, 98, 40,115, 44, 98, 44,101, 41, - 10, 32, 32, 32, 79,112,101,114, 97,116,111,114, 40,100,101, - 99,108, 44,107,105,110,100, 44, 97,114,103, 44, 99,111,110, - 115,116, 41, 10, 32, 32, 32,114,101,116,117,114,110, 32,115, - 116,114,115,117, 98, 40,115, 44,101, 43, 49, 41, 10, 32, 32, - 101,110,100, 10, 32,101,110,100, 10, 10, 32, 45, 45, 32,116, - 114,121, 32,102,117,110, 99,116,105,111,110, 10, 32,100,111, - 10, 32, 32, 45, 45,108,111, 99, 97,108, 32, 98, 44,101, 44, - 100,101, 99,108, 44, 97,114,103, 44, 99,111,110,115,116, 32, - 61, 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, 37, - 115, 42, 40, 91,126, 95, 37,119, 93, 91, 95, 64, 37,119, 37, - 115, 37, 42, 38, 58, 60, 62, 93, 42, 91, 95, 37,119, 93, 41, - 37,115, 42, 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, 63, - 111, 63,110, 63,115, 63,116, 63, 41, 37,115, 42, 61, 63, 37, - 115, 42, 48, 63, 37,115, 42, 59, 37,115, 42, 34, 41, 10, 32, - 32,108,111, 99, 97,108, 32, 98, 44,101, 44,100,101, 99,108, - 44, 97,114,103, 44, 99,111,110,115,116, 44,118,105,114,116, - 32, 61, 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, - 37,115, 42, 40, 91, 94, 37, 40, 92,110, 93, 43, 41, 37,115, - 42, 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, 63,111, 63, - 110, 63,115, 63,116, 63, 41, 37,115, 42, 40, 61, 63, 37,115, - 42, 48, 63, 41, 37,115, 42, 59, 37,115, 42, 34, 41, 10, 32, - 32,105,102, 32,110,111,116, 32, 98, 32,116,104,101,110, 10, - 32, 32, 9, 45, 45, 32,116,114,121, 32,102,117,110, 99,116, - 105,111,110, 32,119,105,116,104, 32,116,101,109,112,108, 97, - 116,101, 10, 32, 32, 9, 98, 44,101, 44,100,101, 99,108, 44, - 97,114,103, 44, 99,111,110,115,116, 32, 61, 32,115,116,114, - 102,105,110,100, 40,115, 44, 34, 94, 37,115, 42, 40, 91,126, - 95, 37,119, 93, 91, 95, 64, 37,119, 37,115, 37, 42, 38, 58, - 60, 62, 93, 42, 91, 95, 37,119, 93, 37, 98, 60, 62, 41, 37, - 115, 42, 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, 63,111, - 63,110, 63,115, 63,116, 63, 41, 37,115, 42, 61, 63, 37,115, - 42, 48, 63, 37,115, 42, 59, 37,115, 42, 34, 41, 10, 32, 32, - 101,110,100, 10, 32, 32,105,102, 32,110,111,116, 32, 98, 32, - 116,104,101,110, 10, 32, 32, 32, 45, 45, 32,116,114,121, 32, - 97, 32,115,105,110,103,108,101, 32,108,101,116,116,101,114, - 32,102,117,110, 99,116,105,111,110, 32,110, 97,109,101, 10, - 32, 32, 32, 98, 44,101, 44,100,101, 99,108, 44, 97,114,103, - 44, 99,111,110,115,116, 32, 61, 32,115,116,114,102,105,110, - 100, 40,115, 44, 34, 94, 37,115, 42, 40, 91, 95, 37,119, 93, - 41, 37,115, 42, 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, - 63,111, 63,110, 63,115, 63,116, 63, 41, 37,115, 42, 59, 37, - 115, 42, 34, 41, 10, 32, 32,101,110,100, 10, 32, 32,105,102, - 32,110,111,116, 32, 98, 32,116,104,101,110, 10, 32, 32, 32, - 45, 45, 32,116,114,121, 32,102,117,110, 99,116,105,111,110, - 32,112,111,105,110,116,101,114, 10, 32, 32, 32, 98, 44,101, - 44,100,101, 99,108, 44, 97,114,103, 44, 99,111,110,115,116, - 32, 61, 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, - 37,115, 42, 40, 91, 94, 37, 40, 59, 92,110, 93, 43, 37, 98, - 40, 41, 41, 37,115, 42, 40, 37, 98, 40, 41, 41, 37,115, 42, - 59, 37,115, 42, 34, 41, 10, 32, 32, 32,105,102, 32, 98, 32, - 116,104,101,110, 10, 32, 32, 32, 32,100,101, 99,108, 32, 61, - 32,115,116,114,105,110,103, 46,103,115,117, 98, 40,100,101, - 99,108, 44, 32, 34, 37, 40, 37,115, 42, 37, 42, 40, 91, 94, - 37, 41, 93, 42, 41, 37,115, 42, 37, 41, 34, 44, 32, 34, 32, - 37, 49, 32, 34, 41, 10, 32, 32, 32,101,110,100, 10, 32, 32, - 101,110,100, 10, 32, 32,105,102, 32, 98, 32,116,104,101,110, - 10, 32, 32, 9,105,102, 32,118,105,114,116, 32, 97,110,100, - 32,115,116,114,105,110,103, 46,102,105,110,100, 40,118,105, - 114,116, 44, 32, 34, 91, 61, 48, 93, 34, 41, 32,116,104,101, - 110, 10, 32, 32, 9, 9,105,102, 32,115,101,108,102, 46,102, - 108, 97,103,115, 32,116,104,101,110, 10, 32, 32, 9, 9, 9, - 115,101,108,102, 46,102,108, 97,103,115, 46,112,117,114,101, - 95,118,105,114,116,117, 97,108, 32, 61, 32,116,114,117,101, - 10, 32, 32, 9, 9,101,110,100, 10, 32, 32, 9,101,110,100, - 10, 32, 32, 32, 95, 99,117,114,114, 95, 99,111,100,101, 32, - 61, 32,115,116,114,115,117, 98, 40,115, 44, 98, 44,101, 41, - 10, 32, 32, 32, 70,117,110, 99,116,105,111,110, 40,100,101, - 99,108, 44, 97,114,103, 44, 99,111,110,115,116, 41, 10, 32, - 32, 32,114,101,116,117,114,110, 32,115,116,114,115,117, 98, - 40,115, 44,101, 43, 49, 41, 10, 32, 32,101,110,100, 10, 32, - 101,110,100, 10, 10, 32, 45, 45, 32,116,114,121, 32,105,110, - 108,105,110,101, 32,102,117,110, 99,116,105,111,110, 10, 32, - 100,111, 10, 32, 32,108,111, 99, 97,108, 32, 98, 44,101, 44, - 100,101, 99,108, 44, 97,114,103, 44, 99,111,110,115,116, 32, - 61, 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, 37, - 115, 42, 40, 91, 94, 37, 40, 92,110, 93, 43, 41, 37,115, 42, - 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, 63,111, 63,110, - 63,115, 63,116, 63, 41, 91, 94, 59,123, 93, 42, 37, 98,123, - 125, 37,115, 42, 59, 63, 37,115, 42, 34, 41, 10, 32, 32, 45, - 45,108,111, 99, 97,108, 32, 98, 44,101, 44,100,101, 99,108, - 44, 97,114,103, 44, 99,111,110,115,116, 32, 61, 32,115,116, - 114,102,105,110,100, 40,115, 44, 34, 94, 37,115, 42, 40, 91, - 126, 95, 37,119, 93, 91, 95, 64, 37,119, 37,115, 37, 42, 38, - 58, 60, 62, 93, 42, 91, 95, 37,119, 62, 93, 41, 37,115, 42, - 40, 37, 98, 40, 41, 41, 37,115, 42, 40, 99, 63,111, 63,110, - 63,115, 63,116, 63, 41, 91, 94, 59, 93, 42, 37, 98,123,125, - 37,115, 42, 59, 63, 37,115, 42, 34, 41, 10, 32, 32,105,102, - 32,110,111,116, 32, 98, 32,116,104,101,110, 10, 32, 32, 32, - 45, 45, 32,116,114,121, 32, 97, 32,115,105,110,103,108,101, - 32,108,101,116,116,101,114, 32,102,117,110, 99,116,105,111, - 110, 32,110, 97,109,101, 10, 32, 32, 32, 98, 44,101, 44,100, - 101, 99,108, 44, 97,114,103, 44, 99,111,110,115,116, 32, 61, - 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, 37,115, - 42, 40, 91, 95, 37,119, 93, 41, 37,115, 42, 40, 37, 98, 40, - 41, 41, 37,115, 42, 40, 99, 63,111, 63,110, 63,115, 63,116, - 63, 41, 46, 45, 37, 98,123,125, 37,115, 42, 59, 63, 37,115, - 42, 34, 41, 10, 32, 32,101,110,100, 10, 32, 32,105,102, 32, - 98, 32,116,104,101,110, 10, 32, 32, 32, 95, 99,117,114,114, - 95, 99,111,100,101, 32, 61, 32,115,116,114,115,117, 98, 40, - 115, 44, 98, 44,101, 41, 10, 32, 32, 32, 70,117,110, 99,116, - 105,111,110, 40,100,101, 99,108, 44, 97,114,103, 44, 99,111, - 110,115,116, 41, 10, 32, 32, 32,114,101,116,117,114,110, 32, - 115,116,114,115,117, 98, 40,115, 44,101, 43, 49, 41, 10, 32, - 32,101,110,100, 10, 32,101,110,100, 10, 10, 32, 45, 45, 32, - 116,114,121, 32, 99,108, 97,115,115, 10, 32,100,111, 10, 9, - 32,108,111, 99, 97,108, 32, 98, 44,101, 44,110, 97,109,101, - 44, 98, 97,115,101, 44, 98,111,100,121, 10, 9, 9, 98, 97, - 115,101, 32, 61, 32, 39, 39, 32, 98,111,100,121, 32, 61, 32, - 39, 39, 10, 9, 9, 98, 44,101, 44,110, 97,109,101, 32, 61, - 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, 37,115, - 42, 99,108, 97,115,115, 37,115, 42, 40, 91, 95, 37,119, 93, - 91, 95, 37,119, 64, 93, 42, 41, 37,115, 42, 59, 34, 41, 32, - 32, 45, 45, 32,100,117,109,109,121, 32, 99,108, 97,115,115, - 10, 9, 9,108,111, 99, 97,108, 32,100,117,109,109,121, 32, - 61, 32,102, 97,108,115,101, 10, 9, 9,105,102, 32,110,111, - 116, 32, 98, 32,116,104,101,110, 10, 9, 9, 9, 98, 44,101, - 44,110, 97,109,101, 32, 61, 32,115,116,114,102,105,110,100, - 40,115, 44, 34, 94, 37,115, 42,115,116,114,117, 99,116, 37, - 115, 42, 40, 91, 95, 37,119, 93, 91, 95, 37,119, 64, 93, 42, - 41, 37,115, 42, 59, 34, 41, 32, 32, 32, 32, 45, 45, 32,100, - 117,109,109,121, 32,115,116,114,117, 99,116, 10, 9, 9, 9, - 105,102, 32,110,111,116, 32, 98, 32,116,104,101,110, 10, 9, - 9, 9, 9, 98, 44,101, 44,110, 97,109,101, 44, 98, 97,115, - 101, 44, 98,111,100,121, 32, 61, 32,115,116,114,102,105,110, - 100, 40,115, 44, 34, 94, 37,115, 42, 99,108, 97,115,115, 37, - 115, 42, 40, 91, 95, 37,119, 93, 91, 95, 37,119, 64, 93, 42, - 41, 37,115, 42, 40, 91, 94,123, 93, 45, 41, 37,115, 42, 40, - 37, 98,123,125, 41, 37,115, 42, 34, 41, 10, 9, 9, 9, 9, - 105,102, 32,110,111,116, 32, 98, 32,116,104,101,110, 10, 9, - 9, 9, 9, 9, 98, 44,101, 44,110, 97,109,101, 44, 98, 97, - 115,101, 44, 98,111,100,121, 32, 61, 32,115,116,114,102,105, - 110,100, 40,115, 44, 34, 94, 37,115, 42,115,116,114,117, 99, - 116, 37,115, 43, 40, 91, 95, 37,119, 93, 91, 95, 37,119, 64, - 93, 42, 41, 37,115, 42, 40, 91, 94,123, 93, 45, 41, 37,115, - 42, 40, 37, 98,123,125, 41, 37,115, 42, 34, 41, 10, 9, 9, - 9, 9, 9,105,102, 32,110,111,116, 32, 98, 32,116,104,101, - 110, 10, 9, 9, 9, 9, 9, 9, 98, 44,101, 44,110, 97,109, - 101, 44, 98, 97,115,101, 44, 98,111,100,121, 32, 61, 32,115, - 116,114,102,105,110,100, 40,115, 44, 34, 94, 37,115, 42,117, - 110,105,111,110, 37,115, 42, 40, 91, 95, 37,119, 93, 91, 95, - 37,119, 64, 93, 42, 41, 37,115, 42, 40, 91, 94,123, 93, 45, - 41, 37,115, 42, 40, 37, 98,123,125, 41, 37,115, 42, 34, 41, - 10, 9, 9, 9, 9, 9, 9,105,102, 32,110,111,116, 32, 98, - 32,116,104,101,110, 10, 9, 9, 9, 9, 9, 9, 9, 98, 97, - 115,101, 32, 61, 32, 39, 39, 10, 9, 9, 9, 9, 9, 9, 9, - 98, 44,101, 44, 98,111,100,121, 44,110, 97,109,101, 32, 61, - 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, 37,115, - 42,116,121,112,101,100,101,102, 37,115, 37,115, 42,115,116, - 114,117, 99,116, 37,115, 37,115, 42, 91, 95, 37,119, 93, 42, - 37,115, 42, 40, 37, 98,123,125, 41, 37,115, 42, 40, 91, 95, - 37,119, 93, 91, 95, 37,119, 64, 93, 42, 41, 37,115, 42, 59, - 34, 41, 10, 9, 9, 9, 9, 9, 9,101,110,100, 10, 9, 9, - 9, 9, 9,101,110,100, 10, 9, 9, 9, 9,101,110,100, 10, - 9, 9, 9,101,108,115,101, 32,100,117,109,109,121, 32, 61, - 32, 49, 32,101,110,100, 10, 9, 9,101,108,115,101, 32,100, - 117,109,109,121, 32, 61, 32, 49, 32,101,110,100, 10, 9, 9, - 105,102, 32, 98, 32,116,104,101,110, 10, 9, 9, 9,105,102, - 32, 98, 97,115,101, 32,126, 61, 32, 39, 39, 32,116,104,101, - 110, 10, 9, 9, 9, 9, 98, 97,115,101, 32, 61, 32,115,116, - 114,105,110,103, 46,103,115,117, 98, 40, 98, 97,115,101, 44, - 32, 34, 94, 37,115, 42, 58, 37,115, 42, 34, 44, 32, 34, 34, - 41, 10, 9, 9, 9, 9, 98, 97,115,101, 32, 61, 32,115,116, - 114,105,110,103, 46,103,115,117, 98, 40, 98, 97,115,101, 44, - 32, 34, 37,115, 42,112,117, 98,108,105, 99, 37,115, 42, 34, - 44, 32, 34, 34, 41, 10, 9, 9, 9, 9, 98, 97,115,101, 32, - 61, 32,115,112,108,105,116, 40, 98, 97,115,101, 44, 32, 34, - 44, 34, 41, 10, 9, 9, 9, 9, 45, 45,108,111, 99, 97,108, - 32, 98, 44,101, 10, 9, 9, 9, 9, 45, 45, 98, 44,101, 44, - 98, 97,115,101, 32, 61, 32,115,116,114,102,105,110,100, 40, - 98, 97,115,101, 44, 34, 46, 45, 40, 91, 95, 37,119, 93, 91, - 95, 37,119, 60, 62, 44, 58, 93, 42, 41, 36, 34, 41, 10, 9, - 9, 9,101,108,115,101, 10, 9, 9, 9, 9, 98, 97,115,101, - 32, 61, 32,123,125, 10, 9, 9, 9,101,110,100, 10, 9, 9, - 9, 95, 99,117,114,114, 95, 99,111,100,101, 32, 61, 32,115, - 116,114,115,117, 98, 40,115, 44, 98, 44,101, 41, 10, 9, 9, - 9, 67,108, 97,115,115, 40,110, 97,109,101, 44, 98, 97,115, - 101, 44, 98,111,100,121, 41, 10, 9, 9, 9,105,102, 32,110, - 111,116, 32,100,117,109,109,121, 32,116,104,101,110, 10, 9, - 9, 9, 9,118, 97,114, 98, 44,118, 97,114,101, 44,118, 97, - 114,110, 97,109,101, 32, 61, 32,115,116,114,105,110,103, 46, - 102,105,110,100, 40,115, 44, 32, 34, 94, 37,115, 42, 40, 91, - 95, 37,119, 93, 43, 41, 37,115, 42, 59, 34, 44, 32,101, 43, - 49, 41, 10, 9, 9, 9, 9,105,102, 32,118, 97,114, 98, 32, - 116,104,101,110, 10, 9, 9, 9, 9, 9, 86, 97,114,105, 97, - 98,108,101, 40,110, 97,109,101, 46, 46, 34, 32, 34, 46, 46, - 118, 97,114,110, 97,109,101, 41, 10, 9, 9, 9, 9, 9,101, - 32, 61, 32,118, 97,114,101, 10, 9, 9, 9, 9,101,110,100, - 10, 9, 9, 9,101,110,100, 10, 9, 9, 9,114,101,116,117, - 114,110, 32,115,116,114,115,117, 98, 40,115, 44,101, 43, 49, - 41, 10, 9, 9,101,110,100, 10, 9,101,110,100, 10, 10, 32, - 45, 45, 32,116,114,121, 32,116,121,112,101,100,101,102, 10, - 32,100,111, 10, 32, 32,108,111, 99, 97,108, 32, 98, 44,101, - 44,116,121,112,101,115, 32, 61, 32,115,116,114,102,105,110, - 100, 40,115, 44, 34, 94, 37,115, 42,116,121,112,101,100,101, - 102, 37,115, 37,115, 42, 40, 46, 45, 41, 37,115, 42, 59, 37, - 115, 42, 34, 41, 10, 32, 32,105,102, 32, 98, 32,116,104,101, - 110, 10, 32, 32, 32, 95, 99,117,114,114, 95, 99,111,100,101, - 32, 61, 32,115,116,114,115,117, 98, 40,115, 44, 98, 44,101, - 41, 10, 32, 32, 32, 84,121,112,101,100,101,102, 40,116,121, - 112,101,115, 41, 10, 32, 32, 32,114,101,116,117,114,110, 32, - 115,116,114,115,117, 98, 40,115, 44,101, 43, 49, 41, 10, 32, - 32,101,110,100, 10, 32,101,110,100, 10, 10, 32, 45, 45, 32, - 116,114,121, 32,118, 97,114,105, 97, 98,108,101, 10, 32,100, - 111, 10, 32, 32,108,111, 99, 97,108, 32, 98, 44,101, 44,100, - 101, 99,108, 32, 61, 32,115,116,114,102,105,110,100, 40,115, - 44, 34, 94, 37,115, 42, 40, 91, 95, 37,119, 93, 91, 95, 64, - 37,115, 37,119, 37,100, 37, 42, 38, 58, 60, 62, 44, 93, 42, - 91, 95, 37,119, 37,100, 93, 41, 37,115, 42, 59, 37,115, 42, - 34, 41, 10, 32, 32,105,102, 32, 98, 32,116,104,101,110, 10, - 32, 32, 32, 95, 99,117,114,114, 95, 99,111,100,101, 32, 61, - 32,115,116,114,115,117, 98, 40,115, 44, 98, 44,101, 41, 10, - 10, 9,108,111, 99, 97,108, 32,108,105,115,116, 32, 61, 32, - 115,112,108,105,116, 95, 99, 95,116,111,107,101,110,115, 40, - 100,101, 99,108, 44, 32, 34, 44, 34, 41, 10, 9, 86, 97,114, - 105, 97, 98,108,101, 40,108,105,115,116, 91, 49, 93, 41, 10, - 9,105,102, 32,108,105,115,116, 46,110, 32, 62, 32, 49, 32, - 116,104,101,110, 10, 9, 9,108,111, 99, 97,108, 32, 95, 44, - 95, 44,116,121,112,101, 32, 61, 32,115,116,114,102,105,110, - 100, 40,108,105,115,116, 91, 49, 93, 44, 32, 34, 40, 46, 45, - 41, 37,115, 43, 40, 91, 94, 37,115, 93, 42, 41, 36, 34, 41, - 59, 10, 10, 9, 9,108,111, 99, 97,108, 32,105, 32, 61, 50, - 59, 10, 9, 9,119,104,105,108,101, 32,108,105,115,116, 91, - 105, 93, 32,100,111, 10, 9, 9, 9, 86, 97,114,105, 97, 98, - 108,101, 40,116,121,112,101, 46, 46, 34, 32, 34, 46, 46,108, - 105,115,116, 91,105, 93, 41, 10, 9, 9, 9,105, 61,105, 43, - 49, 10, 9, 9,101,110,100, 10, 9,101,110,100, 10, 32, 32, - 32, 45, 45, 86, 97,114,105, 97, 98,108,101, 40,100,101, 99, - 108, 41, 10, 32, 32, 32,114,101,116,117,114,110, 32,115,116, - 114,115,117, 98, 40,115, 44,101, 43, 49, 41, 10, 32, 32,101, - 110,100, 10, 32,101,110,100, 10, 10, 9, 45, 45, 32,116,114, - 121, 32,115,116,114,105,110,103, 10, 32,100,111, 10, 32, 32, - 108,111, 99, 97,108, 32, 98, 44,101, 44,100,101, 99,108, 32, - 61, 32,115,116,114,102,105,110,100, 40,115, 44, 34, 94, 37, - 115, 42, 40, 91, 95, 37,119, 93, 63, 91, 95, 37,115, 37,119, - 37,100, 93, 45, 99,104, 97,114, 37,115, 43, 91, 95, 64, 37, - 119, 37,100, 93, 42, 37,115, 42, 37, 91, 37,115, 42, 37, 83, - 43, 37,115, 42, 37, 93, 41, 37,115, 42, 59, 37,115, 42, 34, - 41, 10, 32, 32,105,102, 32, 98, 32,116,104,101,110, 10, 32, - 32, 32, 95, 99,117,114,114, 95, 99,111,100,101, 32, 61, 32, - 115,116,114,115,117, 98, 40,115, 44, 98, 44,101, 41, 10, 32, - 32, 32, 86, 97,114,105, 97, 98,108,101, 40,100,101, 99,108, - 41, 10, 32, 32, 32,114,101,116,117,114,110, 32,115,116,114, - 115,117, 98, 40,115, 44,101, 43, 49, 41, 10, 32, 32,101,110, - 100, 10, 32,101,110,100, 10, 10, 32, 45, 45, 32,116,114,121, - 32, 97,114,114, 97,121, 10, 32,100,111, 10, 32, 32,108,111, - 99, 97,108, 32, 98, 44,101, 44,100,101, 99,108, 32, 61, 32, - 115,116,114,102,105,110,100, 40,115, 44, 34, 94, 37,115, 42, - 40, 91, 95, 37,119, 93, 91, 93, 91, 95, 64, 37,115, 37,119, - 37,100, 37, 42, 38, 58, 60, 62, 93, 42, 91, 93, 95, 37,119, - 37,100, 93, 41, 37,115, 42, 59, 37,115, 42, 34, 41, 10, 32, - 32,105,102, 32, 98, 32,116,104,101,110, 10, 32, 32, 32, 95, - 99,117,114,114, 95, 99,111,100,101, 32, 61, 32,115,116,114, - 115,117, 98, 40,115, 44, 98, 44,101, 41, 10, 32, 32, 32, 65, - 114,114, 97,121, 40,100,101, 99,108, 41, 10, 32, 32, 32,114, - 101,116,117,114,110, 32,115,116,114,115,117, 98, 40,115, 44, - 101, 43, 49, 41, 10, 32, 32,101,110,100, 10, 32,101,110,100, - 10, 10, 32, 45, 45, 32,110,111, 32,109, 97,116, 99,104,105, - 110,103, 10, 32,105,102, 32,103,115,117, 98, 40,115, 44, 34, - 37,115, 37,115, 42, 34, 44, 34, 34, 41, 32,126, 61, 32, 34, - 34, 32,116,104,101,110, 10, 32, 32, 95, 99,117,114,114, 95, - 99,111,100,101, 32, 61, 32,115, 10, 32, 32,101,114,114,111, - 114, 40, 34, 35,112, 97,114,115,101, 32,101,114,114,111,114, - 34, 41, 10, 32,101,108,115,101, 10, 32, 32,114,101,116,117, - 114,110, 32, 34, 34, 10, 32,101,110,100, 10, 10,101,110,100, - 10, 10,102,117,110, 99,116,105,111,110, 32, 99,108, 97,115, - 115, 67,111,110,116, 97,105,110,101,114, 58,112, 97,114,115, - 101, 32, 40,115, 41, 10, 10, 9, 45, 45,115,101,108,102, 46, - 99,117,114,114, 95,109,101,109, 98,101,114, 95, 97, 99, 99, - 101,115,115, 32, 61, 32,110,105,108, 10, 10, 32,119,104,105, - 108,101, 32,115, 32,126, 61, 32, 39, 39, 32,100,111, 10, 32, - 32,115, 32, 61, 32,115,101,108,102, 58,100,111,112, 97,114, - 115,101, 40,115, 41, 10, 32, 32,109,101,116,104,111,100,105, - 115,118,105,114,116,117, 97,108, 32, 61, 32,102, 97,108,115, - 101, 10, 32,101,110,100, 10,101,110,100, 10, 10, 10, 45, 45, - 32,112,114,111,112,101,114,116,121, 32,116,121,112,101,115, - 10, 10,102,117,110, 99,116,105,111,110, 32,103,101,116, 95, - 112,114,111,112,101,114,116,121, 95,116,121,112,101, 40, 41, - 10, 10, 9,114,101,116,117,114,110, 32, 99,108, 97,115,115, - 67,111,110,116, 97,105,110,101,114, 46, 99,117,114,114, 58, - 103,101,116, 95,112,114,111,112,101,114,116,121, 95,116,121, - 112,101, 40, 41, 10,101,110,100, 10, 10,102,117,110, 99,116, - 105,111,110, 32, 99,108, 97,115,115, 67,111,110,116, 97,105, - 110,101,114, 58,115,101,116, 95,112,114,111,112,101,114,116, - 121, 95,116,121,112,101, 40,112,116,121,112,101, 41, 10, 9, - 112,116,121,112,101, 32, 61, 32,115,116,114,105,110,103, 46, - 103,115,117, 98, 40,112,116,121,112,101, 44, 32, 34, 94, 37, - 115, 42, 34, 44, 32, 34, 34, 41, 10, 9,112,116,121,112,101, - 32, 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40, - 112,116,121,112,101, 44, 32, 34, 37,115, 42, 36, 34, 44, 32, - 34, 34, 41, 10, 10, 9,115,101,108,102, 46,112,114,111,112, - 101,114,116,121, 95,116,121,112,101, 32, 61, 32,112,116,121, - 112,101, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111, - 110, 32, 99,108, 97,115,115, 67,111,110,116, 97,105,110,101, - 114, 58,103,101,116, 95,112,114,111,112,101,114,116,121, 95, - 116,121,112,101, 40, 41, 10, 9,114,101,116,117,114,110, 32, - 115,101,108,102, 46,112,114,111,112,101,114,116,121, 95,116, - 121,112,101, 32,111,114, 32, 40,115,101,108,102, 46,112, 97, - 114,101,110,116, 32, 97,110,100, 32,115,101,108,102, 46,112, - 97,114,101,110,116, 58,103,101,116, 95,112,114,111,112,101, - 114,116,121, 95,116,121,112,101, 40, 41, 41, 32,111,114, 32, - 34,100,101,102, 97,117,108,116, 34, 10,101,110,100,32 - }; - tolua_dobuffer(tolua_S,(char*)B,sizeof(B),"tolua embedded: src/bin/lua/container.lua"); + #include "container_lua.h" + tolua_dobuffer(tolua_S,(char*)lua_container_lua,sizeof(lua_container_lua),"tolua embedded: src/bin/lua/container.lua"); lua_settop(tolua_S, top); } /* end of embedded lua code */ From 1f5a4a39f2cd9f63a7e5695689042d3c43b2e83b Mon Sep 17 00:00:00 2001 From: Tycho Date: Wed, 2 Apr 2014 06:36:25 -0700 Subject: [PATCH 016/188] Fixed All signedness warnings in HTTPServer.cpp --- src/ClientHandle.cpp | 2 +- src/ClientHandle.h | 2 +- src/HTTPServer/HTTPConnection.cpp | 6 +++--- src/HTTPServer/HTTPConnection.h | 2 +- src/HTTPServer/HTTPFormParser.cpp | 4 ++-- src/HTTPServer/HTTPFormParser.h | 7 +++++-- src/HTTPServer/HTTPMessage.h | 2 +- src/OSSupport/SocketThreads.h | 2 +- src/RCONServer.cpp | 2 +- src/RCONServer.h | 2 +- 10 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 5ed5f1085..4513cfb38 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2633,7 +2633,7 @@ void cClientHandle::PacketError(unsigned char a_PacketType) -void cClientHandle::DataReceived(const char * a_Data, int a_Size) +void cClientHandle::DataReceived(const char * a_Data, size_t a_Size) { // Data is received from the client, store it in the buffer to be processed by the Tick thread: m_TimeSinceLastPacket = 0; diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 8366caa16..3fb653012 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -362,7 +362,7 @@ private: void HandleCommandBlockMessage(const char * a_Data, unsigned int a_Length); // cSocketThreads::cCallback overrides: - virtual void DataReceived (const char * a_Data, int a_Size) override; // Data is received from the client + virtual void DataReceived (const char * a_Data, size_t a_Size) override; // Data is received from the client virtual void GetOutgoingData(AString & a_Data) override; // Data can be sent to client virtual void SocketClosed (void) override; // The socket has been closed for any reason }; // tolua_export diff --git a/src/HTTPServer/HTTPConnection.cpp b/src/HTTPServer/HTTPConnection.cpp index 6d238f028..44a3d3f88 100644 --- a/src/HTTPServer/HTTPConnection.cpp +++ b/src/HTTPServer/HTTPConnection.cpp @@ -144,7 +144,7 @@ void cHTTPConnection::Terminate(void) -void cHTTPConnection::DataReceived(const char * a_Data, int a_Size) +void cHTTPConnection::DataReceived(const char * a_Data, size_t a_Size) { switch (m_State) { @@ -181,9 +181,9 @@ void cHTTPConnection::DataReceived(const char * a_Data, int a_Size) } // Process the rest of the incoming data into the request body: - if (a_Size > (int)BytesConsumed) + if (a_Size > BytesConsumed) { - DataReceived(a_Data + BytesConsumed, a_Size - (int)BytesConsumed); + DataReceived(a_Data + BytesConsumed, a_Size - BytesConsumed); } else { diff --git a/src/HTTPServer/HTTPConnection.h b/src/HTTPServer/HTTPConnection.h index 0ad409c51..fc11f1ba6 100644 --- a/src/HTTPServer/HTTPConnection.h +++ b/src/HTTPServer/HTTPConnection.h @@ -91,7 +91,7 @@ protected: // cSocketThreads::cCallback overrides: - virtual void DataReceived (const char * a_Data, int a_Size) override; // Data is received from the client + virtual void DataReceived (const char * a_Data, size_t a_Size) override; // Data is received from the client virtual void GetOutgoingData(AString & a_Data) override; // Data can be sent to client virtual void SocketClosed (void) override; // The socket has been closed for any reason } ; diff --git a/src/HTTPServer/HTTPFormParser.cpp b/src/HTTPServer/HTTPFormParser.cpp index 14d97bb7d..9ddfb82f1 100644 --- a/src/HTTPServer/HTTPFormParser.cpp +++ b/src/HTTPServer/HTTPFormParser.cpp @@ -52,7 +52,7 @@ cHTTPFormParser::cHTTPFormParser(cHTTPRequest & a_Request, cCallbacks & a_Callba -cHTTPFormParser::cHTTPFormParser(eKind a_Kind, const char * a_Data, int a_Size, cCallbacks & a_Callbacks) : +cHTTPFormParser::cHTTPFormParser(eKind a_Kind, const char * a_Data, size_t a_Size, cCallbacks & a_Callbacks) : m_Callbacks(a_Callbacks), m_Kind(a_Kind), m_IsValid(true) @@ -64,7 +64,7 @@ cHTTPFormParser::cHTTPFormParser(eKind a_Kind, const char * a_Data, int a_Size, -void cHTTPFormParser::Parse(const char * a_Data, int a_Size) +void cHTTPFormParser::Parse(const char * a_Data, size_t a_Size) { if (!m_IsValid) { diff --git a/src/HTTPServer/HTTPFormParser.h b/src/HTTPServer/HTTPFormParser.h index b8e6d246c..01d103bb8 100644 --- a/src/HTTPServer/HTTPFormParser.h +++ b/src/HTTPServer/HTTPFormParser.h @@ -36,6 +36,9 @@ public: class cCallbacks { public: + + virtual ~cCallbacks() {}; + /// Called when a new file part is encountered in the form data virtual void OnFileStart(cHTTPFormParser & a_Parser, const AString & a_FileName) = 0; @@ -51,10 +54,10 @@ public: cHTTPFormParser(cHTTPRequest & a_Request, cCallbacks & a_Callbacks); /// Creates a parser with the specified content type that reads data from a string - cHTTPFormParser(eKind a_Kind, const char * a_Data, int a_Size, cCallbacks & a_Callbacks); + cHTTPFormParser(eKind a_Kind, const char * a_Data, size_t a_Size, cCallbacks & a_Callbacks); /// Adds more data into the parser, as the request body is received - void Parse(const char * a_Data, int a_Size); + void Parse(const char * a_Data, size_t a_Size); /** Notifies that there's no more data incoming and the parser should finish its parsing. Returns true if parsing successful diff --git a/src/HTTPServer/HTTPMessage.h b/src/HTTPServer/HTTPMessage.h index c2d310839..dab942136 100644 --- a/src/HTTPServer/HTTPMessage.h +++ b/src/HTTPServer/HTTPMessage.h @@ -39,7 +39,7 @@ public: void AddHeader(const AString & a_Key, const AString & a_Value); void SetContentType (const AString & a_ContentType) { m_ContentType = a_ContentType; } - void SetContentLength(int a_ContentLength) { m_ContentLength = a_ContentLength; } + void SetContentLength(size_t a_ContentLength) { m_ContentLength = a_ContentLength; } const AString & GetContentType (void) const { return m_ContentType; } size_t GetContentLength(void) const { return m_ContentLength; } diff --git a/src/OSSupport/SocketThreads.h b/src/OSSupport/SocketThreads.h index b2eb5950f..679e374e1 100644 --- a/src/OSSupport/SocketThreads.h +++ b/src/OSSupport/SocketThreads.h @@ -64,7 +64,7 @@ public: virtual ~cCallback() {} /** Called when data is received from the remote party */ - virtual void DataReceived(const char * a_Data, int a_Size) = 0; + virtual void DataReceived(const char * a_Data, size_t a_Size) = 0; /** Called when data can be sent to remote party The function is supposed to *set* outgoing data to a_Data (overwrite) */ diff --git a/src/RCONServer.cpp b/src/RCONServer.cpp index 72f2d9ba9..d7083ff2b 100644 --- a/src/RCONServer.cpp +++ b/src/RCONServer.cpp @@ -169,7 +169,7 @@ cRCONServer::cConnection::cConnection(cRCONServer & a_RCONServer, cSocket & a_So -void cRCONServer::cConnection::DataReceived(const char * a_Data, int a_Size) +void cRCONServer::cConnection::DataReceived(const char * a_Data, size_t a_Size) { // Append data to the buffer: m_Buffer.append(a_Data, a_Size); diff --git a/src/RCONServer.h b/src/RCONServer.h index 88aac4b5f..b964852ab 100644 --- a/src/RCONServer.h +++ b/src/RCONServer.h @@ -65,7 +65,7 @@ protected: // cSocketThreads::cCallback overrides: - virtual void DataReceived(const char * a_Data, int a_Size) override; + virtual void DataReceived(const char * a_Data, size_t a_Size) override; virtual void GetOutgoingData(AString & a_Data) override; virtual void SocketClosed(void) override; From 1b78bef4b355c84ee86688eb4f802e5f8a8ccd78 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Wed, 2 Apr 2014 17:57:14 +0200 Subject: [PATCH 017/188] Removed unneeded asserts. --- src/LightingThread.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/LightingThread.h b/src/LightingThread.h index 3209ad9b2..770ae809f 100644 --- a/src/LightingThread.h +++ b/src/LightingThread.h @@ -164,9 +164,7 @@ protected: int & a_NumSeedsOut, unsigned char * a_IsSeedOut, unsigned int * a_SeedIdxOut ) { - ASSERT(a_SrcIdx >= 0); ASSERT(a_SrcIdx < ARRAYCOUNT(m_SkyLight)); - ASSERT(a_DstIdx >= 0); ASSERT(a_DstIdx < ARRAYCOUNT(m_BlockTypes)); if (a_Light[a_SrcIdx] <= a_Light[a_DstIdx] + cBlockInfo::GetSpreadLightFalloff(m_BlockTypes[a_DstIdx])) From e304bd08a2363f43bf845b2b370c18a60d1b66d1 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Thu, 3 Apr 2014 21:44:03 +0200 Subject: [PATCH 018/188] Documented the units and range for entity rotations. --- MCServer/Plugins/APIDump/APIDesc.lua | 6 +++--- src/Entities/Entity.h | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/MCServer/Plugins/APIDump/APIDesc.lua b/MCServer/Plugins/APIDump/APIDesc.lua index 451b7364a..b0086d740 100644 --- a/MCServer/Plugins/APIDump/APIDesc.lua +++ b/MCServer/Plugins/APIDump/APIDesc.lua @@ -777,14 +777,14 @@ end GetMass = { Params = "", Return = "number", Notes = "Returns the mass of the entity. Currently unused." }, GetMaxHealth = { Params = "", Return = "number", Notes = "Returns the maximum number of hitpoints this entity is allowed to have." }, GetParentClass = { Params = "", Return = "string", Notes = "Returns the name of the direct parent class for this entity" }, - GetPitch = { Params = "", Return = "number", Notes = "Returns the pitch (nose-down rotation) of the entity" }, + GetPitch = { Params = "", Return = "number", Notes = "Returns the pitch (nose-down rotation) of the entity. Measured in degrees, values range from -90 to +90." }, GetPosition = { Params = "", Return = "{{Vector3d}}", Notes = "Returns the entity's pivot position as a 3D vector" }, GetPosX = { Params = "", Return = "number", Notes = "Returns the X-coord of the entity's pivot" }, GetPosY = { Params = "", Return = "number", Notes = "Returns the Y-coord of the entity's pivot" }, GetPosZ = { Params = "", Return = "number", Notes = "Returns the Z-coord of the entity's pivot" }, GetRawDamageAgainst = { Params = "ReceiverEntity", Return = "number", Notes = "Returns the raw damage that this entity's equipment would cause when attacking the ReceiverEntity. This includes this entity's weapon {{cEnchantments|enchantments}}, but excludes the receiver's armor or potion effects. See {{TakeDamageInfo}} for more information on attack damage." }, GetRoll = { Params = "", Return = "number", Notes = "Returns the roll (sideways rotation) of the entity. Currently unused." }, - GetRot = { Params = "", Return = "{{Vector3f}}", Notes = "Returns the entire rotation vector (Yaw, Pitch, Roll)" }, + GetRot = { Params = "", Return = "{{Vector3f}}", Notes = "(OBSOLETE) Returns the entire rotation vector (Yaw, Pitch, Roll)" }, GetSpeed = { Params = "", Return = "{{Vector3d}}", Notes = "Returns the complete speed vector of the entity" }, GetSpeedX = { Params = "", Return = "number", Notes = "Returns the X-part of the speed vector" }, GetSpeedY = { Params = "", Return = "number", Notes = "Returns the Y-part of the speed vector" }, @@ -792,7 +792,7 @@ end GetUniqueID = { Params = "", Return = "number", Notes = "Returns the ID that uniquely identifies the entity within the running server. Note that this ID is not persisted to the data files." }, GetWidth = { Params = "", Return = "number", Notes = "Returns the width (X and Z size) of the entity." }, GetWorld = { Params = "", Return = "{{cWorld}}", Notes = "Returns the world where the entity resides" }, - GetYaw = { Params = "", Return = "number", Notes = "Returns the yaw (direction) of the entity." }, + GetYaw = { Params = "", Return = "number", Notes = "Returns the yaw (direction) of the entity. Measured in degrees, values range from -180 to +180." }, Heal = { Params = "Hitpoints", Return = "", Notes = "Heals the specified number of hitpoints. Hitpoints is expected to be a positive number." }, IsA = { Params = "ClassName", Return = "bool", Notes = "Returns true if the entity class is a descendant of the specified class name, or the specified class itself" }, IsBoat = { Params = "", Return = "bool", Notes = "Returns true if the entity is a {{cBoat|boat}}." }, diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h index e41f74b09..6e3f8292b 100644 --- a/src/Entities/Entity.h +++ b/src/Entities/Entity.h @@ -159,7 +159,7 @@ public: cWorld * GetWorld(void) const { return m_World; } - double GetHeadYaw (void) const { return m_HeadYaw; } + double GetHeadYaw (void) const { return m_HeadYaw; } // In degrees double GetHeight (void) const { return m_Height; } double GetMass (void) const { return m_Mass; } const Vector3d & GetPosition (void) const { return m_Pos; } @@ -167,9 +167,9 @@ public: double GetPosY (void) const { return m_Pos.y; } double GetPosZ (void) const { return m_Pos.z; } const Vector3d & GetRot (void) const { return m_Rot; } // OBSOLETE, use individual GetYaw(), GetPitch, GetRoll() components - double GetYaw (void) const { return m_Rot.x; } - double GetPitch (void) const { return m_Rot.y; } - double GetRoll (void) const { return m_Rot.z; } + double GetYaw (void) const { return m_Rot.x; } // In degrees, [-180, +180) + double GetPitch (void) const { return m_Rot.y; } // In degrees, [-180, +180), but normal client clips to [-90, +90] + double GetRoll (void) const { return m_Rot.z; } // In degrees, unused in current client Vector3d GetLookVector(void) const; const Vector3d & GetSpeed (void) const { return m_Speed; } double GetSpeedX (void) const { return m_Speed.x; } @@ -189,9 +189,9 @@ public: void SetPosition(double a_PosX, double a_PosY, double a_PosZ); void SetPosition(const Vector3d & a_Pos) { SetPosition(a_Pos.x, a_Pos.y, a_Pos.z); } void SetRot (const Vector3f & a_Rot); // OBSOLETE, use individual SetYaw(), SetPitch(), SetRoll() components - void SetYaw (double a_Yaw); - void SetPitch (double a_Pitch); - void SetRoll (double a_Roll); + void SetYaw (double a_Yaw); // In degrees, normalizes to [-180, +180) + void SetPitch (double a_Pitch); // In degrees, normalizes to [-180, +180) + void SetRoll (double a_Roll); // In degrees, normalizes to [-180, +180) void SetSpeed (double a_SpeedX, double a_SpeedY, double a_SpeedZ); void SetSpeed (const Vector3d & a_Speed) { SetSpeed(a_Speed.x, a_Speed.y, a_Speed.z); } void SetSpeedX (double a_SpeedX); From e2fb507be2157194dc435e30c856ffb4e6ad4ed6 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Thu, 3 Apr 2014 21:52:50 +0200 Subject: [PATCH 019/188] APIDump: Added angular specifics. --- MCServer/Plugins/APIDump/APIDesc.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MCServer/Plugins/APIDump/APIDesc.lua b/MCServer/Plugins/APIDump/APIDesc.lua index b0086d740..b3b7dd11c 100644 --- a/MCServer/Plugins/APIDump/APIDesc.lua +++ b/MCServer/Plugins/APIDump/APIDesc.lua @@ -777,7 +777,7 @@ end GetMass = { Params = "", Return = "number", Notes = "Returns the mass of the entity. Currently unused." }, GetMaxHealth = { Params = "", Return = "number", Notes = "Returns the maximum number of hitpoints this entity is allowed to have." }, GetParentClass = { Params = "", Return = "string", Notes = "Returns the name of the direct parent class for this entity" }, - GetPitch = { Params = "", Return = "number", Notes = "Returns the pitch (nose-down rotation) of the entity. Measured in degrees, values range from -90 to +90." }, + GetPitch = { Params = "", Return = "number", Notes = "Returns the pitch (nose-down rotation) of the entity. Measured in degrees, normal values range from -90 to +90. +90 means looking down, 0 means looking straight ahead, -90 means looking up." }, GetPosition = { Params = "", Return = "{{Vector3d}}", Notes = "Returns the entity's pivot position as a 3D vector" }, GetPosX = { Params = "", Return = "number", Notes = "Returns the X-coord of the entity's pivot" }, GetPosY = { Params = "", Return = "number", Notes = "Returns the Y-coord of the entity's pivot" }, @@ -792,7 +792,7 @@ end GetUniqueID = { Params = "", Return = "number", Notes = "Returns the ID that uniquely identifies the entity within the running server. Note that this ID is not persisted to the data files." }, GetWidth = { Params = "", Return = "number", Notes = "Returns the width (X and Z size) of the entity." }, GetWorld = { Params = "", Return = "{{cWorld}}", Notes = "Returns the world where the entity resides" }, - GetYaw = { Params = "", Return = "number", Notes = "Returns the yaw (direction) of the entity. Measured in degrees, values range from -180 to +180." }, + GetYaw = { Params = "", Return = "number", Notes = "Returns the yaw (direction) of the entity. Measured in degrees, values range from -180 to +180. 0 means ZP, 90 means XM, -180 means ZM, -90 means XP." }, Heal = { Params = "Hitpoints", Return = "", Notes = "Heals the specified number of hitpoints. Hitpoints is expected to be a positive number." }, IsA = { Params = "ClassName", Return = "bool", Notes = "Returns true if the entity class is a descendant of the specified class name, or the specified class itself" }, IsBoat = { Params = "", Return = "bool", Notes = "Returns true if the entity is a {{cBoat|boat}}." }, From 0fb40da8776482a90a86a46760ae8c9560963a73 Mon Sep 17 00:00:00 2001 From: Howaner Date: Thu, 3 Apr 2014 21:53:18 +0200 Subject: [PATCH 020/188] Change CanBeAt() from big flower --- src/Blocks/BlockBigFlower.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Blocks/BlockBigFlower.h b/src/Blocks/BlockBigFlower.h index 98d6502ab..39fd3cac8 100644 --- a/src/Blocks/BlockBigFlower.h +++ b/src/Blocks/BlockBigFlower.h @@ -81,11 +81,7 @@ public: virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override { - return ( - a_RelY > 0 - && a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) != E_BLOCK_AIR - && a_RelY < cChunkDef::Height - ); + return ((a_RelY > 0) && (a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) != E_BLOCK_AIR) && (a_RelY < cChunkDef::Height) && ((a_Chunk.GetBlock(a_RelX, a_RelY + 1, a_RelZ) == E_BLOCK_AIR) || (a_Chunk.GetBlock(a_RelX, a_RelY + 1, a_RelZ) == E_BLOCK_BIG_FLOWER))); } From 446a6515029e66b1f76358dcee1ccfe59c432bdd Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 4 Apr 2014 08:55:48 +0200 Subject: [PATCH 021/188] ProtoProxy: Fixed a few Clang and MSVC warnings. --- Tools/ProtoProxy/Connection.cpp | 10 +++++++--- Tools/ProtoProxy/Connection.h | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Tools/ProtoProxy/Connection.cpp b/Tools/ProtoProxy/Connection.cpp index f02b503f1..d9b8e3dd1 100644 --- a/Tools/ProtoProxy/Connection.cpp +++ b/Tools/ProtoProxy/Connection.cpp @@ -387,6 +387,8 @@ bool cConnection::RelayFromServer(void) return CLIENTSEND(Buffer, res); } } + ASSERT(!"Unhandled server state while relaying from server"); + return false; } @@ -423,6 +425,8 @@ bool cConnection::RelayFromClient(void) return SERVERSEND(Buffer, res); } } + ASSERT(!"Unhandled server state while relaying from client"); + return false; } @@ -438,11 +442,11 @@ double cConnection::GetRelativeTime(void) -bool cConnection::SendData(SOCKET a_Socket, const char * a_Data, int a_Size, const char * a_Peer) +bool cConnection::SendData(SOCKET a_Socket, const char * a_Data, size_t a_Size, const char * a_Peer) { - DataLog(a_Data, a_Size, "Sending data to %s, %d bytes", a_Peer, a_Size); + DataLog(a_Data, a_Size, "Sending data to %s, %u bytes", a_Peer, (unsigned)a_Size); - int res = send(a_Socket, a_Data, a_Size, 0); + int res = send(a_Socket, a_Data, (int)a_Size, 0); if (res <= 0) { Log("%s closed the socket: %d, %d; aborting connection", a_Peer, res, SocketError); diff --git a/Tools/ProtoProxy/Connection.h b/Tools/ProtoProxy/Connection.h index 70b759d0f..9e04994b7 100644 --- a/Tools/ProtoProxy/Connection.h +++ b/Tools/ProtoProxy/Connection.h @@ -103,7 +103,7 @@ protected: double GetRelativeTime(void); /// Sends data to the specified socket. If sending fails, prints a fail message using a_Peer and returns false. - bool SendData(SOCKET a_Socket, const char * a_Data, int a_Size, const char * a_Peer); + bool SendData(SOCKET a_Socket, const char * a_Data, size_t a_Size, const char * a_Peer); /// Sends data to the specified socket. If sending fails, prints a fail message using a_Peer and returns false. bool SendData(SOCKET a_Socket, cByteBuffer & a_Data, const char * a_Peer); From 402d85d896c793644681c4bb2934a7e0abb5ed8c Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 4 Apr 2014 09:56:57 +0200 Subject: [PATCH 022/188] Fixed Clang warnings in itemhandlers. --- src/Blocks/BlockSign.h | 4 ++-- src/Items/ItemEmptyMap.h | 2 +- src/Items/ItemFishingRod.h | 4 ++-- src/Items/ItemHandler.cpp | 6 +++--- src/Items/ItemLilypad.h | 23 ++++++++++++----------- src/Items/ItemMap.h | 2 +- 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/Blocks/BlockSign.h b/src/Blocks/BlockSign.h index 6c0becfd6..9d6fede21 100644 --- a/src/Blocks/BlockSign.h +++ b/src/Blocks/BlockSign.h @@ -31,7 +31,7 @@ public: } - static char RotationToMetaData(double a_Rotation) + static NIBBLETYPE RotationToMetaData(double a_Rotation) { a_Rotation += 180 + (180 / 16); // So it's not aligned with axis if (a_Rotation > 360) @@ -45,7 +45,7 @@ public: } - static char DirectionToMetaData(eBlockFace a_Direction) + static NIBBLETYPE DirectionToMetaData(eBlockFace a_Direction) { switch (a_Direction) { diff --git a/src/Items/ItemEmptyMap.h b/src/Items/ItemEmptyMap.h index f0b1e1424..953673382 100644 --- a/src/Items/ItemEmptyMap.h +++ b/src/Items/ItemEmptyMap.h @@ -55,7 +55,7 @@ public: return true; } - a_Player->GetInventory().AddItem(cItem(E_ITEM_MAP, 1, NewMap->GetID()), true, true); + a_Player->GetInventory().AddItem(cItem(E_ITEM_MAP, 1, (short)(NewMap->GetID() & 0x7fff)), true, true); return true; } diff --git a/src/Items/ItemFishingRod.h b/src/Items/ItemFishingRod.h index 15acbd9fe..0431b88b7 100644 --- a/src/Items/ItemFishingRod.h +++ b/src/Items/ItemFishingRod.h @@ -123,7 +123,7 @@ public: } case 2: { - Drops.Add(cItem(E_ITEM_FISHING_ROD, 1, a_World->GetTickRandomNumber(50))); // Fishing rod with durability. TODO: Enchantments on it + Drops.Add(cItem(E_ITEM_FISHING_ROD, 1, (short)a_World->GetTickRandomNumber(50))); // Fishing rod with durability. TODO: Enchantments on it break; } case 3: @@ -152,7 +152,7 @@ public: } else if (Junk <= 4) { - Drops.Add(cItem(E_ITEM_BOW, 1, a_World->GetTickRandomNumber(64))); + Drops.Add(cItem(E_ITEM_BOW, 1, (short)a_World->GetTickRandomNumber(64))); } else if (Junk <= 9) { diff --git a/src/Items/ItemHandler.cpp b/src/Items/ItemHandler.cpp index 337b3a83c..1e77717e3 100644 --- a/src/Items/ItemHandler.cpp +++ b/src/Items/ItemHandler.cpp @@ -506,13 +506,13 @@ bool cItemHandler::GetPlacementBlockTypeMeta( { ASSERT(m_ItemType < 256); // Items with IDs above 255 should all be handled by specific handlers - if (m_ItemType > 256) + if (m_ItemType >= 256) { - LOGERROR("%s: Item %d has no valid block!", __FUNCTION__, m_ItemType); + LOGERROR("%s: Item %d is not eligible for direct block placement!", __FUNCTION__, m_ItemType); return false; } - cBlockHandler * BlockH = BlockHandler(m_ItemType); + cBlockHandler * BlockH = BlockHandler((BLOCKTYPE)m_ItemType); cChunkInterface ChunkInterface(a_World->GetChunkMap()); return BlockH->GetPlacementBlockTypeMeta( ChunkInterface, a_Player, diff --git a/src/Items/ItemLilypad.h b/src/Items/ItemLilypad.h index 5a29abe94..8fc1d8543 100644 --- a/src/Items/ItemLilypad.h +++ b/src/Items/ItemLilypad.h @@ -16,17 +16,19 @@ class cItemLilypadHandler : typedef cItemHandler super; public: - cItemLilypadHandler(BLOCKTYPE a_BlockType) - : cItemHandler(a_BlockType) + cItemLilypadHandler(int a_ItemType): + super(a_ItemType) { } + virtual bool IsPlaceable(void) override { return false; // Set as not placeable so OnItemUse is called } + virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override { if (a_BlockFace > BLOCK_FACE_NONE) @@ -45,23 +47,22 @@ public: public cBlockTracer::cCallbacks { public: - cCallbacks(cWorld * a_World) : + cCallbacks(cWorld * a_CBWorld) : m_HasHitFluid(false), - m_World(a_World) + m_World(a_CBWorld) { } - virtual bool OnNextBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, char a_EntryFace) override + virtual bool OnNextBlock(int a_CBBlockX, int a_CBBlockY, int a_CBBlockZ, BLOCKTYPE a_CBBlockType, NIBBLETYPE a_CBBlockMeta, char a_CBEntryFace) override { - if (IsBlockWater(a_BlockType)) + if (IsBlockWater(a_CBBlockType)) { - if ((a_BlockMeta != 0) || (a_EntryFace == BLOCK_FACE_NONE)) // The hit block should be a source. The FACE_NONE check is clicking whilst submerged + if ((a_CBBlockMeta != 0) || (a_CBEntryFace == BLOCK_FACE_NONE)) // The hit block should be a source. The FACE_NONE check is clicking whilst submerged { return false; } - a_EntryFace = BLOCK_FACE_YP; // Always place pad at top of water block - AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, (eBlockFace)a_EntryFace); - BLOCKTYPE Block = m_World->GetBlock(a_BlockX, a_BlockY, a_BlockZ); + AddFaceDirection(a_CBBlockX, a_CBBlockY, a_CBBlockZ, BLOCK_FACE_YP); // Always place pad at top of water block + BLOCKTYPE Block = m_World->GetBlock(a_CBBlockX, a_CBBlockY, a_CBBlockZ); if ( !IsBlockWater(Block) && cBlockInfo::FullyOccupiesVoxel(Block) @@ -71,7 +72,7 @@ public: return true; } m_HasHitFluid = true; - m_Pos.Set(a_BlockX, a_BlockY, a_BlockZ); + m_Pos.Set(a_CBBlockX, a_CBBlockY, a_CBBlockZ); return true; } return false; diff --git a/src/Items/ItemMap.h b/src/Items/ItemMap.h index e8ff9da88..056fe0fe7 100644 --- a/src/Items/ItemMap.h +++ b/src/Items/ItemMap.h @@ -29,7 +29,7 @@ public: virtual void OnUpdate(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item) { - cMap * Map = a_World->GetMapManager().GetMapData(a_Item.m_ItemDamage); + cMap * Map = a_World->GetMapManager().GetMapData((unsigned)a_Item.m_ItemDamage); if (Map == NULL) { From 8825d30aabbee8cb2e452dc5a17deb6f9b6892a7 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 4 Apr 2014 10:13:25 +0200 Subject: [PATCH 023/188] Fixed some Clang warnings in protocols. --- src/ClientHandle.cpp | 4 ++-- src/ClientHandle.h | 2 +- src/Endianness.h | 31 ++++++++++++++++------------- src/Protocol/Protocol.h | 27 +++++++++++++++---------- src/Protocol/Protocol125.cpp | 2 +- src/Protocol/Protocol125.h | 2 +- src/Protocol/Protocol132.cpp | 2 +- src/Protocol/Protocol132.h | 2 +- src/Protocol/Protocol14x.cpp | 12 +++++------ src/Protocol/Protocol17x.cpp | 4 ++-- src/Protocol/Protocol17x.h | 2 +- src/Protocol/ProtocolRecognizer.cpp | 2 +- src/Protocol/ProtocolRecognizer.h | 2 +- 13 files changed, 51 insertions(+), 43 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 23ba4dbab..daf2c4da8 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1532,7 +1532,7 @@ void cClientHandle::HandleTabCompletion(const AString & a_Text) -void cClientHandle::SendData(const char * a_Data, int a_Size) +void cClientHandle::SendData(const char * a_Data, size_t a_Size) { if (m_HasSentDC) { @@ -1547,7 +1547,7 @@ void cClientHandle::SendData(const char * a_Data, int a_Size) if (m_OutgoingDataOverflow.empty()) { // No queued overflow data; if this packet fits into the ringbuffer, put it in, otherwise put it in the overflow buffer: - int CanFit = m_OutgoingData.GetFreeSpace(); + size_t CanFit = m_OutgoingData.GetFreeSpace(); if (CanFit > a_Size) { CanFit = a_Size; diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 5496e61a7..d83a323f9 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -225,7 +225,7 @@ public: */ bool HandleLogin(int a_ProtocolVersion, const AString & a_Username); - void SendData(const char * a_Data, int a_Size); + void SendData(const char * a_Data, size_t a_Size); /** Called when the player moves into a different world; queues sreaming the new chunks */ void MoveToWorld(cWorld & a_World, bool a_SendRespawnPacket); diff --git a/src/Endianness.h b/src/Endianness.h index 86eb369f5..6a2593077 100644 --- a/src/Endianness.h +++ b/src/Endianness.h @@ -1,12 +1,14 @@ #pragma once +#define ntohll(x) ((((UInt64)ntohl((u_long)x)) << 32) + ntohl(x >> 32)) + // Changes endianness -inline unsigned long long HostToNetwork8(const void* a_Value ) +inline UInt64 HostToNetwork8(const void * a_Value) { unsigned long long __HostToNetwork8; memcpy( &__HostToNetwork8, a_Value, sizeof( __HostToNetwork8 ) ); @@ -18,7 +20,7 @@ inline unsigned long long HostToNetwork8(const void* a_Value ) -inline unsigned int HostToNetwork4(const void* a_Value ) +inline UInt32 HostToNetwork4(const void* a_Value ) { unsigned int __HostToNetwork4; memcpy( &__HostToNetwork4, a_Value, sizeof( __HostToNetwork4 ) ); @@ -30,11 +32,10 @@ inline unsigned int HostToNetwork4(const void* a_Value ) -inline double NetworkToHostDouble8(const void* a_Value ) +inline double NetworkToHostDouble8(const void * a_Value) { -#define ntohll(x) ((((unsigned long long)ntohl((u_long)x)) << 32) + ntohl(x >> 32)) - unsigned long long buf = 0;//(*(unsigned long long*)a_Value); - memcpy( &buf, a_Value, 8 ); + UInt64 buf = 0; + memcpy(&buf, a_Value, 8); buf = ntohll(buf); double x; memcpy(&x, &buf, sizeof(double)); @@ -45,23 +46,25 @@ inline double NetworkToHostDouble8(const void* a_Value ) -inline long long NetworkToHostLong8(const void * a_Value ) +inline Int64 NetworkToHostLong8(const void * a_Value) { - unsigned long long buf = *(unsigned long long*)a_Value; + UInt64 buf; + memcpy(&buf, &a_Value, 8); buf = ntohll(buf); - return *reinterpret_cast(&buf); + return *reinterpret_cast(&buf); } -inline float NetworkToHostFloat4(const void* a_Value ) +inline float NetworkToHostFloat4(const void * a_Value) { - u_long buf = *(u_long*)a_Value; - buf = ntohl( buf ); - float x = 0; - memcpy( &x, &buf, sizeof(float) ); + UInt32 buf; + float x; + memcpy(&buf, &a_Value, 4); + buf = ntohl(buf); + memcpy(&x, &buf, sizeof(float)); return x; } diff --git a/src/Protocol/Protocol.h b/src/Protocol/Protocol.h index d3383bf0d..8294fa8b7 100644 --- a/src/Protocol/Protocol.h +++ b/src/Protocol/Protocol.h @@ -132,7 +132,7 @@ protected: cCriticalSection m_CSPacket; //< Each SendXYZ() function must acquire this CS in order to send the whole packet at once /// A generic data-sending routine, all outgoing packet data needs to be routed through this so that descendants may override it - virtual void SendData(const char * a_Data, int a_Size) = 0; + virtual void SendData(const char * a_Data, size_t a_Size) = 0; /// Called after writing each packet, enables descendants to flush their buffers virtual void Flush(void) {}; @@ -143,10 +143,15 @@ protected: SendData((const char *)&a_Value, 1); } + void WriteChar(char a_Value) + { + SendData(&a_Value, 1); + } + void WriteShort(short a_Value) { - a_Value = htons(a_Value); - SendData((const char *)&a_Value, 2); + u_short Value = htons((u_short)a_Value); + SendData((const char *)&Value, 2); } /* @@ -159,8 +164,8 @@ protected: void WriteInt(int a_Value) { - a_Value = htonl(a_Value); - SendData((const char *)&a_Value, 4); + u_long Value = htonl((u_long)a_Value); + SendData((const char *)&Value, 4); } void WriteUInt(unsigned int a_Value) @@ -171,19 +176,19 @@ protected: void WriteInt64 (Int64 a_Value) { - a_Value = HostToNetwork8(&a_Value); - SendData((const char *)&a_Value, 8); + UInt64 Value = HostToNetwork8(&a_Value); + SendData((const char *)Value, 8); } void WriteFloat (float a_Value) { - unsigned int val = HostToNetwork4(&a_Value); + UInt32 val = HostToNetwork4(&a_Value); SendData((const char *)&val, 4); } void WriteDouble(double a_Value) { - unsigned long long val = HostToNetwork8(&a_Value); + UInt64 val = HostToNetwork8(&a_Value); SendData((const char *)&val, 8); } @@ -191,7 +196,7 @@ protected: { AString UTF16; UTF8ToRawBEUTF16(a_Value.c_str(), a_Value.length(), UTF16); - WriteShort((unsigned short)(UTF16.size() / 2)); + WriteShort((short)(UTF16.size() / 2)); SendData(UTF16.data(), UTF16.size()); } @@ -224,7 +229,7 @@ protected: void WriteVarUTF8String(const AString & a_String) { - WriteVarInt(a_String.size()); + WriteVarInt((UInt32)a_String.size()); SendData(a_String.data(), a_String.size()); } } ; diff --git a/src/Protocol/Protocol125.cpp b/src/Protocol/Protocol125.cpp index fe6280218..0fa5c6de7 100644 --- a/src/Protocol/Protocol125.cpp +++ b/src/Protocol/Protocol125.cpp @@ -1156,7 +1156,7 @@ AString cProtocol125::GetAuthServerID(void) -void cProtocol125::SendData(const char * a_Data, int a_Size) +void cProtocol125::SendData(const char * a_Data, size_t a_Size) { m_Client->SendData(a_Data, a_Size); } diff --git a/src/Protocol/Protocol125.h b/src/Protocol/Protocol125.h index aca24c03a..08d3ebbe9 100644 --- a/src/Protocol/Protocol125.h +++ b/src/Protocol/Protocol125.h @@ -125,7 +125,7 @@ protected: AString m_Username; ///< Stored in ParseHandshake(), compared to Login username - virtual void SendData(const char * a_Data, int a_Size) override; + virtual void SendData(const char * a_Data, size_t a_Size) override; /// Sends the Handshake packet void SendHandshake(const AString & a_ConnectionHash); diff --git a/src/Protocol/Protocol132.cpp b/src/Protocol/Protocol132.cpp index be9c503ed..ce5d134ea 100644 --- a/src/Protocol/Protocol132.cpp +++ b/src/Protocol/Protocol132.cpp @@ -605,7 +605,7 @@ int cProtocol132::ParseTabCompletion(void) -void cProtocol132::SendData(const char * a_Data, int a_Size) +void cProtocol132::SendData(const char * a_Data, size_t a_Size) { m_DataToSend.append(a_Data, a_Size); } diff --git a/src/Protocol/Protocol132.h b/src/Protocol/Protocol132.h index 0702fbf5a..b280c8a41 100644 --- a/src/Protocol/Protocol132.h +++ b/src/Protocol/Protocol132.h @@ -87,7 +87,7 @@ protected: /// The ServerID used for session authentication; set in StartEncryption(), used in GetAuthServerID() AString m_AuthServerID; - virtual void SendData(const char * a_Data, int a_Size) override; + virtual void SendData(const char * a_Data, size_t a_Size) override; // DEBUG: virtual void Flush(void) override; diff --git a/src/Protocol/Protocol14x.cpp b/src/Protocol/Protocol14x.cpp index 232b2718e..f694af1eb 100644 --- a/src/Protocol/Protocol14x.cpp +++ b/src/Protocol/Protocol14x.cpp @@ -103,9 +103,9 @@ void cProtocol142::SendPickupSpawn(const cPickup & a_Pickup) WriteInt (a_Pickup.GetUniqueID()); WriteItem (a_Pickup.GetItem()); WriteVectorI((Vector3i)(a_Pickup.GetPosition() * 32)); - WriteByte ((char)(a_Pickup.GetSpeed().x * 8)); - WriteByte ((char)(a_Pickup.GetSpeed().y * 8)); - WriteByte ((char)(a_Pickup.GetSpeed().z * 8)); + WriteChar ((char)(a_Pickup.GetSpeed().x * 8)); + WriteChar ((char)(a_Pickup.GetSpeed().y * 8)); + WriteChar ((char)(a_Pickup.GetSpeed().z * 8)); Flush(); } @@ -119,7 +119,7 @@ void cProtocol142::SendSoundParticleEffect(int a_EffectID, int a_SrcX, int a_Src WriteByte(PACKET_SOUND_PARTICLE_EFFECT); WriteInt (a_EffectID); WriteInt (a_SrcX); - WriteByte(a_SrcY); + WriteByte((Byte)a_SrcY); WriteInt (a_SrcZ); WriteInt (a_Data); WriteBool(0); @@ -218,7 +218,7 @@ void cProtocol146::SendSpawnObject(const cEntity & a_Entity, char a_ObjectType, cCSLock Lock(m_CSPacket); WriteByte(PACKET_SPAWN_OBJECT); WriteInt (a_Entity.GetUniqueID()); - WriteByte(a_ObjectType); + WriteChar(a_ObjectType); WriteInt ((int)(a_Entity.GetPosX() * 32)); WriteInt ((int)(a_Entity.GetPosY() * 32)); WriteInt ((int)(a_Entity.GetPosZ() * 32)); @@ -243,7 +243,7 @@ void cProtocol146::SendSpawnVehicle(const cEntity & a_Vehicle, char a_VehicleTyp cCSLock Lock(m_CSPacket); WriteByte (PACKET_SPAWN_OBJECT); WriteInt (a_Vehicle.GetUniqueID()); - WriteByte (a_VehicleType); + WriteChar (a_VehicleType); WriteInt ((int)(a_Vehicle.GetPosX() * 32)); WriteInt ((int)(a_Vehicle.GetPosY() * 32)); WriteInt ((int)(a_Vehicle.GetPosZ() * 32)); diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index c678fc9a0..b987294b0 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -1988,14 +1988,14 @@ void cProtocol172::WritePacket(cByteBuffer & a_Packet) -void cProtocol172::SendData(const char * a_Data, int a_Size) +void cProtocol172::SendData(const char * a_Data, size_t a_Size) { if (m_IsEncrypted) { Byte Encrypted[8192]; // Larger buffer, we may be sending lots of data (chunks) while (a_Size > 0) { - size_t NumBytes = ((size_t)a_Size > sizeof(Encrypted)) ? sizeof(Encrypted) : (size_t)a_Size; + size_t NumBytes = (a_Size > sizeof(Encrypted)) ? sizeof(Encrypted) : a_Size; m_Encryptor.ProcessData(Encrypted, (Byte *)a_Data, NumBytes); m_Client->SendData((const char *)Encrypted, NumBytes); a_Size -= NumBytes; diff --git a/src/Protocol/Protocol17x.h b/src/Protocol/Protocol17x.h index 41163009e..bb6ee575a 100644 --- a/src/Protocol/Protocol17x.h +++ b/src/Protocol/Protocol17x.h @@ -287,7 +287,7 @@ protected: void WritePacket(cByteBuffer & a_Packet); /** Sends the data to the client, encrypting them if needed. */ - virtual void SendData(const char * a_Data, int a_Size) override; + virtual void SendData(const char * a_Data, size_t a_Size) override; void SendCompass(const cWorld & a_World); diff --git a/src/Protocol/ProtocolRecognizer.cpp b/src/Protocol/ProtocolRecognizer.cpp index 3b9003e60..81f146370 100644 --- a/src/Protocol/ProtocolRecognizer.cpp +++ b/src/Protocol/ProtocolRecognizer.cpp @@ -794,7 +794,7 @@ AString cProtocolRecognizer::GetAuthServerID(void) -void cProtocolRecognizer::SendData(const char * a_Data, int a_Size) +void cProtocolRecognizer::SendData(const char * a_Data, size_t a_Size) { // This is used only when handling the server ping m_Client->SendData(a_Data, a_Size); diff --git a/src/Protocol/ProtocolRecognizer.h b/src/Protocol/ProtocolRecognizer.h index d7fb8fad2..072d7c2d2 100644 --- a/src/Protocol/ProtocolRecognizer.h +++ b/src/Protocol/ProtocolRecognizer.h @@ -133,7 +133,7 @@ public: virtual AString GetAuthServerID(void) override; - virtual void SendData(const char * a_Data, int a_Size) override; + virtual void SendData(const char * a_Data, size_t a_Size) override; protected: cProtocol * m_Protocol; //< The recognized protocol From 396abb5db6e46f214e27e4dba1099490bf03bb0a Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 4 Apr 2014 10:19:21 +0200 Subject: [PATCH 024/188] Fixed silly Clang's warnings in FastNBT. --- src/WorldStorage/FastNBT.h | 56 +++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/WorldStorage/FastNBT.h b/src/WorldStorage/FastNBT.h index 1b8b09c21..5e5af3ca3 100644 --- a/src/WorldStorage/FastNBT.h +++ b/src/WorldStorage/FastNBT.h @@ -122,33 +122,33 @@ public: int GetRoot(void) const {return 0; } /** Returns the first child of the specified tag, or -1 if none / not applicable. */ - int GetFirstChild (int a_Tag) const { return m_Tags[a_Tag].m_FirstChild; } + int GetFirstChild (int a_Tag) const { return m_Tags[(size_t)a_Tag].m_FirstChild; } /** Returns the last child of the specified tag, or -1 if none / not applicable. */ - int GetLastChild (int a_Tag) const { return m_Tags[a_Tag].m_LastChild; } + int GetLastChild (int a_Tag) const { return m_Tags[(size_t)a_Tag].m_LastChild; } /** Returns the next sibling of the specified tag, or -1 if none. */ - int GetNextSibling(int a_Tag) const { return m_Tags[a_Tag].m_NextSibling; } + int GetNextSibling(int a_Tag) const { return m_Tags[(size_t)a_Tag].m_NextSibling; } /** Returns the previous sibling of the specified tag, or -1 if none. */ - int GetPrevSibling(int a_Tag) const { return m_Tags[a_Tag].m_PrevSibling; } + int GetPrevSibling(int a_Tag) const { return m_Tags[(size_t)a_Tag].m_PrevSibling; } /** Returns the length of the tag's data, in bytes. Not valid for Compound or List tags! */ int GetDataLength (int a_Tag) const { - ASSERT(m_Tags[a_Tag].m_Type != TAG_List); - ASSERT(m_Tags[a_Tag].m_Type != TAG_Compound); - return m_Tags[a_Tag].m_DataLength; + ASSERT(m_Tags[(size_t)a_Tag].m_Type != TAG_List); + ASSERT(m_Tags[(size_t)a_Tag].m_Type != TAG_Compound); + return m_Tags[(size_t)a_Tag].m_DataLength; } /** Returns the data stored in this tag. Not valid for Compound or List tags! */ const char * GetData(int a_Tag) const { - ASSERT(m_Tags[a_Tag].m_Type != TAG_List); - ASSERT(m_Tags[a_Tag].m_Type != TAG_Compound); - return m_Data + m_Tags[a_Tag].m_DataStart; + ASSERT(m_Tags[(size_t)a_Tag].m_Type != TAG_List); + ASSERT(m_Tags[(size_t)a_Tag].m_Type != TAG_Compound); + return m_Data + m_Tags[(size_t)a_Tag].m_DataStart; } /** Returns the direct child tag of the specified name, or -1 if no such tag. */ @@ -163,47 +163,47 @@ public: /** Returns the child tag of the specified path (Name1\Name2\Name3...), or -1 if no such tag. */ int FindTagByPath(int a_Tag, const AString & a_Path) const; - eTagType GetType(int a_Tag) const { return m_Tags[a_Tag].m_Type; } + eTagType GetType(int a_Tag) const { return m_Tags[(size_t)a_Tag].m_Type; } /** Returns the children type for a List tag; undefined on other tags. If list empty, returns TAG_End. */ eTagType GetChildrenType(int a_Tag) const { - ASSERT(m_Tags[a_Tag].m_Type == TAG_List); - return (m_Tags[a_Tag].m_FirstChild < 0) ? TAG_End : m_Tags[m_Tags[a_Tag].m_FirstChild].m_Type; + ASSERT(m_Tags[(size_t)a_Tag].m_Type == TAG_List); + return (m_Tags[(size_t)a_Tag].m_FirstChild < 0) ? TAG_End : m_Tags[(size_t)m_Tags[(size_t)a_Tag].m_FirstChild].m_Type; } /** Returns the value stored in a Byte tag. Not valid for any other tag type. */ inline unsigned char GetByte(int a_Tag) const { - ASSERT(m_Tags[a_Tag].m_Type == TAG_Byte); - return (unsigned char)(m_Data[m_Tags[a_Tag].m_DataStart]); + ASSERT(m_Tags[(size_t)a_Tag].m_Type == TAG_Byte); + return (unsigned char)(m_Data[(size_t)m_Tags[(size_t)a_Tag].m_DataStart]); } /** Returns the value stored in a Short tag. Not valid for any other tag type. */ inline Int16 GetShort(int a_Tag) const { - ASSERT(m_Tags[a_Tag].m_Type == TAG_Short); - return GetBEShort(m_Data + m_Tags[a_Tag].m_DataStart); + ASSERT(m_Tags[(size_t)a_Tag].m_Type == TAG_Short); + return GetBEShort(m_Data + m_Tags[(size_t)a_Tag].m_DataStart); } /** Returns the value stored in an Int tag. Not valid for any other tag type. */ inline Int32 GetInt(int a_Tag) const { - ASSERT(m_Tags[a_Tag].m_Type == TAG_Int); - return GetBEInt(m_Data + m_Tags[a_Tag].m_DataStart); + ASSERT(m_Tags[(size_t)a_Tag].m_Type == TAG_Int); + return GetBEInt(m_Data + m_Tags[(size_t)a_Tag].m_DataStart); } /** Returns the value stored in a Long tag. Not valid for any other tag type. */ inline Int64 GetLong(int a_Tag) const { - ASSERT(m_Tags[a_Tag].m_Type == TAG_Long); - return NetworkToHostLong8(m_Data + m_Tags[a_Tag].m_DataStart); + ASSERT(m_Tags[(size_t)a_Tag].m_Type == TAG_Long); + return NetworkToHostLong8(m_Data + m_Tags[(size_t)a_Tag].m_DataStart); } /** Returns the value stored in a Float tag. Not valid for any other tag type. */ inline float GetFloat(int a_Tag) const { - ASSERT(m_Tags[a_Tag].m_Type == TAG_Float); + ASSERT(m_Tags[(size_t)a_Tag].m_Type == TAG_Float); // Cause a compile-time error if sizeof(float) != 4 // If your platform produces a compiler error here, you'll need to add code that manually decodes 32-bit floats @@ -212,7 +212,7 @@ public: UNUSED(Check1); UNUSED(Check2); - Int32 i = GetBEInt(m_Data + m_Tags[a_Tag].m_DataStart); + Int32 i = GetBEInt(m_Data + m_Tags[(size_t)a_Tag].m_DataStart); float f; memcpy(&f, &i, sizeof(f)); return f; @@ -228,16 +228,16 @@ public: UNUSED(Check1); UNUSED(Check2); - ASSERT(m_Tags[a_Tag].m_Type == TAG_Double); - return NetworkToHostDouble8(m_Data + m_Tags[a_Tag].m_DataStart); + ASSERT(m_Tags[(size_t)a_Tag].m_Type == TAG_Double); + return NetworkToHostDouble8(m_Data + m_Tags[(size_t)a_Tag].m_DataStart); } /** Returns the value stored in a String tag. Not valid for any other tag type. */ inline AString GetString(int a_Tag) const { - ASSERT(m_Tags[a_Tag].m_Type == TAG_String); + ASSERT(m_Tags[(size_t)a_Tag].m_Type == TAG_String); AString res; - res.assign(m_Data + m_Tags[a_Tag].m_DataStart, m_Tags[a_Tag].m_DataLength); + res.assign(m_Data + m_Tags[(size_t)a_Tag].m_DataStart, m_Tags[(size_t)a_Tag].m_DataLength); return res; } @@ -245,7 +245,7 @@ public: inline AString GetName(int a_Tag) const { AString res; - res.assign(m_Data + m_Tags[a_Tag].m_NameStart, m_Tags[a_Tag].m_NameLength); + res.assign(m_Data + m_Tags[(size_t)a_Tag].m_NameStart, m_Tags[(size_t)a_Tag].m_NameLength); return res; } From 5dee19648d8b3b068698fd1c9cb62e9038bf0e2c Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 4 Apr 2014 10:31:50 +0200 Subject: [PATCH 025/188] More Clang warning fixes in the protocols. --- src/Protocol/Protocol132.cpp | 65 ++++++++++++++++++++---------------- src/StringUtils.cpp | 2 +- src/StringUtils.h | 2 +- 3 files changed, 39 insertions(+), 30 deletions(-) diff --git a/src/Protocol/Protocol132.cpp b/src/Protocol/Protocol132.cpp index ce5d134ea..ce5942a5c 100644 --- a/src/Protocol/Protocol132.cpp +++ b/src/Protocol/Protocol132.cpp @@ -115,7 +115,7 @@ void cProtocol132::DataReceived(const char * a_Data, size_t a_Size) Byte Decrypted[512]; while (a_Size > 0) { - int NumBytes = (a_Size > (int)sizeof(Decrypted)) ? (int)sizeof(Decrypted) : a_Size; + size_t NumBytes = (a_Size > sizeof(Decrypted)) ? sizeof(Decrypted) : a_Size; m_Decryptor.ProcessData(Decrypted, (Byte *)a_Data, NumBytes); super::DataReceived((const char *)Decrypted, NumBytes); a_Size -= NumBytes; @@ -139,8 +139,8 @@ void cProtocol132::SendBlockAction(int a_BlockX, int a_BlockY, int a_BlockZ, cha WriteInt (a_BlockX); WriteShort((short)a_BlockY); WriteInt (a_BlockZ); - WriteByte (a_Byte1); - WriteByte (a_Byte2); + WriteChar (a_Byte1); + WriteChar (a_Byte2); WriteShort(a_BlockType); Flush(); } @@ -157,7 +157,7 @@ void cProtocol132::SendBlockBreakAnim(int a_entityID, int a_BlockX, int a_BlockY WriteInt (a_BlockX); WriteInt (a_BlockY); WriteInt (a_BlockZ); - WriteByte (stage); + WriteChar (stage); Flush(); } @@ -259,7 +259,7 @@ void cProtocol132::SendLogin(const cPlayer & a_Player, const cWorld & a_World) WriteByte (PACKET_LOGIN); WriteInt (a_Player.GetUniqueID()); // EntityID of the player WriteString("default"); // Level type - WriteByte ((int)a_Player.GetGameMode()); + WriteByte ((Byte)a_Player.GetGameMode()); WriteByte ((Byte)(a_World.GetDimension())); WriteByte (2); // TODO: Difficulty WriteByte (0); // Unused, used to be world height @@ -283,8 +283,8 @@ void cProtocol132::SendPlayerSpawn(const cPlayer & a_Player) WriteInt ((int)(a_Player.GetPosX() * 32)); WriteInt ((int)(a_Player.GetPosY() * 32)); WriteInt ((int)(a_Player.GetPosZ() * 32)); - WriteByte ((char)((a_Player.GetYaw() / 360.f) * 256)); - WriteByte ((char)((a_Player.GetPitch() / 360.f) * 256)); + WriteChar ((char)((a_Player.GetYaw() / 360.f) * 256)); + WriteChar ((char)((a_Player.GetPitch() / 360.f) * 256)); WriteShort (HeldItem.IsEmpty() ? 0 : HeldItem.m_ItemType); // Player metadata: just use a default metadata value, since the client doesn't like starting without any metadata: WriteByte (0); // Index 0, byte (flags) @@ -306,7 +306,7 @@ void cProtocol132::SendSoundEffect(const AString & a_SoundName, int a_SrcX, int WriteInt (a_SrcY); WriteInt (a_SrcZ); WriteFloat (a_Volume); - WriteByte ((char)(a_Pitch * 63.0f)); + WriteChar ((char)(a_Pitch * 63.0f)); Flush(); } @@ -320,7 +320,7 @@ void cProtocol132::SendSoundParticleEffect(int a_EffectID, int a_SrcX, int a_Src WriteByte(PACKET_SOUND_PARTICLE_EFFECT); WriteInt (a_EffectID); WriteInt (a_SrcX); - WriteByte(a_SrcY); + WriteByte((Byte)a_SrcY); WriteInt (a_SrcZ); WriteInt (a_Data); Flush(); @@ -335,7 +335,7 @@ void cProtocol132::SendSpawnMob(const cMonster & a_Mob) cCSLock Lock(m_CSPacket); WriteByte (PACKET_SPAWN_MOB); WriteInt (a_Mob.GetUniqueID()); - WriteByte (a_Mob.GetMobType()); + WriteByte ((Byte)a_Mob.GetMobType()); WriteVectorI((Vector3i)(a_Mob.GetPosition() * 32)); WriteByte ((Byte)((a_Mob.GetYaw() / 360.f) * 256)); WriteByte ((Byte)((a_Mob.GetPitch() / 360.f) * 256)); @@ -411,12 +411,12 @@ void cProtocol132::SendWholeInventory(const cWindow & a_Window) const cInventory & Inventory = m_Client->GetPlayer()->GetInventory(); int BaseOffset = a_Window.GetNumSlots() - (cInventory::invNumSlots - cInventory::invInventoryOffset); // Number of non-inventory slots char WindowID = a_Window.GetWindowID(); - for (int i = 0; i < cInventory::invInventoryCount; i++) + for (short i = 0; i < cInventory::invInventoryCount; i++) { SendInventorySlot(WindowID, BaseOffset + i, Inventory.GetInventorySlot(i)); } // for i - Inventory[] BaseOffset += cInventory::invInventoryCount; - for (int i = 0; i < cInventory::invHotbarCount; i++) + for (short i = 0; i < cInventory::invHotbarCount; i++) { SendInventorySlot(WindowID, BaseOffset + i, Inventory.GetHotbarSlot(i)); } // for i - Hotbar[] @@ -527,21 +527,30 @@ int cProtocol132::ParseClientStatuses(void) int cProtocol132::ParseEncryptionKeyResponse(void) { + // Read the encryption key: HANDLE_PACKET_READ(ReadBEShort, short, EncKeyLength); + if (EncKeyLength > MAX_ENC_LEN) + { + LOGD("Too long encryption key"); + m_Client->Kick("Hacked client"); + return PARSE_OK; + } AString EncKey; - if (!m_ReceivedData.ReadString(EncKey, EncKeyLength)) + if (!m_ReceivedData.ReadString(EncKey, (size_t)EncKeyLength)) { return PARSE_INCOMPLETE; } + + // Read the encryption nonce: HANDLE_PACKET_READ(ReadBEShort, short, EncNonceLength); AString EncNonce; - if (!m_ReceivedData.ReadString(EncNonce, EncNonceLength)) + if (!m_ReceivedData.ReadString(EncNonce, (size_t)EncNonceLength)) { return PARSE_INCOMPLETE; } - if ((EncKeyLength > MAX_ENC_LEN) || (EncNonceLength > MAX_ENC_LEN)) + if (EncNonceLength > MAX_ENC_LEN) { - LOGD("Too long encryption"); + LOGD("Too long encryption nonce"); m_Client->Kick("Hacked client"); return PARSE_OK; } @@ -623,23 +632,23 @@ void cProtocol132::Flush(void) LOGD("Flushing empty"); return; } - const char * a_Data = m_DataToSend.data(); - int a_Size = m_DataToSend.size(); + const char * Data = m_DataToSend.data(); + size_t Size = m_DataToSend.size(); if (m_IsEncrypted) { Byte Encrypted[8192]; // Larger buffer, we may be sending lots of data (chunks) - while (a_Size > 0) + while (Size > 0) { - int NumBytes = (a_Size > (int)sizeof(Encrypted)) ? (int)sizeof(Encrypted) : a_Size; - m_Encryptor.ProcessData(Encrypted, (Byte *)a_Data, NumBytes); + size_t NumBytes = (Size > sizeof(Encrypted)) ? sizeof(Encrypted) : Size; + m_Encryptor.ProcessData(Encrypted, (Byte *)Data, NumBytes); super::SendData((const char *)Encrypted, NumBytes); - a_Size -= NumBytes; - a_Data += NumBytes; + Size -= NumBytes; + Data += NumBytes; } } else { - super::SendData(a_Data, a_Size); + super::SendData(Data, Size); } m_DataToSend.clear(); } @@ -665,7 +674,7 @@ void cProtocol132::WriteItem(const cItem & a_Item) } WriteShort(ItemType); - WriteByte (a_Item.m_ItemCount); + WriteChar (a_Item.m_ItemCount); WriteShort(a_Item.m_ItemDamage); if (a_Item.m_Enchantments.IsEmpty()) @@ -681,7 +690,7 @@ void cProtocol132::WriteItem(const cItem & a_Item) Writer.Finish(); AString Compressed; CompressStringGZIP(Writer.GetResult().data(), Writer.GetResult().size(), Compressed); - WriteShort(Compressed.size()); + WriteShort((short)Compressed.size()); SendData(Compressed.data(), Compressed.size()); } @@ -717,8 +726,8 @@ int cProtocol132::ParseItem(cItem & a_Item) // Read the metadata AString Metadata; - Metadata.resize(MetadataLength); - if (!m_ReceivedData.ReadBuf((void *)Metadata.data(), MetadataLength)) + Metadata.resize((size_t)MetadataLength); + if (!m_ReceivedData.ReadBuf((void *)Metadata.data(), (size_t)MetadataLength)) { return PARSE_INCOMPLETE; } diff --git a/src/StringUtils.cpp b/src/StringUtils.cpp index ad622d707..f46730150 100644 --- a/src/StringUtils.cpp +++ b/src/StringUtils.cpp @@ -531,7 +531,7 @@ AString & UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length, AString & a format binary data this way: 00001234: 31 32 33 34 35 36 37 38 39 30 61 62 63 64 65 66 1234567890abcdef */ -AString & CreateHexDump(AString & a_Out, const void * a_Data, int a_Size, int a_LineLength) +AString & CreateHexDump(AString & a_Out, const void * a_Data, size_t a_Size, int a_LineLength) { ASSERT(a_LineLength <= 120); // Due to using a fixed size line buffer; increase line[]'s size to lift this max char line[512]; diff --git a/src/StringUtils.h b/src/StringUtils.h index da395e5b5..ce24e89bc 100644 --- a/src/StringUtils.h +++ b/src/StringUtils.h @@ -64,7 +64,7 @@ extern AString & RawBEToUTF8(const char * a_RawData, int a_NumShorts, AString & extern AString & UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length, AString & a_UTF16); /// Creates a nicely formatted HEX dump of the given memory block. Max a_BytesPerLine is 120 -extern AString & CreateHexDump(AString & a_Out, const void * a_Data, int a_Size, int a_BytesPerLine); +extern AString & CreateHexDump(AString & a_Out, const void * a_Data, size_t a_Size, int a_BytesPerLine); /// Returns a copy of a_Message with all quotes and backslashes escaped by a backslash extern AString EscapeString(const AString & a_Message); // tolua_export From e1f75ab6d0862d77bf91b588d54acf63fdf20c63 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 4 Apr 2014 10:42:17 +0200 Subject: [PATCH 026/188] Fixed CreateHexDump's signedness. --- src/Protocol/Protocol.h | 2 +- src/StringUtils.cpp | 18 +++++++++--------- src/StringUtils.h | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Protocol/Protocol.h b/src/Protocol/Protocol.h index 8294fa8b7..ae06f2f9e 100644 --- a/src/Protocol/Protocol.h +++ b/src/Protocol/Protocol.h @@ -216,7 +216,7 @@ protected: { // A 32-bit integer can be encoded by at most 5 bytes: unsigned char b[5]; - int idx = 0; + size_t idx = 0; do { b[idx] = (a_Value & 0x7f) | ((a_Value > 0x7f) ? 0x80 : 0x00); diff --git a/src/StringUtils.cpp b/src/StringUtils.cpp index f46730150..a69d8750f 100644 --- a/src/StringUtils.cpp +++ b/src/StringUtils.cpp @@ -531,20 +531,20 @@ AString & UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length, AString & a format binary data this way: 00001234: 31 32 33 34 35 36 37 38 39 30 61 62 63 64 65 66 1234567890abcdef */ -AString & CreateHexDump(AString & a_Out, const void * a_Data, size_t a_Size, int a_LineLength) +AString & CreateHexDump(AString & a_Out, const void * a_Data, size_t a_Size, size_t a_BytesPerLine) { - ASSERT(a_LineLength <= 120); // Due to using a fixed size line buffer; increase line[]'s size to lift this max + ASSERT(a_BytesPerLine <= 120); // Due to using a fixed size line buffer; increase line[]'s size to lift this max char line[512]; char * p; char * q; - a_Out.reserve(a_Size / a_LineLength * (18 + 6 * a_LineLength)); - for (int i = 0; i < a_Size; i += a_LineLength) + a_Out.reserve(a_Size / a_BytesPerLine * (18 + 6 * a_BytesPerLine)); + for (size_t i = 0; i < a_Size; i += a_BytesPerLine) { - int k = a_Size - i; - if (k > a_LineLength) + size_t k = a_Size - i; + if (k > a_BytesPerLine) { - k = a_LineLength; + k = a_BytesPerLine; } #ifdef _MSC_VER // MSVC provides a "secure" version of sprintf() @@ -555,8 +555,8 @@ AString & CreateHexDump(AString & a_Out, const void * a_Data, size_t a_Size, int // Remove the terminating NULL / leftover garbage in line, after the sprintf-ed value memset(line + Count, 32, sizeof(line) - Count); p = line + 10; - q = p + 2 + a_LineLength * 3 + 1; - for (int j = 0; j < k; j++) + q = p + 2 + a_BytesPerLine * 3 + 1; + for (size_t j = 0; j < k; j++) { unsigned char c = ((unsigned char *)a_Data)[i + j]; p[0] = HEX(c >> 4); diff --git a/src/StringUtils.h b/src/StringUtils.h index ce24e89bc..b69e47d3c 100644 --- a/src/StringUtils.h +++ b/src/StringUtils.h @@ -64,7 +64,7 @@ extern AString & RawBEToUTF8(const char * a_RawData, int a_NumShorts, AString & extern AString & UTF8ToRawBEUTF16(const char * a_UTF8, size_t a_UTF8Length, AString & a_UTF16); /// Creates a nicely formatted HEX dump of the given memory block. Max a_BytesPerLine is 120 -extern AString & CreateHexDump(AString & a_Out, const void * a_Data, size_t a_Size, int a_BytesPerLine); +extern AString & CreateHexDump(AString & a_Out, const void * a_Data, size_t a_Size, size_t a_BytesPerLine); /// Returns a copy of a_Message with all quotes and backslashes escaped by a backslash extern AString EscapeString(const AString & a_Message); // tolua_export From 3590f97e00e570df7a18d953212f33d947f3896c Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 4 Apr 2014 11:19:57 +0200 Subject: [PATCH 027/188] Fixed CreateHexDump's format string. --- src/StringUtils.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/StringUtils.cpp b/src/StringUtils.cpp index a69d8750f..33b04505f 100644 --- a/src/StringUtils.cpp +++ b/src/StringUtils.cpp @@ -548,9 +548,9 @@ AString & CreateHexDump(AString & a_Out, const void * a_Data, size_t a_Size, siz } #ifdef _MSC_VER // MSVC provides a "secure" version of sprintf() - int Count = sprintf_s(line, sizeof(line), "%08x:", i); + int Count = sprintf_s(line, sizeof(line), "%08x:", (unsigned)i); #else - int Count = sprintf(line, "%08x:", i); + int Count = sprintf(line, "%08x:", (unsigned)i); #endif // Remove the terminating NULL / leftover garbage in line, after the sprintf-ed value memset(line + Count, 32, sizeof(line) - Count); From 4be894f0601fcfa182fda045b07b196e5dcd9343 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 4 Apr 2014 11:47:46 +0200 Subject: [PATCH 028/188] More Clang warning fixes in the protocols. --- src/Protocol/ChunkDataSerializer.cpp | 4 +- src/Protocol/Protocol125.cpp | 139 ++++++++++++++------------- src/Protocol/Protocol16x.cpp | 8 +- src/Protocol/Protocol17x.cpp | 2 +- src/Protocol/Protocol17x.h | 4 +- src/Protocol/ProtocolRecognizer.cpp | 6 +- 6 files changed, 82 insertions(+), 81 deletions(-) diff --git a/src/Protocol/ChunkDataSerializer.cpp b/src/Protocol/ChunkDataSerializer.cpp index 78318a5ee..ebe61631b 100644 --- a/src/Protocol/ChunkDataSerializer.cpp +++ b/src/Protocol/ChunkDataSerializer.cpp @@ -105,7 +105,7 @@ void cChunkDataSerializer::Serialize29(AString & a_Data) a_Data.append((const char *)&BitMap1, sizeof(short)); a_Data.append((const char *)&BitMap2, sizeof(short)); - Int32 CompressedSizeBE = htonl(CompressedSize); + UInt32 CompressedSizeBE = htonl((UInt32)CompressedSize); a_Data.append((const char *)&CompressedSizeBE, sizeof(CompressedSizeBE)); Int32 UnusedInt32 = 0; @@ -163,7 +163,7 @@ void cChunkDataSerializer::Serialize39(AString & a_Data) a_Data.append((const char *)&BitMap1, sizeof(short)); a_Data.append((const char *)&BitMap2, sizeof(short)); - Int32 CompressedSizeBE = htonl(CompressedSize); + UInt32 CompressedSizeBE = htonl((UInt32)CompressedSize); a_Data.append((const char *)&CompressedSizeBE, sizeof(CompressedSizeBE)); // Unlike 29, 39 doesn't have the "unused" int diff --git a/src/Protocol/Protocol125.cpp b/src/Protocol/Protocol125.cpp index 0fa5c6de7..231ae410f 100644 --- a/src/Protocol/Protocol125.cpp +++ b/src/Protocol/Protocol125.cpp @@ -161,8 +161,8 @@ void cProtocol125::SendBlockAction(int a_BlockX, int a_BlockY, int a_BlockZ, cha WriteInt (a_BlockX); WriteShort((short)a_BlockY); WriteInt (a_BlockZ); - WriteByte (a_Byte1); - WriteByte (a_Byte2); + WriteChar (a_Byte1); + WriteChar (a_Byte2); Flush(); } @@ -209,12 +209,12 @@ void cProtocol125::SendBlockChanges(int a_ChunkX, int a_ChunkZ, const sSetBlockV WriteByte (PACKET_MULTI_BLOCK); WriteInt (a_ChunkX); WriteInt (a_ChunkZ); - WriteShort((unsigned short)a_Changes.size()); - WriteUInt (sizeof(int) * a_Changes.size()); + WriteShort((short)a_Changes.size()); + WriteUInt ((UInt32)(sizeof(int) * a_Changes.size())); for (sSetBlockVector::const_iterator itr = a_Changes.begin(), end = a_Changes.end(); itr != end; ++itr) { - unsigned int Coords = itr->y | (itr->z << 8) | (itr->x << 12); - unsigned int Blocks = itr->BlockMeta | (itr->BlockType << 4); + UInt32 Coords = ((UInt32)itr->y) | ((UInt32)(itr->z << 8)) | ((UInt32)(itr->x << 12)); + UInt32 Blocks = ((UInt32)itr->BlockMeta) | ((UInt32)(itr->BlockType << 4)); WriteUInt(Coords << 16 | Blocks); } Flush(); @@ -325,8 +325,8 @@ void cProtocol125::SendEntityEffect(const cEntity & a_Entity, int a_EffectID, in cCSLock Lock(m_CSPacket); WriteByte (PACKET_ENTITY_EFFECT); WriteInt (a_Entity.GetUniqueID()); - WriteByte (a_EffectID); - WriteByte (a_Amplifier); + WriteByte ((Byte)a_EffectID); + WriteByte ((Byte)a_Amplifier); WriteShort(a_Duration); Flush(); } @@ -357,7 +357,7 @@ void cProtocol125::SendEntityHeadLook(const cEntity & a_Entity) cCSLock Lock(m_CSPacket); WriteByte(PACKET_ENT_HEAD_LOOK); WriteInt (a_Entity.GetUniqueID()); - WriteByte((char)((a_Entity.GetHeadYaw() / 360.f) * 256)); + WriteChar((char)((a_Entity.GetHeadYaw() / 360.f) * 256)); Flush(); } @@ -372,8 +372,8 @@ void cProtocol125::SendEntityLook(const cEntity & a_Entity) cCSLock Lock(m_CSPacket); WriteByte(PACKET_ENT_LOOK); WriteInt (a_Entity.GetUniqueID()); - WriteByte((char)((a_Entity.GetYaw() / 360.f) * 256)); - WriteByte((char)((a_Entity.GetPitch() / 360.f) * 256)); + WriteChar((char)((a_Entity.GetYaw() / 360.f) * 256)); + WriteChar((char)((a_Entity.GetPitch() / 360.f) * 256)); Flush(); } @@ -421,9 +421,9 @@ void cProtocol125::SendEntityRelMove(const cEntity & a_Entity, char a_RelX, char cCSLock Lock(m_CSPacket); WriteByte(PACKET_ENT_REL_MOVE); WriteInt (a_Entity.GetUniqueID()); - WriteByte(a_RelX); - WriteByte(a_RelY); - WriteByte(a_RelZ); + WriteChar(a_RelX); + WriteChar(a_RelY); + WriteChar(a_RelZ); Flush(); } @@ -438,11 +438,11 @@ void cProtocol125::SendEntityRelMoveLook(const cEntity & a_Entity, char a_RelX, cCSLock Lock(m_CSPacket); WriteByte(PACKET_ENT_REL_MOVE_LOOK); WriteInt (a_Entity.GetUniqueID()); - WriteByte(a_RelX); - WriteByte(a_RelY); - WriteByte(a_RelZ); - WriteByte((char)((a_Entity.GetYaw() / 360.f) * 256)); - WriteByte((char)((a_Entity.GetPitch() / 360.f) * 256)); + WriteChar(a_RelX); + WriteChar(a_RelY); + WriteChar(a_RelZ); + WriteChar((char)((a_Entity.GetYaw() / 360.f) * 256)); + WriteChar((char)((a_Entity.GetPitch() / 360.f) * 256)); Flush(); } @@ -455,7 +455,7 @@ void cProtocol125::SendEntityStatus(const cEntity & a_Entity, char a_Status) cCSLock Lock(m_CSPacket); WriteByte(PACKET_ENT_STATUS); WriteInt (a_Entity.GetUniqueID()); - WriteByte(a_Status); + WriteChar(a_Status); Flush(); } @@ -488,7 +488,7 @@ void cProtocol125::SendExplosion(double a_BlockX, double a_BlockY, double a_Bloc WriteDouble (a_BlockY); WriteDouble (a_BlockZ); WriteFloat (a_Radius); - WriteInt (a_BlocksAffected.size()); + WriteInt ((Int32)a_BlocksAffected.size()); int BlockX = (int)a_BlockX; int BlockY = (int)a_BlockY; int BlockZ = (int)a_BlockZ; @@ -513,7 +513,7 @@ void cProtocol125::SendGameMode(eGameMode a_GameMode) cCSLock Lock(m_CSPacket); WriteByte(PACKET_CHANGE_GAME_STATE); WriteByte(3); - WriteByte((char)a_GameMode); + WriteChar((char)a_GameMode); Flush(); } @@ -538,7 +538,7 @@ void cProtocol125::SendHealth(void) cCSLock Lock(m_CSPacket); WriteByte (PACKET_UPDATE_HEALTH); WriteShort((short)m_Client->GetPlayer()->GetHealth()); - WriteShort(m_Client->GetPlayer()->GetFoodLevel()); + WriteShort((short)m_Client->GetPlayer()->GetFoodLevel()); WriteFloat((float)m_Client->GetPlayer()->GetFoodSaturationLevel()); Flush(); } @@ -551,7 +551,7 @@ void cProtocol125::SendInventorySlot(char a_WindowID, short a_SlotNum, const cIt { cCSLock Lock(m_CSPacket); WriteByte (PACKET_INVENTORY_SLOT); - WriteByte (a_WindowID); + WriteChar (a_WindowID); WriteShort(a_SlotNum); WriteItem (a_Item); Flush(); @@ -600,17 +600,14 @@ void cProtocol125::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colo WriteByte (PACKET_ITEM_DATA); WriteShort(E_ITEM_MAP); - WriteShort(a_ID); - WriteShort(3 + a_Length); + WriteShort((short)a_ID); + WriteShort((short)(3 + a_Length)); WriteByte(0); - WriteByte(a_X); - WriteByte(a_Y); + WriteChar((char)a_X); + WriteChar((char)a_Y); - for (unsigned int i = 0; i < a_Length; ++i) - { - WriteByte(a_Colors[i]); - } + SendData((const char *)a_Colors, a_Length); Flush(); } @@ -625,16 +622,16 @@ void cProtocol125::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decor WriteByte (PACKET_ITEM_DATA); WriteShort(E_ITEM_MAP); - WriteShort(a_ID); - WriteShort(1 + (3 * a_Decorators.size())); + WriteShort((short)a_ID); + WriteShort((short)(1 + (3 * a_Decorators.size()))); WriteByte(1); for (cMapDecoratorList::const_iterator it = a_Decorators.begin(); it != a_Decorators.end(); ++it) { - WriteByte((it->GetType() << 4) | (it->GetRot() & 0xf)); - WriteByte(it->GetPixelX()); - WriteByte(it->GetPixelZ()); + WriteByte((Byte)(it->GetType() << 4) | (it->GetRot() & 0xf)); + WriteByte((Byte)it->GetPixelX()); + WriteByte((Byte)it->GetPixelZ()); } Flush(); @@ -651,7 +648,7 @@ void cProtocol125::SendPickupSpawn(const cPickup & a_Pickup) WriteByte (PACKET_PICKUP_SPAWN); WriteInt (a_Pickup.GetUniqueID()); WriteShort (a_Pickup.GetItem().m_ItemType); - WriteByte (a_Pickup.GetItem().m_ItemCount); + WriteChar (a_Pickup.GetItem().m_ItemCount); WriteShort (a_Pickup.GetItem().m_ItemDamage); WriteVectorI((Vector3i)(a_Pickup.GetPosition() * 32)); WriteByte ((char)(a_Pickup.GetSpeed().x * 8)); @@ -669,7 +666,7 @@ void cProtocol125::SendEntityAnimation(const cEntity & a_Entity, char a_Animatio cCSLock Lock(m_CSPacket); WriteByte(PACKET_ANIMATION); WriteInt (a_Entity.GetUniqueID()); - WriteByte(a_Animation); + WriteChar(a_Animation); Flush(); } @@ -763,8 +760,8 @@ void cProtocol125::SendPlayerSpawn(const cPlayer & a_Player) WriteInt ((int)(a_Player.GetPosX() * 32)); WriteInt ((int)(a_Player.GetPosY() * 32)); WriteInt ((int)(a_Player.GetPosZ() * 32)); - WriteByte ((char)((a_Player.GetYaw() / 360.f) * 256)); - WriteByte ((char)((a_Player.GetPitch() / 360.f) * 256)); + WriteChar ((char)((a_Player.GetYaw() / 360.f) * 256)); + WriteChar ((char)((a_Player.GetPitch() / 360.f) * 256)); WriteShort (HeldItem.IsEmpty() ? 0 : HeldItem.m_ItemType); Flush(); } @@ -790,9 +787,9 @@ void cProtocol125::SendPluginMessage(const AString & a_Channel, const AString & void cProtocol125::SendRemoveEntityEffect(const cEntity & a_Entity, int a_EffectID) { cCSLock Lock(m_CSPacket); - WriteByte (PACKET_REMOVE_ENTITY_EFFECT); - WriteInt (a_Entity.GetUniqueID()); - WriteByte (a_EffectID); + WriteByte(PACKET_REMOVE_ENTITY_EFFECT); + WriteInt (a_Entity.GetUniqueID()); + WriteChar((char)a_EffectID); Flush(); } @@ -806,7 +803,7 @@ void cProtocol125::SendRespawn(void) WriteByte (PACKET_RESPAWN); WriteInt ((int)(m_Client->GetPlayer()->GetWorld()->GetDimension())); WriteByte (2); // TODO: Difficulty; 2 = Normal - WriteByte ((char)m_Client->GetPlayer()->GetGameMode()); + WriteChar ((char)m_Client->GetPlayer()->GetGameMode()); WriteShort (256); // Current world height WriteString("default"); } @@ -837,7 +834,7 @@ void cProtocol125::SendExperienceOrb(const cExpOrb & a_ExpOrb) WriteInt((int) a_ExpOrb.GetPosX()); WriteInt((int) a_ExpOrb.GetPosY()); WriteInt((int) a_ExpOrb.GetPosZ()); - WriteShort(a_ExpOrb.GetReward()); + WriteShort((short)a_ExpOrb.GetReward()); Flush(); } @@ -878,7 +875,7 @@ void cProtocol125::SendSpawnMob(const cMonster & a_Mob) cCSLock Lock(m_CSPacket); WriteByte (PACKET_SPAWN_MOB); WriteInt (a_Mob.GetUniqueID()); - WriteByte (a_Mob.GetMobType()); + WriteByte ((Byte)a_Mob.GetMobType()); WriteVectorI((Vector3i)(a_Mob.GetPosition() * 32)); WriteByte (0); WriteByte (0); @@ -903,7 +900,7 @@ void cProtocol125::SendSpawnObject(const cEntity & a_Entity, char a_ObjectType, cCSLock Lock(m_CSPacket); WriteByte(PACKET_SPAWN_OBJECT); WriteInt (a_Entity.GetUniqueID()); - WriteByte(a_ObjectType); + WriteChar(a_ObjectType); WriteInt ((int)(a_Entity.GetPosX() * 32)); WriteInt ((int)(a_Entity.GetPosY() * 32)); WriteInt ((int)(a_Entity.GetPosZ() * 32)); @@ -928,7 +925,7 @@ void cProtocol125::SendSpawnVehicle(const cEntity & a_Vehicle, char a_VehicleTyp cCSLock Lock(m_CSPacket); WriteByte (PACKET_SPAWN_OBJECT); WriteInt (a_Vehicle.GetUniqueID()); - WriteByte (a_VehicleType); + WriteChar (a_VehicleType); WriteInt ((int)(a_Vehicle.GetPosX() * 32)); WriteInt ((int)(a_Vehicle.GetPosY() * 32)); WriteInt ((int)(a_Vehicle.GetPosZ() * 32)); @@ -966,8 +963,8 @@ void cProtocol125::SendTeleportEntity(const cEntity & a_Entity) WriteInt ((int)(floor(a_Entity.GetPosX() * 32))); WriteInt ((int)(floor(a_Entity.GetPosY() * 32))); WriteInt ((int)(floor(a_Entity.GetPosZ() * 32))); - WriteByte ((char)((a_Entity.GetYaw() / 360.f) * 256)); - WriteByte ((char)((a_Entity.GetPitch() / 360.f) * 256)); + WriteChar ((char)((a_Entity.GetYaw() / 360.f) * 256)); + WriteChar ((char)((a_Entity.GetPitch() / 360.f) * 256)); Flush(); } @@ -1042,7 +1039,7 @@ void cProtocol125::SendUseBed(const cEntity & a_Entity, int a_BlockX, int a_Bloc WriteInt (a_Entity.GetUniqueID()); WriteByte(0); // Unknown byte only 0 has been observed WriteInt (a_BlockX); - WriteByte(a_BlockY); + WriteByte((Byte)a_BlockY); WriteInt (a_BlockZ); Flush(); } @@ -1086,7 +1083,7 @@ void cProtocol125::SendWholeInventory(const cWindow & a_Window) cCSLock Lock(m_CSPacket); cItems Slots; a_Window.GetSlots(*(m_Client->GetPlayer()), Slots); - SendWindowSlots(a_Window.GetWindowID(), Slots.size(), &(Slots[0])); + SendWindowSlots(a_Window.GetWindowID(), (int)Slots.size(), &(Slots[0])); } @@ -1103,7 +1100,7 @@ void cProtocol125::SendWindowClose(const cWindow & a_Window) cCSLock Lock(m_CSPacket); WriteByte(PACKET_WINDOW_CLOSE); - WriteByte(a_Window.GetWindowID()); + WriteChar(a_Window.GetWindowID()); Flush(); } @@ -1120,10 +1117,10 @@ void cProtocol125::SendWindowOpen(const cWindow & a_Window) } cCSLock Lock(m_CSPacket); WriteByte (PACKET_WINDOW_OPEN); - WriteByte (a_Window.GetWindowID()); - WriteByte (a_Window.GetWindowType()); + WriteChar (a_Window.GetWindowID()); + WriteByte ((Byte)a_Window.GetWindowType()); WriteString(a_Window.GetWindowTitle()); - WriteByte (a_Window.GetNumNonInventorySlots()); + WriteByte ((Byte)a_Window.GetNumNonInventorySlots()); Flush(); } @@ -1135,7 +1132,7 @@ void cProtocol125::SendWindowProperty(const cWindow & a_Window, short a_Property { cCSLock Lock(m_CSPacket); WriteByte (PACKET_WINDOW_PROPERTY); - WriteByte (a_Window.GetWindowID()); + WriteChar (a_Window.GetWindowID()); WriteShort(a_Property); WriteShort(a_Value); Flush(); @@ -1527,7 +1524,7 @@ int cProtocol125::ParsePluginMessage(void) HANDLE_PACKET_READ(ReadBEUTF16String16, AString, ChannelName); HANDLE_PACKET_READ(ReadBEShort, short, Length); AString Data; - if (!m_ReceivedData.ReadString(Data, Length)) + if (!m_ReceivedData.ReadString(Data, (size_t)Length)) { m_ReceivedData.CheckValid(); return PARSE_INCOMPLETE; @@ -1688,7 +1685,7 @@ void cProtocol125::SendPreChunk(int a_ChunkX, int a_ChunkZ, bool a_ShouldLoad) void cProtocol125::SendWindowSlots(char a_WindowID, int a_NumItems, const cItem * a_Items) { WriteByte (PACKET_INVENTORY_WHOLE); - WriteByte (a_WindowID); + WriteChar (a_WindowID); WriteShort((short)a_NumItems); for (int j = 0; j < a_NumItems; j++) @@ -1718,7 +1715,7 @@ void cProtocol125::WriteItem(const cItem & a_Item) return; } - WriteByte (a_Item.m_ItemCount); + WriteChar (a_Item.m_ItemCount); WriteShort(a_Item.m_ItemDamage); if (cItem::IsEnchantable(a_Item.m_ItemType)) @@ -1765,7 +1762,7 @@ int cProtocol125::ParseItem(cItem & a_Item) } // TODO: Enchantment not implemented yet! - if (!m_ReceivedData.SkipRead(EnchantNumBytes)) + if (!m_ReceivedData.SkipRead((size_t)EnchantNumBytes)) { return PARSE_INCOMPLETE; } @@ -1850,7 +1847,7 @@ void cProtocol125::WriteMobMetadata(const cMonster & a_Mob) case cMonster::mtCreeper: { WriteByte(0x10); - WriteByte(((const cCreeper &)a_Mob).IsBlowing() ? 1 : -1); // Blowing up? + WriteChar(((const cCreeper &)a_Mob).IsBlowing() ? 1 : -1); // Blowing up? WriteByte(0x11); WriteByte(((const cCreeper &)a_Mob).IsCharged() ? 1 : 0); // Lightning-charged? break; @@ -1920,9 +1917,9 @@ void cProtocol125::WriteMobMetadata(const cMonster & a_Mob) WriteByte(0x10); Byte SheepMetadata = 0; - SheepMetadata = ((const cSheep &)a_Mob).GetFurColor(); // Fur colour + SheepMetadata = (Byte)((const cSheep &)a_Mob).GetFurColor(); - if (((const cSheep &)a_Mob).IsSheared()) // Is sheared? + if (((const cSheep &)a_Mob).IsSheared()) { SheepMetadata |= 0x16; } @@ -1954,7 +1951,7 @@ void cProtocol125::WriteMobMetadata(const cMonster & a_Mob) case cMonster::mtWither: { WriteByte(0x54); // Int at index 20 - WriteInt(((const cWither &)a_Mob).GetNumInvulnerableTicks()); + WriteInt((Int32)((const cWither &)a_Mob).GetNumInvulnerableTicks()); WriteByte(0x66); // Float at index 6 WriteFloat((float)(a_Mob.GetHealth())); break; @@ -1965,11 +1962,11 @@ void cProtocol125::WriteMobMetadata(const cMonster & a_Mob) WriteByte(0x10); if (a_Mob.GetMobType() == cMonster::mtSlime) { - WriteByte(((const cSlime &)a_Mob).GetSize()); // Size of slime - HEWGE, meh, cute BABBY SLIME + WriteByte((Byte)((const cSlime &)a_Mob).GetSize()); // Size of slime - HEWGE, meh, cute BABBY SLIME } else { - WriteByte(((const cMagmaCube &)a_Mob).GetSize()); // Size of slime - HEWGE, meh, cute BABBY SLIME + WriteByte((Byte)((const cMagmaCube &)a_Mob).GetSize()); // Size of slime - HEWGE, meh, cute BABBY SLIME } break; } @@ -2008,7 +2005,7 @@ void cProtocol125::WriteMobMetadata(const cMonster & a_Mob) WriteInt(Flags); WriteByte(0x13); - WriteByte(((const cHorse &)a_Mob).GetHorseType()); // Type of horse (donkey, chestnut, etc.) + WriteByte((Byte)((const cHorse &)a_Mob).GetHorseType()); // Type of horse (donkey, chestnut, etc.) WriteByte(0x54); int Appearance = 0; @@ -2020,6 +2017,10 @@ void cProtocol125::WriteMobMetadata(const cMonster & a_Mob) WriteInt(((const cHorse &)a_Mob).GetHorseArmour()); // Horshey armour break; } + default: + { + break; + } } } diff --git a/src/Protocol/Protocol16x.cpp b/src/Protocol/Protocol16x.cpp index ecb24254f..bf7d9a0b1 100644 --- a/src/Protocol/Protocol16x.cpp +++ b/src/Protocol/Protocol16x.cpp @@ -119,7 +119,7 @@ void cProtocol161::SendHealth(void) cCSLock Lock(m_CSPacket); WriteByte (PACKET_UPDATE_HEALTH); WriteFloat((float)m_Client->GetPlayer()->GetHealth()); - WriteShort(m_Client->GetPlayer()->GetFoodLevel()); + WriteShort((short)m_Client->GetPlayer()->GetFoodLevel()); WriteFloat((float)m_Client->GetPlayer()->GetFoodSaturationLevel()); Flush(); } @@ -163,10 +163,10 @@ void cProtocol161::SendWindowOpen(const cWindow & a_Window) } cCSLock Lock(m_CSPacket); WriteByte (PACKET_WINDOW_OPEN); - WriteByte (a_Window.GetWindowID()); - WriteByte (a_Window.GetWindowType()); + WriteChar (a_Window.GetWindowID()); + WriteByte ((Byte)a_Window.GetWindowType()); WriteString(a_Window.GetWindowTitle()); - WriteByte (a_Window.GetNumNonInventorySlots()); + WriteByte ((Byte)a_Window.GetNumNonInventorySlots()); WriteByte (1); // Use title if (a_Window.GetWindowType() == cWindow::wtAnimalChest) { diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index b987294b0..cbc138990 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -1236,7 +1236,7 @@ void cProtocol172::SendWindowProperty(const cWindow & a_Window, short a_Property -void cProtocol172::AddReceivedData(const char * a_Data, int a_Size) +void cProtocol172::AddReceivedData(const char * a_Data, size_t a_Size) { // Write the incoming data into the comm log file: if (g_ShouldLogCommIn) diff --git a/src/Protocol/Protocol17x.h b/src/Protocol/Protocol17x.h index bb6ee575a..91186b270 100644 --- a/src/Protocol/Protocol17x.h +++ b/src/Protocol/Protocol17x.h @@ -196,7 +196,7 @@ protected: m_Out.WriteVarUTF8String(a_Value); } - void WriteBuf(const char * a_Data, int a_Size) + void WriteBuf(const char * a_Data, size_t a_Size) { m_Out.Write(a_Data, a_Size); } @@ -243,7 +243,7 @@ protected: /** Adds the received (unencrypted) data to m_ReceivedData, parses complete packets */ - void AddReceivedData(const char * a_Data, int a_Size); + void AddReceivedData(const char * a_Data, size_t a_Size); /** Reads and handles the packet. The packet length and type have already been read. Returns true if the packet was understood, false if it was an unknown packet diff --git a/src/Protocol/ProtocolRecognizer.cpp b/src/Protocol/ProtocolRecognizer.cpp index 81f146370..3f7d7b254 100644 --- a/src/Protocol/ProtocolRecognizer.cpp +++ b/src/Protocol/ProtocolRecognizer.cpp @@ -854,7 +854,7 @@ bool cProtocolRecognizer::TryRecognizeProtocol(void) // This must be a lengthed protocol, try if it has the entire initial handshake packet: m_Buffer.ResetRead(); UInt32 PacketLen; - UInt32 ReadSoFar = m_Buffer.GetReadableSpace(); + UInt32 ReadSoFar = (UInt32)m_Buffer.GetReadableSpace(); if (!m_Buffer.ReadVarInt(PacketLen)) { // Not enough bytes for the packet length, keep waiting @@ -931,7 +931,7 @@ bool cProtocolRecognizer::TryRecognizeLengthlessProtocol(void) bool cProtocolRecognizer::TryRecognizeLengthedProtocol(UInt32 a_PacketLengthRemaining) { UInt32 PacketType; - UInt32 NumBytesRead = m_Buffer.GetReadableSpace(); + UInt32 NumBytesRead = (UInt32)m_Buffer.GetReadableSpace(); if (!m_Buffer.ReadVarInt(PacketType)) { return false; @@ -962,7 +962,7 @@ bool cProtocolRecognizer::TryRecognizeLengthedProtocol(UInt32 a_PacketLengthRema m_Buffer.ReadBEShort(ServerPort); m_Buffer.ReadVarInt(NextState); m_Buffer.CommitRead(); - m_Protocol = new cProtocol172(m_Client, ServerAddress, ServerPort, NextState); + m_Protocol = new cProtocol172(m_Client, ServerAddress, (UInt16)ServerPort, NextState); return true; } } From bc227299d0a1111da8bf7b61165649b2f9345e5d Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 4 Apr 2014 12:08:14 +0200 Subject: [PATCH 029/188] Fixed format string mismatch. --- src/Protocol/Protocol17x.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index cbc138990..a4319df37 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -1258,7 +1258,7 @@ void cProtocol172::AddReceivedData(const char * a_Data, size_t a_Size) AString Hex; CreateHexDump(Hex, a_Data, a_Size, 16); m_CommLogFile.Printf("Incoming data: %d (0x%x) bytes: \n%s\n", - a_Size, a_Size, Hex.c_str() + (unsigned)a_Size, (unsigned)a_Size, Hex.c_str() ); m_CommLogFile.Flush(); } From 4b4c3f2a204d353e1fa793d1a2b08838221a8616 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 4 Apr 2014 12:28:38 +0200 Subject: [PATCH 030/188] Changed cNoise seed to signed. --- src/Noise.cpp | 2 +- src/Noise.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Noise.cpp b/src/Noise.cpp index a97ea70c6..32922c8f3 100644 --- a/src/Noise.cpp +++ b/src/Noise.cpp @@ -425,7 +425,7 @@ void cCubicCell3D::Move(int a_NewFloorX, int a_NewFloorY, int a_NewFloorZ) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cNoise: -cNoise::cNoise(unsigned int a_Seed) : +cNoise::cNoise(int a_Seed) : m_Seed(a_Seed) { } diff --git a/src/Noise.h b/src/Noise.h index ea72c64e9..62004503f 100644 --- a/src/Noise.h +++ b/src/Noise.h @@ -25,7 +25,7 @@ class cNoise { public: - cNoise(unsigned int a_Seed); + cNoise(int a_Seed); cNoise(const cNoise & a_Noise); // The following functions, if not marked INLINE, are about 20 % slower @@ -47,14 +47,14 @@ public: NOISE_DATATYPE CubicNoise3D (NOISE_DATATYPE a_X, NOISE_DATATYPE a_Y, NOISE_DATATYPE a_Z) const; - void SetSeed(unsigned int a_Seed) { m_Seed = a_Seed; } + void SetSeed(int a_Seed) { m_Seed = a_Seed; } INLINE static NOISE_DATATYPE CubicInterpolate (NOISE_DATATYPE a_A, NOISE_DATATYPE a_B, NOISE_DATATYPE a_C, NOISE_DATATYPE a_D, NOISE_DATATYPE a_Pct); INLINE static NOISE_DATATYPE CosineInterpolate(NOISE_DATATYPE a_A, NOISE_DATATYPE a_B, NOISE_DATATYPE a_Pct); INLINE static NOISE_DATATYPE LinearInterpolate(NOISE_DATATYPE a_A, NOISE_DATATYPE a_B, NOISE_DATATYPE a_Pct); private: - unsigned int m_Seed; + int m_Seed; } ; From 87f39e9e287aa1a7e513036f5004ec24ac789f40 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 4 Apr 2014 13:19:25 +0200 Subject: [PATCH 031/188] Explicit change record size. --- src/Protocol/Protocol125.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Protocol/Protocol125.cpp b/src/Protocol/Protocol125.cpp index 231ae410f..bf946ef19 100644 --- a/src/Protocol/Protocol125.cpp +++ b/src/Protocol/Protocol125.cpp @@ -210,7 +210,7 @@ void cProtocol125::SendBlockChanges(int a_ChunkX, int a_ChunkZ, const sSetBlockV WriteInt (a_ChunkX); WriteInt (a_ChunkZ); WriteShort((short)a_Changes.size()); - WriteUInt ((UInt32)(sizeof(int) * a_Changes.size())); + WriteUInt ((UInt32)(4 * a_Changes.size())); for (sSetBlockVector::const_iterator itr = a_Changes.begin(), end = a_Changes.end(); itr != end; ++itr) { UInt32 Coords = ((UInt32)itr->y) | ((UInt32)(itr->z << 8)) | ((UInt32)(itr->x << 12)); From 1cab52f86799b98940da910e84e207b6037a5cd2 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 4 Apr 2014 23:06:47 +0200 Subject: [PATCH 032/188] Added cPlayer:SendRotation() API function. --- src/Entities/Player.cpp | 11 +++++++++++ src/Entities/Player.h | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index 646aad50f..7f2e5b4c2 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -1124,6 +1124,17 @@ void cPlayer::TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ) +void cPlayer::SendRotation(double a_YawDegrees, double a_PitchDegrees) +{ + SetYaw(a_YawDegrees); + SetPitch(a_PitchDegrees); + m_ClientHandle->SendPlayerMoveLook(); +} + + + + + Vector3d cPlayer::GetThrowStartPos(void) const { Vector3d res = GetEyePosition(); diff --git a/src/Entities/Player.h b/src/Entities/Player.h index ea32dbfb9..05377a117 100644 --- a/src/Entities/Player.h +++ b/src/Entities/Player.h @@ -129,6 +129,12 @@ public: // tolua_begin + /** Sends the "look" packet to the player, forcing them to set their rotation to the specified values. + a_YawDegrees is clipped to range [-180, +180), + a_PitchDegrees is clipped to range [-180, +180) but the client only uses [-90, +90] + */ + void SendRotation(double a_YawDegrees, double a_PitchDegrees); + /** Returns the position where projectiles thrown by this player should start, player eye position + adjustment */ Vector3d GetThrowStartPos(void) const; From 43e3a55a70b7ec79046ea0de4f1912177ea3eb25 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 5 Apr 2014 12:09:14 +0200 Subject: [PATCH 033/188] Added more API documentation to cCompositeChat. --- MCServer/Plugins/APIDump/APIDesc.lua | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/MCServer/Plugins/APIDump/APIDesc.lua b/MCServer/Plugins/APIDump/APIDesc.lua index b3b7dd11c..59dd93137 100644 --- a/MCServer/Plugins/APIDump/APIDesc.lua +++ b/MCServer/Plugins/APIDump/APIDesc.lua @@ -551,7 +551,22 @@ end {{cPlayer}}:SendMessage(), {{cWorld}}:BroadcastChat() and {{cRoot}}:BroadcastChat().

Note that most of the functions in this class are so-called modifiers - they modify the object and - then return the object itself, so that they can be chained one after another. + then return the object itself, so that they can be chained one after another. See the Chaining + example below for details.

+

+ Each part of the composite chat message takes a "Style" parameter, this is a string that describes + the formatting. It uses the following strings, concatenated together: + + + + + + + + +
StringStyle
bBold text
iItalic text
uUnderlined text
sStrikethrough text
oObfuscated text
@Xcolor X (X is 0 - 9 or a - f, same as dye meta
+ The following picture, taken from MineCraft Wiki, illustrates the color codes:

+ ]], Functions = { @@ -565,6 +580,7 @@ end AddTextPart = { Params = "Text, [Style]", Return = "self", Notes = "Adds a regular text. Chaining." }, AddUrlPart = { Params = "Text, Url, [Style]", Return = "self", Notes = "Adds a text which, when clicked, opens up a browser at the specified URL. Chaining." }, Clear = { Params = "", Return = "", Notes = "Removes all parts from this object" }, + ExtractText = { Params = "", Return = "string", Notes = "Returns the text from the parts that comprises the human-readable data. Used for older protocols that don't support composite chat and for console-logging." }, GetMessageType = { Params = "", Return = "MessageType", Notes = "Returns the MessageType (mtXXX constant) that is associated with this message. When sent to a player, the message will be formatted according to this message type and the player's settings (adding \"[INFO]\" prefix etc.)" }, ParseText = { Params = "Text", Return = "self", Notes = "Adds text, while recognizing http and https URLs and old-style formatting codes (\"@2\"). Chaining." }, SetMessageType = { Params = "MessageType", Return = "self", Notes = "Sets the MessageType (mtXXX constant) that is associated with this message. When sent to a player, the message will be formatted according to this message type and the player's settings (adding \"[INFO]\" prefix etc.) Chaining." }, From d43c5a9c474bd6e4fbd74f09cca9b9bdbbd88b71 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 5 Apr 2014 22:25:40 +0200 Subject: [PATCH 034/188] Removed debugging log from entity physics handling. --- src/Entities/ProjectileEntity.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Entities/ProjectileEntity.cpp b/src/Entities/ProjectileEntity.cpp index a9735a53c..e86bb48bd 100644 --- a/src/Entities/ProjectileEntity.cpp +++ b/src/Entities/ProjectileEntity.cpp @@ -371,13 +371,14 @@ void cProjectileEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk) SetYawFromSpeed(); SetPitchFromSpeed(); - // DEBUG: + /* LOGD("Projectile %d: pos {%.02f, %.02f, %.02f}, speed {%.02f, %.02f, %.02f}, rot {%.02f, %.02f}", m_UniqueID, GetPosX(), GetPosY(), GetPosZ(), GetSpeedX(), GetSpeedY(), GetSpeedZ(), GetYaw(), GetPitch() ); + */ } From 22794e720883dea9f80d22ab13221cb345bdc186 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 5 Apr 2014 22:26:10 +0200 Subject: [PATCH 035/188] Fixed double projectile spawning. Two spawn packets were sent per projectile. --- src/World.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/World.cpp b/src/World.cpp index e39a605bb..c188fd522 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -2993,7 +2993,6 @@ int cWorld::CreateProjectile(double a_PosX, double a_PosY, double a_PosZ, cProje delete Projectile; return -1; } - BroadcastSpawnEntity(*Projectile); return Projectile->GetUniqueID(); } From 143a5e61fc8e704f3df776d089217f031bc47779 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 5 Apr 2014 22:34:05 +0200 Subject: [PATCH 036/188] Fixed Endiannes conversion routines for floats and doubles. This bug has been introduced in 8825d30aabbee8cb2e452dc5a17deb6f9b6892a7. This change fixes #854. --- src/Endianness.h | 4 ++-- src/Entities/Entity.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Endianness.h b/src/Endianness.h index 6a2593077..78f9a5d99 100644 --- a/src/Endianness.h +++ b/src/Endianness.h @@ -49,7 +49,7 @@ inline double NetworkToHostDouble8(const void * a_Value) inline Int64 NetworkToHostLong8(const void * a_Value) { UInt64 buf; - memcpy(&buf, &a_Value, 8); + memcpy(&buf, a_Value, 8); buf = ntohll(buf); return *reinterpret_cast(&buf); } @@ -62,7 +62,7 @@ inline float NetworkToHostFloat4(const void * a_Value) { UInt32 buf; float x; - memcpy(&buf, &a_Value, 4); + memcpy(&buf, a_Value, 4); buf = ntohl(buf); memcpy(&x, &buf, sizeof(float)); return x; diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 221cbbea7..8ef45f1a5 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -1469,7 +1469,7 @@ void cEntity::SteerVehicle(float a_Forward, float a_Sideways) Vector3d cEntity::GetLookVector(void) const { Matrix4d m; - m.Init(Vector3f(), 0, m_Rot.x, -m_Rot.y); + m.Init(Vector3d(), 0, m_Rot.x, -m_Rot.y); Vector3d Look = m.Transform(Vector3d(0, 0, 1)); return Look; } From c89f7902dff3addc36135907d1b502f98d3120f3 Mon Sep 17 00:00:00 2001 From: Tycho Date: Sun, 6 Apr 2014 05:56:43 -0700 Subject: [PATCH 037/188] Added forgoten lua file --- lib/tolua++/src/bin/container_lua.h | 1476 +++++++++++++++++++++++++++ 1 file changed, 1476 insertions(+) create mode 100644 lib/tolua++/src/bin/container_lua.h diff --git a/lib/tolua++/src/bin/container_lua.h b/lib/tolua++/src/bin/container_lua.h new file mode 100644 index 000000000..4c7cf6a67 --- /dev/null +++ b/lib/tolua++/src/bin/container_lua.h @@ -0,0 +1,1476 @@ +static const unsigned char lua_container_lua[] = { + 0x2d, 0x2d, 0x20, 0x74, 0x6f, 0x6c, 0x75, 0x61, 0x3a, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x61, 0x62, 0x73, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x0a, 0x2d, + 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x62, 0x79, + 0x20, 0x57, 0x61, 0x6c, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x20, 0x43, 0x65, + 0x6c, 0x65, 0x73, 0x0a, 0x2d, 0x2d, 0x20, 0x54, 0x65, 0x43, 0x47, 0x72, + 0x61, 0x66, 0x2f, 0x50, 0x55, 0x43, 0x2d, 0x52, 0x69, 0x6f, 0x0a, 0x2d, + 0x2d, 0x20, 0x4a, 0x75, 0x6c, 0x20, 0x31, 0x39, 0x39, 0x38, 0x0a, 0x2d, + 0x2d, 0x20, 0x24, 0x49, 0x64, 0x3a, 0x20, 0x24, 0x0a, 0x0a, 0x2d, 0x2d, + 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x69, + 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, + 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x20, 0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20, + 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x20, 0x69, 0x74, 0x2e, 0x0a, 0x2d, + 0x2d, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, + 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x22, 0x61, 0x73, 0x20, 0x69, + 0x73, 0x22, 0x20, 0x62, 0x61, 0x73, 0x69, 0x73, 0x2c, 0x20, 0x61, 0x6e, + 0x64, 0x0a, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x69, + 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x2c, 0x0a, 0x2d, 0x2d, 0x20, 0x65, 0x6e, 0x68, 0x61, 0x6e, + 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x6f, 0x72, 0x20, + 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x64, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x64, 0x65, 0x66, 0x73, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x20, + 0x69, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x0a, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x0a, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x75, 0x6d, + 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x0a, 0x2d, 0x2d, 0x20, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x0a, 0x2d, 0x2d, 0x20, 0x74, 0x6f, 0x20, 0x6c, + 0x75, 0x61, 0x2e, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x0a, 0x7b, 0x0a, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x0a, + 0x7d, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x0a, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2c, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x29, 0x0a, + 0x0a, 0x2d, 0x2d, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, + 0x61, 0x67, 0x73, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x3a, 0x64, 0x65, 0x63, 0x6c, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x28, 0x29, 0x0a, 0x20, 0x70, 0x75, 0x73, 0x68, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x3d, 0x31, 0x0a, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x5b, 0x69, 0x5d, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x5b, 0x69, 0x5d, 0x3a, 0x64, 0x65, 0x63, 0x6c, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x69, 0x2b, 0x31, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x70, 0x6f, + 0x70, 0x28, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x2d, 0x2d, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3a, 0x73, 0x75, 0x70, 0x63, + 0x6f, 0x64, 0x65, 0x20, 0x28, 0x29, 0x0a, 0x0a, 0x09, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x28, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x09, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x20, 0x70, 0x75, 0x73, 0x68, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x29, 0x0a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x3d, + 0x31, 0x0a, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x5b, 0x69, 0x5d, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x69, 0x5d, 0x3a, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x28, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x69, 0x5d, 0x3a, 0x73, + 0x75, 0x70, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x2b, 0x31, + 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x70, 0x6f, 0x70, 0x28, 0x29, + 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3a, 0x68, 0x61, 0x73, 0x76, 0x61, 0x72, + 0x20, 0x28, 0x29, 0x0a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x3d, 0x31, 0x0a, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x5b, 0x69, 0x5d, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x69, 0x5d, 0x3a, 0x69, 0x73, + 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x31, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x69, 0x2b, 0x31, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x29, 0x0a, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x20, 0x3d, + 0x20, 0x30, 0x0a, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x64, 0x65, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x74, 0x6f, 0x6c, + 0x75, 0x61, 0x5f, 0x6e, 0x3d, 0x30, 0x7d, 0x0a, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x65, + 0x6e, 0x75, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x74, 0x6f, 0x6c, 0x75, + 0x61, 0x5f, 0x6e, 0x3d, 0x30, 0x7d, 0x0a, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x0a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x70, 0x75, + 0x73, 0x68, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x75, + 0x73, 0x68, 0x20, 0x28, 0x74, 0x29, 0x0a, 0x09, 0x74, 0x2e, 0x70, 0x72, + 0x6f, 0x78, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x75, 0x72, 0x72, + 0x0a, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x20, 0x3d, 0x20, + 0x74, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x70, 0x6f, + 0x70, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x6f, 0x70, + 0x20, 0x28, 0x29, 0x0a, 0x2d, 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x75, + 0x72, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x2d, 0x2d, 0x66, + 0x6f, 0x72, 0x65, 0x61, 0x63, 0x68, 0x28, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x75, + 0x72, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2c, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x29, 0x0a, 0x2d, 0x2d, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x28, 0x22, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x22, 0x29, 0x0a, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, + 0x63, 0x75, 0x72, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x67, 0x65, 0x74, 0x63, 0x75, 0x72, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x28, 0x29, 0x0a, 0x09, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x75, 0x72, + 0x72, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x61, + 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x29, 0x0a, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x75, + 0x72, 0x72, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x74, 0x29, + 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, + 0x74, 0x6f, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x0a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, + 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x28, 0x74, 0x29, 0x0a, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, + 0x75, 0x72, 0x72, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x74, 0x79, + 0x70, 0x65, 0x64, 0x65, 0x66, 0x28, 0x74, 0x29, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, + 0x75, 0x73, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x75, 0x73, 0x65, + 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x75, 0x72, + 0x72, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x75, 0x73, 0x65, 0x72, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x2d, 0x2d, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x65, + 0x6e, 0x75, 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x75, 0x6d, 0x20, 0x28, 0x74, 0x29, + 0x0a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, + 0x63, 0x75, 0x72, 0x72, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x65, + 0x6e, 0x75, 0x6d, 0x28, 0x74, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x2d, 0x2d, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, + 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x0a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, + 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x64, + 0x2c, 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x3a, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x28, + 0x6d, 0x6f, 0x64, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, + 0x69, 0x66, 0x20, 0x69, 0x73, 0x20, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, 0x09, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x73, 0x20, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x74, + 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, + 0x29, 0x0a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x2e, 0x63, 0x75, 0x72, 0x72, 0x3a, 0x69, 0x73, 0x74, 0x79, 0x70, 0x65, + 0x64, 0x65, 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x66, 0x75, + 0x6c, 0x6c, 0x74, 0x79, 0x70, 0x65, 0x20, 0x28, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x29, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x74, 0x79, 0x70, 0x65, 0x20, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x75, 0x72, 0x72, 0x20, 0x3d, 0x20, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x0a, 0x09, 0x77, 0x68, + 0x69, 0x6c, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x20, 0x69, 0x66, 0x20, 0x63, 0x75, 0x72, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x20, 0x69, 0x66, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x63, 0x75, 0x72, 0x72, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x64, 0x65, 0x66, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x09, 0x09, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, + 0x73, 0x5b, 0x74, 0x5d, 0x0a, 0x09, 0x09, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x63, 0x75, 0x72, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x75, + 0x72, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x5b, 0x74, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x73, 0x5b, 0x74, + 0x5d, 0x0a, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, + 0x6e, 0x64, 0x0a, 0x09, 0x20, 0x63, 0x75, 0x72, 0x72, 0x20, 0x3d, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x0a, 0x09, 0x65, + 0x6e, 0x64, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x73, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3a, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x74, 0x29, 0x0a, 0x20, 0x70, 0x75, 0x73, 0x68, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x3d, 0x31, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x77, 0x68, 0x69, + 0x6c, 0x65, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x69, 0x5d, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x5b, 0x69, 0x5d, 0x3a, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x72, 0x0a, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x69, 0x2b, 0x31, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x70, 0x6f, + 0x70, 0x28, 0x29, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x67, + 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x61, 0x70, 0x63, 0x65, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x28, + 0x63, 0x75, 0x72, 0x72, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, + 0x20, 0x27, 0x27, 0x0a, 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x20, 0x69, 0x66, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x20, + 0x20, 0x20, 0x28, 0x20, 0x63, 0x75, 0x72, 0x72, 0x2e, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x27, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x27, 0x29, 0x0a, 0x09, 0x09, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, + 0x09, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, + 0x3d, 0x20, 0x28, 0x63, 0x75, 0x72, 0x72, 0x2e, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, + 0x2e, 0x2e, 0x20, 0x27, 0x3a, 0x3a, 0x27, 0x20, 0x2e, 0x2e, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x0a, 0x09, 0x09, 0x20, + 0x2d, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, + 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x2e, 0x2e, 0x20, 0x27, 0x3a, 0x3a, 0x27, 0x20, 0x2e, 0x2e, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x0a, 0x09, 0x09, 0x65, + 0x6e, 0x64, 0x0a, 0x09, 0x20, 0x63, 0x75, 0x72, 0x72, 0x20, 0x3d, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x0a, 0x09, 0x65, + 0x6e, 0x64, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x28, 0x6f, 0x6e, 0x6c, 0x79, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x29, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, + 0x6f, 0x6e, 0x6c, 0x79, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x28, 0x29, 0x0a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x75, + 0x72, 0x72, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x27, + 0x0a, 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x3d, 0x20, 0x27, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x0a, + 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, + 0x27, 0x3a, 0x3a, 0x27, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x20, 0x63, 0x75, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, + 0x2d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x66, 0x20, 0x69, + 0x73, 0x20, 0x65, 0x6e, 0x75, 0x6d, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x65, 0x6e, 0x75, 0x6d, 0x20, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x3a, 0x69, 0x73, + 0x65, 0x6e, 0x75, 0x6d, 0x28, 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x20, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x0a, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3a, 0x61, + 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x5b, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x5d, 0x20, 0x3d, 0x20, 0x74, + 0x0a, 0x20, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, + 0x2d, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x64, 0x65, 0x66, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x74, + 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x28, 0x74, 0x29, 0x0a, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, 0x75, + 0x72, 0x72, 0x29, 0x0a, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x64, 0x65, 0x66, 0x73, 0x2e, 0x74, 0x6f, 0x6c, 0x75, 0x61, + 0x5f, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x64, 0x65, 0x66, 0x73, 0x2e, 0x74, 0x6f, 0x6c, 0x75, 0x61, + 0x5f, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x73, 0x5b, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x73, 0x2e, + 0x74, 0x6f, 0x6c, 0x75, 0x61, 0x5f, 0x6e, 0x5d, 0x20, 0x3d, 0x20, 0x74, + 0x0a, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x64, + 0x65, 0x66, 0x73, 0x5b, 0x74, 0x2e, 0x75, 0x74, 0x79, 0x70, 0x65, 0x5d, + 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x2e, 0x75, 0x74, 0x79, 0x70, 0x65, 0x0a, + 0x09, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x64, 0x65, 0x66, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x2e, 0x2e, 0x74, 0x2e, 0x75, 0x74, 0x79, 0x70, 0x65, 0x5d, + 0x20, 0x3d, 0x20, 0x74, 0x0a, 0x09, 0x74, 0x2e, 0x66, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x09, 0x2d, 0x2d, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x28, 0x22, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x22, + 0x2e, 0x2e, 0x74, 0x2e, 0x75, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x2e, 0x22, + 0x20, 0x61, 0x73, 0x20, 0x22, 0x2e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x2e, 0x2e, 0x74, 0x2e, 0x75, 0x74, 0x79, 0x70, + 0x65, 0x2e, 0x2e, 0x22, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x66, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x22, 0x2e, 0x2e, 0x74, 0x2e, 0x66, 0x74, 0x79, + 0x70, 0x65, 0x29, 0x0a, 0x09, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x2e, 0x74, + 0x2e, 0x75, 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, 0x09, 0x69, 0x66, 0x20, + 0x74, 0x2e, 0x66, 0x74, 0x79, 0x70, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x69, 0x73, 0x65, 0x6e, 0x75, 0x6d, 0x28, 0x74, 0x2e, 0x66, 0x74, 0x79, + 0x70, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x09, 0x09, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x73, + 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x2e, + 0x74, 0x2e, 0x75, 0x74, 0x79, 0x70, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, + 0x75, 0x73, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x75, 0x73, 0x65, + 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x28, 0x74, 0x29, 0x0a, 0x09, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x74, 0x20, 0x3d, 0x3d, 0x20, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, + 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x72, + 0x6f, 0x78, 0x0a, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x09, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x20, 0x2e, 0x2e, 0x20, + 0x74, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x73, 0x5b, 0x74, + 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x74, 0x0a, 0x09, 0x5f, 0x75, 0x73, 0x65, + 0x72, 0x74, 0x79, 0x70, 0x65, 0x5b, 0x66, 0x74, 0x5d, 0x20, 0x3d, 0x20, + 0x66, 0x74, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x74, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x75, 0x6d, 0x0a, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3a, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x75, 0x6d, 0x20, 0x28, 0x74, 0x29, + 0x0a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, + 0x63, 0x75, 0x72, 0x72, 0x29, 0x0a, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x74, 0x6f, 0x6c, 0x75, 0x61, 0x5f, + 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x65, 0x6e, 0x75, + 0x6d, 0x73, 0x2e, 0x74, 0x6f, 0x6c, 0x75, 0x61, 0x5f, 0x6e, 0x20, 0x2b, + 0x20, 0x31, 0x0a, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x65, 0x6e, 0x75, + 0x6d, 0x73, 0x5b, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x65, 0x6e, 0x75, 0x6d, + 0x73, 0x2e, 0x74, 0x6f, 0x6c, 0x75, 0x61, 0x5f, 0x6e, 0x5d, 0x20, 0x3d, + 0x20, 0x74, 0x0a, 0x09, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x65, + 0x6e, 0x75, 0x6d, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x2e, 0x2e, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, + 0x3d, 0x20, 0x74, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, + 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x75, + 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x3a, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x6c, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x5b, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x5b, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, + 0x20, 0x30, 0x0a, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x6c, + 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x6c, 0x6e, 0x61, 0x6d, + 0x65, 0x5d, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x22, 0x25, 0x30, 0x32, 0x64, 0x22, 0x2c, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x6c, 0x6e, + 0x61, 0x6d, 0x65, 0x5d, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, + 0x2d, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x64, 0x65, 0x66, 0x3a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x27, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x27, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x3a, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, + 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x29, + 0x0a, 0x09, 0x69, 0x66, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x73, 0x5b, 0x74, 0x79, 0x70, + 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x2d, 0x2d, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x22, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x22, 0x2e, 0x2e, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x64, + 0x65, 0x66, 0x73, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x5d, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x29, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6d, 0x6f, 0x64, 0x31, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x31, 0x20, + 0x3d, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x64, 0x65, 0x66, 0x73, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x5d, 0x2e, + 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x73, 0x5b, 0x74, 0x79, 0x70, + 0x65, 0x5d, 0x2e, 0x66, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x09, 0x09, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x32, 0x2c, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x32, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, + 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x28, 0x6d, 0x6f, 0x64, 0x2e, + 0x2e, 0x22, 0x20, 0x22, 0x2e, 0x2e, 0x6d, 0x6f, 0x64, 0x31, 0x2c, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x31, 0x29, 0x0a, 0x09, 0x09, 0x2d, 0x2d, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x32, 0x20, 0x2e, + 0x2e, 0x20, 0x27, 0x20, 0x27, 0x20, 0x2e, 0x2e, 0x20, 0x6d, 0x6f, 0x64, + 0x31, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x32, 0x0a, 0x09, 0x09, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x32, 0x2c, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x32, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, + 0x64, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, + 0x64, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x0a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3a, 0x69, 0x73, 0x74, 0x79, + 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x29, + 0x0a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x0a, 0x20, 0x77, 0x68, 0x69, 0x6c, + 0x65, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, + 0x66, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x3d, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x64, 0x65, 0x66, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x6e, 0x76, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x73, 0x5b, 0x69, 0x5d, 0x2e, + 0x75, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x69, 0x2b, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x69, 0x6e, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x72, + 0x28, 0x76, 0x61, 0x72, 0x29, 0x0a, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x74, + 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x76, 0x61, 0x72, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x76, 0x61, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, + 0x63, 0x75, 0x72, 0x72, 0x0a, 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, + 0x63, 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x63, 0x29, 0x0a, 0x09, 0x09, + 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x28, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x09, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, 0x72, 0x2c, 0x20, 0x76, 0x2c, 0x20, + 0x6e, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x0a, 0x09, 0x09, + 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, + 0x09, 0x69, 0x66, 0x20, 0x63, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x63, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x20, 0x7e, 0x3d, + 0x20, 0x27, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, + 0x63, 0x20, 0x3d, 0x20, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5b, 0x63, 0x3a, 0x66, 0x69, + 0x6e, 0x64, 0x74, 0x79, 0x70, 0x65, 0x28, 0x63, 0x2e, 0x62, 0x61, 0x73, + 0x65, 0x29, 0x5d, 0x0a, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x09, + 0x09, 0x09, 0x63, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x09, 0x09, + 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x72, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, + 0x69, 0x66, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3a, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x74, 0x79, 0x70, 0x65, 0x20, 0x28, 0x74, + 0x29, 0x0a, 0x0a, 0x09, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, 0x2c, 0x20, 0x22, + 0x3d, 0x2e, 0x2a, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x09, 0x69, + 0x66, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5b, 0x74, 0x5d, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x5f, 0x2c, 0x65, 0x6d, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, + 0x64, 0x28, 0x74, 0x2c, 0x20, 0x22, 0x28, 0x5b, 0x26, 0x25, 0x2a, 0x5d, + 0x29, 0x25, 0x73, 0x2a, 0x24, 0x22, 0x29, 0x0a, 0x09, 0x74, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x74, 0x2c, 0x20, 0x22, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x26, 0x25, + 0x2a, 0x5d, 0x29, 0x25, 0x73, 0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, + 0x29, 0x0a, 0x09, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x0a, + 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x70, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x70, 0x29, 0x3d, 0x3d, 0x27, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x27, 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x09, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x65, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x70, + 0x29, 0x0a, 0x0a, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x6e, 0x2c, 0x31, 0x2c, 0x2d, 0x31, 0x20, 0x64, 0x6f, 0x20, 0x2d, + 0x2d, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x69, + 0x66, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x74, 0x2c, 0x20, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x74, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x2e, + 0x28, 0x65, 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x09, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x70, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x70, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x20, 0x7e, + 0x3d, 0x20, 0x27, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x2e, 0x62, + 0x61, 0x73, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x28, 0x22, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x73, 0x20, 0x22, 0x2e, + 0x2e, 0x74, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x70, 0x20, 0x69, 0x73, 0x20, + 0x22, 0x2e, 0x2e, 0x70, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x2e, 0x22, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, + 0x73, 0x20, 0x22, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x2e, 0x22, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x69, 0x73, 0x20, 0x22, 0x2e, 0x2e, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x09, 0x09, 0x09, + 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5b, 0x70, 0x3a, 0x66, 0x69, + 0x6e, 0x64, 0x74, 0x79, 0x70, 0x65, 0x28, 0x70, 0x2e, 0x62, 0x61, 0x73, + 0x65, 0x29, 0x5d, 0x0a, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x09, + 0x09, 0x09, 0x70, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x09, 0x09, + 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x2c, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x29, 0x0a, 0x09, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x6e, 0x20, 0x3d, 0x20, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x6e, 0x20, 0x2b, 0x31, 0x0a, 0x09, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x5b, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x6e, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x0a, 0x09, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x5b, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x09, 0x69, + 0x66, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x2c, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x2c, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x29, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5b, 0x74, 0x5d, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, + 0x73, 0x5b, 0x74, 0x5d, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x0a, 0x09, + 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2e, 0x6c, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x2e, 0x6c, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x2e, 0x62, + 0x61, 0x73, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x27, 0x27, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x2e, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5b, + 0x74, 0x5d, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x0a, 0x09, 0x09, + 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, + 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2e, 0x66, 0x6c, 0x61, 0x67, + 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2e, 0x66, 0x6c, + 0x61, 0x67, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x28, 0x63, + 0x68, 0x69, 0x6c, 0x64, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x72, 0x65, + 0x67, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x29, 0x0a, 0x2d, + 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x22, 0x66, 0x69, 0x6e, 0x64, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x22, 0x2e, 0x2e, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x2e, + 0x2e, 0x72, 0x65, 0x67, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x2e, 0x22, 0x2c, + 0x20, 0x22, 0x2e, 0x2e, 0x73, 0x74, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x72, 0x65, 0x67, + 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x74, + 0x79, 0x70, 0x65, 0x2c, 0x20, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x6c, 0x65, 0x6e, 0x28, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x74, 0x79, + 0x70, 0x65, 0x29, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x09, + 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x09, + 0x09, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x6c, 0x65, 0x6e, 0x28, 0x72, 0x65, 0x67, 0x74, + 0x79, 0x70, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x09, + 0x09, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x6f, 0x72, 0x20, + 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, 0x62, 0x28, + 0x72, 0x65, 0x67, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x62, 0x2d, 0x31, + 0x2c, 0x20, 0x62, 0x2d, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x3a, + 0x27, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, 0x62, 0x28, 0x72, 0x65, 0x67, + 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x62, 0x2d, 0x31, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x62, + 0x2d, 0x31, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x74, 0x79, + 0x70, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x73, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x29, 0x0a, 0x0a, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x0a, 0x09, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x27, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x66, + 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x76, 0x2e, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x27, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x20, 0x6f, 0x72, 0x20, 0x76, 0x2e, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, + 0x20, 0x27, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x27, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, + 0x20, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, + 0x66, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, + 0x09, 0x09, 0x09, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x73, 0x5b, 0x74, 0x5d, + 0x0a, 0x09, 0x09, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x76, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x76, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x76, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x73, 0x5b, + 0x74, 0x5d, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, + 0x09, 0x09, 0x09, 0x74, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x3d, 0x20, + 0x66, 0x69, 0x6e, 0x64, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, + 0x63, 0x68, 0x69, 0x6c, 0x64, 0x73, 0x28, 0x76, 0x2c, 0x20, 0x74, 0x29, + 0x0a, 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x74, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, + 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x3a, 0x69, 0x73, 0x65, 0x6e, 0x75, 0x6d, 0x20, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x29, 0x0a, 0x20, 0x69, 0x66, 0x20, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x5b, 0x74, 0x79, 0x70, + 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x2c, 0x22, 0x5e, 0x2e, 0x2a, 0x3a, 0x3a, 0x22, 0x2c, + 0x22, 0x22, 0x29, 0x0a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, + 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x0a, 0x20, 0x77, + 0x68, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x65, 0x6e, 0x75, + 0x6d, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x3d, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x65, 0x6e, + 0x75, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x65, 0x6e, 0x75, + 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x74, 0x79, 0x70, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x69, 0x2b, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x20, + 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x69, 0x73, 0x76, 0x69, 0x72, + 0x74, 0x75, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x3a, 0x64, 0x6f, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x20, 0x28, 0x73, 0x29, 0x0a, 0x2d, 0x2d, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x20, 0x28, 0x22, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x22, 0x2e, 0x2e, + 0x73, 0x29, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x20, 0x68, + 0x6f, 0x6f, 0x6b, 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x09, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x20, 0x3d, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x73, 0x29, + 0x0a, 0x20, 0x09, 0x69, 0x66, 0x20, 0x73, 0x75, 0x62, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x75, 0x62, 0x0a, 0x20, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, + 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x5e, + 0x25, 0x73, 0x2a, 0x3b, 0x22, 0x29, 0x0a, 0x20, 0x09, 0x69, 0x66, 0x20, + 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x09, 0x09, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, + 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x09, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, 0x20, 0x74, + 0x72, 0x79, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x76, 0x65, 0x72, + 0x62, 0x61, 0x74, 0x69, 0x6d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, + 0x2c, 0x65, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, + 0x20, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x24, 0x5c, 0x6e, 0x22, 0x29, 0x0a, + 0x20, 0x09, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, 0x0a, + 0x20, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x4c, 0x75, 0x61, 0x20, + 0x63, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x63, 0x6f, 0x64, + 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, + 0x73, 0x2c, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x62, 0x5c, 0x31, + 0x5c, 0x32, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x43, 0x6f, 0x64, + 0x65, 0x28, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x63, 0x6f, 0x64, + 0x65, 0x2c, 0x32, 0x2c, 0x2d, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, + 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, + 0x20, 0x74, 0x72, 0x79, 0x20, 0x43, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x62, 0x2c, 0x65, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, 0x25, + 0x73, 0x2a, 0x28, 0x25, 0x62, 0x5c, 0x33, 0x5c, 0x34, 0x29, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x09, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x7b, 0x27, + 0x2e, 0x2e, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x63, 0x6f, 0x64, + 0x65, 0x2c, 0x32, 0x2c, 0x2d, 0x32, 0x29, 0x2e, 0x2e, 0x27, 0x5c, 0x6e, + 0x7d, 0x5c, 0x6e, 0x27, 0x0a, 0x09, 0x56, 0x65, 0x72, 0x62, 0x61, 0x74, + 0x69, 0x6d, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x27, 0x72, 0x27, 0x29, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x76, + 0x65, 0x72, 0x62, 0x61, 0x74, 0x69, 0x6d, 0x20, 0x63, 0x6f, 0x64, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x27, 0x72, 0x27, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, + 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, + 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x43, 0x20, 0x63, 0x6f, 0x64, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x65, 0x61, 0x6d, 0x62, + 0x6c, 0x65, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, + 0x2c, 0x65, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, + 0x20, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x62, 0x5c, 0x35, 0x5c, + 0x36, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x09, 0x69, 0x66, 0x20, 0x62, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x09, 0x09, 0x63, 0x6f, 0x64, 0x65, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, + 0x62, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x2d, + 0x32, 0x29, 0x2e, 0x2e, 0x22, 0x5c, 0x6e, 0x22, 0x0a, 0x09, 0x09, 0x56, + 0x65, 0x72, 0x62, 0x61, 0x74, 0x69, 0x6d, 0x28, 0x63, 0x6f, 0x64, 0x65, + 0x2c, 0x20, 0x27, 0x27, 0x29, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, + 0x62, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x09, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, + 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x0a, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, + 0x2c, 0x70, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x5e, 0x25, 0x73, + 0x2a, 0x54, 0x4f, 0x4c, 0x55, 0x41, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x45, + 0x52, 0x54, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x25, 0x73, 0x2a, 0x25, + 0x28, 0x2b, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5e, 0x25, 0x29, 0x25, 0x73, + 0x5d, 0x2a, 0x29, 0x25, 0x73, 0x2a, 0x25, 0x29, 0x2b, 0x25, 0x73, 0x2a, + 0x3b, 0x3f, 0x22, 0x29, 0x0a, 0x20, 0x09, 0x69, 0x66, 0x20, 0x62, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x70, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, + 0x70, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x09, 0x09, 0x09, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x0a, 0x20, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x09, + 0x09, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x70, 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, 0x09, 0x20, 0x09, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, + 0x73, 0x2c, 0x20, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x09, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, 0x20, + 0x74, 0x72, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, + 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x0a, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, + 0x2c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x5e, 0x25, 0x73, + 0x2a, 0x54, 0x4f, 0x4c, 0x55, 0x41, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x45, + 0x43, 0x54, 0x45, 0x44, 0x5f, 0x44, 0x45, 0x53, 0x54, 0x52, 0x55, 0x43, + 0x54, 0x4f, 0x52, 0x25, 0x73, 0x2a, 0x3b, 0x3f, 0x22, 0x29, 0x0a, 0x09, + 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, + 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x74, 0x5f, + 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x65, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x09, 0x20, 0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, + 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x5f, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x28, + 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x09, 0x20, 0x09, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x2b, 0x31, + 0x29, 0x0a, 0x20, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x27, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x27, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x09, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x20, + 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x25, + 0x73, 0x2b, 0x22, 0x29, 0x0a, 0x20, 0x09, 0x69, 0x66, 0x20, 0x62, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x64, 0x6f, + 0x20, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x09, 0x09, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, + 0x62, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x09, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, + 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x27, 0x76, 0x69, 0x72, 0x74, 0x75, + 0x61, 0x6c, 0x27, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x6b, 0x64, + 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x62, 0x2c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x5e, + 0x25, 0x73, 0x2a, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x25, 0x73, + 0x2b, 0x22, 0x29, 0x0a, 0x20, 0x09, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x09, 0x09, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x69, 0x73, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x09, 0x09, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, + 0x2c, 0x20, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x09, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, 0x20, 0x74, + 0x72, 0x79, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x28, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2c, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x29, 0x0a, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, + 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x25, + 0x77, 0x2a, 0x25, 0x73, 0x2a, 0x3a, 0x5b, 0x5e, 0x3a, 0x5d, 0x22, 0x29, + 0x0a, 0x20, 0x09, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x20, 0x65, 0x29, 0x20, + 0x2d, 0x2d, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x5b, 0x5e, 0x3a, 0x5d, 0x0a, 0x20, 0x09, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, + 0x20, 0x74, 0x72, 0x79, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x0a, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x62, 0x2c, 0x65, 0x2c, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x62, 0x6f, 0x64, + 0x79, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, + 0x73, 0x2c, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x25, 0x73, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5f, 0x25, 0x77, 0x5d, + 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x2a, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x25, + 0x62, 0x7b, 0x7d, 0x29, 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x62, + 0x2c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x61, 0x70, 0x63, 0x65, 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, 0x25, + 0x73, 0x2a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x25, + 0x73, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x5b, 0x5f, + 0x25, 0x77, 0x5d, 0x2a, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x62, 0x7b, + 0x7d, 0x29, 0x25, 0x73, 0x2a, 0x3b, 0x3f, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x62, + 0x2c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x62, 0x6f, + 0x64, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x65, + 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, + 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x23, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x25, 0x73, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5e, + 0x25, 0x73, 0x5d, 0x2a, 0x29, 0x5b, 0x5e, 0x5c, 0x6e, 0x5d, 0x2a, 0x5c, + 0x6e, 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x5f, 0x63, + 0x75, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x62, 0x2c, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x28, 0x6e, + 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, + 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, + 0x20, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x73, 0x0a, + 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x62, 0x6f, + 0x64, 0x79, 0x2c, 0x76, 0x61, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, + 0x5e, 0x25, 0x73, 0x2a, 0x65, 0x6e, 0x75, 0x6d, 0x25, 0x73, 0x2b, 0x28, + 0x25, 0x53, 0x2a, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x62, 0x7b, 0x7d, + 0x29, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5e, 0x25, 0x73, 0x3b, 0x5d, 0x2a, + 0x29, 0x25, 0x73, 0x2a, 0x3b, 0x3f, 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x23, 0x53, 0x6f, 0x72, 0x72, 0x79, 0x2c, 0x20, 0x64, 0x65, 0x63, 0x6c, + 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x65, + 0x6e, 0x75, 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x5c, 0x6e, + 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x72, + 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x65, + 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x20, 0x28, 0x65, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a, 0x20, 0x27, 0x22, 0x2e, 0x2e, 0x6e, + 0x61, 0x6d, 0x65, 0x2e, 0x2e, 0x22, 0x20, 0x22, 0x2e, 0x2e, 0x76, 0x61, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x2e, 0x22, 0x3b, 0x27, 0x29, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, + 0x28, 0x73, 0x2c, 0x62, 0x2c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x45, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x76, 0x61, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x65, + 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x64, 0x6f, 0x0a, 0x2d, 0x2d, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, + 0x25, 0x73, 0x2a, 0x65, 0x6e, 0x75, 0x6d, 0x25, 0x73, 0x2b, 0x28, 0x25, + 0x53, 0x2a, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x62, 0x7b, 0x7d, 0x29, + 0x25, 0x73, 0x2a, 0x3b, 0x3f, 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, 0x2d, + 0x2d, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x2d, 0x2d, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, + 0x62, 0x28, 0x73, 0x2c, 0x62, 0x2c, 0x65, 0x29, 0x0a, 0x2d, 0x2d, 0x20, + 0x20, 0x20, 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x28, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, 0x2d, + 0x2d, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, 0x0a, + 0x2d, 0x2d, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x2d, 0x2d, 0x20, 0x65, + 0x6e, 0x64, 0x20, 0x0a, 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x62, 0x6f, 0x64, + 0x79, 0x2c, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, 0x25, 0x73, 0x2a, + 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x25, 0x73, 0x2b, 0x65, 0x6e, + 0x75, 0x6d, 0x5b, 0x5e, 0x7b, 0x5d, 0x2a, 0x28, 0x25, 0x62, 0x7b, 0x7d, + 0x29, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x25, 0x77, 0x5f, 0x5d, 0x5b, 0x5e, + 0x25, 0x73, 0x5d, 0x2a, 0x29, 0x25, 0x73, 0x2a, 0x3b, 0x25, 0x73, 0x2a, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, + 0x62, 0x28, 0x73, 0x2c, 0x62, 0x2c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, + 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, + 0x20, 0x74, 0x72, 0x79, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x64, 0x65, 0x63, 0x6c, 0x2c, 0x6b, + 0x69, 0x6e, 0x64, 0x2c, 0x61, 0x72, 0x67, 0x2c, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, + 0x73, 0x2c, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5f, 0x25, 0x77, + 0x5d, 0x5b, 0x5f, 0x25, 0x77, 0x25, 0x73, 0x25, 0x2a, 0x26, 0x3a, 0x3c, + 0x3e, 0x2c, 0x5d, 0x2d, 0x25, 0x73, 0x2b, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5e, 0x25, 0x73, + 0x5d, 0x5b, 0x5e, 0x25, 0x73, 0x5d, 0x2a, 0x29, 0x25, 0x73, 0x2a, 0x28, + 0x25, 0x62, 0x28, 0x29, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x63, 0x3f, 0x6f, + 0x3f, 0x6e, 0x3f, 0x73, 0x3f, 0x74, 0x3f, 0x29, 0x25, 0x73, 0x2a, 0x3b, + 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, + 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x69, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x64, 0x65, + 0x63, 0x6c, 0x2c, 0x6b, 0x69, 0x6e, 0x64, 0x2c, 0x61, 0x72, 0x67, 0x2c, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, + 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x28, + 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x5b, 0x5f, 0x25, 0x77, 0x25, 0x73, 0x25, + 0x2a, 0x26, 0x3a, 0x3c, 0x3e, 0x2c, 0x5d, 0x2d, 0x25, 0x73, 0x2b, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0x25, 0x73, 0x2a, 0x28, + 0x5b, 0x5e, 0x25, 0x73, 0x5d, 0x5b, 0x5e, 0x25, 0x73, 0x5d, 0x2a, 0x29, + 0x25, 0x73, 0x2a, 0x28, 0x25, 0x62, 0x28, 0x29, 0x29, 0x25, 0x73, 0x2a, + 0x28, 0x63, 0x3f, 0x6f, 0x3f, 0x6e, 0x3f, 0x73, 0x3f, 0x74, 0x3f, 0x29, + 0x5b, 0x25, 0x73, 0x5c, 0x6e, 0x5d, 0x2a, 0x25, 0x62, 0x7b, 0x7d, 0x25, + 0x73, 0x2a, 0x3b, 0x3f, 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x09, 0x2d, + 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x63, 0x61, 0x73, 0x74, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x09, 0x62, + 0x2c, 0x65, 0x2c, 0x64, 0x65, 0x63, 0x6c, 0x2c, 0x6b, 0x69, 0x6e, 0x64, + 0x2c, 0x61, 0x72, 0x67, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x20, + 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x28, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x29, 0x25, 0x73, 0x2b, 0x28, 0x5b, 0x25, 0x77, 0x5f, 0x3a, + 0x25, 0x64, 0x3c, 0x3e, 0x25, 0x2a, 0x25, 0x26, 0x25, 0x73, 0x5d, 0x2b, + 0x29, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x62, 0x28, 0x29, 0x29, 0x25, 0x73, + 0x2a, 0x28, 0x63, 0x3f, 0x6f, 0x3f, 0x6e, 0x3f, 0x73, 0x3f, 0x74, 0x3f, + 0x29, 0x22, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x09, 0x69, 0x66, 0x20, 0x62, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x09, 0x09, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x69, 0x65, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, + 0x2c, 0x20, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x25, 0x62, 0x7b, 0x7d, 0x22, + 0x2c, 0x20, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x09, 0x09, 0x69, + 0x66, 0x20, 0x69, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x09, 0x09, 0x09, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x65, 0x0a, 0x20, 0x20, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x09, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x5f, 0x63, + 0x75, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x62, 0x2c, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x28, 0x64, 0x65, 0x63, 0x6c, 0x2c, 0x6b, 0x69, 0x6e, 0x64, 0x2c, 0x61, + 0x72, 0x67, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, + 0x75, 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, + 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x2d, 0x2d, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x64, 0x65, 0x63, + 0x6c, 0x2c, 0x61, 0x72, 0x67, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, + 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x7e, 0x5f, 0x25, 0x77, 0x5d, + 0x5b, 0x5f, 0x40, 0x25, 0x77, 0x25, 0x73, 0x25, 0x2a, 0x26, 0x3a, 0x3c, + 0x3e, 0x5d, 0x2a, 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x29, 0x25, 0x73, 0x2a, + 0x28, 0x25, 0x62, 0x28, 0x29, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x63, 0x3f, + 0x6f, 0x3f, 0x6e, 0x3f, 0x73, 0x3f, 0x74, 0x3f, 0x29, 0x25, 0x73, 0x2a, + 0x3d, 0x3f, 0x25, 0x73, 0x2a, 0x30, 0x3f, 0x25, 0x73, 0x2a, 0x3b, 0x25, + 0x73, 0x2a, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x64, 0x65, 0x63, 0x6c, 0x2c, 0x61, 0x72, + 0x67, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x2c, 0x76, 0x69, 0x72, 0x74, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, + 0x2c, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5e, 0x25, 0x28, 0x5c, + 0x6e, 0x5d, 0x2b, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x62, 0x28, 0x29, + 0x29, 0x25, 0x73, 0x2a, 0x28, 0x63, 0x3f, 0x6f, 0x3f, 0x6e, 0x3f, 0x73, + 0x3f, 0x74, 0x3f, 0x29, 0x76, 0x3f, 0x65, 0x3f, 0x72, 0x3f, 0x72, 0x3f, + 0x69, 0x3f, 0x64, 0x3f, 0x65, 0x3f, 0x25, 0x73, 0x2a, 0x6f, 0x3f, 0x76, + 0x3f, 0x65, 0x3f, 0x72, 0x3f, 0x72, 0x3f, 0x69, 0x3f, 0x64, 0x3f, 0x65, + 0x3f, 0x25, 0x73, 0x2a, 0x28, 0x3d, 0x3f, 0x25, 0x73, 0x2a, 0x30, 0x3f, + 0x29, 0x25, 0x73, 0x2a, 0x3b, 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x09, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x0a, + 0x20, 0x20, 0x09, 0x62, 0x2c, 0x65, 0x2c, 0x64, 0x65, 0x63, 0x6c, 0x2c, + 0x61, 0x72, 0x67, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, + 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x7e, 0x5f, 0x25, 0x77, 0x5d, 0x5b, 0x5f, + 0x40, 0x25, 0x77, 0x25, 0x73, 0x25, 0x2a, 0x26, 0x3a, 0x3c, 0x3e, 0x5d, + 0x2a, 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x25, 0x62, 0x3c, 0x3e, 0x29, 0x25, + 0x73, 0x2a, 0x28, 0x25, 0x62, 0x28, 0x29, 0x29, 0x25, 0x73, 0x2a, 0x28, + 0x63, 0x3f, 0x6f, 0x3f, 0x6e, 0x3f, 0x73, 0x3f, 0x74, 0x3f, 0x29, 0x76, + 0x3f, 0x65, 0x3f, 0x72, 0x3f, 0x72, 0x3f, 0x69, 0x3f, 0x64, 0x3f, 0x65, + 0x3f, 0x25, 0x73, 0x2a, 0x6f, 0x3f, 0x76, 0x3f, 0x65, 0x3f, 0x72, 0x3f, + 0x72, 0x3f, 0x69, 0x3f, 0x64, 0x3f, 0x65, 0x3f, 0x25, 0x73, 0x2a, 0x3d, + 0x3f, 0x25, 0x73, 0x2a, 0x30, 0x3f, 0x25, 0x73, 0x2a, 0x3b, 0x25, 0x73, + 0x2a, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, + 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x6c, 0x65, 0x74, + 0x74, 0x65, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x62, 0x2c, 0x65, + 0x2c, 0x64, 0x65, 0x63, 0x6c, 0x2c, 0x61, 0x72, 0x67, 0x2c, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, + 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5f, + 0x25, 0x77, 0x5d, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x62, 0x28, 0x29, + 0x29, 0x25, 0x73, 0x2a, 0x28, 0x63, 0x3f, 0x6f, 0x3f, 0x6e, 0x3f, 0x73, + 0x3f, 0x74, 0x3f, 0x29, 0x76, 0x3f, 0x65, 0x3f, 0x72, 0x3f, 0x72, 0x3f, + 0x69, 0x3f, 0x64, 0x3f, 0x65, 0x3f, 0x25, 0x73, 0x2a, 0x6f, 0x3f, 0x76, + 0x3f, 0x65, 0x3f, 0x72, 0x3f, 0x72, 0x3f, 0x69, 0x3f, 0x64, 0x3f, 0x65, + 0x3f, 0x25, 0x73, 0x2a, 0x3b, 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x0a, + 0x20, 0x20, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x64, 0x65, 0x63, 0x6c, 0x2c, + 0x61, 0x72, 0x67, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, + 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5e, 0x25, 0x28, 0x3b, 0x5c, 0x6e, 0x5d, + 0x2b, 0x25, 0x62, 0x28, 0x29, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x62, + 0x28, 0x29, 0x29, 0x25, 0x73, 0x2a, 0x3b, 0x25, 0x73, 0x2a, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x64, 0x65, 0x63, 0x6c, 0x2c, 0x20, 0x22, 0x25, 0x28, 0x25, 0x73, + 0x2a, 0x25, 0x2a, 0x28, 0x5b, 0x5e, 0x25, 0x29, 0x5d, 0x2a, 0x29, 0x25, + 0x73, 0x2a, 0x25, 0x29, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x25, 0x31, 0x20, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x09, 0x69, 0x66, 0x20, 0x76, 0x69, + 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x76, 0x69, 0x72, 0x74, 0x2c, + 0x20, 0x22, 0x5b, 0x3d, 0x30, 0x5d, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x09, 0x09, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x09, 0x09, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x66, + 0x6c, 0x61, 0x67, 0x73, 0x2e, 0x70, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x09, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x75, 0x72, 0x72, + 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x73, + 0x75, 0x62, 0x28, 0x73, 0x2c, 0x62, 0x2c, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3d, 0x3d, + 0x20, 0x27, 0x6f, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x27, + 0x27, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x65, 0x63, + 0x6c, 0x2c, 0x61, 0x72, 0x67, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x64, 0x65, 0x63, 0x6c, 0x2c, 0x61, 0x72, + 0x67, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, 0x25, 0x73, + 0x2a, 0x28, 0x5b, 0x5e, 0x25, 0x28, 0x5c, 0x6e, 0x5d, 0x2b, 0x29, 0x25, + 0x73, 0x2a, 0x28, 0x25, 0x62, 0x28, 0x29, 0x29, 0x25, 0x73, 0x2a, 0x28, + 0x63, 0x3f, 0x6f, 0x3f, 0x6e, 0x3f, 0x73, 0x3f, 0x74, 0x3f, 0x29, 0x76, + 0x3f, 0x65, 0x3f, 0x72, 0x3f, 0x72, 0x3f, 0x69, 0x3f, 0x64, 0x3f, 0x65, + 0x3f, 0x25, 0x73, 0x2a, 0x6f, 0x3f, 0x76, 0x3f, 0x65, 0x3f, 0x72, 0x3f, + 0x72, 0x3f, 0x69, 0x3f, 0x64, 0x3f, 0x65, 0x3f, 0x5b, 0x5e, 0x3b, 0x7b, + 0x5d, 0x2a, 0x25, 0x62, 0x7b, 0x7d, 0x25, 0x73, 0x2a, 0x3b, 0x3f, 0x25, + 0x73, 0x2a, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x2d, 0x2d, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x64, 0x65, 0x63, 0x6c, 0x2c, + 0x61, 0x72, 0x67, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, + 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x7e, 0x5f, 0x25, 0x77, 0x5d, 0x5b, 0x5f, + 0x40, 0x25, 0x77, 0x25, 0x73, 0x25, 0x2a, 0x26, 0x3a, 0x3c, 0x3e, 0x5d, + 0x2a, 0x5b, 0x5f, 0x25, 0x77, 0x3e, 0x5d, 0x29, 0x25, 0x73, 0x2a, 0x28, + 0x25, 0x62, 0x28, 0x29, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x63, 0x3f, 0x6f, + 0x3f, 0x6e, 0x3f, 0x73, 0x3f, 0x74, 0x3f, 0x29, 0x5b, 0x5e, 0x3b, 0x5d, + 0x2a, 0x25, 0x62, 0x7b, 0x7d, 0x25, 0x73, 0x2a, 0x3b, 0x3f, 0x25, 0x73, + 0x2a, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x2d, + 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, + 0x6c, 0x65, 0x20, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x64, 0x65, 0x63, 0x6c, 0x2c, + 0x61, 0x72, 0x67, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, + 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x29, 0x25, 0x73, + 0x2a, 0x28, 0x25, 0x62, 0x28, 0x29, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x63, + 0x3f, 0x6f, 0x3f, 0x6e, 0x3f, 0x73, 0x3f, 0x74, 0x3f, 0x29, 0x76, 0x3f, + 0x65, 0x3f, 0x72, 0x3f, 0x72, 0x3f, 0x69, 0x3f, 0x64, 0x3f, 0x65, 0x3f, + 0x25, 0x73, 0x2a, 0x6f, 0x3f, 0x76, 0x3f, 0x65, 0x3f, 0x72, 0x3f, 0x72, + 0x3f, 0x69, 0x3f, 0x64, 0x3f, 0x65, 0x3f, 0x2e, 0x2d, 0x25, 0x62, 0x7b, + 0x7d, 0x25, 0x73, 0x2a, 0x3b, 0x3f, 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x75, + 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x62, 0x2c, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x3d, 0x3d, 0x20, 0x27, 0x6f, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3d, + 0x20, 0x27, 0x27, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, + 0x65, 0x63, 0x6c, 0x2c, 0x61, 0x72, 0x67, 0x2c, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, + 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x20, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x0a, 0x09, 0x09, + 0x62, 0x2c, 0x65, 0x2c, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, 0x25, + 0x73, 0x2a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x25, 0x73, 0x2a, 0x28, 0x5b, + 0x5f, 0x25, 0x77, 0x5d, 0x5b, 0x5f, 0x25, 0x77, 0x40, 0x5d, 0x2a, 0x29, + 0x25, 0x73, 0x2a, 0x3b, 0x22, 0x29, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x64, + 0x75, 0x6d, 0x6d, 0x79, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x0a, 0x09, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, + 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x09, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x09, 0x09, 0x09, 0x62, 0x2c, 0x65, 0x2c, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, + 0x2c, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x5b, 0x5f, 0x25, + 0x77, 0x40, 0x5d, 0x2a, 0x29, 0x25, 0x73, 0x2a, 0x3b, 0x22, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x20, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x62, 0x2c, 0x65, 0x2c, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, + 0x5e, 0x25, 0x73, 0x2a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x25, 0x73, 0x2a, + 0x28, 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x5b, 0x5f, 0x25, 0x77, 0x40, 0x5d, + 0x2a, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5e, 0x7b, 0x5d, 0x2d, 0x29, + 0x25, 0x73, 0x2a, 0x28, 0x25, 0x62, 0x7b, 0x7d, 0x29, 0x25, 0x73, 0x2a, + 0x22, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x62, 0x2c, 0x65, 0x2c, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x62, + 0x61, 0x73, 0x65, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, 0x25, + 0x73, 0x2a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x25, 0x73, 0x2b, 0x28, + 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x5b, 0x5f, 0x25, 0x77, 0x40, 0x5d, 0x2a, + 0x29, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5e, 0x7b, 0x5d, 0x2d, 0x29, 0x25, + 0x73, 0x2a, 0x28, 0x25, 0x62, 0x7b, 0x7d, 0x29, 0x25, 0x73, 0x2a, 0x22, + 0x29, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, 0x62, 0x2c, 0x65, 0x2c, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x62, 0x61, 0x73, 0x65, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, + 0x25, 0x73, 0x2a, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x25, 0x73, 0x2a, 0x28, + 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x5b, 0x5f, 0x25, 0x77, 0x40, 0x5d, 0x2a, + 0x29, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5e, 0x7b, 0x5d, 0x2d, 0x29, 0x25, + 0x73, 0x2a, 0x28, 0x25, 0x62, 0x7b, 0x7d, 0x29, 0x25, 0x73, 0x2a, 0x22, + 0x29, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, + 0x27, 0x27, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x62, 0x2c, + 0x65, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, + 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, + 0x25, 0x73, 0x25, 0x73, 0x2a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x25, + 0x73, 0x25, 0x73, 0x2a, 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x2a, 0x25, 0x73, + 0x2a, 0x28, 0x25, 0x62, 0x7b, 0x7d, 0x29, 0x25, 0x73, 0x2a, 0x28, 0x5b, + 0x5f, 0x25, 0x77, 0x5d, 0x5b, 0x5f, 0x25, 0x77, 0x40, 0x5d, 0x2a, 0x29, + 0x25, 0x73, 0x2a, 0x3b, 0x22, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, + 0x64, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, + 0x09, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x20, + 0x3d, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x20, 0x3d, 0x20, 0x31, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x62, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x62, + 0x61, 0x73, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x61, 0x73, 0x65, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, + 0x62, 0x28, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x22, 0x5e, 0x25, 0x73, + 0x2a, 0x3a, 0x25, 0x73, 0x2a, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x62, + 0x61, 0x73, 0x65, 0x2c, 0x20, 0x22, 0x25, 0x73, 0x2a, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x25, 0x73, 0x2a, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, + 0x0a, 0x09, 0x09, 0x09, 0x09, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, + 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x20, + 0x22, 0x2c, 0x22, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x0a, 0x09, 0x09, 0x09, + 0x09, 0x2d, 0x2d, 0x62, 0x2c, 0x65, 0x2c, 0x62, 0x61, 0x73, 0x65, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x62, 0x61, + 0x73, 0x65, 0x2c, 0x22, 0x2e, 0x2d, 0x28, 0x5b, 0x5f, 0x25, 0x77, 0x5d, + 0x5b, 0x5f, 0x25, 0x77, 0x3c, 0x3e, 0x2c, 0x3a, 0x5d, 0x2a, 0x29, 0x24, + 0x22, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x09, + 0x09, 0x09, 0x09, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x0a, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x09, 0x5f, + 0x63, 0x75, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x62, 0x2c, 0x65, + 0x29, 0x0a, 0x09, 0x09, 0x09, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x62, 0x6f, 0x64, + 0x79, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x76, 0x61, 0x72, 0x62, 0x2c, 0x76, 0x61, 0x72, + 0x65, 0x2c, 0x76, 0x61, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, + 0x73, 0x2c, 0x20, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5f, 0x25, + 0x77, 0x5d, 0x2b, 0x29, 0x25, 0x73, 0x2a, 0x3b, 0x22, 0x2c, 0x20, 0x65, + 0x2b, 0x31, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x76, + 0x61, 0x72, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x6e, + 0x61, 0x6d, 0x65, 0x2e, 0x2e, 0x22, 0x20, 0x22, 0x2e, 0x2e, 0x76, 0x61, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x65, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x72, 0x65, 0x0a, 0x09, 0x09, 0x09, + 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x64, 0x65, 0x66, 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, + 0x73, 0x2c, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x74, 0x79, 0x70, 0x65, 0x64, + 0x65, 0x66, 0x25, 0x73, 0x25, 0x73, 0x2a, 0x28, 0x2e, 0x2d, 0x29, 0x25, + 0x73, 0x2a, 0x3b, 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x5f, 0x63, 0x75, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x62, 0x2c, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x54, 0x79, 0x70, 0x65, 0x64, 0x65, + 0x66, 0x28, 0x74, 0x79, 0x70, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, + 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, + 0x20, 0x74, 0x72, 0x79, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x64, 0x65, 0x63, 0x6c, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, + 0x5e, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x5b, 0x5f, + 0x40, 0x25, 0x73, 0x25, 0x77, 0x25, 0x64, 0x25, 0x2a, 0x26, 0x3a, 0x3c, + 0x3e, 0x2c, 0x5d, 0x2a, 0x5b, 0x5f, 0x25, 0x77, 0x25, 0x64, 0x5d, 0x29, + 0x25, 0x73, 0x2a, 0x3b, 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x62, + 0x2c, 0x65, 0x29, 0x0a, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x5f, 0x63, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x28, 0x64, 0x65, + 0x63, 0x6c, 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x29, 0x0a, 0x09, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x5b, + 0x31, 0x5d, 0x29, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x2e, 0x6e, 0x20, 0x3e, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x5f, 0x2c, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, + 0x6e, 0x64, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, + 0x22, 0x28, 0x2e, 0x2d, 0x29, 0x25, 0x73, 0x2b, 0x28, 0x5b, 0x5e, 0x25, + 0x73, 0x5d, 0x2a, 0x29, 0x24, 0x22, 0x29, 0x3b, 0x0a, 0x0a, 0x09, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, 0x3d, 0x32, 0x3b, 0x0a, + 0x09, 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x5b, 0x69, 0x5d, 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x09, 0x09, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x79, 0x70, 0x65, 0x2e, + 0x2e, 0x22, 0x20, 0x22, 0x2e, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x69, + 0x5d, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x3d, 0x69, 0x2b, 0x31, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x2d, 0x2d, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x64, 0x65, 0x63, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, + 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x2d, 0x2d, 0x20, 0x74, + 0x72, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x2c, + 0x65, 0x2c, 0x64, 0x65, 0x63, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, 0x5e, 0x25, 0x73, 0x2a, + 0x28, 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x3f, 0x5b, 0x5f, 0x25, 0x73, 0x25, + 0x77, 0x25, 0x64, 0x5d, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x25, 0x73, 0x2b, + 0x5b, 0x5f, 0x40, 0x25, 0x77, 0x25, 0x64, 0x5d, 0x2a, 0x25, 0x73, 0x2a, + 0x25, 0x5b, 0x25, 0x73, 0x2a, 0x25, 0x53, 0x2b, 0x25, 0x73, 0x2a, 0x25, + 0x5d, 0x29, 0x25, 0x73, 0x2a, 0x3b, 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, + 0x2c, 0x62, 0x2c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x64, 0x65, 0x63, 0x6c, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x0a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x2c, 0x65, 0x2c, 0x64, 0x65, 0x63, 0x6c, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x22, + 0x5e, 0x25, 0x73, 0x2a, 0x28, 0x5b, 0x5f, 0x25, 0x77, 0x5d, 0x5b, 0x5d, + 0x5b, 0x5f, 0x40, 0x25, 0x73, 0x25, 0x77, 0x25, 0x64, 0x25, 0x2a, 0x26, + 0x3a, 0x3c, 0x3e, 0x5d, 0x2a, 0x5b, 0x5d, 0x5f, 0x25, 0x77, 0x25, 0x64, + 0x5d, 0x29, 0x25, 0x73, 0x2a, 0x3b, 0x25, 0x73, 0x2a, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, 0x62, 0x28, 0x73, + 0x2c, 0x62, 0x2c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x41, 0x72, 0x72, + 0x61, 0x79, 0x28, 0x64, 0x65, 0x63, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x73, 0x75, + 0x62, 0x28, 0x73, 0x2c, 0x65, 0x2b, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x2d, 0x2d, + 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, + 0x0a, 0x20, 0x69, 0x66, 0x20, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x2c, + 0x22, 0x25, 0x73, 0x25, 0x73, 0x2a, 0x22, 0x2c, 0x22, 0x22, 0x29, 0x20, + 0x7e, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, + 0x3d, 0x20, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x22, 0x23, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x29, 0x0a, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3a, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x20, 0x28, 0x73, 0x29, 0x0a, 0x0a, 0x09, 0x2d, 0x2d, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x5f, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x73, 0x20, 0x7e, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x64, + 0x6f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x69, 0x73, 0x76, 0x69, 0x72, 0x74, + 0x75, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x2d, + 0x2d, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x28, 0x29, 0x0a, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x63, + 0x75, 0x72, 0x72, 0x3a, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x28, 0x29, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x3a, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x28, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, 0x09, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, + 0x75, 0x62, 0x28, 0x70, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x22, 0x5e, + 0x25, 0x73, 0x2a, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x09, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x2c, 0x20, 0x22, 0x25, 0x73, 0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, + 0x29, 0x0a, 0x0a, 0x09, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, + 0x20, 0x70, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x3a, + 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x28, 0x29, 0x0a, 0x09, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3a, 0x67, 0x65, 0x74, 0x5f, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x29, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x0a, 0x65, 0x6e, 0x64, 0x0a +}; +unsigned int lua_container_lua_len = 17673; From c7f8c7eb21424d483fbb3727aa48fefd0e12122c Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Sun, 6 Apr 2014 17:47:27 +0100 Subject: [PATCH 038/188] Updated cWorld::CreateProjectile() documentation --- MCServer/Plugins/APIDump/APIDesc.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MCServer/Plugins/APIDump/APIDesc.lua b/MCServer/Plugins/APIDump/APIDesc.lua index 59dd93137..233bdbc46 100644 --- a/MCServer/Plugins/APIDump/APIDesc.lua +++ b/MCServer/Plugins/APIDump/APIDesc.lua @@ -2216,7 +2216,7 @@ end CastThunderbolt = { Params = "X, Y, Z", Return = "", Notes = "Creates a thunderbolt at the specified coords" }, ChangeWeather = { Params = "", Return = "", Notes = "Forces the weather to change in the next game tick. Weather is changed according to the normal rules: wSunny <-> wRain <-> wStorm" }, ChunkStay = { Params = "ChunkCoordTable, OnChunkAvailable, OnAllChunksAvailable", Return = "", Notes = "Queues the specified chunks to be loaded or generated and calls the specified callbacks once they are loaded. ChunkCoordTable is an arra-table of chunk coords, each coord being a table of 2 numbers: { {Chunk1x, Chunk1z}, {Chunk2x, Chunk2z}, ...}. When any of those chunks are made available (including being available at the start of this call), the OnChunkAvailable() callback is called. When all the chunks are available, the OnAllChunksAvailable() callback is called. The function signatures are:
function OnChunkAvailable(ChunkX, ChunkZ)\nfunction OnAllChunksAvailable()
All return values from the callbacks are ignored." }, - CreateProjectile = { Params = "X, Y, Z, {{cProjectileEntity|ProjectileKind}}, {{cEntity|Creator}}, [{{Vector3d|Speed}}]", Return = "", Notes = "Creates a new projectile of the specified kind at the specified coords. The projectile's creator is set to Creator (may be nil). Optional speed indicates the initial speed for the projectile." }, + CreateProjectile = { Params = "X, Y, Z, {{cProjectileEntity|ProjectileKind}}, {{cEntity|Creator}}, {{cItem|Originating Item}}, [{{Vector3d|Speed}}]", Return = "", Notes = "Creates a new projectile of the specified kind at the specified coords. The projectile's creator is set to Creator (may be nil). The item that created the projectile entity, commonly the {{cPlayer|player}}'s currently equipped item, is used at present for fireworks to correctly set their entity metadata. It is not used for any other projectile. Optional speed indicates the initial speed for the projectile." }, DigBlock = { Params = "X, Y, Z", Return = "", Notes = "Replaces the specified block with air, without dropping the usual pickups for the block. Wakes up the simulators for the block and its neighbors." }, DoExplosionAt = { Params = "Force, X, Y, Z, CanCauseFire, Source, SourceData", Return = "", Notes = "Creates an explosion of the specified relative force in the specified position. If CanCauseFire is set, the explosion will set blocks on fire, too. The Source parameter specifies the source of the explosion, one of the esXXX constants. The SourceData parameter is specific to each source type, usually it provides more info about the source." }, DoWithBlockEntityAt = { Params = "X, Y, Z, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a block entity at the specified coords, calls the CallbackFunction with the {{cBlockEntity}} parameter representing the block entity. The CallbackFunction has the following signature:
function Callback({{cBlockEntity|BlockEntity}}, [CallbackData])
The function returns false if there is no block entity, or if there is, it returns the bool value that the callback has returned. Use {{tolua}}.cast() to cast the Callback's BlockEntity parameter to the correct {{cBlockEntity}} descendant." }, From f5cb81eb1bb10d7a3a6704269644a6aedd04375a Mon Sep 17 00:00:00 2001 From: Tycho Date: Sun, 6 Apr 2014 11:09:33 -0700 Subject: [PATCH 039/188] Added support for redstone latching fixes #856 --- .../IncrementalRedstoneSimulator.cpp | 65 ++++++++++++++++++- src/Simulator/IncrementalRedstoneSimulator.h | 2 + 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index 92659fab7..b59f95cfd 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -688,12 +688,13 @@ void cIncrementalRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_B bool IsOn = ((a_MyState == E_BLOCK_REDSTONE_REPEATER_ON) ? true : false); // Cache if repeater is on bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta & 0x3); // Cache if repeater is pwoered + bool IsLocked = IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta & 0x3); - if (IsSelfPowered && !IsOn) // Queue a power change if I am receiving power but not on + if (IsSelfPowered && !IsOn && !IsLocked) // Queue a power change if I am receiving power but not on { QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, true); } - else if (!IsSelfPowered && IsOn) // Queue a power change if I am not receiving power but on + else if (!IsSelfPowered && IsOn && !IsLocked) // Queue a power change if I am not receiving power but on { QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, false); } @@ -1220,6 +1221,66 @@ bool cIncrementalRedstoneSimulator::IsRepeaterPowered(int a_BlockX, int a_BlockY + +bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta) +{ + // Repeaters can be locked by either of their sides + + for (PoweredBlocksList::const_iterator itr = m_PoweredBlocks->begin(); itr != m_PoweredBlocks->end(); ++itr) + { + if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; } + + switch (a_Meta) + { + // If N/S check E/W + case 0x0: + case 0x2: + { + if (itr->a_SourcePos.Equals(Vector3i(a_BlockX + 1, a_BlockY, a_BlockZ))) { return true; } + if (itr->a_SourcePos.Equals(Vector3i(a_BlockX - 1, a_BlockY, a_BlockZ))) { return true; } + break; + } + // If E/W check N/S + case 0x1: + case 0x3: + { + if (itr->a_SourcePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ + 1))) { return true; } + if (itr->a_SourcePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ - 1))) { return true; } + break; + } + } + } + + for (LinkedBlocksList::const_iterator itr = m_LinkedPoweredBlocks->begin(); itr != m_LinkedPoweredBlocks->end(); ++itr) + { + if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; } + + switch (a_Meta) + { + // If N/S check E/W + case 0x0: + case 0x2: + { + if (itr->a_MiddlePos.Equals(Vector3i(a_BlockX + 1, a_BlockY, a_BlockZ))) { return true; } + if (itr->a_MiddlePos.Equals(Vector3i(a_BlockX - 1, a_BlockY, a_BlockZ))) { return true; } + break; + } + // If E/W check N/S + case 0x1: + case 0x3: + { + if (itr->a_MiddlePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ + 1))) { return true; } + if (itr->a_MiddlePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ - 1))) { return true; } + break; + } + } + } + return false; // Couldn't find power source behind repeater +} + + + + bool cIncrementalRedstoneSimulator::IsPistonPowered(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta) { // Pistons cannot be powered through their front face; this function verifies that a source meets this requirement diff --git a/src/Simulator/IncrementalRedstoneSimulator.h b/src/Simulator/IncrementalRedstoneSimulator.h index 8b7363366..f93f86898 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.h +++ b/src/Simulator/IncrementalRedstoneSimulator.h @@ -154,6 +154,8 @@ private: bool AreCoordsSimulated(int a_BlockX, int a_BlockY, int a_BlockZ, bool IsCurrentStatePowered); /** Returns if a repeater is powered */ bool IsRepeaterPowered(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta); + /** Returns if a repeater is locked */ + bool IsRepeaterLocked(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta); /** Returns if a piston is powered */ bool IsPistonPowered(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta); /** Returns if a wire is powered From 7119dd293a702ebdd2c5acf199e46fb91311701d Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 6 Apr 2014 22:05:44 +0200 Subject: [PATCH 040/188] Updated the tolua executable for Windows. --- src/Bindings/tolua++.exe | Bin 200192 -> 200704 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/Bindings/tolua++.exe b/src/Bindings/tolua++.exe index 1e3cc77890111f44cb7775b0813aec88e2a9ee82..ba3a6b0c703968167e89e26e649c1dc33c49cdaa 100644 GIT binary patch delta 7841 zcmeHMdt6jy-aqHe3=S|{f*BkYbhruTjf7Eg7=#fJ6%9nWq$0gx?}%k&Ge)imc4QYk z;#$Xq$czz7KdTiru3+sN3SM8gXzO+Hwqd#Mv`~xXA}VtB`#Xb0pU=LZ-u?Ieyu;`F zTz@6bJNV?EOxx_twEMa zAgLGybC`W8G*H~kMsY27#ow?6)357UhUo=!H1aP=>c?La!z4{9dffInNJTpE{W*rY zi^_nQ$VIVz;*&`Go!hznEEi@GXDGw;krpOLaJe$P7=~|8Uz#I*mLvVint5A%RvBDg zdOMl1CVMlCwZ-U`^MM=*@$E?@*FXZBJs`j&y9IjCp$AsZ6ZZlL)~dN~?#IKpw}`uk zbPKcG+$M1O_KXMW!R7ss@Jxk7M@+Kp=C6n8rxUk+0=1pz)_-=0JLFsm37k|xpkcFH zAaj^{9dTb%f@}Sin>%e7x1G3Y;iRnI=4NZb9_C#SNxbO;fiAn-x$o6Kc3po5+$a;c zRlNAAN>`pj1b!R{F)z989UdlLLfltIf!osL=I$ECtt0N9ncy}Zb2n8A?l524N#NCy z5Xd~|R?i)#-V1KIHF5;lz1Q6A_#yVtNEz-zzbFs_`mfyr`eFL%#GOGyQ8D1=-i56P zvs6Od>14cxog+`u6;y^fS4RRPUPTmId)3ZvkBVTmw z6_3sGhOwz!SJ8@OBx|loSOxiQg0xiV$r0@87HY}VyDn_= zU?JRJ7x|<&5st4LXQujBk*{$97H7ry5v&)qnS9$A>k^&#Qj~5!stHa$6sujM!Xd=38en2C&xsHD9PRsUIf?PB4(UL7YpVZV@`*3gFn*P=-IyHp$R60e#w}w6BkD>XFbJtqkkWQo)@&4e0CtWbKkdpy*&m()Cu0)Vt*$7*H)pZ5~ zVKVBqV(`SJp#kWoUGM4~kN%8xjgQ3KOK{W`b5D};^BvJz@#Trr10W^+N$9M+Y@brB zDTr5H4-hX+e3sQZGbSY{v<+nZGc8=St1J6#cHRuN-BTB_0nYBJyI58$zWB(>@*oRy zT9ty-b7K-p=_vjF7gWkXsZTCtqO=mF#w946R^=hB-$EkGQTl}}Qi#&k4MZzKsTd{q z?7DVIlH^)77d zJ{)XeYypDLzA+Z2GQGq;!c~}wN%RoXlqS`I(O?D%X=<4-z8L!##E7^$u7NUdV=%fG zZH&ZNEHZW~h!!3HEk%)jRu#(yS;W1j$&`I+3PyDXtB;;CiMiXW$rB;miNE~P9nZ9)*-TR$!b%-$rX=9exwXj1iiie+ij|0mYjw3$=?wH8b% z_%o8w%lAw6 zFYhu^oQLZ#e?^3o)V{eFIh?!Y>0uhE`_=G>f1fD4`b`YxDqClI5->#Y%Il%dW>>jt{vKAWoSd&cR^ze33HO{K?~BNidc` zOS*u;4|P<4fbp=6#Jb<2vxspEmjA5Gy9@Hmp(g3bj?i1#XCEUOmw01ZS79mT3%xnA zEeMp7z^Q_^ADRh5Gs{WRM3Pbm??Vnq4m2&h;ft}}2qoT!DAL!)`;vs-rBmOFolEjs~1L(AT?v2w^+9@k1H7vzgzeg$<;5K?nO&g zyIE=)V-YVcDl3N<(gkY??BzC+^Qc(mN}gQd&6&tCSk#9`^4S)|n@Nzd`S4~EVr&Rt zdxV3AK{nwa*H5cR@lI|MmL^Hbx{}UDLPOp3+j5>Mr#+p_WztOeZTXP)PUA%ki;?tQ zf!Idf0*!KAA=hPtq~-b^bL}3>Mk2btLY;5-ms@j1-H{|r?<(sz`Iu?9K{M^kQb*&^ zjEhS%NB=Nb>oXV7__bvkY2n??3}wB=;H+>j7|tnXPN~W?;=HU!SzqzhtSl1j$y!8N z!s0lRU$;0)L&wRDesT%N(VL53pvceGBb}KY9Rg-!Iub;Rs#uScn;(z3FQB-s8xYH~ z7mx7AL2%6fo;Z*_R^6hfik>PFG z`oh7DlvGf%1L9`TS1KLh9s9wNuU_ zcgWe~ZOC^2TGfh7NM#xi%ek_#1$j-Xy0M+=m0bgpbXvur%;L{M%>2f~aO$+`08&pS z(|THU2qm19@?pYMS9U_ju@fgrb>$TlCEZiB7WyGn%(^a3#zm+YdxaH5YX_T*ViAhG zx!+g({xO?B;)b!ST-$NM$PtXVtvtVMhBtQjO3C(La{cJCN2j6gvVVpZ5ZQ?$!$-lN z6ljtcv90;bRu;5L#=|7_s4R8Z(>ZJT`|L!Bz_wR7E-y;R9_x4r5uaTZ@;TjGbUWdP zBMCCq#&%C}WWkycSg4loN7%OMFj-l!?5ulNc60`aZxn>G0pjrjy&CGcmUad>uN8Q) z<50s!!L4YEZB1&7#`!li-F%O~9Kv3Op|p-B7v|D=d;3DQkw&XvB zg(QDBliyd>4i@u(I+#AkT}=0{cmc!X$rmaIWeQ)amh7vt%Q0Ie8tH;elS=$iHC{mj zk}d^a4Eahet~sj}bXxc~@k~v|Lp@nF>DsJJ*THzWovP;BHIm#dlZs^5EBU9@T67WX zFPOT7h$DKnnL3F1JKJ{t{CS4~l^lctjYn>*Wa_oY@vZ)ATD3S=NH_O^D;;pfblR@O zJeBe)QuB9fHImqxKCMEQx3(wKb)2-snME=BAG*=~8ox*_RVP+&Qc5a+ZDU1|(g%vd zLNyvwsI*$K#ySmms8%a3aN-SXJW|8z6jtk8wfc{&7Iy3b!omTQJU{jkd}LREbHSQ2 zmYaEBJonUL$dy0+X9XK57CbwH=KkjTP-n}tGgR*KQDn|T&u4M4I{3mQq!TwhM;lwi z1{1NaZuk|e&AX37@%Cw4ULXHdl7xN-E}>%S#+fm6?VOJ5^k^KE+b|A@J-^L^71(@i zBXV5M_pyUH=x$m)*D4rM5W6-eXy7qFIA|YxTIC85qszh&$P3DXky^{b$*Gz$BL~s; zvLlpj+%$%=S2v|mc5PEJ1T)G*xYGOLn(_+r^qcbV6}S|$ew9}dT*W@FmUC#AUOd7a zWn({@6XvKJ2jpDS$OO_WsXFyK->)k3e^SVp*hAPQw(m7<}jeqFTO(AM-Q@TViiB_Vf2i~G9TBIeBm^nqOI~_ zMl&L`Vn+UP7BkW-&&YLt7R)&fTcX)v@87J-JPp=3e};`c8?TBEbpEzdp};&Jt(rg+ ze7$NK%eCAW^;?$(A?y_P1^g*L{zh-LU4xZjQsE6&y)`uu!z1YuXw`L^zOZM+oAJE5 zwl$mUyf01{C_GmSGmtt2njg)!9HdWdn}D=tTaH_q)``$xDcN)6w^`q|4zB;cc&4U` z=6vz?ClIJdwtwWo=?BHr; zF}2wqjSnF)+uTgo4lpGn)r4LbPm=lQOrLF%sHvL*PfT^eNb@Ll+Uq`HeX)OcM?1P` z8~4F`cyWCsmp3TBP*0=uUcCh)bE`hy2NM%}vO0C3Pt|}xnDtsHP2h^xVp(6bL<^g4 z1*Kr^*?koQwDI-rN;KoWcQOsyti5m141T#cjHBG+O^FSBU@$u;_HwRpGd?6GP}J`a z)52W0PSPb|68Qd7yB7|vKylIjsc?7G{t|`v13gE2pm^su(IF%sH%z{m%WF(0q6!ku z#Dnt{<3lJiGhN?RP-N08bmI`EOQx*H1HJ-5{?0pw@*&0{x2V5KRW(GZcT=<`)wUr@ zm7AhBsdfxe*1IXeCe_X%N|BplFsbT>D2rvv`UsP8w@k@#B@qShF6`y!oeSUHPEY(R zO~G90pm?{*jLOXSD7^mjy?62c9Qpo7G@zaD@9>6tw|92dhpizN=X1`LoF_VMA7R~r zIk^1W@zCIo6d-;4NEBB$C~iGMk$UWiJ5n1W9}HtoY+t;wgIsx(H@A|Bm7A<$&24M8#qY#w@k$b;Y@DX#6E;o`CPVeoW3jF#ODBfS?V}C zn%wOz*3?R2z_ z5@(*c!~TUBzjLRQ;-z@bzybt zA=3%JEnnjscA3xZ&ZE%=i?it5i}W?b>H5PqmYQGxNf-xm{U>TK3|HgDee@YboOgLH z3B7#zA{z=@Z8U{+LDb7@NwTT={z01pk1IzjY;3zqbK^X4^&~sCa}c}qw?%j=x5le9 zm?~RNU#dFEmL9L#9cmGUFQ#yz7Uzdwq;lm}701+jaLiU<15gAk0n>2g^_Ujlal zUyfsffM{SkkPa*XihvT}Mc`$i0eBxc2mBfM4)9fQ%p@QQSOh!`GZDZvAPrayEC)6KzXWyx2Y}xJ zXMjtpax{bjgP!^WVF3M_(Ax%J2e1iP3lsvGfCY#H#sgYF2^^u30y=>kKtJFyf@1;z z0}uzK0gnO2z>B~(V9#PCO~5hW9MB2$0CxcoHOJ_IXdn(q19E^OU_J0lU?;E-I1ID{ ze^hhMPrl;(Rd{+Ze$ETuE2lPl4YJQDn>TRWdk?dQ=82QJ70S@{vscYthriXci%^Pu z?%`)<|CCf)^$7RY|3WPE5iY29=2Rqtk$Wogr$+vTU64$*F;ls*&8}%&0XuQ^lZGdr zS^J#LU^W|~o{2KptgF^~8R$1eHbg~Hebw5c+8NWid9^|u_a8s+SMxVS1~??aR(i-TPdh+;(ulmu7X3q0|+Lj_odLF z|6i>C=N4=87jLtnYO#sy@+zeJI(~(^X0Idc8(z4^Hy>WBWXCJQa?$ zH1BU`pNMY`uyB3vy%eKvR^Q_6J_WrjvmCZ>&FY^u)0AhjnMzG{rWVuZrcP78NuLmr zkd#oE@Ki!o!p?-Ig!2g<2|WqD3I66u<`{E^In!KX-eGPscbI$4{)sV(nTaKdI})1` TI}&>mdlT{h;pWS%B2x2DFo#4! delta 7552 zcmeHMeOOdw+CS&a4301(gn*-gg2;#YxxxVBNHGG6iZqB0kczaSJ7Klv&KR{I*pYXc zju_i1A+>UxHoely9A$>wwJ}h%*DWg7#jnCLcUq{$GQ`&P?C(B<#a`FG*Iw_x@AcyK zdp_>3=YH4vw@XvEQ`6)h_ndJ?5i|7H!*FZ}JCb2O1!1blv1!~{oj99K9CfCR zW#*97Oa*g@{cYT6aTA-wwHy{-XUoz$J^`a2I0JkR4ExJsn5^j)5856Ct)i4=m@eR6 zpjEt=OJc8!Yfuijw{m+}?sJovuAHd*(!^KOt{wWpwR| zgC@pm3Sk(l_xpgH7IGxScVv;=W)j#G1ObMfD;w&=gzi{5K-{w+SQ|zJxE~DTb`$qy z(k;I$z&!vi-;sYuovC$0A}EKf>jDzb4%44X-0hRWRj&weA0OflIk%Jqj;kQBw>}_X z9;RMR+#O1A*9igctYO@}#GMyU%3)0bb_CeNyz3%~-)SMxH8T*K@6)eg@oHYr+Vy2fqxk4MXgqNGT6PzhX25V!sXu=!WS}C2l%}qJhbl7x@R+ zy0c14iJL~oeX0QWB09sIt0sXFFCrzagBo{lP+c^Ke0((i*CTb=Os}f#z{e)>T6}Dv z=cV4bNso-^GBNGW^2uW3q_Nh?*-WLL$=GbB-e(_QskAus<>2`{|AnEd z99L4-p7L=U0~@_6C&@cB9Dgj9e^0sTX5Ggoruwgyx62?A28m+fy<>waL0O-r6GtV) zn?S1mU{#8*tlb|miDBw8PiwOo#-{RL!YGoStof&67nHUO(lVjXBG}bl8p+tde&VLv z<#2y}!kQ2w99usjllosI?BG5&x$6=~u))w~N^N&rmyQ*Gn-sYa-4x%-_DY>Kw$;S= z_eC>IrP@C>9zy);TTIG@Y(vZ$j32uBIO6As=|cON+_2r`6JMiYLhD}wUDD@|75kGS z*s-E2`My!)p%Es8K}nxCR$P+2g4K#|CI2A?GcRj5YMW5ox$oM)+By?LGzmVlM=Lre z$8%Y&;+vCOLde2`REBYNYsJEQ45Klc%ZtJ+>Gz|O^n119OZTjeC?}_jkhc8lD+~f* z)a!I&^ps_BQJAJ(=kHF$e8&3|6R`FY9QDuqyCjvCI+Jzcb5qj7Atn7;=&rwDpI)gc zGpMdaiRY(0&g$IxQ|Blm>d5#f5pdD2t{<@3`An$ooKe6=xqD}9V_BW}^v_n+o;5L@ zsvMLftFzF`L+cN}rdB>$19HoZ)+)4IOVQ|5m7v_dnM78g^=nzA9IZ=F5v>BPO0)v2 z>)$3xl7IDl%&!oB@J6X zrcRud^)nc&$gW%=?b1$WmMfeZ*mme+c3cbW`7pb_+NfFXjBbq#hQ6({}b!fyo?$DUJIra z{7FgZ=LaSGF`;u+8Fpou)z>P{oFA*jAyZQ<+&FfX!)YR}oSztn9U>@$cwekpiY&qS z@+l*w2Km4I3o@LfUY&oA>uD8h^CoJb9@@ww|B3!a-bC!vuDk-26Bf)HJqkN{&i54v z6l)*fsQkVh@u^yn90dZ-hTdy}R3yaE5SF9FYF!XF@=rLTF3P>01!K~wceQMJAYp}E zwUl}sf{YY72}+oS#;W#UC(Zpql2WAkj+!ee7Ys2Mqr~Y8<2e{CS}0QGUpQ?7ED8E` z(2~v~_;JoU5D*XB80`Dae=>=wi&p$cnYR{|)tL_gMb4vRl{+PJhtD*lMzClOF7nwH#b=TrW7G1PB*fT| z!1hT_3WIFINv?OQNbzQI7Pcly$+}Xcjf94#8M^s2Q%h$$nKRQ$gl;}UXQ%!g!lEaA z|7aYe0RflXSIB+Ypd9M&u-1WCx`^oi0)4(COdidjbW@VBysNEWmtv&@1~chgmbzR+ zD=scGkNYuL8_bI+e(h#GZM+}Macrm!g#}d2 zS&~Zf>z5>H=sLMNNG{8Rc!2N31DY zGNS*mi84KwK6R0$m<}uP+odma zUXS?PG86nevn-ZW29`aMghO7)e1yu66gQ23u9>v-n9f)l=8vi-N*Z(Dx0m9 zP4XheSGs&vS-Ye^L{j(5Qirte*((mRQy>D{!SQ&!C?R{aD-s!B)DUxq-Yt>O!w+W` zWE}bqtvIG^Z44|p9%3)(O!IU{uL-Q{z+ zTG?Fa=5EYQ&`ttJ(0eI(Ocui&yBw;>(;Q*y7^bLDIve0Sd!X_T#Opr!>qxU&?h099 z0Ve-yLkC#Q9qR48>_9UwtnNvKXCz;)ye(7sDz#)^T~v$JTBniD$~0+R7`pn47(j~5 zffqx*(uiwMMF^1*@Nde=#{9eb3LEnx3eEm~2DqK8<~uZ!JT0S&WH%`JN7WISBKBW2 zO$ixCbVnvl5bJlU{q*V6&RBFTNCS#Taf)Q@x2N*Hu(iGj+$*G8e8-h8xMJ+IE3r;h zyo%Jq0$MH-TRRY;kmao%CVGyOmY7j7Q}^REdUx;zYRPf0W1~`1h3Q;%6-q4>g~e(N zrcg!b#765ZyrFznJmAEuRs+h|hjUn+d-cN~vk|ak4;L2SGRo^?AHgT|M7bBOtzkKx zSA74GLy)U|^iu^pMl5?go!0)^hB&wP@pM(7-G<7&|A|5lR&PH!73Gwtenkh{uBVK| zy7bg<*oX`-F2x(2c)ULNkt7L&PCP=zs_KlH^z2N-b9x*u$}NZkaxZk#?K&JjwhWz0(_2R~PR9)U!3Bml@7_P)CuC1*jPrt5>Ux`OC8(Mz}$yKTKd*8>n^u;4&D_w&a zPRLffZppRA#f+h^BuDNQeh`<<8X-SBY>h*c+Xr@5uV3b5ve=+C+Gp~0(G3l|x=rGv zb>pU=Gl72!aCXLHW>@$tWAQSOUtlPlUmG$!?Lq%?7q~aot|=WMc!Z`I4;< zAyHemz8l01dc`MRNP(?=FHA@Ib*oPN_JviPu1zf3HU)&*ZAmEiYNgE!I;y zYxdjRxGt2Fk`?#}cg-9kt_lz}GBI_CxDdor*BtclaEY*9=b%9rX36vn(4ABm+imw7 zVo1z3-|TM!Q_@pU==bv^S&GRF*rtk_mg(@s*beJ&z%eY-)6g-JQ?$h|e7+J!`zy(5kmaOI8^b`(aUjZLqDDzIMO zc?kikerc-`!-VXfMnRjs`!!m@&v#Gcs1Ev_#E!mWu*i~fp;)+Ph{+iv>h?^GfVtjC zDKZO-zzMQqw4t~N=1MYYgDxiQI^P*4U>%eoifGZ&ms!GyKt7Db}xQwD}CZ$JP^&5 zw240)$V4aOZA!0Sy!{rwKgS$=mjc>-uqg!Uy&*+~M|_t|?q9iAaU(Hl`v_|j*5Jb7 zL}+lWWhftPP2#HB#AjM5Q;)U=GIdwNoiJKb1`PTxa^-$Lv*S|}a~qfcZagfU=!geB ziBaHj_VYhQ_(KQDi{E%+IY@+gXW)Qvo4gy@yRa*NRU{mv-<7W6=K%b&)YUeQ-0f?# zg%fj}aFXwtaO|c^&@_U({v89?(k8y~&fReB)H@HLoOC1u*|YLUHA}}%S34fd@0}01 z0w08vQ?!22V%iTVsP1b2Owot>v3Hx*#MV-$@c1iZd*t4Al#S6WUKd~Opqm_hapZ}Y z#zBht%Q--#*Wo?{zmR)K*p1d}O@%YYQq{&s-VL)ByN zZW}o$52Qq|@c1sB+|eL_!$(CQqrN;A9i&KPb^oE6#rGZBX_^?z0l2H zadfob=x$5yF}W+=f0}*`ar^(cg{9#)d^nKs`Uzym-IkP0LM5y0!eXPNha^T0R20HFQ@ z%R~XmKq`;}n1P=I>w!ApIpB5RDDW}x4WK#7GO@sPU^b9FtQW^0A)a zTkI>rcv5=y1#xBUTs#Yh|Ly(X_nQ}~IeLXQ|5D9GgOq?4lYk+U908cYZeL z(?PRcGBNqM3I7vnhyJQyci%{EAm~#QQ~s&RvnQB)$ly6Yk^QC8lb6IEyvOtRLUyIH z`AG}=TJyDKY*e#)DT-0c*+-hqMXct>uG$k{!dlqoQ7hQo=C4cHpL^Clzy`C;JC?IK z9uVIT@%$s3QylcD2ROU7>;TKGfV*e(-FjVGM%vP}lC-L{mb61@-n8zt!8B!hYGZDj{&Y=7SjNE P%Ygs>^juIV5;Xq=Kl3S$ From de3df0a71fbde1630775c0daa592d6f2c1ba679f Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 6 Apr 2014 22:15:49 +0200 Subject: [PATCH 041/188] Fixed crash in protocols sending 64-bit ints. Fixes #855. --- src/Protocol/Protocol.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Protocol/Protocol.h b/src/Protocol/Protocol.h index ae06f2f9e..939170f0e 100644 --- a/src/Protocol/Protocol.h +++ b/src/Protocol/Protocol.h @@ -177,7 +177,7 @@ protected: void WriteInt64 (Int64 a_Value) { UInt64 Value = HostToNetwork8(&a_Value); - SendData((const char *)Value, 8); + SendData((const char *)&Value, 8); } void WriteFloat (float a_Value) From 95fb90eaa642b76915a117495b472d7f7e141cde Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 6 Apr 2014 22:28:41 +0200 Subject: [PATCH 042/188] Fixed 1.6.4 client crash on composite chat messages. --- src/Protocol/Protocol16x.cpp | 13 +++++++++++++ src/Protocol/Protocol16x.h | 1 + 2 files changed, 14 insertions(+) diff --git a/src/Protocol/Protocol16x.cpp b/src/Protocol/Protocol16x.cpp index bf7d9a0b1..3da23a1dc 100644 --- a/src/Protocol/Protocol16x.cpp +++ b/src/Protocol/Protocol16x.cpp @@ -18,6 +18,7 @@ Implements the 1.6.x protocol classes: #include "../Entities/Entity.h" #include "../Entities/Player.h" #include "../UI/Window.h" +#include "../CompositeChat.h" @@ -89,6 +90,18 @@ void cProtocol161::SendChat(const AString & a_Message) +void cProtocol161::SendChat(const cCompositeChat & a_Message) +{ + // This protocol version doesn't support composite messages to the full + // Just extract each part's text and use it: + + super::SendChat(Printf("{\"text\":\"%s\"}", EscapeString(a_Message.ExtractText()).c_str())); +} + + + + + void cProtocol161::SendEditSign(int a_BlockX, int a_BlockY, int a_BlockZ) { cCSLock Lock(m_CSPacket); diff --git a/src/Protocol/Protocol16x.h b/src/Protocol/Protocol16x.h index 325e41c5a..ae1388649 100644 --- a/src/Protocol/Protocol16x.h +++ b/src/Protocol/Protocol16x.h @@ -37,6 +37,7 @@ protected: // cProtocol150 overrides: virtual void SendAttachEntity (const cEntity & a_Entity, const cEntity * a_Vehicle) override; virtual void SendChat (const AString & a_Message) override; + virtual void SendChat (const cCompositeChat & a_Message) override; virtual void SendEditSign (int a_BlockX, int a_BlockY, int a_BlockZ) override; ///< Request the client to open up the sign editor for the sign (1.6+) virtual void SendGameMode (eGameMode a_GameMode) override; virtual void SendHealth (void) override; From 176deb4b5bbbfc23e44bb4d5087c7832cad36da1 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 6 Apr 2014 22:30:34 +0200 Subject: [PATCH 043/188] Added the generated ZBS API file to ignore list. --- MCServer/.gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MCServer/.gitignore b/MCServer/.gitignore index 69826ef06..32a634a03 100644 --- a/MCServer/.gitignore +++ b/MCServer/.gitignore @@ -28,3 +28,5 @@ motd.txt *.deuser *.dmp *.xml +mcserver_api.lua + From f9b2c2956efff75c71af6d3f18f615bc0cd345d4 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Mon, 7 Apr 2014 08:11:56 +0200 Subject: [PATCH 044/188] Fixed HTTP chunked encoding. Fixes #858. --- src/HTTPServer/HTTPConnection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HTTPServer/HTTPConnection.cpp b/src/HTTPServer/HTTPConnection.cpp index 44a3d3f88..da4df0e34 100644 --- a/src/HTTPServer/HTTPConnection.cpp +++ b/src/HTTPServer/HTTPConnection.cpp @@ -70,7 +70,7 @@ void cHTTPConnection::Send(const cHTTPResponse & a_Response) void cHTTPConnection::Send(const void * a_Data, size_t a_Size) { ASSERT(m_State == wcsSendingResp); - AppendPrintf(m_OutgoingData, SIZE_T_FMT "\r\n", a_Size); + AppendPrintf(m_OutgoingData, SIZE_T_FMT_HEX "\r\n", a_Size); m_OutgoingData.append((const char *)a_Data, a_Size); m_OutgoingData.append("\r\n"); m_HTTPServer.NotifyConnectionWrite(*this); From 4082adbbade69890fb275f1807f061c8b206070e Mon Sep 17 00:00:00 2001 From: Alexander Harkness Date: Mon, 7 Apr 2014 11:35:37 +0100 Subject: [PATCH 045/188] Fix some of the comments in the PR tycho just did. --- src/Simulator/IncrementalRedstoneSimulator.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index b59f95cfd..0c032eeab 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -1,4 +1,3 @@ - #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "IncrementalRedstoneSimulator.h" @@ -686,15 +685,15 @@ void cIncrementalRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_B { NIBBLETYPE a_Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); - bool IsOn = ((a_MyState == E_BLOCK_REDSTONE_REPEATER_ON) ? true : false); // Cache if repeater is on - bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta & 0x3); // Cache if repeater is pwoered - bool IsLocked = IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta & 0x3); + bool IsOn = ((a_MyState == E_BLOCK_REDSTONE_REPEATER_ON) ? true : false); // Cache if repeater is on. + bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta & 0x3); // Cache if repeater is powered. + bool IsLocked = IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta & 0x3); // Cache if repeater is locked. - if (IsSelfPowered && !IsOn && !IsLocked) // Queue a power change if I am receiving power but not on + if (IsSelfPowered && !IsOn && !IsLocked) // Queue a power change if powered, but not on and not locked. { QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, true); } - else if (!IsSelfPowered && IsOn && !IsLocked) // Queue a power change if I am not receiving power but on + else if (!IsSelfPowered && IsOn && !IsLocked) // Queue a power change if unpowered, on, and not locked. { QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, false); } @@ -1225,7 +1224,6 @@ bool cIncrementalRedstoneSimulator::IsRepeaterPowered(int a_BlockX, int a_BlockY bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta) { // Repeaters can be locked by either of their sides - for (PoweredBlocksList::const_iterator itr = m_PoweredBlocks->begin(); itr != m_PoweredBlocks->end(); ++itr) { if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; } @@ -1275,7 +1273,7 @@ bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, } } } - return false; // Couldn't find power source behind repeater + return false; // Repeater is not being powered from either side, therefore it is not locked. } From 440b74af6cae6c93075f622c815f9e2cf518362e Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Mon, 7 Apr 2014 12:02:41 +0100 Subject: [PATCH 046/188] Fixed #859 --- .../IncrementalRedstoneSimulator.cpp | 26 +++---------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index 92659fab7..86462f4cb 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -96,26 +96,6 @@ void cIncrementalRedstoneSimulator::RedstoneAddBlock(int a_BlockX, int a_BlockY, PoweredBlocks->erase(itr); break; } - else if (Block == E_BLOCK_DAYLIGHT_SENSOR) - { - if (!a_Chunk->IsLightValid()) - { - m_World.QueueLightChunk(a_Chunk->GetPosX(), a_Chunk->GetPosZ()); - break; - } - else - { - NIBBLETYPE SkyLight; - a_Chunk->UnboundedRelGetBlockSkyLight(RelX, itr->a_SourcePos.y + 1, RelZ, SkyLight); - - if (a_Chunk->GetTimeAlteredLight(SkyLight) <= 8) // Could use SkyLight - m_World.GetSkyDarkness(); - { - LOGD("cIncrementalRedstoneSimulator: Erased daylight sensor from powered blocks list due to insufficient light level"); - PoweredBlocks->erase(itr); - break; - } - } - } } LinkedBlocksList * LinkedPoweredBlocks = a_Chunk->GetRedstoneSimulatorLinkedBlocksList(); @@ -558,8 +538,8 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block } else { - NIBBLETYPE MetaToSet = 0; NIBBLETYPE MyMeta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); + NIBBLETYPE MetaToSet = MyMeta; int TimesMetaSmaller = 0, TimesFoundAWire = 0; for (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++) // Loop through all directions to transfer or receive power @@ -589,9 +569,9 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block if (SurroundMeta > 1) // Wires of power 1 or 0 cannot transfer power TO ME, don't bother checking { - // Does surrounding wire have a higher power level than self? + // Does surrounding wire have a higher power level than the highest so far (MetaToSet)? // >= to fix a bug where wires bordering each other with the same power level will appear (in terms of meta) to power each other, when they aren't actually in the powered list - if (SurroundMeta >= MyMeta) + if (SurroundMeta >= MetaToSet) { MetaToSet = SurroundMeta - 1; // To improve performance } From 634c4d6770605323e2992e1b381682579d698f39 Mon Sep 17 00:00:00 2001 From: Alexander Harkness Date: Mon, 7 Apr 2014 17:12:06 +0100 Subject: [PATCH 047/188] Fixed the redstone simulator. --- .../IncrementalRedstoneSimulator.cpp | 85 +++++++++---------- 1 file changed, 38 insertions(+), 47 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index 0c032eeab..cab3a714a 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -1223,57 +1223,48 @@ bool cIncrementalRedstoneSimulator::IsRepeaterPowered(int a_BlockX, int a_BlockY bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta) { - // Repeaters can be locked by either of their sides - for (PoweredBlocksList::const_iterator itr = m_PoweredBlocks->begin(); itr != m_PoweredBlocks->end(); ++itr) + // Change checking direction according to meta rotation. + switch (m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ) & 0x3) //compare my direction to my neighbor's { - if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; } + // If N/S check E/W <<<<< - switch (a_Meta) - { - // If N/S check E/W - case 0x0: - case 0x2: - { - if (itr->a_SourcePos.Equals(Vector3i(a_BlockX + 1, a_BlockY, a_BlockZ))) { return true; } - if (itr->a_SourcePos.Equals(Vector3i(a_BlockX - 1, a_BlockY, a_BlockZ))) { return true; } - break; - } - // If E/W check N/S - case 0x1: - case 0x3: - { - if (itr->a_SourcePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ + 1))) { return true; } - if (itr->a_SourcePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ - 1))) { return true; } - break; - } - } + case 0x0: + case 0x2: + { + if (m_World.GetBlock(a_BlockX + 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) // Is right neighbor a + { + NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX + 1, a_BlockY, a_BlockZ) & 0x3; + if (otherRepeaterDir == 0x1) { return true; } + } + + if (m_World.GetBlock(a_BlockX - 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) + { + NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX -1, a_BlockY, a_BlockZ) & 0x3; + if (otherRepeaterDir == 0x3) { return true; } + } + + break; + } + + // If E/W check N/S + case 0x1: + case 0x3: + + if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ + 1) == E_BLOCK_REDSTONE_REPEATER_ON) + { + NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ + 1) & 0x3; + if (otherRepeaterDir == 0x0) { return true; } + } + + if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ -1) == E_BLOCK_REDSTONE_REPEATER_ON) + { + NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ - 1) & 0x3; + if (otherRepeaterDir == 0x2) { return true; } + } + break; } - for (LinkedBlocksList::const_iterator itr = m_LinkedPoweredBlocks->begin(); itr != m_LinkedPoweredBlocks->end(); ++itr) - { - if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; } - - switch (a_Meta) - { - // If N/S check E/W - case 0x0: - case 0x2: - { - if (itr->a_MiddlePos.Equals(Vector3i(a_BlockX + 1, a_BlockY, a_BlockZ))) { return true; } - if (itr->a_MiddlePos.Equals(Vector3i(a_BlockX - 1, a_BlockY, a_BlockZ))) { return true; } - break; - } - // If E/W check N/S - case 0x1: - case 0x3: - { - if (itr->a_MiddlePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ + 1))) { return true; } - if (itr->a_MiddlePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ - 1))) { return true; } - break; - } - } - } - return false; // Repeater is not being powered from either side, therefore it is not locked. + return false; } From 5374730753aa5f07dc0b565af1140abb8b694c0b Mon Sep 17 00:00:00 2001 From: Alexander Harkness Date: Mon, 7 Apr 2014 17:28:16 +0100 Subject: [PATCH 048/188] Improved the speed a little more. --- src/Simulator/IncrementalRedstoneSimulator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index cab3a714a..08a0f42c6 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -1224,7 +1224,7 @@ bool cIncrementalRedstoneSimulator::IsRepeaterPowered(int a_BlockX, int a_BlockY bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta) { // Change checking direction according to meta rotation. - switch (m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ) & 0x3) //compare my direction to my neighbor's + switch (a_Meta & 0x3) //compare my direction to my neighbor's { // If N/S check E/W <<<<< From 57a474ba01ff9dcfba8e90b30d3938d60aa600e5 Mon Sep 17 00:00:00 2001 From: Alexander Harkness Date: Mon, 7 Apr 2014 17:37:53 +0100 Subject: [PATCH 049/188] Fixed some more minor issues with the redstone simulator. --- .../IncrementalRedstoneSimulator.cpp | 73 ++++++++++--------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index 08a0f42c6..f12c29211 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -683,11 +683,13 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block void cIncrementalRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_MyState) { + // Create a variable holding my meta to avoid multiple lookups. NIBBLETYPE a_Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); - bool IsOn = ((a_MyState == E_BLOCK_REDSTONE_REPEATER_ON) ? true : false); // Cache if repeater is on. - bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta & 0x3); // Cache if repeater is powered. - bool IsLocked = IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta & 0x3); // Cache if repeater is locked. + // Do the same for being on, self powered or locked. + bool IsOn = (a_MyState == E_BLOCK_REDSTONE_REPEATER_ON); + bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta); + bool IsLocked = IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta); if (IsSelfPowered && !IsOn && !IsLocked) // Queue a power change if powered, but not on and not locked. { @@ -1151,7 +1153,8 @@ bool cIncrementalRedstoneSimulator::AreCoordsLinkedPowered(int a_BlockX, int a_B - +// IsRepeaterPowered tests if a repeater should be powered by testing for power sources behind the repeater. +// It takes the coordinates of the repeater the the meta value. bool cIncrementalRedstoneSimulator::IsRepeaterPowered(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta) { // Repeaters cannot be powered by any face except their back; verify that this is true for a source @@ -1160,7 +1163,7 @@ bool cIncrementalRedstoneSimulator::IsRepeaterPowered(int a_BlockX, int a_BlockY { if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; } - switch (a_Meta) + switch (a_Meta & 0x3) { case 0x0: { @@ -1190,7 +1193,7 @@ bool cIncrementalRedstoneSimulator::IsRepeaterPowered(int a_BlockX, int a_BlockY { if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; } - switch (a_Meta) + switch (a_Meta & 0x3) { case 0x0: { @@ -1226,42 +1229,44 @@ bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, // Change checking direction according to meta rotation. switch (a_Meta & 0x3) //compare my direction to my neighbor's { - // If N/S check E/W <<<<< - case 0x0: - case 0x2: - { - if (m_World.GetBlock(a_BlockX + 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) // Is right neighbor a - { - NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX + 1, a_BlockY, a_BlockZ) & 0x3; - if (otherRepeaterDir == 0x1) { return true; } - } + // If the repeater is facing one direction, do one thing. + case 0x0: + case 0x2: + { + if (m_World.GetBlock(a_BlockX + 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) // Is right neighbor a + { + NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX + 1, a_BlockY, a_BlockZ) & 0x3; + if (otherRepeaterDir == 0x1) { return true; } + } - if (m_World.GetBlock(a_BlockX - 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) - { - NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX -1, a_BlockY, a_BlockZ) & 0x3; - if (otherRepeaterDir == 0x3) { return true; } - } + if (m_World.GetBlock(a_BlockX - 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) + { + NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX -1, a_BlockY, a_BlockZ) & 0x3; + if (otherRepeaterDir == 0x3) { return true; } + } break; - } + } - // If E/W check N/S + // If another, do the other. case 0x1: case 0x3: + { + if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ + 1) == E_BLOCK_REDSTONE_REPEATER_ON) + { + NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ + 1) & 0x3; + if (otherRepeaterDir == 0x0) { return true; } + } + + if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ -1) == E_BLOCK_REDSTONE_REPEATER_ON) + { + NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ - 1) & 0x3; + if (otherRepeaterDir == 0x2) { return true; } + } - if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ + 1) == E_BLOCK_REDSTONE_REPEATER_ON) - { - NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ + 1) & 0x3; - if (otherRepeaterDir == 0x0) { return true; } - } - - if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ -1) == E_BLOCK_REDSTONE_REPEATER_ON) - { - NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ - 1) & 0x3; - if (otherRepeaterDir == 0x2) { return true; } - } - break; + break; + } } return false; From 4f8f686292e8a55ae5b172a191c955ddd1fa9457 Mon Sep 17 00:00:00 2001 From: wiseoldman95 Date: Mon, 7 Apr 2014 19:55:17 +0300 Subject: [PATCH 050/188] Slight cleanup It is more efficient and readable if we do nothing unless we're not locked. --- .../IncrementalRedstoneSimulator.cpp | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index f12c29211..420d7c3f6 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -684,22 +684,26 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block void cIncrementalRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_MyState) { // Create a variable holding my meta to avoid multiple lookups. - NIBBLETYPE a_Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); + NIBBLETYPE a_Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); - // Do the same for being on, self powered or locked. - bool IsOn = (a_MyState == E_BLOCK_REDSTONE_REPEATER_ON); - bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta); - bool IsLocked = IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta); + - if (IsSelfPowered && !IsOn && !IsLocked) // Queue a power change if powered, but not on and not locked. - { - QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, true); + + if (IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta)) // If we're locked, change nothing. Otherwise: + { + // Create a variable holding being on or self powered to avoid multiple lookups. + bool IsOn = (a_MyState == E_BLOCK_REDSTONE_REPEATER_ON); + bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta); + if (IsSelfPowered && !IsOn && !IsLocked) // Queue a power change if powered, but not on and not locked. + { + QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, true); + } + else if (!IsSelfPowered && IsOn && !IsLocked) // Queue a power change if unpowered, on, and not locked. + { + QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, false); + } } - else if (!IsSelfPowered && IsOn && !IsLocked) // Queue a power change if unpowered, on, and not locked. - { - QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, false); - } - + for (RepeatersDelayList::iterator itr = m_RepeatersDelayList->begin(); itr != m_RepeatersDelayList->end(); ++itr) { if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) From 45eb539a17f92117905ef924db772599d8a146f0 Mon Sep 17 00:00:00 2001 From: wiseoldman95 Date: Mon, 7 Apr 2014 20:00:38 +0300 Subject: [PATCH 051/188] Removed unneeded spacings --- src/Simulator/IncrementalRedstoneSimulator.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index 420d7c3f6..c8509de12 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -684,12 +684,9 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block void cIncrementalRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_MyState) { // Create a variable holding my meta to avoid multiple lookups. - NIBBLETYPE a_Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); + NIBBLETYPE a_Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); - - - - if (IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta)) // If we're locked, change nothing. Otherwise: + if (!IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta)) // If we're locked, change nothing. Otherwise: { // Create a variable holding being on or self powered to avoid multiple lookups. bool IsOn = (a_MyState == E_BLOCK_REDSTONE_REPEATER_ON); @@ -703,7 +700,7 @@ void cIncrementalRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_B QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, false); } } - + for (RepeatersDelayList::iterator itr = m_RepeatersDelayList->begin(); itr != m_RepeatersDelayList->end(); ++itr) { if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) From 011123726b2e394c96a4c67b51bd7a86cc1cb13d Mon Sep 17 00:00:00 2001 From: wiseoldman95 Date: Mon, 7 Apr 2014 20:26:23 +0300 Subject: [PATCH 052/188] Removed stray IsLocked --- src/Simulator/IncrementalRedstoneSimulator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index c8509de12..ebe8e2541 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -691,11 +691,11 @@ void cIncrementalRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_B // Create a variable holding being on or self powered to avoid multiple lookups. bool IsOn = (a_MyState == E_BLOCK_REDSTONE_REPEATER_ON); bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta); - if (IsSelfPowered && !IsOn && !IsLocked) // Queue a power change if powered, but not on and not locked. + if (IsSelfPowered && !IsOn) // Queue a power change if powered, but not on and not locked. { QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, true); } - else if (!IsSelfPowered && IsOn && !IsLocked) // Queue a power change if unpowered, on, and not locked. + else if (!IsSelfPowered && IsOn) // Queue a power change if unpowered, on, and not locked. { QueueRepeaterPowerChange(a_BlockX, a_BlockY, a_BlockZ, a_Meta, false); } From af566d5a79134842854bea78de577676d507949f Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Mon, 7 Apr 2014 19:52:35 +0200 Subject: [PATCH 053/188] Added Enchantment-Slot-Level generating --- src/FastRandom.cpp | 10 ++++++++++ src/FastRandom.h | 3 +++ src/UI/SlotArea.cpp | 28 +++++++++++++++++++--------- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/FastRandom.cpp b/src/FastRandom.cpp index e6634bb0d..c45261947 100644 --- a/src/FastRandom.cpp +++ b/src/FastRandom.cpp @@ -172,3 +172,13 @@ float cFastRandom::NextFloat(float a_Range, int a_Salt) + +int cFastRandom::GenerateRandomInteger(int a_Begin, int a_End) +{ + cFastRandom Random; + return Random.NextInt(a_End - a_Begin + 1) + a_Begin; +} + + + + diff --git a/src/FastRandom.h b/src/FastRandom.h index bf70822cf..1c20fa39f 100644 --- a/src/FastRandom.h +++ b/src/FastRandom.h @@ -43,6 +43,9 @@ public: /// Returns a random float in the range [0 .. a_Range]; a_Range must be less than 1M; a_Salt is additional source of randomness float NextFloat(float a_Range, int a_Salt); + + /// Returns a random int in the range [a_Begin .. a_End] + int GenerateRandomInteger(int a_Begin, int a_End); protected: int m_Seed; diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index a226d027b..03bfd275a 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -13,6 +13,8 @@ #include "Window.h" #include "../CraftingRecipes.h" #include "../Root.h" +#include "../FastRandom.h" +#include "../BlockArea.h" @@ -615,23 +617,31 @@ void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) if (a_Player.GetDraggingItem().IsEmpty()) { LOGWARN("EMPTY"); - this->m_ParentWindow.SetProperty(0, 0); - this->m_ParentWindow.SetProperty(1, 0); - this->m_ParentWindow.SetProperty(2, 0); + m_ParentWindow.SetProperty(0, 0); + m_ParentWindow.SetProperty(1, 0); + m_ParentWindow.SetProperty(2, 0); } else if (a_Player.GetDraggingItem().IsEnchantable) { + int bookshelves = 15; // TODO: Check Bookshelves + + cFastRandom Random; + int base = (Random.GenerateRandomInteger(1, 8) + floor(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); + LOGWARN("Enchantable"); - this->m_ParentWindow.SetProperty(0, 30); - this->m_ParentWindow.SetProperty(1, 20); - this->m_ParentWindow.SetProperty(2, 10); + m_ParentWindow.SetProperty(0, topSlot); + m_ParentWindow.SetProperty(1, middleSlot); + m_ParentWindow.SetProperty(2, bottomSlot); } else { LOGWARN("Not Enchantable"); - this->m_ParentWindow.SetProperty(0, 0); - this->m_ParentWindow.SetProperty(1, 0); - this->m_ParentWindow.SetProperty(2, 0); + m_ParentWindow.SetProperty(0, 0); + m_ParentWindow.SetProperty(1, 0); + m_ParentWindow.SetProperty(2, 0); } } From dab01b27c68036fff76edba0d96d518867c574a0 Mon Sep 17 00:00:00 2001 From: wiseoldman95 Date: Mon, 7 Apr 2014 21:04:06 +0300 Subject: [PATCH 054/188] Fixed IsOn --- src/Simulator/IncrementalRedstoneSimulator.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index ebe8e2541..8f82c454e 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -685,11 +685,10 @@ void cIncrementalRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_B { // Create a variable holding my meta to avoid multiple lookups. NIBBLETYPE a_Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); - + bool IsOn = (a_MyState == E_BLOCK_REDSTONE_REPEATER_ON); + if (!IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta)) // If we're locked, change nothing. Otherwise: { - // Create a variable holding being on or self powered to avoid multiple lookups. - bool IsOn = (a_MyState == E_BLOCK_REDSTONE_REPEATER_ON); bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta); if (IsSelfPowered && !IsOn) // Queue a power change if powered, but not on and not locked. { From 93a7494e4b32777c38bae863aaa9ac0a39a770eb Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Mon, 7 Apr 2014 20:11:43 +0200 Subject: [PATCH 055/188] Fixed merge conflict --- src/ClientHandle.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 1a1e22a19..4add022a6 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -214,9 +214,6 @@ public: /// Handles the block placing packet when it is a real block placement (not block-using, item-using or eating) void HandlePlaceBlock(int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, cItemHandler & a_ItemHandler); - - ///Handle item enchanting - void HandleEnchantItem(Byte & WindowID, Byte & Enchantment); private: From 296d0acbffc053b4edc4c4b02503603081180ecf Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Mon, 7 Apr 2014 20:13:45 +0200 Subject: [PATCH 056/188] Added deleted things for merging --- src/ClientHandle.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 0c367ec7d..01765cc85 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -230,6 +230,9 @@ public: /** Called when the player moves into a different world; queues sreaming the new chunks */ void MoveToWorld(cWorld & a_World, bool a_SendRespawnPacket); + ///Handle item enchanting + void HandleEnchantItem(Byte & WindowID, Byte & Enchantment); + private: /** Handles the block placing packet when it is a real block placement (not block-using, item-using or eating) */ From 1dfd2b1c5fe125757aeb084c163aec5b25a55fc2 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Mon, 7 Apr 2014 20:25:30 +0200 Subject: [PATCH 057/188] Fixed Errors --- src/Blocks/BlockEnchantmentTable.h | 2 +- src/Protocol/Protocol125.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Blocks/BlockEnchantmentTable.h b/src/Blocks/BlockEnchantmentTable.h index e8a87179b..81d2cb9a0 100644 --- a/src/Blocks/BlockEnchantmentTable.h +++ b/src/Blocks/BlockEnchantmentTable.h @@ -19,7 +19,7 @@ public: } - virtual void OnUse(cWorld * a_World, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) override + virtual void OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) override { cWindow * Window = new cEnchantingWindow(a_BlockX, a_BlockY, a_BlockZ); a_Player->OpenWindow(Window); diff --git a/src/Protocol/Protocol125.cpp b/src/Protocol/Protocol125.cpp index 867cf3ef3..26f109918 100644 --- a/src/Protocol/Protocol125.cpp +++ b/src/Protocol/Protocol125.cpp @@ -1601,8 +1601,8 @@ int cProtocol125::ParseUseEntity(void) int cProtocol125::ParseEnchantItem(void) { - HANDLE_PACKET_READ(ReadByte, byte, WindowID); - HANDLE_PACKET_READ(ReadByte, byte, Enchantment); + HANDLE_PACKET_READ(ReadByte, Byte, WindowID); + HANDLE_PACKET_READ(ReadByte, Byte, Enchantment); LOGWARN("Older Protocol: Enchantment Packet received!"); From 427924fbb0dd4d6bae909095d0c3ae7dac0da36b Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Mon, 7 Apr 2014 20:41:47 +0200 Subject: [PATCH 058/188] Modified comment --- src/FastRandom.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FastRandom.h b/src/FastRandom.h index 1c20fa39f..567198a31 100644 --- a/src/FastRandom.h +++ b/src/FastRandom.h @@ -44,7 +44,7 @@ public: /// Returns a random float in the range [0 .. a_Range]; a_Range must be less than 1M; a_Salt is additional source of randomness float NextFloat(float a_Range, int a_Salt); - /// Returns a random int in the range [a_Begin .. a_End] + /** Returns a random int in the range [a_Begin .. a_End] */ int GenerateRandomInteger(int a_Begin, int a_End); protected: From 4d32f41b8b01b6c1e74689a3fd73aa3b29b3c940 Mon Sep 17 00:00:00 2001 From: Alexander Harkness Date: Tue, 8 Apr 2014 14:48:24 +0100 Subject: [PATCH 059/188] Fixed the thing properly. --- .../IncrementalRedstoneSimulator.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index fc239169c..9903fc7d3 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -1211,24 +1211,24 @@ bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, { // If the repeater is facing one direction, do one thing. - case 0x0: + case 0x0: case 0x2: { if (m_World.GetBlock(a_BlockX + 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) // Is right neighbor a - { + { NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX + 1, a_BlockY, a_BlockZ) & 0x3; - if (otherRepeaterDir == 0x1) { return true; } - } - - if (m_World.GetBlock(a_BlockX - 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) - { - NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX -1, a_BlockY, a_BlockZ) & 0x3; if (otherRepeaterDir == 0x3) { return true; } } - + + if (m_World.GetBlock(a_BlockX - 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) + { + NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX -1, a_BlockY, a_BlockZ) & 0x3; + if (otherRepeaterDir == 0x1) { return true; } + } + break; } - + // If another, do the other. case 0x1: case 0x3: From 506f5def049f59059a503d99b59c69b9b2a81b2b Mon Sep 17 00:00:00 2001 From: wiseoldman95 Date: Tue, 8 Apr 2014 17:14:23 +0300 Subject: [PATCH 060/188] Added comments regarding latching and orientation No real code was changed. --- .../IncrementalRedstoneSimulator.cpp | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index 9903fc7d3..26c8355dd 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -12,7 +12,25 @@ - + // Orientation mini guide: + /* + ^ + | + | Z Axis + + X Axis ----> + + Block Direction, and value of _World.GetBlockMeta(a_BlockX , a_BlockY, a_BlockZ): + + Right (X+): 0x1 + Left (X-): 0x3 + Up (z+): 0x2 + Down (z-): 0x0 + + //TODO: Define those in preprocessor and replace them everywhere in the entire project. + Sun rises from right (X+) + */ + cIncrementalRedstoneSimulator::cIncrementalRedstoneSimulator(cWorld & a_World) : super(a_World) @@ -1206,50 +1224,54 @@ bool cIncrementalRedstoneSimulator::IsRepeaterPowered(int a_BlockX, int a_BlockY bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta) { - // Change checking direction according to meta rotation. + switch (a_Meta & 0x3) //compare my direction to my neighbor's { - // If the repeater is facing one direction, do one thing. + // If the repeater is looking up or down (If parallel to the Z axis) case 0x0: case 0x2: { + //Check if right neighbor is a powered on repeater who is facing us. if (m_World.GetBlock(a_BlockX + 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) // Is right neighbor a { NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX + 1, a_BlockY, a_BlockZ) & 0x3; - if (otherRepeaterDir == 0x3) { return true; } + if (otherRepeaterDir == 0x3) { return true; } //If so, I am latched/locked. } + //Check if left neighbor is a powered on repeater who is facing us. if (m_World.GetBlock(a_BlockX - 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) { NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX -1, a_BlockY, a_BlockZ) & 0x3; - if (otherRepeaterDir == 0x1) { return true; } + if (otherRepeaterDir == 0x1) { return true; } //If so, I am latched/locked. } break; } - // If another, do the other. + // If the repeater is looking left or right (If parallel to the x axis) case 0x1: case 0x3: { + //Check if upper neighbor is a powered on repeater who is facing us. if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ + 1) == E_BLOCK_REDSTONE_REPEATER_ON) { NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ + 1) & 0x3; - if (otherRepeaterDir == 0x0) { return true; } + if (otherRepeaterDir == 0x0) { return true; } //If so, am latched/locked. } + //Check if bottom neighbor is a powered on repeater who is facing us. if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ -1) == E_BLOCK_REDSTONE_REPEATER_ON) { NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ - 1) & 0x3; - if (otherRepeaterDir == 0x2) { return true; } + if (otherRepeaterDir == 0x2) { return true; } //If so, I am latched/locked. } break; } } - return false; + return false; //None of the checks succeeded, I am not a locked repeater. } From fb90afd651a1bf3c3f7fc2599b951365570498c7 Mon Sep 17 00:00:00 2001 From: wiseoldman95 Date: Tue, 8 Apr 2014 17:55:03 +0300 Subject: [PATCH 061/188] Comments: Inverted Z axis. -Comments fix, No code has been changed. -Inverted the Z axis in the comments and changed all dependent comments accordingly. -Added NORTH/SOUTH/EAST/WEST in addition to LEFT/RIGHT/UP/DOWN. --- .../IncrementalRedstoneSimulator.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index 26c8355dd..478bbed7e 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -14,18 +14,19 @@ // Orientation mini guide: /* - ^ + | | Z Axis + V X Axis ----> Block Direction, and value of _World.GetBlockMeta(a_BlockX , a_BlockY, a_BlockZ): - Right (X+): 0x1 - Left (X-): 0x3 - Up (z+): 0x2 - Down (z-): 0x0 + East (Right) (X+): 0x1 + West (Left) (X-): 0x3 + North (Up) (z-): 0x2 + South (Down) (z+): 0x0 //TODO: Define those in preprocessor and replace them everywhere in the entire project. Sun rises from right (X+) @@ -1232,14 +1233,14 @@ bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, case 0x0: case 0x2: { - //Check if right neighbor is a powered on repeater who is facing us. + //Check if eastern(right) neighbor is a powered on repeater who is facing us. if (m_World.GetBlock(a_BlockX + 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) // Is right neighbor a { NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX + 1, a_BlockY, a_BlockZ) & 0x3; if (otherRepeaterDir == 0x3) { return true; } //If so, I am latched/locked. } - //Check if left neighbor is a powered on repeater who is facing us. + //Check if western(left) neighbor is a powered on repeater who is facing us. if (m_World.GetBlock(a_BlockX - 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) { NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX -1, a_BlockY, a_BlockZ) & 0x3; @@ -1253,14 +1254,14 @@ bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, case 0x1: case 0x3: { - //Check if upper neighbor is a powered on repeater who is facing us. + //Check if southern(down) neighbor is a powered on repeater who is facing us. if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ + 1) == E_BLOCK_REDSTONE_REPEATER_ON) { NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ + 1) & 0x3; if (otherRepeaterDir == 0x0) { return true; } //If so, am latched/locked. } - //Check if bottom neighbor is a powered on repeater who is facing us. + //Check if northern(up) neighbor is a powered on repeater who is facing us. if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ -1) == E_BLOCK_REDSTONE_REPEATER_ON) { NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ - 1) & 0x3; From 6a0c122dfb25958eb961d6b421355e599b517a4b Mon Sep 17 00:00:00 2001 From: wiseoldman95 Date: Tue, 8 Apr 2014 17:59:42 +0300 Subject: [PATCH 062/188] Uppercased Z Minor, no code changed. --- src/Simulator/IncrementalRedstoneSimulator.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index 478bbed7e..f3482dcc5 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -25,11 +25,11 @@ East (Right) (X+): 0x1 West (Left) (X-): 0x3 - North (Up) (z-): 0x2 - South (Down) (z+): 0x0 + North (Up) (Z-): 0x2 + South (Down) (Z+): 0x0 //TODO: Define those in preprocessor and replace them everywhere in the entire project. - Sun rises from right (X+) + Sun rises from East (X+) */ From 10e72a122c0588769e09aed216b85732afe67bca Mon Sep 17 00:00:00 2001 From: Tycho Date: Tue, 8 Apr 2014 08:43:28 -0700 Subject: [PATCH 063/188] Removed check for enqueuing a chunk that is already enqueued to be loaded This remaval is safe as cWorldStorage checks for duplicate chunks when dequeuing and removes an expensive iteration whilst holding the queue lock --- src/WorldStorage/WorldStorage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WorldStorage/WorldStorage.cpp b/src/WorldStorage/WorldStorage.cpp index 711c8612f..54eaaca5c 100644 --- a/src/WorldStorage/WorldStorage.cpp +++ b/src/WorldStorage/WorldStorage.cpp @@ -150,7 +150,7 @@ size_t cWorldStorage::GetSaveQueueLength(void) void cWorldStorage::QueueLoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ, bool a_Generate) { - m_LoadQueue.EnqueueItemIfNotPresent(sChunkLoad(a_ChunkX, a_ChunkY, a_ChunkZ, a_Generate)); + m_LoadQueue.EnqueueItem(sChunkLoad(a_ChunkX, a_ChunkY, a_ChunkZ, a_Generate)); m_Event.Set(); } From 18793ca568ed1d26d56ba2afc26ae7b8316159f7 Mon Sep 17 00:00:00 2001 From: Tycho Date: Tue, 8 Apr 2014 08:57:35 -0700 Subject: [PATCH 064/188] Fixed missing - that caused all neighbour lookups to go to the chunkmap --- src/Chunk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Chunk.cpp b/src/Chunk.cpp index 22b33c595..fe9cd9b31 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -2511,7 +2511,7 @@ cChunk * cChunk::GetNeighborChunk(int a_BlockX, int a_BlockZ) cChunk * cChunk::GetRelNeighborChunk(int a_RelX, int a_RelZ) { // If the relative coords are too far away, use the parent's chunk lookup instead: - if ((a_RelX < 128) || (a_RelX > 128) || (a_RelZ < -128) || (a_RelZ > 128)) + if ((a_RelX < -128) || (a_RelX > 128) || (a_RelZ < -128) || (a_RelZ > 128)) { int BlockX = m_PosX * cChunkDef::Width + a_RelX; int BlockZ = m_PosZ * cChunkDef::Width + a_RelZ; From c3fcc5b132556a798c945d751900d9ae21c69b07 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Tue, 8 Apr 2014 18:49:53 +0100 Subject: [PATCH 065/188] cRedstoneSimulator.cpp style improvements --- .../IncrementalRedstoneSimulator.cpp | 81 ++++++++++--------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index f3482dcc5..50cac8d7e 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -1,3 +1,4 @@ + #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "IncrementalRedstoneSimulator.h" @@ -12,25 +13,6 @@ - // Orientation mini guide: - /* - - | - | Z Axis - V - - X Axis ----> - - Block Direction, and value of _World.GetBlockMeta(a_BlockX , a_BlockY, a_BlockZ): - - East (Right) (X+): 0x1 - West (Left) (X-): 0x3 - North (Up) (Z-): 0x2 - South (Down) (Z+): 0x0 - - //TODO: Define those in preprocessor and replace them everywhere in the entire project. - Sun rises from East (X+) - */ cIncrementalRedstoneSimulator::cIncrementalRedstoneSimulator(cWorld & a_World) @@ -682,12 +664,33 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block void cIncrementalRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_MyState) { + /* Repeater Orientation Mini Guide: + =================================== + + | + | Z Axis + V + + X Axis ----> + + Repeater directions, values from a cWorld::GetBlockMeta(a_BlockX , a_BlockY, a_BlockZ) lookup: + + East (Right) (X+): 0x1 + West (Left) (X-): 0x3 + North (Up) (Z-): 0x2 + South (Down) (Z+): 0x0 + // TODO: Add E_META_XXX enum entries for all meta values and update project with them + + Sun rises from East (X+) + + */ + // Create a variable holding my meta to avoid multiple lookups. NIBBLETYPE a_Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); - bool IsOn = (a_MyState == E_BLOCK_REDSTONE_REPEATER_ON); + bool IsOn = (a_MyState == E_BLOCK_REDSTONE_REPEATER_ON); - if (!IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta)) // If we're locked, change nothing. Otherwise: - { + if (!IsRepeaterLocked(a_BlockX, a_BlockY, a_BlockZ, a_Meta)) // If we're locked, change nothing. Otherwise: + { bool IsSelfPowered = IsRepeaterPowered(a_BlockX, a_BlockY, a_BlockZ, a_Meta); if (IsSelfPowered && !IsOn) // Queue a power change if powered, but not on and not locked. { @@ -1224,27 +1227,25 @@ bool cIncrementalRedstoneSimulator::IsRepeaterPowered(int a_BlockX, int a_BlockY bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta) -{ - - switch (a_Meta & 0x3) //compare my direction to my neighbor's +{ + switch (a_Meta & 0x3) // We only want the 'direction' part of our metadata { - // If the repeater is looking up or down (If parallel to the Z axis) case 0x0: case 0x2: { - //Check if eastern(right) neighbor is a powered on repeater who is facing us. - if (m_World.GetBlock(a_BlockX + 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) // Is right neighbor a + // Check if eastern(right) neighbor is a powered on repeater who is facing us. + if (m_World.GetBlock(a_BlockX + 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) // Is right neighbor a powered repeater? { - NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX + 1, a_BlockY, a_BlockZ) & 0x3; - if (otherRepeaterDir == 0x3) { return true; } //If so, I am latched/locked. + NIBBLETYPE OtherRepeaterDir = m_World.GetBlockMeta(a_BlockX + 1, a_BlockY, a_BlockZ) & 0x3; + if (OtherRepeaterDir == 0x3) { return true; } // If so, I am latched/locked. } - //Check if western(left) neighbor is a powered on repeater who is facing us. + // Check if western(left) neighbor is a powered on repeater who is facing us. if (m_World.GetBlock(a_BlockX - 1, a_BlockY, a_BlockZ) == E_BLOCK_REDSTONE_REPEATER_ON) { - NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX -1, a_BlockY, a_BlockZ) & 0x3; - if (otherRepeaterDir == 0x1) { return true; } //If so, I am latched/locked. + NIBBLETYPE OtherRepeaterDir = m_World.GetBlockMeta(a_BlockX -1, a_BlockY, a_BlockZ) & 0x3; + if (OtherRepeaterDir == 0x1) { return true; } // If so, I am latched/locked. } break; @@ -1254,25 +1255,25 @@ bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_BlockX, int a_BlockY, case 0x1: case 0x3: { - //Check if southern(down) neighbor is a powered on repeater who is facing us. + // Check if southern(down) neighbor is a powered on repeater who is facing us. if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ + 1) == E_BLOCK_REDSTONE_REPEATER_ON) { - NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ + 1) & 0x3; - if (otherRepeaterDir == 0x0) { return true; } //If so, am latched/locked. + NIBBLETYPE OtherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ + 1) & 0x3; + if (OtherRepeaterDir == 0x0) { return true; } // If so, am latched/locked. } - //Check if northern(up) neighbor is a powered on repeater who is facing us. + // Check if northern(up) neighbor is a powered on repeater who is facing us. if (m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ -1) == E_BLOCK_REDSTONE_REPEATER_ON) { - NIBBLETYPE otherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ - 1) & 0x3; - if (otherRepeaterDir == 0x2) { return true; } //If so, I am latched/locked. + NIBBLETYPE OtherRepeaterDir = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ - 1) & 0x3; + if (OtherRepeaterDir == 0x2) { return true; } // If so, I am latched/locked. } break; } } - return false; //None of the checks succeeded, I am not a locked repeater. + return false; // None of the checks succeeded, I am not a locked repeater. } From 2d02ff1df8204a74c477a27b3d30f297fde2e5bf Mon Sep 17 00:00:00 2001 From: Alexander Harkness Date: Thu, 10 Apr 2014 15:50:43 +0100 Subject: [PATCH 066/188] Update Monster.cpp --- src/Mobs/Monster.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index aa6071515..22ee6e0dd 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -1,4 +1,3 @@ - #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "IncludeAllMonsters.h" @@ -526,7 +525,10 @@ void cMonster::KilledBy(cEntity * a_Killer) break; } } - m_World->SpawnExperienceOrb(GetPosX(), GetPosY(), GetPosZ(), Reward); + if (a_Killer != NULL) + { + m_World->SpawnExperienceOrb(GetPosX(), GetPosY(), GetPosZ(), Reward); + } m_DestroyTimer = 0; } From 9ad87f670b66abd0d3cc02bec446bb93ef2b578c Mon Sep 17 00:00:00 2001 From: Alexander Harkness Date: Thu, 10 Apr 2014 15:52:00 +0100 Subject: [PATCH 067/188] Fixed GitHuB WebEdit fail. --- src/Mobs/Monster.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index 22ee6e0dd..171097aba 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -1,3 +1,4 @@ + #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "IncludeAllMonsters.h" From 8c7d0f53041af5b5e5b4e42902e6ac49abbd5bd7 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Mon, 7 Apr 2014 15:47:42 +0200 Subject: [PATCH 068/188] InfoReg uses cCompositeChat for subcommand lists. Also fixed an issue with console commands. --- MCServer/Plugins/InfoReg.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/MCServer/Plugins/InfoReg.lua b/MCServer/Plugins/InfoReg.lua index 27e63aa5b..da5a9972c 100644 --- a/MCServer/Plugins/InfoReg.lua +++ b/MCServer/Plugins/InfoReg.lua @@ -16,22 +16,22 @@ local function ListSubcommands(a_Player, a_Subcommands, a_CmdString) end -- Enum all the subcommands: - local Verbs = {}; + local Verbs = {} for cmd, info in pairs(a_Subcommands) do - if (a_Player:HasPermission(info.Permission or "")) then - table.insert(Verbs, " " .. a_CmdString .. " " .. cmd); + if ((a_Player == nil) or (a_Player:HasPermission(info.Permission or ""))) then + table.insert(Verbs, a_CmdString .. " " .. cmd) end end - table.sort(Verbs); + table.sort(Verbs) -- Send the list: if (a_Player == nil) then for idx, verb in ipairs(Verbs) do - LOGINFO(verb); + LOGINFO(" " .. verb) end else for idx, verb in ipairs(Verbs) do - a_Player:SendMessage(verb); + a_Player:SendMessage(cCompositeChat(" ", mtInfo):AddSuggestCommandPart(verb, verb)) end end end From 22d56d1a3f4849ec62a99933b2f2e15182e73c46 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Thu, 10 Apr 2014 19:09:21 +0200 Subject: [PATCH 069/188] Fixed enchantment parsing. Fixes #880. Enchantment parsing now reports in detail which value failed to parse --- src/Enchantments.cpp | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/Enchantments.cpp b/src/Enchantments.cpp index 1d8188e96..9d4e23e0a 100644 --- a/src/Enchantments.cpp +++ b/src/Enchantments.cpp @@ -49,21 +49,17 @@ void cEnchantments::AddFromString(const AString & a_StringSpec) LOG("%s: Malformed enchantment decl: \"%s\", skipping.", __FUNCTION__, itr->c_str()); continue; } - int id = atoi(Split[0].c_str()); - if ((id == 0) && (Split[0] != "0")) + int id = StringToEnchantmentID(Split[0]); + if (id < 0) { - id = StringToEnchantmentID(Split[0]); + LOG("%s: Failed to parse enchantment \"%s\", skipping.", __FUNCTION__, Split[0].c_str()); + continue; } int lvl = atoi(Split[1].c_str()); - if ( - ((id <= 0) && (Split[0] != "0")) || - ((lvl == 0) && (Split[1] != "0")) - ) + if ((lvl == 0) && (Split[1] != "0")) { - // Numbers failed to parse - LOG("%s: Failed to parse enchantment declaration for numbers: \"%s\" and \"%s\", skipping.", - __FUNCTION__, Split[0].c_str(), Split[1].c_str() - ); + // Level failed to parse + LOG("%s: Failed to parse enchantment level \"%s\", skipping.", __FUNCTION__, Split[1].c_str()); continue; } SetLevel(id, lvl); @@ -150,7 +146,7 @@ bool cEnchantments::IsEmpty(void) const int cEnchantments::StringToEnchantmentID(const AString & a_EnchantmentName) { - struct + static const struct { int m_Value; const char * m_Name; @@ -181,6 +177,15 @@ int cEnchantments::StringToEnchantmentID(const AString & a_EnchantmentName) { enchLuckOfTheSea, "LuckOfTheSea"}, { enchLure, "Lure"}, } ; + + // First try to parse as a number: + int id = atoi(a_EnchantmentName.c_str()); + if ((id != 0) || (a_EnchantmentName == "0")) + { + return id; + } + + // It wasn't a number, do a lookup: for (size_t i = 0; i < ARRAYCOUNT(EnchantmentNames); i++) { if (NoCaseCompare(EnchantmentNames[i].m_Name, a_EnchantmentName) == 0) From f44a291da8a735d00e311ae561dd2b1ba366e5ee Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 11 Apr 2014 13:09:19 +0200 Subject: [PATCH 070/188] Fixed issues with 64-bit MSVC compilation. --- src/OSSupport/IsThread.cpp | 31 +++++++++++++++++++------------ src/OSSupport/IsThread.h | 2 +- src/OSSupport/Thread.cpp | 23 +++++++++++++++-------- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/OSSupport/IsThread.cpp b/src/OSSupport/IsThread.cpp index 36205bcf1..04fc818e4 100644 --- a/src/OSSupport/IsThread.cpp +++ b/src/OSSupport/IsThread.cpp @@ -18,26 +18,33 @@ // Usage: SetThreadName (-1, "MainThread"); // -static void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName) +// Code adapted from MSDN: http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx + +const DWORD MS_VC_EXCEPTION = 0x406D1388; + +#pragma pack(push, 8) +typedef struct tagTHREADNAME_INFO { - struct - { - DWORD dwType; // must be 0x1000 - LPCSTR szName; // pointer to name (in user addr space) - DWORD dwThreadID; // thread ID (-1=caller thread) - DWORD dwFlags; // reserved for future use, must be zero - } info; - + DWORD dwType; // Must be 0x1000. + LPCSTR szName; // Pointer to name (in user addr space). + DWORD dwThreadID; // Thread ID (-1 = caller thread). + DWORD dwFlags; // Reserved for future use, must be zero. +} THREADNAME_INFO; +#pragma pack(pop) + +static void SetThreadName(DWORD dwThreadID, const char * threadName) +{ + THREADNAME_INFO info; info.dwType = 0x1000; - info.szName = szThreadName; + info.szName = threadName; info.dwThreadID = dwThreadID; info.dwFlags = 0; __try { - RaiseException(0x406D1388, 0, sizeof(info) / sizeof(DWORD), (DWORD *)&info); + RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info); } - __except(EXCEPTION_CONTINUE_EXECUTION) + __except (EXCEPTION_EXECUTE_HANDLER) { } } diff --git a/src/OSSupport/IsThread.h b/src/OSSupport/IsThread.h index 42b8bfdda..57651a490 100644 --- a/src/OSSupport/IsThread.h +++ b/src/OSSupport/IsThread.h @@ -62,7 +62,7 @@ protected: HANDLE m_Handle; - static DWORD_PTR __stdcall thrExecute(LPVOID a_Param) + static DWORD __stdcall thrExecute(LPVOID a_Param) { // Create a window so that the thread can be identified by 3rd party tools: HWND IdentificationWnd = CreateWindow("STATIC", ((cIsThread *)a_Param)->m_ThreadName.c_str(), 0, 0, 0, 0, WS_OVERLAPPED, NULL, NULL, NULL, NULL); diff --git a/src/OSSupport/Thread.cpp b/src/OSSupport/Thread.cpp index 3df75f0e7..7a10ef8d2 100644 --- a/src/OSSupport/Thread.cpp +++ b/src/OSSupport/Thread.cpp @@ -10,27 +10,34 @@ // // Usage: SetThreadName (-1, "MainThread"); // + +// Code adapted from MSDN: http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx + +const DWORD MS_VC_EXCEPTION = 0x406D1388; + +#pragma pack(push, 8) typedef struct tagTHREADNAME_INFO { - DWORD dwType; // must be 0x1000 - LPCSTR szName; // pointer to name (in user addr space) - DWORD dwThreadID; // thread ID (-1=caller thread) - DWORD dwFlags; // reserved for future use, must be zero + DWORD dwType; // Must be 0x1000. + LPCSTR szName; // Pointer to name (in user addr space). + DWORD dwThreadID; // Thread ID (-1 = caller thread). + DWORD dwFlags; // Reserved for future use, must be zero. } THREADNAME_INFO; +#pragma pack(pop) -void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName) +static void SetThreadName(DWORD dwThreadID, const char * threadName) { THREADNAME_INFO info; info.dwType = 0x1000; - info.szName = szThreadName; + info.szName = threadName; info.dwThreadID = dwThreadID; info.dwFlags = 0; __try { - RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info ); + RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info); } - __except(EXCEPTION_CONTINUE_EXECUTION) + __except (EXCEPTION_EXECUTE_HANDLER) { } } From 875c2557c30aa5254c2ec3f4062ec463418c7d09 Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 12 Apr 2014 00:01:15 +0200 Subject: [PATCH 071/188] Implemented the skeleton code for the beacon. There is no handling for the GUI. It can now check how big the pyramid is under the beacon. --- src/BlockEntities/BeaconEntity.cpp | 111 +++++++++++++++++++++++++++++ src/BlockEntities/BeaconEntity.h | 40 +++++++++++ src/BlockEntities/BlockEntity.cpp | 2 + src/Chunk.cpp | 2 + 4 files changed, 155 insertions(+) create mode 100644 src/BlockEntities/BeaconEntity.cpp create mode 100644 src/BlockEntities/BeaconEntity.h diff --git a/src/BlockEntities/BeaconEntity.cpp b/src/BlockEntities/BeaconEntity.cpp new file mode 100644 index 000000000..e5e890dbc --- /dev/null +++ b/src/BlockEntities/BeaconEntity.cpp @@ -0,0 +1,111 @@ + +#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules + +#include "BeaconEntity.h" +#include "../BlockArea.h" + + + + + +cBeaconEntity::cBeaconEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World) : + super(E_BLOCK_BEACON, a_BlockX, a_BlockY, a_BlockZ, a_World) +{ +} + + + + + +int cBeaconEntity::GetPyramidLevel() +{ + cBlockArea Area; + Area.Read( + m_World, + GetPosX() - 4, + GetPosX() + 4, + GetPosY() - 5, + GetPosY() - 1, + GetPosZ() - 4, + GetPosZ() + 4 + ); + + int Layer = 1; + int MiddleXZ = 4; + + for (int Y = Area.GetSizeY() - 1; Y > 0; Y--) + { + bool FullLayer = true; + for (int X = MiddleXZ - Layer; X <= (MiddleXZ + Layer); X++) + { + for (int Z = MiddleXZ - Layer; Z <= (MiddleXZ + Layer); Z++) + { + if (!IsMineralBlock(Area.GetRelBlockType(X, Y, Z))) + { + FullLayer = false; + } + } + } + if (!FullLayer) + { + break; + } + else + { + Layer++; + } + } + + return Layer; +} + + + + + +bool cBeaconEntity::IsMineralBlock(BLOCKTYPE a_BlockType) +{ + switch(a_BlockType) + { + case E_BLOCK_DIAMOND_BLOCK: + case E_BLOCK_GOLD_BLOCK: + case E_BLOCK_IRON_BLOCK: + case E_BLOCK_EMERALD_BLOCK: + { + return true; + } + } + return false; +} + + + + + +bool cBeaconEntity::Tick(float a_Dt, cChunk & a_Chunk) +{ + return false; +} + + + + + +void cBeaconEntity::SaveToJson(Json::Value& a_Value) +{ +} + + + + +void cBeaconEntity::SendTo(cClientHandle & a_Client) +{ +} + + + + + +void cBeaconEntity::UsedBy(cPlayer * a_Player) +{ +} \ No newline at end of file diff --git a/src/BlockEntities/BeaconEntity.h b/src/BlockEntities/BeaconEntity.h new file mode 100644 index 000000000..1dfd745b2 --- /dev/null +++ b/src/BlockEntities/BeaconEntity.h @@ -0,0 +1,40 @@ + +#pragma once + +#include "BlockEntity.h" + + + + + +namespace Json +{ + class Value; +} + + + + + +class cBeaconEntity : + public cBlockEntity +{ + typedef cBlockEntity super; + +public: + + // The initial constructor + cBeaconEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World); + + // Returns the amount of layers the pyramid below the beacon has. + int GetPyramidLevel(void); + + // Returns true if the block is a diamond block, an golden block, an iron block or an emerald block. + bool IsMineralBlock(BLOCKTYPE a_BlockType); + + // cBlockEntity overrides: + virtual void SaveToJson(Json::Value& a_Value ) override; + virtual void SendTo(cClientHandle & a_Client) override; + virtual void UsedBy(cPlayer * a_Player) override; + virtual bool Tick(float a_Dt, cChunk & /* a_Chunk */) override; +} ; \ No newline at end of file diff --git a/src/BlockEntities/BlockEntity.cpp b/src/BlockEntities/BlockEntity.cpp index b42318c2f..430f04551 100644 --- a/src/BlockEntities/BlockEntity.cpp +++ b/src/BlockEntities/BlockEntity.cpp @@ -4,6 +4,7 @@ // Implements the cBlockEntity class that is the common ancestor for all block entities #include "Globals.h" +#include "BeaconEntity.h" #include "BlockEntity.h" #include "ChestEntity.h" #include "CommandBlockEntity.h" @@ -26,6 +27,7 @@ cBlockEntity * cBlockEntity::CreateByBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE { switch (a_BlockType) { + case E_BLOCK_BEACON: return new cBeaconEntity (a_BlockX, a_BlockY, a_BlockZ, a_World); case E_BLOCK_CHEST: return new cChestEntity (a_BlockX, a_BlockY, a_BlockZ, a_World); case E_BLOCK_COMMAND_BLOCK: return new cCommandBlockEntity(a_BlockX, a_BlockY, a_BlockZ, a_World); case E_BLOCK_DISPENSER: return new cDispenserEntity (a_BlockX, a_BlockY, a_BlockZ, a_World); diff --git a/src/Chunk.cpp b/src/Chunk.cpp index fe9cd9b31..4366111ef 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -1299,6 +1299,7 @@ void cChunk::CreateBlockEntities(void) BLOCKTYPE BlockType = cChunkDef::GetBlock(m_BlockTypes, x, y, z); switch (BlockType) { + case E_BLOCK_BEACON: case E_BLOCK_CHEST: case E_BLOCK_COMMAND_BLOCK: case E_BLOCK_DISPENSER: @@ -1429,6 +1430,7 @@ void cChunk::SetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, // If the new block is a block entity, create the entity object: switch (a_BlockType) { + case E_BLOCK_BEACON: case E_BLOCK_CHEST: case E_BLOCK_COMMAND_BLOCK: case E_BLOCK_DISPENSER: From e19556ebf6a3a452a31b4e327f6018637418100a Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 12 Apr 2014 00:13:16 +0200 Subject: [PATCH 072/188] Simplefied GetPyramidLevel --- src/BlockEntities/BeaconEntity.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/BlockEntities/BeaconEntity.cpp b/src/BlockEntities/BeaconEntity.cpp index e5e890dbc..b5a503192 100644 --- a/src/BlockEntities/BeaconEntity.cpp +++ b/src/BlockEntities/BeaconEntity.cpp @@ -35,25 +35,17 @@ int cBeaconEntity::GetPyramidLevel() for (int Y = Area.GetSizeY() - 1; Y > 0; Y--) { - bool FullLayer = true; for (int X = MiddleXZ - Layer; X <= (MiddleXZ + Layer); X++) { for (int Z = MiddleXZ - Layer; Z <= (MiddleXZ + Layer); Z++) { if (!IsMineralBlock(Area.GetRelBlockType(X, Y, Z))) { - FullLayer = false; + return Layer; } } } - if (!FullLayer) - { - break; - } - else - { - Layer++; - } + Layer++; } return Layer; @@ -84,6 +76,7 @@ bool cBeaconEntity::IsMineralBlock(BLOCKTYPE a_BlockType) bool cBeaconEntity::Tick(float a_Dt, cChunk & a_Chunk) { + std::cout << GetPyramidLevel() << "\n"; return false; } From eb4dd23775fa6de25d14bd485dcb96451a2b2989 Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 12 Apr 2014 00:21:37 +0200 Subject: [PATCH 073/188] Removed debug message. --- src/BlockEntities/BeaconEntity.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/BlockEntities/BeaconEntity.cpp b/src/BlockEntities/BeaconEntity.cpp index b5a503192..65fda827c 100644 --- a/src/BlockEntities/BeaconEntity.cpp +++ b/src/BlockEntities/BeaconEntity.cpp @@ -76,7 +76,6 @@ bool cBeaconEntity::IsMineralBlock(BLOCKTYPE a_BlockType) bool cBeaconEntity::Tick(float a_Dt, cChunk & a_Chunk) { - std::cout << GetPyramidLevel() << "\n"; return false; } From 433bd530f38b78bb7e276acafef40fec47d43267 Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 12 Apr 2014 00:35:13 +0200 Subject: [PATCH 074/188] Some tweaks GetPyramidLevel returns 0 when no layers were found, 1 for one layer etc. Auto adjust the minY and/or maxY to 0 if the beacon is low. --- src/BlockEntities/BeaconEntity.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/BlockEntities/BeaconEntity.cpp b/src/BlockEntities/BeaconEntity.cpp index 65fda827c..dd340f24f 100644 --- a/src/BlockEntities/BeaconEntity.cpp +++ b/src/BlockEntities/BeaconEntity.cpp @@ -20,14 +20,26 @@ cBeaconEntity::cBeaconEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * int cBeaconEntity::GetPyramidLevel() { cBlockArea Area; + int MinY = GetPosY() - 4; + if (MinY < 0) + { + MinY = 0; + } + int MaxY = GetPosY() - 1; + if (MaxY < 0) + { + MaxY = 0; + } + Area.Read( m_World, GetPosX() - 4, GetPosX() + 4, - GetPosY() - 5, - GetPosY() - 1, + MinY, + MaxY, GetPosZ() - 4, - GetPosZ() + 4 + GetPosZ() + 4, + cBlockArea::baTypes ); int Layer = 1; @@ -41,14 +53,14 @@ int cBeaconEntity::GetPyramidLevel() { if (!IsMineralBlock(Area.GetRelBlockType(X, Y, Z))) { - return Layer; + return Layer - 1; } } } Layer++; } - return Layer; + return Layer - 1; } From b3f6afefe9a70741734944027573de5834939349 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Sat, 12 Apr 2014 13:14:35 +0100 Subject: [PATCH 075/188] Simplified pickup speed randomisation --- src/World.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/World.cpp b/src/World.cpp index c188fd522..1ba849806 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -1632,7 +1632,6 @@ bool cWorld::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlock void cWorld::SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double a_BlockY, double a_BlockZ, double a_FlyAwaySpeed, bool IsPlayerCreated) { - MTRand r1; a_FlyAwaySpeed /= 100; // Pre-divide, so that we don't have to divide each time inside the loop for (cItems::const_iterator itr = a_Pickups.begin(); itr != a_Pickups.end(); ++itr) { @@ -1642,9 +1641,9 @@ void cWorld::SpawnItemPickups(const cItems & a_Pickups, double a_BlockX, double continue; } - float SpeedX = (float)(a_FlyAwaySpeed * (r1.randInt(10) - 5)); - float SpeedY = (float)(a_FlyAwaySpeed * r1.randInt(50)); - float SpeedZ = (float)(a_FlyAwaySpeed * (r1.randInt(10) - 5)); + float SpeedX = (float)(a_FlyAwaySpeed * (GetTickRandomNumber(10) - 5)); + float SpeedY = (float)(a_FlyAwaySpeed * GetTickRandomNumber(50)); + float SpeedZ = (float)(a_FlyAwaySpeed * (GetTickRandomNumber(10) - 5)); cPickup * Pickup = new cPickup( a_BlockX, a_BlockY, a_BlockZ, From c0c47d33c571bde4cfb45043b645b3d45c3223e6 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Sat, 12 Apr 2014 13:16:48 +0100 Subject: [PATCH 076/188] Entities handle chunks properly again * Entities properly handle chunks * Changed EntityStatus enums to be less shouty --- src/ClientHandle.cpp | 2 +- src/Entities/Entity.cpp | 125 +++++++++++++----------------- src/Entities/Entity.h | 51 ++++++++---- src/Entities/Pickup.cpp | 61 +++++++-------- src/Entities/Pickup.h | 3 - src/Entities/Player.cpp | 2 +- src/Entities/ProjectileEntity.cpp | 2 +- src/Mobs/Sheep.cpp | 2 +- src/Mobs/Villager.cpp | 2 +- src/Mobs/Wolf.cpp | 4 +- 10 files changed, 127 insertions(+), 127 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 5876e55c7..06091cae4 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2101,7 +2101,7 @@ void cClientHandle::SendExplosion(double a_BlockX, double a_BlockY, double a_Blo } // Update the statistics: - m_NumExplosionsThisTick += 1; + m_NumExplosionsThisTick++; m_Protocol->SendExplosion(a_BlockX, a_BlockY, a_BlockZ, a_Radius, a_BlocksAffected, a_PlayerMotion); } diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 8ef45f1a5..aa07527d0 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -330,7 +330,7 @@ void cEntity::DoTakeDamage(TakeDamageInfo & a_TDI) AddSpeed(a_TDI.Knockback * 2); } - m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_HURT); + m_World->BroadcastEntityStatus(*this, esGenericHurt); if (m_Health <= 0) { @@ -479,7 +479,7 @@ void cEntity::KilledBy(cEntity * a_Killer) GetDrops(Drops, a_Killer); m_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ()); - m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_DEAD); + m_World->BroadcastEntityStatus(*this, esGenericDead); } @@ -519,37 +519,36 @@ void cEntity::Tick(float a_Dt, cChunk & a_Chunk) } else { - if (a_Chunk.IsValid()) + if (!a_Chunk.IsValid()) { - cChunk * NextChunk = a_Chunk.GetNeighborChunk(POSX_TOINT, POSZ_TOINT); - - if ((NextChunk == NULL) || !NextChunk->IsValid()) - { - return; - } - - TickBurning(*NextChunk); - - if (GetPosY() < VOID_BOUNDARY) - { - TickInVoid(*NextChunk); - } - else - { - m_TicksSinceLastVoidDamage = 0; - } - - if (IsMob() || IsPlayer()) - { - // Set swimming state - SetSwimState(*NextChunk); - - // Handle drowning - HandleAir(); - } - - HandlePhysics(a_Dt, *NextChunk); + return; } + + // Position changed -> super::Tick() called + GET_AND_VERIFY_CURRENT_CHUNK(NextChunk, POSX_TOINT, POSZ_TOINT) + + TickBurning(*NextChunk); + + if (GetPosY() < VOID_BOUNDARY) + { + TickInVoid(*NextChunk); + } + else + { + m_TicksSinceLastVoidDamage = 0; + } + + if (IsMob() || IsPlayer()) + { + // Set swimming state + SetSwimState(*NextChunk); + + // Handle drowning + HandleAir(); + } + + // None of the above functions change position, we remain in the chunk of NextChunk + HandlePhysics(a_Dt, *NextChunk); } } @@ -559,34 +558,30 @@ void cEntity::Tick(float a_Dt, cChunk & a_Chunk) void cEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk) { + int BlockX = POSX_TOINT; + int BlockY = POSY_TOINT; + int BlockZ = POSZ_TOINT; + + // Position changed -> super::HandlePhysics() called + GET_AND_VERIFY_CURRENT_CHUNK(NextChunk, BlockX, BlockZ) + // TODO Add collision detection with entities. a_Dt /= 1000; // Convert from msec to sec - Vector3d NextPos = Vector3d(GetPosX(),GetPosY(),GetPosZ()); - Vector3d NextSpeed = Vector3d(GetSpeedX(),GetSpeedY(),GetSpeedZ()); - int BlockX = (int) floor(NextPos.x); - int BlockY = (int) floor(NextPos.y); - int BlockZ = (int) floor(NextPos.z); + Vector3d NextPos = Vector3d(GetPosX(), GetPosY(), GetPosZ()); + Vector3d NextSpeed = Vector3d(GetSpeedX(), GetSpeedY(), GetSpeedZ()); if ((BlockY >= cChunkDef::Height) || (BlockY < 0)) { - // Outside of the world - - cChunk * NextChunk = a_Chunk.GetNeighborChunk(BlockX, BlockZ); - // See if we can commit our changes. If not, we will discard them. - if (NextChunk != NULL) - { - SetSpeed(NextSpeed); - NextPos += (NextSpeed * a_Dt); - SetPosition(NextPos); - } - + // Outside of the world + AddSpeedY(m_Gravity * a_Dt); + AddPosition(GetSpeed() * a_Dt); return; } - int RelBlockX = BlockX - (a_Chunk.GetPosX() * cChunkDef::Width); - int RelBlockZ = BlockZ - (a_Chunk.GetPosZ() * cChunkDef::Width); - BLOCKTYPE BlockIn = a_Chunk.GetBlock( RelBlockX, BlockY, RelBlockZ ); - BLOCKTYPE BlockBelow = (BlockY > 0) ? a_Chunk.GetBlock(RelBlockX, BlockY - 1, RelBlockZ) : E_BLOCK_AIR; + int RelBlockX = BlockX - (NextChunk->GetPosX() * cChunkDef::Width); + int RelBlockZ = BlockZ - (NextChunk->GetPosZ() * cChunkDef::Width); + BLOCKTYPE BlockIn = NextChunk->GetBlock( RelBlockX, BlockY, RelBlockZ ); + BLOCKTYPE BlockBelow = (BlockY > 0) ? NextChunk->GetBlock(RelBlockX, BlockY - 1, RelBlockZ) : E_BLOCK_AIR; if (!cBlockInfo::IsSolid(BlockIn)) // Making sure we are not inside a solid block { if (m_bOnGround) // check if it's still on the ground @@ -616,7 +611,7 @@ void cEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk) bool IsNoAirSurrounding = true; for (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++) { - if (!a_Chunk.UnboundedRelGetBlockType(RelBlockX + gCrossCoords[i].x, BlockY, RelBlockZ + gCrossCoords[i].z, GotBlock)) + if (!NextChunk->UnboundedRelGetBlockType(RelBlockX + gCrossCoords[i].x, BlockY, RelBlockZ + gCrossCoords[i].z, GotBlock)) { // The pickup is too close to an unloaded chunk, bail out of any physics handling return; @@ -764,20 +759,8 @@ void cEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk) } } - BlockX = (int) floor(NextPos.x); - BlockZ = (int) floor(NextPos.z); - - cChunk * NextChunk = a_Chunk.GetNeighborChunk(BlockX, BlockZ); - // See if we can commit our changes. If not, we will discard them. - if (NextChunk != NULL) - { - if (NextPos.x != GetPosX()) SetPosX(NextPos.x); - if (NextPos.y != GetPosY()) SetPosY(NextPos.y); - if (NextPos.z != GetPosZ()) SetPosZ(NextPos.z); - if (NextSpeed.x != GetSpeedX()) SetSpeedX(NextSpeed.x); - if (NextSpeed.y != GetSpeedY()) SetSpeedY(NextSpeed.y); - if (NextSpeed.z != GetSpeedZ()) SetSpeedZ(NextSpeed.z); - } + SetPosition(NextPos); + SetSpeed(NextSpeed); } @@ -981,13 +964,13 @@ void cEntity::HandleAir(void) } else { - m_AirTickTimer -= 1; + m_AirTickTimer--; } } else { // Reduce air supply - m_AirLevel -= 1; + m_AirLevel--; } } else @@ -1099,15 +1082,15 @@ void cEntity::TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ) void cEntity::BroadcastMovementUpdate(const cClientHandle * a_Exclude) { - //We need to keep updating the clients when there is movement or if there was a change in speed and after 2 ticks - if( (m_Speed.SqrLength() > 0.0004f || m_bDirtySpeed) && (m_World->GetWorldAge() - m_TimeLastSpeedPacket >= 2)) + // Send velocity packet every two ticks if: speed is not negligible or speed was set (as indicated by the DirtySpeed flag) + if (((m_Speed.SqrLength() > 0.0004f) || m_bDirtySpeed) && ((m_World->GetWorldAge() - m_TimeLastSpeedPacket) >= 2)) { m_World->BroadcastEntityVelocity(*this,a_Exclude); m_bDirtySpeed = false; m_TimeLastSpeedPacket = m_World->GetWorldAge(); } - //Have to process position related packets this every two ticks + // Have to process position related packets this every two ticks if (m_World->GetWorldAge() % 2 == 0) { int DiffX = (int) (floor(GetPosX() * 32.0) - floor(m_LastPosX * 32.0)); diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h index 6e3f8292b..c2137039a 100644 --- a/src/Entities/Entity.h +++ b/src/Entities/Entity.h @@ -32,6 +32,8 @@ #define POSZ_TOINT (int)floor(GetPosZ()) #define POS_TOINT Vector3i(POSXTOINT, POSYTOINT, POSZTOINT) +#define GET_AND_VERIFY_CURRENT_CHUNK(ChunkVarName, X, Z) cChunk * ChunkVarName = a_Chunk.GetNeighborChunk(X, Z); if ((ChunkVarName == NULL) || !ChunkVarName->IsValid()) { return; } + @@ -88,23 +90,42 @@ public: } ; // tolua_end - - enum + + enum eEntityStatus { - ENTITY_STATUS_HURT = 2, - ENTITY_STATUS_DEAD = 3, - ENTITY_STATUS_WOLF_TAMING = 6, - ENTITY_STATUS_WOLF_TAMED = 7, - ENTITY_STATUS_WOLF_SHAKING = 8, - ENTITY_STATUS_EATING_ACCEPTED = 9, - ENTITY_STATUS_SHEEP_EATING = 10, - ENTITY_STATUS_GOLEM_ROSING = 11, - ENTITY_STATUS_VILLAGER_HEARTS = 12, - ENTITY_STATUS_VILLAGER_ANGRY = 13, - ENTITY_STATUS_VILLAGER_HAPPY = 14, - ENTITY_STATUS_WITCH_MAGICKING = 15, + // TODO: Investiagate 0, 1, and 5 as Wiki.vg is not certain + + // Entity becomes coloured red + esGenericHurt = 2, + // Entity plays death animation (entity falls to ground) + esGenericDead = 3, + // Iron Golem plays attack animation (arms lift and fall) + esIronGolemAttacking = 4, + // Wolf taming particles spawn (smoke) + esWolfTaming = 6, + // Wolf tamed particles spawn (hearts) + esWolfTamed = 7, + // Wolf plays water removal animation (shaking and water particles) + esWolfDryingWater = 8, + // Informs client that eating was accepted + esPlayerEatingAccepted = 9, + // Sheep plays eating animation (head lowers to ground) + esSheepEating = 10, + // Iron Golem holds gift to villager children + esIronGolemGivingPlant = 11, + // Villager spawns heart particles + esVillagerBreeding = 12, + // Villager spawns thunderclound particles + esVillagerAngry = 13, + // Villager spawns green crosses + esVillagerHappy = 14, + // Witch spawns magic particle (TODO: investigation into what this is) + esWitchMagicking = 15, + // It seems 16 (zombie conversion) is now done with metadata - ENTITY_STATUS_FIREWORK_EXPLODE= 17, + + // Informs client to explode a firework based on its metadata + esFireworkExploding = 17, } ; enum diff --git a/src/Entities/Pickup.cpp b/src/Entities/Pickup.cpp index 7fc89b62b..497b41683 100644 --- a/src/Entities/Pickup.cpp +++ b/src/Entities/Pickup.cpp @@ -98,45 +98,44 @@ void cPickup::Tick(float a_Dt, cChunk & a_Chunk) if (!m_bCollected) { - int BlockY = (int) floor(GetPosY()); + int BlockY = POSY_TOINT; + int BlockX = POSX_TOINT; + int BlockZ = POSZ_TOINT; + if ((BlockY >= 0) && (BlockY < cChunkDef::Height)) // Don't do anything except for falling when outside the world { - int BlockX = (int) floor(GetPosX()); - int BlockZ = (int) floor(GetPosZ()); // Position might have changed due to physics. So we have to make sure we have the correct chunk. - cChunk * CurrentChunk = a_Chunk.GetNeighborChunk(BlockX, BlockZ); - if (CurrentChunk != NULL) // Make sure the chunk is loaded - { - int RelBlockX = BlockX - (CurrentChunk->GetPosX() * cChunkDef::Width); - int RelBlockZ = BlockZ - (CurrentChunk->GetPosZ() * cChunkDef::Width); + GET_AND_VERIFY_CURRENT_CHUNK(CurrentChunk, BlockX, BlockZ) + + int RelBlockX = BlockX - (CurrentChunk->GetPosX() * cChunkDef::Width); + int RelBlockZ = BlockZ - (CurrentChunk->GetPosZ() * cChunkDef::Width); - // If the pickup is on the bottommost block position, make it think the void is made of air: (#131) - BLOCKTYPE BlockBelow = (BlockY > 0) ? CurrentChunk->GetBlock(RelBlockX, BlockY - 1, RelBlockZ) : E_BLOCK_AIR; - BLOCKTYPE BlockIn = CurrentChunk->GetBlock(RelBlockX, BlockY, RelBlockZ); + // If the pickup is on the bottommost block position, make it think the void is made of air: (#131) + BLOCKTYPE BlockBelow = (BlockY > 0) ? CurrentChunk->GetBlock(RelBlockX, BlockY - 1, RelBlockZ) : E_BLOCK_AIR; + BLOCKTYPE BlockIn = CurrentChunk->GetBlock(RelBlockX, BlockY, RelBlockZ); - if ( - IsBlockLava(BlockBelow) || (BlockBelow == E_BLOCK_FIRE) || - IsBlockLava(BlockIn) || (BlockIn == E_BLOCK_FIRE) - ) + if ( + IsBlockLava(BlockBelow) || (BlockBelow == E_BLOCK_FIRE) || + IsBlockLava(BlockIn) || (BlockIn == E_BLOCK_FIRE) + ) + { + m_bCollected = true; + m_Timer = 0; // We have to reset the timer. + m_Timer += a_Dt; // In case we have to destroy the pickup in the same tick. + if (m_Timer > 500.f) { - m_bCollected = true; - m_Timer = 0; // We have to reset the timer. - m_Timer += a_Dt; // In case we have to destroy the pickup in the same tick. - if (m_Timer > 500.f) - { - Destroy(true); - return; - } + Destroy(true); + return; } + } - if (!IsDestroyed()) // Don't try to combine if someone has tried to combine me + if (!IsDestroyed()) // Don't try to combine if someone has tried to combine me + { + cPickupCombiningCallback PickupCombiningCallback(GetPosition(), this); + m_World->ForEachEntity(PickupCombiningCallback); // Not ForEachEntityInChunk, otherwise pickups don't combine across chunk boundaries + if (PickupCombiningCallback.FoundMatchingPickup()) { - cPickupCombiningCallback PickupCombiningCallback(GetPosition(), this); - m_World->ForEachEntity(PickupCombiningCallback); // Not ForEachEntityInChunk, otherwise pickups don't combine across chunk boundaries - if (PickupCombiningCallback.FoundMatchingPickup()) - { - m_World->BroadcastEntityMetadata(*this); - } + m_World->BroadcastEntityMetadata(*this); } } } @@ -156,7 +155,7 @@ void cPickup::Tick(float a_Dt, cChunk & a_Chunk) return; } - if (GetPosY() < -8) // Out of this world and no more visible! + if (GetPosY() < VOID_BOUNDARY) // Out of this world and no more visible! { Destroy(true); return; diff --git a/src/Entities/Pickup.h b/src/Entities/Pickup.h index 74b917bce..2dcbecaaf 100644 --- a/src/Entities/Pickup.h +++ b/src/Entities/Pickup.h @@ -49,9 +49,6 @@ public: bool IsPlayerCreated(void) const { return m_bIsPlayerCreated; } // tolua_export private: - Vector3d m_ResultingSpeed; //Can be used to modify the resulting speed for the current tick ;) - - Vector3d m_WaterSpeed; /** The number of ticks that the entity has existed / timer between collect and destroy; in msec */ float m_Timer; diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index 7f2e5b4c2..2b9533623 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -590,7 +590,7 @@ void cPlayer::FinishEating(void) m_EatingFinishTick = -1; // Send the packets: - m_ClientHandle->SendEntityStatus(*this, ENTITY_STATUS_EATING_ACCEPTED); + m_ClientHandle->SendEntityStatus(*this, esPlayerEatingAccepted); m_World->BroadcastEntityAnimation(*this, 0); m_World->BroadcastEntityMetadata(*this); diff --git a/src/Entities/ProjectileEntity.cpp b/src/Entities/ProjectileEntity.cpp index e86bb48bd..96db17ffd 100644 --- a/src/Entities/ProjectileEntity.cpp +++ b/src/Entities/ProjectileEntity.cpp @@ -791,7 +791,7 @@ void cFireworkEntity::Tick(float a_Dt, cChunk & a_Chunk) if (m_ExplodeTimer == m_FireworkItem.m_FireworkItem.m_FlightTimeInTicks) { - m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_FIREWORK_EXPLODE); + m_World->BroadcastEntityStatus(*this, esFireworkExploding); Destroy(); } diff --git a/src/Mobs/Sheep.cpp b/src/Mobs/Sheep.cpp index c64360153..d599a4cef 100644 --- a/src/Mobs/Sheep.cpp +++ b/src/Mobs/Sheep.cpp @@ -101,7 +101,7 @@ void cSheep::Tick(float a_Dt, cChunk & a_Chunk) { if (m_World->GetBlock(PosX, PosY, PosZ) == E_BLOCK_GRASS) { - m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_SHEEP_EATING); + m_World->BroadcastEntityStatus(*this, esSheepEating); m_TimeToStopEating = 40; } } diff --git a/src/Mobs/Villager.cpp b/src/Mobs/Villager.cpp index bbd8d6aaa..d049acc1e 100644 --- a/src/Mobs/Villager.cpp +++ b/src/Mobs/Villager.cpp @@ -30,7 +30,7 @@ void cVillager::DoTakeDamage(TakeDamageInfo & a_TDI) { if (m_World->GetTickRandomNumber(5) == 3) { - m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_VILLAGER_ANGRY); + m_World->BroadcastEntityStatus(*this, esVillagerAngry); } } } diff --git a/src/Mobs/Wolf.cpp b/src/Mobs/Wolf.cpp index 0d3619166..f02b8a4fc 100644 --- a/src/Mobs/Wolf.cpp +++ b/src/Mobs/Wolf.cpp @@ -75,12 +75,12 @@ void cWolf::OnRightClicked(cPlayer & a_Player) SetMaxHealth(20); SetIsTame(true); SetOwner(a_Player.GetName()); - m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_WOLF_TAMED); + m_World->BroadcastEntityStatus(*this, esWolfTamed); m_World->BroadcastParticleEffect("heart", (float) GetPosX(), (float) GetPosY(), (float) GetPosZ(), 0, 0, 0, 0, 5); } else { - m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_WOLF_TAMING); + m_World->BroadcastEntityStatus(*this, esWolfTaming); m_World->BroadcastParticleEffect("smoke", (float) GetPosX(), (float) GetPosY(), (float) GetPosZ(), 0, 0, 0, 0, 5); } } From e6e702e7fdbc8b7475d3dbecc0f81a08304997ae Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sat, 12 Apr 2014 14:58:46 +0200 Subject: [PATCH 077/188] Added complete Enchanting System http://minecraft.gamepedia.com/Enchantment_mechanics --- src/ClientHandle.cpp | 677 ++++++++++++++++++++++++++++++++++++++++++- src/ClientHandle.h | 5 +- src/Enchantments.h | 4 +- src/Item.cpp | 106 ------- src/Item.h | 3 - src/UI/SlotArea.cpp | 49 +++- src/UI/Window.cpp | 86 +++++- src/UI/Window.h | 20 +- 8 files changed, 803 insertions(+), 147 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 73a275ab1..90165b432 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -31,6 +31,8 @@ #include "CompositeChat.h" #include "Items/ItemSword.h" +#include "FastRandom.h" + /** Maximum number of explosions to send this tick, server will start dropping if exceeded */ @@ -2687,34 +2689,679 @@ void cClientHandle::SocketClosed(void) void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) { - //Get Item - cItem EnchantItem = m_Player->GetDraggingItem(); - - cEnchantmentsArray enchantments; - cItem::GetApplicableEnchantmentsForType(EnchantItem.m_ItemType, enchantments); + cItem Item = m_Player->GetDraggingItem(); + cEnchantingWindow * Window = (cEnchantingWindow*)m_Player->GetWindow(); + int BaseEnchantmentLevel = Window->GetPropertyValue(Enchantment); - m_Player->SendMessage(Printf("ItemType: %d", EnchantItem.m_ItemType)); + // Step 1 from Enchanting + int Enchantability = 1; + + if (Item.m_ItemType == E_ITEM_WOODEN_SWORD || Item.m_ItemType == E_ITEM_WOODEN_PICKAXE || Item.m_ItemType == E_ITEM_WOODEN_SHOVEL || Item.m_ItemType == E_ITEM_WOODEN_AXE || Item.m_ItemType == E_ITEM_WOODEN_HOE) + { + Enchantability = 15; + } + else if (Item.m_ItemType == E_ITEM_LEATHER_CAP || Item.m_ItemType == E_ITEM_LEATHER_TUNIC || Item.m_ItemType == E_ITEM_LEATHER_PANTS || Item.m_ItemType == E_ITEM_LEATHER_BOOTS) + { + Enchantability = 15; + } + else if (Item.m_ItemType == E_ITEM_STONE_SWORD || Item.m_ItemType == E_ITEM_STONE_PICKAXE || Item.m_ItemType == E_ITEM_STONE_SHOVEL || Item.m_ItemType == E_ITEM_STONE_AXE || Item.m_ItemType == E_ITEM_STONE_HOE) + { + Enchantability = 5; + } + else if (Item.m_ItemType == E_ITEM_IRON_HELMET || Item.m_ItemType == E_ITEM_IRON_CHESTPLATE || Item.m_ItemType == E_ITEM_IRON_LEGGINGS || Item.m_ItemType == E_ITEM_IRON_BOOTS) + { + Enchantability = 9; + } + else if (Item.m_ItemType == E_ITEM_IRON_SWORD || Item.m_ItemType == E_ITEM_IRON_PICKAXE || Item.m_ItemType == E_ITEM_IRON_SHOVEL || Item.m_ItemType == E_ITEM_IRON_AXE || Item.m_ItemType == E_ITEM_IRON_HOE) + { + Enchantability = 14; + } + else if (Item.m_ItemType == E_ITEM_CHAIN_HELMET || Item.m_ItemType == E_ITEM_CHAIN_CHESTPLATE || Item.m_ItemType == E_ITEM_CHAIN_LEGGINGS || Item.m_ItemType == E_ITEM_CHAIN_BOOTS) + { + Enchantability = 12; + } + else if (Item.m_ItemType == E_ITEM_DIAMOND_HELMET || Item.m_ItemType == E_ITEM_DIAMOND_CHESTPLATE || Item.m_ItemType == E_ITEM_DIAMOND_LEGGINGS || Item.m_ItemType == E_ITEM_DIAMOND_BOOTS) + { + Enchantability = 10; + } + else if (Item.m_ItemType == E_ITEM_DIAMOND_SWORD || Item.m_ItemType == E_ITEM_DIAMOND_PICKAXE || Item.m_ItemType == E_ITEM_DIAMOND_SHOVEL || Item.m_ItemType == E_ITEM_DIAMOND_AXE || Item.m_ItemType == E_ITEM_DIAMOND_HOE) + { + Enchantability = 10; + } + else if (Item.m_ItemType == E_ITEM_GOLD_HELMET || Item.m_ItemType == E_ITEM_GOLD_CHESTPLATE || Item.m_ItemType == E_ITEM_GOLD_LEGGINGS || Item.m_ItemType == E_ITEM_GOLD_BOOTS) + { + Enchantability = 25; + } + else if (Item.m_ItemType == E_ITEM_GOLD_SWORD || Item.m_ItemType == E_ITEM_GOLD_PICKAXE || Item.m_ItemType == E_ITEM_GOLD_SHOVEL || Item.m_ItemType == E_ITEM_GOLD_AXE || Item.m_ItemType == E_ITEM_GOLD_HOE) + { + Enchantability = 22; + } + + cFastRandom Random; + int ModifiedEnchantmentLevel = BaseEnchantmentLevel + Random.NextInt(Enchantability / 4) + Random.NextInt(Enchantability / 4) + 1; + float RandomBonus = 1.0F + (Random.NextFloat(1) + Random.NextFloat(1) - 1.0F) * 0.15F; + + int FinalEnchantmentLevel = (int)(ModifiedEnchantmentLevel * RandomBonus + 0.5F); + + // Step 2 and 3 from Enchanting + cEnchantmentsVector enchantments; + + if (ItemCategory::IsSword(Item.m_ItemType)) + { + // Sharpness + if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=4")); + } + else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=3")); + } + else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=1")); + } + + // Smite + if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=1")); + } + + // Bane of Arthropods + if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=1")); + } + + // Knockback + if (FinalEnchantmentLevel >= 25 && FinalEnchantmentLevel <= 75) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=1")); + } + + // Fire Aspect + if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=1")); + } + + // Looting + if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=3")); + } + else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=2")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=1")); + } + } + + else if (ItemCategory::IsTool(Item.m_ItemType)) + { + // Efficiency + if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 81) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=3")); + } + else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 61) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 51) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=1")); + } + + // Silk Touch + if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("SilkTouch=1")); + } + + // Fortune + if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=3")); + } + else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=2")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=1")); + } + } + + else if (ItemCategory::IsArmor(Item.m_ItemType)) + { + // Protection + if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=4")); + } + else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=3")); + } + else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=1")); + } + + // Fire Protection + if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 46) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=4")); + } + else if (FinalEnchantmentLevel >= 26 && FinalEnchantmentLevel <= 38) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=3")); + } + else if (FinalEnchantmentLevel >= 18 && FinalEnchantmentLevel <= 30) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 22) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=1")); + } + + // Blast Protection + if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 41) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 33) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 25) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 17) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=1")); + } + + // Projectile Protection + if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=4")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 30) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=3")); + } + else if (FinalEnchantmentLevel >= 9 && FinalEnchantmentLevel <= 24) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=2")); + } + else if (FinalEnchantmentLevel >= 3 && FinalEnchantmentLevel <= 18) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=1")); + } + + // Thorns + if (FinalEnchantmentLevel >= 50 && FinalEnchantmentLevel <= 100) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=3")); + } + else if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=1")); + } - m_Player->SendMessage(enchantments[1].ToString()); + if (ItemCategory::IsHelmet(Item.m_ItemType)) + { + // Respiration + if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 60) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=3")); + } + else if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 40) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=1")); + } - //shuffle enchantments (i don't know if this is good) - std::random_shuffle(enchantments.begin(), enchantments.end()); + // Aqua Affinity + if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 41) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("AquaAffinity=1")); + } + } - m_Player->SendMessage(enchantments[1].ToString()); + else if (ItemCategory::IsBoots(Item.m_ItemType)) + { + // Feather Fall + if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 33) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=4")); + } + else if (FinalEnchantmentLevel >= 17 && FinalEnchantmentLevel <= 27) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=3")); + } + else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 21) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 15) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=1")); + } + } + } + + else if (Item.m_ItemType == E_ITEM_BOW) + { + // Power + if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 46) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=3")); + } + else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 26) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 16) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=1")); + } + + // Punch + if (FinalEnchantmentLevel >= 32 && FinalEnchantmentLevel <= 57) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=2")); + } + else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 37) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=1")); + } + + // Flame and Infinity + if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Flame=1")); + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Infinity=1")); + } + } + + else if (Item.m_ItemType == E_ITEM_FISHING_ROD) + { + // Luck of the Sea and Lure + if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=3")); + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=3")); + } + else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=2")); + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=2")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=1")); + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=1")); + } + } + + // Unbreaking + if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 63) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=1")); + } + + int RandomEnchantment1 = floor(Random.NextFloat(1) * enchantments.size()); + cEnchantments Enchantment1 = enchantments[RandomEnchantment1]; + Item.m_Enchantments.AddFromString(Enchantment1.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment1), enchantments.end()); + + // TODO: Don't add every time so much enchantments + + // Checking for conflicting enchantments + enchantments = CheckEnchantmentConflicts(enchantments, Enchantment1); + + int RandomEnchantment2 = floor(Random.NextFloat(1) * enchantments.size()); + cEnchantments Enchantment2 = enchantments[RandomEnchantment2]; + Item.m_Enchantments.AddFromString(Enchantment2.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment2), enchantments.end()); + + // Checking for conflicting enchantments + enchantments = CheckEnchantmentConflicts(enchantments, Enchantment2); + + int RandomEnchantment3 = floor(Random.NextFloat(1) * enchantments.size()); + cEnchantments Enchantment3 = enchantments[RandomEnchantment3]; + Item.m_Enchantments.AddFromString(Enchantment3.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment3), enchantments.end()); + + m_Player->GetWindow()->SetSlot(*m_Player, 0, Item); +} +cEnchantmentsVector cClientHandle::AddEnchantmentWeight(cEnchantmentsVector a_Map, int a_Weight, cEnchantments a_Enchantment) +{ + for (int i = 0; i < a_Weight; i++) + { + a_Map.push_back(a_Enchantment); + } - //Enchant Item - EnchantItem.m_Enchantments.AddFromString(enchantments[1].ToString()); + return a_Map; +} - //Set Enchanted Item to Window Slot - m_Player->GetWindow()->SetSlot(*m_Player, 0, EnchantItem); - LOGWARN("Item enchanted!"); + + + +cEnchantmentsVector cClientHandle::CheckEnchantmentConflicts(cEnchantmentsVector a_Map, cEnchantments a_FirstEnchantment) +{ + int FirstEnchantmentID = std::stoi(StringSplit(a_FirstEnchantment.ToString(), "=")[0]); + + if (FirstEnchantmentID == cEnchantments::enchProtection) + { + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchFireProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchBlastProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchProjectileProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + } + else if (FirstEnchantmentID == cEnchantments::enchFireProtection) + { + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchBlastProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchProjectileProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + } + else if (FirstEnchantmentID == cEnchantments::enchBlastProtection) + { + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchFireProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchProjectileProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + } + else if (FirstEnchantmentID == cEnchantments::enchProjectileProtection) + { + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchFireProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchBlastProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + } + + else if (FirstEnchantmentID == cEnchantments::enchSharpness) + { + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchSmite) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchBaneOfArthropods) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + } + else if (FirstEnchantmentID == cEnchantments::enchSmite) + { + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchSharpness) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchBaneOfArthropods) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + } + else if (FirstEnchantmentID == cEnchantments::enchBaneOfArthropods) + { + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchSharpness) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchSmite) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + } + else if (FirstEnchantmentID == cEnchantments::enchSilkTouch) + { + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchFortune) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + } + else if (FirstEnchantmentID == cEnchantments::enchFortune) + { + for (cEnchantments enchantment : a_Map) + { + int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + + if (EnchantmentID == cEnchantments::enchSilkTouch) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + break; + } + } + } + + return a_Map; } diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 01765cc85..4c88d79e2 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -18,6 +18,7 @@ #include "ByteBuffer.h" #include "Scoreboard.h" #include "Map.h" +#include "Enchantments.h" @@ -230,8 +231,10 @@ public: /** Called when the player moves into a different world; queues sreaming the new chunks */ void MoveToWorld(cWorld & a_World, bool a_SendRespawnPacket); - ///Handle item enchanting + /** Called when the player will enchant a Item */ void HandleEnchantItem(Byte & WindowID, Byte & Enchantment); + cEnchantmentsVector AddEnchantmentWeight(cEnchantmentsVector a_Map, int a_Weight, cEnchantments a_Enchantment); + cEnchantmentsVector CheckEnchantmentConflicts(cEnchantmentsVector a_Map, cEnchantments a_FirstEnchantment); private: diff --git a/src/Enchantments.h b/src/Enchantments.h index 2af772928..70d6b6613 100644 --- a/src/Enchantments.h +++ b/src/Enchantments.h @@ -29,7 +29,7 @@ Level value of 0 means no such enchantment, and it will not be stored in the m_E Serialization will never put zero-level enchantments into the stringspec and will always use numeric IDs. */ -typedef std::vector cEnchantmentsArray; +typedef std::vector cEnchantmentsVector; // tolua_begin class cEnchantments @@ -105,7 +105,7 @@ public: /// Reads the enchantments from the specified NBT list tag (ench or StoredEnchantments) friend void EnchantmentSerializer::ParseFromNBT(cEnchantments& a_Enchantments, const cParsedNBT & a_NBT, int a_EnchListTagIdx); - + protected: /// Maps enchantment ID -> enchantment level typedef std::map cMap; diff --git a/src/Item.cpp b/src/Item.cpp index 093147b54..856b68be6 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -209,112 +209,6 @@ bool cItem::IsEnchantable(short item) -void cItem::GetApplicableEnchantmentsForType(short a_ItemType, cEnchantmentsArray & a_Enchantments) -{ - LOGWARN("Get Enchantments"); - - if (ItemCategory::IsSword(a_ItemType)) - { - a_Enchantments.push_back(cEnchantments("Sharpness=4")); - a_Enchantments.push_back(cEnchantments("Smite=5")); - a_Enchantments.push_back(cEnchantments("BaneOfArthropods=5")); - a_Enchantments.push_back(cEnchantments("Knockback=2")); - a_Enchantments.push_back(cEnchantments("FireAspect=2")); - a_Enchantments.push_back(cEnchantments("Looting=3")); - a_Enchantments.push_back(cEnchantments("Unbreaking=3")); - } - - else if (ItemCategory::IsPickaxe(a_ItemType)) - { - a_Enchantments.push_back(cEnchantments("Efficiency=4")); - a_Enchantments.push_back(cEnchantments("SilkTouch=1")); - a_Enchantments.push_back(cEnchantments("Unbreaking=3")); - a_Enchantments.push_back(cEnchantments("Fortune=3")); - } - - else if (ItemCategory::IsAxe(a_ItemType)) - { - a_Enchantments.push_back(cEnchantments("Efficiency=4")); - a_Enchantments.push_back(cEnchantments("SilkTouch=1")); - a_Enchantments.push_back(cEnchantments("Unbreaking=3")); - a_Enchantments.push_back(cEnchantments("Fortune=3")); - } - - else if (ItemCategory::IsShovel(a_ItemType)) - { - a_Enchantments.push_back(cEnchantments("Efficiency=4")); - a_Enchantments.push_back(cEnchantments("SilkTouch=1")); - a_Enchantments.push_back(cEnchantments("Unbreaking=3")); - a_Enchantments.push_back(cEnchantments("Fortune=3")); - } - - else if (ItemCategory::IsHoe(a_ItemType)) - { - a_Enchantments.push_back(cEnchantments("Unbreaking=3")); - } - - else if (ItemCategory::IsArmor(a_ItemType)) - { - a_Enchantments.push_back(cEnchantments("Protection=4")); - a_Enchantments.push_back(cEnchantments("FireProtection=4")); - a_Enchantments.push_back(cEnchantments("BlastProtection=4")); - a_Enchantments.push_back(cEnchantments("ProjectileProtection=4")); - a_Enchantments.push_back(cEnchantments("Thorns=3")); - a_Enchantments.push_back(cEnchantments("Unbreaking=3")); - - if (ItemCategory::IsHelmet(a_ItemType)) - { - a_Enchantments.push_back(cEnchantments("Respiration=3")); - a_Enchantments.push_back(cEnchantments("AquaAffinity=1")); - } - - else if (ItemCategory::IsBoots(a_ItemType)) - { - a_Enchantments.push_back(cEnchantments("FeatherFalling=4")); - } - } - - //Bow - else if (a_ItemType == 261) - { - a_Enchantments.push_back(cEnchantments("Power=4")); - a_Enchantments.push_back(cEnchantments("Punch=2")); - a_Enchantments.push_back(cEnchantments("Flame=1")); - a_Enchantments.push_back(cEnchantments("Infinity=1")); - a_Enchantments.push_back(cEnchantments("Unbreaking=3")); - } - - //Fishing Rod - else if (a_ItemType == 346) - { - a_Enchantments.push_back(cEnchantments("LuckOfTheSea=3")); - a_Enchantments.push_back(cEnchantments("Lure=3")); - a_Enchantments.push_back(cEnchantments("Unbreaking=3")); - } - - //Shears - else if (a_ItemType == 359) - { - a_Enchantments.push_back(cEnchantments("Unbreaking=3")); - } - - //Flint and Steel - else if (a_ItemType == 259) - { - a_Enchantments.push_back(cEnchantments("Unbreaking=3")); - } - - //Carrot on a Stick - else if (a_ItemType == 398) - { - a_Enchantments.push_back(cEnchantments("Unbreaking=3")); - } -} - - - - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cItems: diff --git a/src/Item.h b/src/Item.h index 620c77b29..910ecb382 100644 --- a/src/Item.h +++ b/src/Item.h @@ -175,9 +175,6 @@ public: /** Returns true if the specified item type is enchantable (as per 1.2.5 protocol requirements) */ static bool IsEnchantable(short a_ItemType); // tolua_export - /** Fills a_Enchantments with the list of enchantments applicable to the specified item type */ - static void cItem::GetApplicableEnchantmentsForType(short a_ItemType, cEnchantmentsArray & a_Enchantments); - // tolua_begin short m_ItemType; diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 9463bc593..f76b11380 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -608,7 +608,6 @@ cSlotAreaTemporary(a_NumSlots, a_ParentWindow) void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) { - LOGWARN("Clicked"); // Check if Slot is in the Enchantment Table if (a_SlotNum == 0) { @@ -642,17 +641,39 @@ void cSlotAreaEnchanting::OnPlayerRemoved(cPlayer & a_Player) void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) { - LOGWARN("Click!"); - if (a_Player.GetDraggingItem().IsEmpty()) { - LOGWARN("EMPTY"); - m_ParentWindow.SetProperty(0, 0); - m_ParentWindow.SetProperty(1, 0); - m_ParentWindow.SetProperty(2, 0); + m_ParentWindow.SetProperty(0, 0, a_Player); + m_ParentWindow.SetProperty(1, 0, a_Player); + m_ParentWindow.SetProperty(2, 0, a_Player); } else if (a_Player.GetDraggingItem().IsEnchantable) { + int PosX = 0; + int PosY = 0; + int PosZ = 0; + cEnchantingWindow * Window = (cEnchantingWindow*)&m_ParentWindow; + Window->GetBlockPos(PosX, PosY, PosZ); + + cBlockArea Area; + Area.Read(a_Player.GetWorld(), PosX - 2, PosX + 2, PosY, PosY + 1, PosZ - 2, PosZ + 2); + + for (int x = 0; x < 7; x++) + { + for (int y = 0; y < 2; y++) + { + for (int z = 0; z < 7; z++) + { + LOG(Printf("%i", Area.GetBlockType(x, y, z)).c_str()); + + if (Area.GetBlockType(x, y, z) == E_BLOCK_BOOKCASE) + { + LOG("BookShelf"); + } + } + } + } + int bookshelves = 15; // TODO: Check Bookshelves cFastRandom Random; @@ -661,17 +682,15 @@ void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) int middleSlot = (base * 2) / 3 + 1; int bottomSlot = std::max(base, bookshelves * 2); - LOGWARN("Enchantable"); - m_ParentWindow.SetProperty(0, topSlot); - m_ParentWindow.SetProperty(1, middleSlot); - m_ParentWindow.SetProperty(2, bottomSlot); + m_ParentWindow.SetProperty(0, topSlot, a_Player); + m_ParentWindow.SetProperty(1, middleSlot, a_Player); + m_ParentWindow.SetProperty(2, bottomSlot, a_Player); } else { - LOGWARN("Not Enchantable"); - m_ParentWindow.SetProperty(0, 0); - m_ParentWindow.SetProperty(1, 0); - m_ParentWindow.SetProperty(2, 0); + m_ParentWindow.SetProperty(0, 0, a_Player); + m_ParentWindow.SetProperty(1, 0, a_Player); + m_ParentWindow.SetProperty(2, 0, a_Player); } } diff --git a/src/UI/Window.cpp b/src/UI/Window.cpp index 5d89534dd..c514e76e7 100644 --- a/src/UI/Window.cpp +++ b/src/UI/Window.cpp @@ -808,7 +808,10 @@ cCraftingWindow::cCraftingWindow(int a_BlockX, int a_BlockY, int a_BlockZ) : // cEnchantingWindow: cEnchantingWindow::cEnchantingWindow(int a_BlockX, int a_BlockY, int a_BlockZ) : -cWindow(wtEnchantment, "Enchant") + cWindow(wtEnchantment, "Enchant"), + m_BlockX(a_BlockX), + m_BlockY(a_BlockY), + m_BlockZ(a_BlockZ) { m_SlotAreas.push_back(new cSlotAreaEnchanting(1, *this)); m_SlotAreas.push_back(new cSlotAreaInventory(*this)); @@ -819,6 +822,87 @@ cWindow(wtEnchantment, "Enchant") +void cEnchantingWindow::SetProperty(int a_Property, int a_Value) +{ + if (a_Property == 0) + { + m_PropertyValue0 = a_Value; + } + else if (a_Property == 1) + { + m_PropertyValue1 = a_Value; + } + else if (a_Property == 2) + { + m_PropertyValue2 = a_Value; + } + + cCSLock Lock(m_CS); + for (cPlayerList::iterator itr = m_OpenedBy.begin(), end = m_OpenedBy.end(); itr != end; ++itr) + { + (*itr)->GetClientHandle()->SendWindowProperty(*this, a_Property, a_Value); + } // for itr - m_OpenedBy[] +} + + + + + +void cEnchantingWindow::SetProperty(int a_Property, int a_Value, cPlayer & a_Player) +{ + if (a_Property == 0) + { + m_PropertyValue0 = a_Value; + } + else if (a_Property == 1) + { + m_PropertyValue1 = a_Value; + } + else if (a_Property == 2) + { + m_PropertyValue2 = a_Value; + } + + a_Player.GetClientHandle()->SendWindowProperty(*this, a_Property, a_Value); +} + + + + + +int cEnchantingWindow::GetPropertyValue(int a_Property) +{ + if (a_Property == 0) + { + return m_PropertyValue0; + } + else if (a_Property == 1) + { + return m_PropertyValue1; + } + else if (a_Property == 2) + { + return m_PropertyValue2; + } + + return -1; +} + + + + + +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 cdaec5aaa..52ab6c3ae 100644 --- a/src/UI/Window.h +++ b/src/UI/Window.h @@ -136,11 +136,11 @@ public: void SetWindowTitle(const AString & a_WindowTitle ) { m_WindowTitle = a_WindowTitle; } /// Sends the UpdateWindowProperty (0x69) packet to all clients of the window - void SetProperty(int a_Property, int a_Value); + virtual void SetProperty(int a_Property, int a_Value); /// Sends the UpdateWindowPropert(0x69) packet to the specified player - void SetProperty(int a_Property, int a_Value, cPlayer & a_Player); - + virtual void SetProperty(int a_Property, int a_Value, cPlayer & a_Player); + // tolua_end void OwnerDestroyed(void); @@ -165,7 +165,7 @@ public: /// Used by cSlotAreas to send individual slots to clients, a_RelativeSlotNum is the slot number relative to a_SlotArea void SendSlot(cPlayer & a_Player, cSlotArea * a_SlotArea, int a_RelativeSlotNum); - + protected: cSlotAreas m_SlotAreas; @@ -237,6 +237,18 @@ class cEnchantingWindow : typedef cWindow super; public: cEnchantingWindow(int a_BlockX, int a_BlockY, int a_BlockZ); + virtual void SetProperty(int a_Property, int a_Value, cPlayer & a_Player) override; + virtual void SetProperty(int a_Property, int a_Value) override; + + /** Return the Value of a Property */ + int GetPropertyValue(int a_Property); + + /** Set the Position Values to the Position of the Enchantment Table */ + void GetBlockPos(int & a_PosX, int & a_PosY, int & a_PosZ); + +protected: + int m_PropertyValue0, m_PropertyValue1, m_PropertyValue2; + int m_BlockX, m_BlockY, m_BlockZ; }; From dd1f8fb1f5640d9f9d58098c8aefbc1c1ad308ab Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sat, 12 Apr 2014 18:52:17 +0200 Subject: [PATCH 078/188] Fixed Bookshelves Checking (not completly) --- src/UI/SlotArea.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index f76b11380..d43b91700 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -658,17 +658,20 @@ void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) cBlockArea Area; Area.Read(a_Player.GetWorld(), PosX - 2, PosX + 2, PosY, PosY + 1, PosZ - 2, PosZ + 2); - for (int x = 0; x < 7; x++) + for (int x = 0; x < 6; x++) { - for (int y = 0; y < 2; y++) + for (int y = 0; y < 3; y++) { - for (int z = 0; z < 7; z++) + for (int z = 0; z < 6; z++) { - LOG(Printf("%i", Area.GetBlockType(x, y, z)).c_str()); - - if (Area.GetBlockType(x, y, z) == E_BLOCK_BOOKCASE) + if ((((x == 0) || (x == 5)) || ((z == 0) || (z == 5))) && ((y == 0) || y == 1)) { - LOG("BookShelf"); + LOG("%i", Area.GetRelBlockType(x, y, z)); + + if (Area.GetRelBlockType(x, y, z) == E_BLOCK_BOOKCASE) + { + LOG("BookShelf"); + } } } } From 83b25d085c333878e10acb18e6de9e83baf71e65 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 12 Apr 2014 19:36:50 +0200 Subject: [PATCH 079/188] Updated the NetherFort prefabs to current Gallery contents. Code exported from the Gallery server by the GalExport plugin. --- src/Generating/NetherFortGen.cpp | 10 +- src/Generating/Prefabs/NetherFortPrefabs.cpp | 5239 +++++++++++------- src/Generating/Prefabs/NetherFortPrefabs.h | 10 +- 3 files changed, 3315 insertions(+), 1944 deletions(-) diff --git a/src/Generating/NetherFortGen.cpp b/src/Generating/NetherFortGen.cpp index 02779a8a3..b6ec46986 100644 --- a/src/Generating/NetherFortGen.cpp +++ b/src/Generating/NetherFortGen.cpp @@ -80,9 +80,9 @@ cNetherFortGen::cNetherFortGen(int a_Seed, int a_GridSize, int a_MaxDepth) : m_MaxDepth(a_MaxDepth) { // Initialize the prefabs: - for (size_t i = 0; i < g_NetherFortPrefabs1Count; i++) + for (size_t i = 0; i < g_NetherFortPrefabsCount; i++) { - cPrefab * Prefab = new cPrefab(g_NetherFortPrefabs1[i]); + cPrefab * Prefab = new cPrefab(g_NetherFortPrefabs[i]); m_AllPieces.push_back(Prefab); if (Prefab->HasConnectorType(0)) { @@ -95,15 +95,17 @@ cNetherFortGen::cNetherFortGen(int a_Seed, int a_GridSize, int a_MaxDepth) : } // Initialize the starting piece prefabs: - for (size_t i = 0; i < g_NetherFortStartingPrefabs1Count; i++) + for (size_t i = 0; i < g_NetherFortStartingPrefabsCount; i++) { - m_StartingPieces.push_back(new cPrefab(g_NetherFortStartingPrefabs1[i])); + m_StartingPieces.push_back(new cPrefab(g_NetherFortStartingPrefabs[i])); } + /* // DEBUG: Try one round of placement: cPlacedPieces Pieces; cBFSPieceGenerator pg(*this, a_Seed); pg.PlacePieces(0, 64, 0, a_MaxDepth, Pieces); + */ } diff --git a/src/Generating/Prefabs/NetherFortPrefabs.cpp b/src/Generating/Prefabs/NetherFortPrefabs.cpp index 5e8685e32..29b35a5a4 100644 --- a/src/Generating/Prefabs/NetherFortPrefabs.cpp +++ b/src/Generating/Prefabs/NetherFortPrefabs.cpp @@ -1,7 +1,10 @@ // NetherFortPrefabs.cpp -// Defines all the prefabs for nether forts +// Defines the prefabs in the group NetherFort + +// NOTE: This file has been generated automatically by GalExport! +// Any manual changes will be overwritten by the next automatic export! #include "Globals.h" #include "NetherFortPrefabs.h" @@ -10,256 +13,278 @@ -/* -The nether fortress has two types of connectors, Outer and Inner. Outer is Type 0, Inner is Type 1. -*/ - - - - - -const cPrefab::sDef g_NetherFortPrefabs1[] = +const cPrefab::sDef g_NetherFortPrefabs[] = { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // BalconyCorridor: - // The data has been exported from gallery Nether, area index 37, ID 288 + // The data has been exported from the gallery Nether, area index 37, ID 288, created by Aloe_vera { // Size: 13, 7, 9, // SizeX = 13, SizeY = 7, SizeZ = 9 // Block definitions: + ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ - "b: 19: 0\n" /* sponge */ - "c:114: 4\n" /* netherbrickstairs */ - "d:114: 7\n" /* netherbrickstairs */ - "e:114: 5\n" /* netherbrickstairs */ - "f: 44: 6\n" /* step */ - "g:113: 0\n" /* netherbrickfence */ - "h:114: 2\n" /* netherbrickstairs */ - "i:114: 3\n" /* netherbrickstairs */ - "j:114: 0\n" /* netherbrickstairs */ - "k:114: 1\n" /* netherbrickstairs */ - ".: 0: 0\n" /* air */, + "b:114: 4\n" /* netherbrickstairs */ + "c:114: 7\n" /* netherbrickstairs */ + "d:114: 5\n" /* netherbrickstairs */ + "e: 44: 6\n" /* step */ + "f:113: 0\n" /* netherbrickfence */ + "g:114: 2\n" /* netherbrickstairs */ + "h:114: 3\n" /* netherbrickstairs */ + "i:114: 0\n" /* netherbrickstairs */ + "j:114: 1\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaa" + /* 5 */ "mmmmaaaaammmm" + /* 6 */ "mmmmmmmmmmmmm" + /* 7 */ "mmmmmmmmmmmmm" + /* 8 */ "mmmmmmmmmmmmm" + // Level 1 - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "bbbbaaaaabbbb" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "aaaa.aaa.aaaa" + /* 5 */ "mmbcaaaaacdmm" + /* 6 */ "mmmbcccccdmmm" + /* 7 */ "mmmmmmmmmmmmm" + /* 8 */ "mmmmmmmmmmmmm" // Level 2 - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaa.aaa.aaaa" - "bbcdaaaaadebb" - "bbbcdddddebbb" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "............." + /* 2 */ "............." + /* 3 */ "............." + /* 4 */ "aaaa.eee.aaaa" + /* 5 */ "mmaaaaaaaaamm" + /* 6 */ "mmaaaaaaaaamm" + /* 7 */ "mmaaaaaaaaamm" + /* 8 */ "mmaaaaaaaaamm" // Level 3 - "aaaaaaaaaaaaa" - "............." - "............." - "............." - "aaaa.fff.aaaa" - "bbaaaaaaaaabb" - "bbaaaaaaaaabb" - "bbaaaaaaaaabb" - "bbaaaaaaaaabb" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "afafafafafafa" + /* 1 */ "............." + /* 2 */ "............." + /* 3 */ "............." + /* 4 */ "afaa.....aafa" + /* 5 */ "mmaaa...aaamm" + /* 6 */ "mmf.......fmm" + /* 7 */ "mmf.......fmm" + /* 8 */ "mmfffffffffmm" // Level 4 - "agagagagagaga" - "............." - "............." - "............." - "agaa.....aaga" - "bbaaa...aaabb" - "bbg.......gbb" - "bbg.......gbb" - "bbgggggggggbb" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "afafafafafafa" + /* 1 */ "............." + /* 2 */ "............." + /* 3 */ "............." + /* 4 */ "afaa.....aafa" + /* 5 */ "mmaaa...aaamm" + /* 6 */ "mm.........mm" + /* 7 */ "mm.........mm" + /* 8 */ "mm.........mm" // Level 5 - "agagagagagaga" - "............." - "............." - "............." - "agaa.....aaga" - "bbaaa...aaabb" - "bb.........bb" - "bb.........bb" - "bb.........bb" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "afafafafafafa" + /* 1 */ "............." + /* 2 */ "............." + /* 3 */ "............." + /* 4 */ "afaa.....aafa" + /* 5 */ "mmaaa...aaamm" + /* 6 */ "mm.........mm" + /* 7 */ "mm.........mm" + /* 8 */ "mm.........mm" // Level 6 - "agagagagagaga" - "............." - "............." - "............." - "agaa.....aaga" - "bbaaa...aaabb" - "bb.........bb" - "bb.........bb" - "bb.........bb" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "ggggggggggggg" + /* 1 */ "aaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "hhiaaaaaaahhh" + /* 5 */ "mmihhhhhhhjmm" + /* 6 */ "mmmmmmmmmmmmm" + /* 7 */ "mmmmmmmmmmmmm" + /* 8 */ "mmmmmmmmmmmmm", + + // Connectors: + "1: 12, 2, 2: 5\n" /* Type 1, direction X+ */ + "1: 0, 2, 2: 4\n" /* Type 1, direction X- */, - // Level 7 - "hhhhhhhhhhhhh" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "iijaaaaaaaiii" - "bbjiiiiiiikbb" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb", - - // Connections: - "1: 0, 2, 2: 4\n" /* Type 1, BLOCK_FACE_XM */ - "1: 12, 2, 2: 5\n" /* Type 1, BLOCK_FACE_XP */, - // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // BalconyCorridor + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // BalconyTee2: - // The data has been exported from gallery Nether, area index 38, ID 289 + // The data has been exported from the gallery Nether, area index 38, ID 289, created by Aloe_vera { // Size: 13, 7, 11, // SizeX = 13, SizeY = 7, SizeZ = 11 // Block definitions: - "a: 19: 0\n" /* sponge */ - "b:112: 0\n" /* netherbrick */ - "c:114: 4\n" /* netherbrickstairs */ - "d:114: 7\n" /* netherbrickstairs */ - "e:114: 5\n" /* netherbrickstairs */ - "f: 44: 6\n" /* step */ - "g:113: 0\n" /* netherbrickfence */ - "h:114: 0\n" /* netherbrickstairs */ - "i:114: 1\n" /* netherbrickstairs */ - "j:114: 2\n" /* netherbrickstairs */ - "k:114: 3\n" /* netherbrickstairs */ - ".: 0: 0\n" /* air */, + ".: 0: 0\n" /* air */ + "a:112: 0\n" /* netherbrick */ + "b:114: 4\n" /* netherbrickstairs */ + "c:114: 7\n" /* netherbrickstairs */ + "d:114: 5\n" /* netherbrickstairs */ + "e: 44: 6\n" /* step */ + "f:113: 0\n" /* netherbrickfence */ + "g:114: 0\n" /* netherbrickstairs */ + "h:114: 1\n" /* netherbrickstairs */ + "i:114: 2\n" /* netherbrickstairs */ + "j:114: 3\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmmaaaaammmm" + /* 1 */ "mmmmaaaaammmm" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaa" + /* 7 */ "mmmmaaaaammmm" + /* 8 */ "mmmmmmmmmmmmm" + /* 9 */ "mmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmm" + // Level 1 - "aaaabbbbbaaaa" - "aaaabbbbbaaaa" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" - "aaaabbbbbaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmmaaaaammmm" + /* 1 */ "mmmmaaaaammmm" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaa" + /* 6 */ "aaaa.aaa.aaaa" + /* 7 */ "mmbcaaaaacdmm" + /* 8 */ "mmmbcccccdmmm" + /* 9 */ "mmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmm" // Level 2 - "aaaabbbbbaaaa" - "aaaabbbbbaaaa" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" - "bbbb.bbb.bbbb" - "aacdbbbbbdeaa" - "aaacdddddeaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmma...ammmm" + /* 1 */ "mmmma...ammmm" + /* 2 */ "aaaaa...aaaaa" + /* 3 */ "............." + /* 4 */ "............." + /* 5 */ "............." + /* 6 */ "aaaa.eee.aaaa" + /* 7 */ "mmaaaaaaaaamm" + /* 8 */ "mmaaaaaaaaamm" + /* 9 */ "mmaaaaaaaaamm" + /* 10 */ "mmaaaaaaaaamm" // Level 3 - "aaaab...baaaa" - "aaaab...baaaa" - "bbbbb...bbbbb" - "............." - "............." - "............." - "bbbb.fff.bbbb" - "aabbbbbbbbbaa" - "aabbbbbbbbbaa" - "aabbbbbbbbbaa" - "aabbbbbbbbbaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmma...ammmm" + /* 1 */ "mmmmf...fmmmm" + /* 2 */ "afafa...afafa" + /* 3 */ "............." + /* 4 */ "............." + /* 5 */ "............." + /* 6 */ "afaa.....aafa" + /* 7 */ "mmaaa...aaamm" + /* 8 */ "mmf.......fmm" + /* 9 */ "mmf.......fmm" + /* 10 */ "mmfffffffffmm" // Level 4 - "aaaab...baaaa" - "aaaag...gaaaa" - "bgbgb...bgbgb" - "............." - "............." - "............." - "bgbb.....bbgb" - "aabbb...bbbaa" - "aag.......gaa" - "aag.......gaa" - "aagggggggggaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmma...ammmm" + /* 1 */ "mmmmf...fmmmm" + /* 2 */ "afafa...afafa" + /* 3 */ "............." + /* 4 */ "............." + /* 5 */ "............." + /* 6 */ "afaa.....aafa" + /* 7 */ "mmaaa...aaamm" + /* 8 */ "mm.........mm" + /* 9 */ "mm.........mm" + /* 10 */ "mm.........mm" // Level 5 - "aaaab...baaaa" - "aaaag...gaaaa" - "bgbgb...bgbgb" - "............." - "............." - "............." - "bgbb.....bbgb" - "aabbb...bbbaa" - "aa.........aa" - "aa.........aa" - "aa.........aa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmma...ammmm" + /* 1 */ "mmmmf...fmmmm" + /* 2 */ "afafa...afafa" + /* 3 */ "............." + /* 4 */ "............." + /* 5 */ "............." + /* 6 */ "afaa.....aafa" + /* 7 */ "mmaaa...aaamm" + /* 8 */ "mm.........mm" + /* 9 */ "mm.........mm" + /* 10 */ "mm.........mm" // Level 6 - "aaaab...baaaa" - "aaaag...gaaaa" - "bgbgb...bgbgb" - "............." - "............." - "............." - "bgbb.....bbgb" - "aabbb...bbbaa" - "aa.........aa" - "aa.........aa" - "aa.........aa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmmgaaahmmmm" + /* 1 */ "mmmmgaaahmmmm" + /* 2 */ "iiiiiaaaiiiii" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaa" + /* 6 */ "jjgaaaaaaajjj" + /* 7 */ "mmgjjjjjjjhmm" + /* 8 */ "mmmmmmmmmmmmm" + /* 9 */ "mmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmm", + + // Connectors: + "1: 12, 2, 4: 5\n" /* Type 1, direction X+ */ + "1: 6, 2, 0: 2\n" /* Type 1, direction Z- */ + "1: 0, 2, 4: 4\n" /* Type 1, direction X- */, - // Level 7 - "aaaahbbbiaaaa" - "aaaahbbbiaaaa" - "jjjjjbbbjjjjj" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" - "bbbbbbbbbbbbb" - "kkhbbbbbbbkkk" - "aahkkkkkkkiaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa", - - // Connections: - "1: 0, 2, 4: 4\n" /* Type 1, BLOCK_FACE_XM */ - "1: 12, 2, 4: 5\n" /* Type 1, BLOCK_FACE_XP */ - "1: 6, 2, 0: 2\n" /* Type 1, BLOCK_FACE_ZM */, - // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // BalconyTee2 + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // BlazePlatform - // The data has been exported from gallery Nether, area index 26, ID 276 + // BlazePlatform: + // The data has been exported from the gallery Nether, area index 26, ID 276, created by tonibm1999 { // Size: 10, 7, 7, // SizeX = 10, SizeY = 7, SizeZ = 7 @@ -268,86 +293,102 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ "b: 52: 0\n" /* mobspawner */ - "c:113: 0\n" /* netherbrickfence */, + "c:113: 0\n" /* netherbrickfence */ + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* */ + /* * 0123456789 */ + /* 0 */ "mmmmmmmmmm" + /* 1 */ "aaaaaaaaaa" + /* 2 */ "aaaaaaaaaa" + /* 3 */ "aaaaaaaaaa" + /* 4 */ "aaaaaaaaaa" + /* 5 */ "aaaaaaaaaa" + /* 6 */ "mmmmmmmmmm" + // Level 1 - ".........." - "aaaaaaaaaa" - "aaaaaaaaaa" - "aaaaaaaaaa" - "aaaaaaaaaa" - "aaaaaaaaaa" - ".........." + /* z\x* */ + /* * 0123456789 */ + /* 0 */ "mmmmmmmmmm" + /* 1 */ "aaaaaaaaaa" + /* 2 */ "..aaaaaaaa" + /* 3 */ "..aaaaaaaa" + /* 4 */ "..aaaaaaaa" + /* 5 */ "aaaaaaaaaa" + /* 6 */ "mmmmmmmmmm" // Level 2 - ".........." - "aaaaaaaaaa" - "..aaaaaaaa" - "..aaaaaaaa" - "..aaaaaaaa" - "aaaaaaaaaa" - ".........." + /* z\x* */ + /* * 0123456789 */ + /* 0 */ "mmmmaaaaaa" + /* 1 */ "aaaaaaaaaa" + /* 2 */ "...aaaaaaa" + /* 3 */ "...aaaaaaa" + /* 4 */ "...aaaaaaa" + /* 5 */ "aaaaaaaaaa" + /* 6 */ "mmmmaaaaaa" // Level 3 - "....aaaaaa" - "aaaaaaaaaa" - "...aaaaaaa" - "...aaaaaaa" - "...aaaaaaa" - "aaaaaaaaaa" - "....aaaaaa" + /* z\x* */ + /* * 0123456789 */ + /* 0 */ "mmmmaaaaaa" + /* 1 */ "mmaaa....a" + /* 2 */ ".........a" + /* 3 */ "......b..a" + /* 4 */ ".........a" + /* 5 */ "mmaaa....a" + /* 6 */ "mmmmaaaaaa" // Level 4 - "....aaaaaa" - "..aaa....a" - ".........a" - "......b..a" - ".........a" - "..aaa....a" - "....aaaaaa" + /* z\x* */ + /* * 0123456789 */ + /* 0 */ "mmmmcccccc" + /* 1 */ "mmmcc....c" + /* 2 */ ".........c" + /* 3 */ ".........c" + /* 4 */ ".........c" + /* 5 */ "mmmcc....c" + /* 6 */ "mmmmcccccc" // Level 5 - "....cccccc" - "...cc....c" - ".........c" - ".........c" - ".........c" - "...cc....c" - "....cccccc" + /* z\x* */ + /* * 0123456789 */ + /* 0 */ "mmmmmmmmmm" + /* 1 */ "mmmmm....c" + /* 2 */ "m........c" + /* 3 */ "m........c" + /* 4 */ "m........c" + /* 5 */ "mmmmm....c" + /* 6 */ "mmmmmmmmmm" // Level 6 - ".........." - ".........c" - ".........c" - ".........c" - ".........c" - ".........c" - ".........." + /* z\x* */ + /* * 0123456789 */ + /* 0 */ "mmmmmmmmmm" + /* 1 */ "mmmmm....m" + /* 2 */ "mm.......c" + /* 3 */ "mm.......c" + /* 4 */ "mm.......c" + /* 5 */ "mmmmm....m" + /* 6 */ "mmmmmmmmmm", - // Level 7 - ".........." - ".........." - ".........c" - ".........c" - ".........c" - ".........." - "..........", + // Connectors: + "0: 0, 1, 3: 4\n" /* Type 0, direction X- */, - // Connections: - "0: 0, 1, 3: 4\n" /* Type 0, BLOCK_FACE_XM */, - // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // BlazePlatform + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // BlazePlatformOverhang: - // The data has been exported from gallery Nether, area index 20, ID 162 + // The data has been exported from the gallery Nether, area index 20, ID 162, created by STR_Warrior { // Size: 14, 9, 7, // SizeX = 14, SizeY = 9, SizeZ = 7 @@ -366,101 +407,304 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "mmmmmmmmmmmmmm" + /* 1 */ "mmmmmmmmmmmmmm" + /* 2 */ "aammmmmmmmmmmm" + /* 3 */ "aammmmmmmmmmmm" + /* 4 */ "aammmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmm" + // Level 1 - "mmmmmmmmmmmmmm" - "mmmmmmmmmmmmmm" - "aammmmmmmmmmmm" - "aammmmmmmmmmmm" - "aammmmmmmmmmmm" - "mmmmmmmmmmmmmm" - "mmmmmmmmmmmmmm" + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "mmmmmmmmmmmmmm" + /* 1 */ "mmmmmmmmmmmmmm" + /* 2 */ "aabcmmmmmmmmmm" + /* 3 */ "aabcmmmmmmmmmm" + /* 4 */ "aabcmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmm" // Level 2 - "mmmmmmmmmmmmmm" - "mmmmmmmmmmmmmm" - "aabcmmmmmmmmmm" - "aabcmmmmmmmmmm" - "aabcmmmmmmmmmm" - "mmmmmmmmmmmmmm" - "mmmmmmmmmmmmmm" + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "mmmmmmmmmmmmmm" + /* 1 */ "mmmmmmmmmmmmmm" + /* 2 */ "aaaaabmmmmmmmm" + /* 3 */ "aaaaabmmmmmmmm" + /* 4 */ "aaaaabmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmm" // Level 3 - "mmmmmmmmmmmmmm" - "mmmmmmmmmmmmmm" - "aaaaabmmmmmmmm" - "aaaaabmmmmmmmm" - "aaaaabmmmmmmmm" - "mmmmmmmmmmmmmm" - "mmmmmmmmmmmmmm" + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "mmmmmmmmmmmmmm" + /* 1 */ "dddddddmmmmmmm" + /* 2 */ "aaaaaabmmmmmmm" + /* 3 */ "aaaaaabmmmmmmm" + /* 4 */ "aaaaaabmmmmmmm" + /* 5 */ "eeeeeeemmmmmmm" + /* 6 */ "mmmmmmmmmmmmmm" // Level 4 - "mmmmmmmmmmmmmm" - "dddddddmmmmmmm" - "aaaaaabmmmmmmm" - "aaaaaabmmmmmmm" - "aaaaaabmmmmmmm" - "eeeeeeemmmmmmm" - "mmmmmmmmmmmmmm" + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "mmmmmmmmmmmmmm" + /* 1 */ "aaaaaaadmmmmmm" + /* 2 */ "aaaaaaabmmmmmm" + /* 3 */ "aaaaaaabmmmmmm" + /* 4 */ "aaaaaaabmmmmmm" + /* 5 */ "aaaaaaaemmmmmm" + /* 6 */ "mmmmmmmmmmmmmm" // Level 5 - "mmmmmmmmmmmmmm" - "aaaaaaadmmmmmm" - "aaaaaaabmmmmmm" - "aaaaaaabmmmmmm" - "aaaaaaabmmmmmm" - "aaaaaaaemmmmmm" - "mmmmmmmmmmmmmm" + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "mmmmmmmmmmmmmm" + /* 1 */ "aaaaaaaabddddm" + /* 2 */ "......faaaaabm" + /* 3 */ "......faaaaabm" + /* 4 */ "......faaaaabm" + /* 5 */ "aaaaaaaaabeebm" + /* 6 */ "mmmmmmmmmmmmmm" // Level 6 - "mmmmmmmmmmmmmm" - "aaaaaaaabddddm" - "......faaaaabm" - "......faaaaabm" - "......faaaaabm" - "aaaaaaaaabeebm" - "mmmmmmmmmmmmmm" + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "mmmmmmmmgdddbm" + /* 1 */ "mmmmmmaaaaaaad" + /* 2 */ ".......faaaaab" + /* 3 */ ".......faaaaab" + /* 4 */ ".......faaaaab" + /* 5 */ "mmmmmmaaaaaaae" + /* 6 */ "mmmmmmmmgeeebm" // Level 7 - "mmmmmmmmgdddbm" - "......aaaaaaad" - ".......faaaaab" - ".......faaaaab" - ".......faaaaab" - "......aaaaaaae" - "mmmmmmmmgeeebm" + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "mmmmmmmmaaaaam" + /* 1 */ "mmmmmmhaa...aa" + /* 2 */ ".............a" + /* 3 */ "..........i..a" + /* 4 */ ".............a" + /* 5 */ "mmmmmmhaa...aa" + /* 6 */ "mmmmmmmmaaaaam" // Level 8 - "mmmmmmmmaaaaam" - "......haa...aa" - ".............a" - "..........i..a" - ".............a" - "......haa...aa" - "mmmmmmmmaaaaam" + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "mmmmmmmmhhhhhm" + /* 1 */ "mmmmmmhhh...hh" + /* 2 */ ".............h" + /* 3 */ ".............h" + /* 4 */ ".............h" + /* 5 */ "mmmmmmhhh...hh" + /* 6 */ "mmmmmmmmhhhhhm", - // Level 9 - "mmmmmmmmhhhhhm" - "......hhh...hh" - ".............h" - ".............h" - ".............h" - "......hhh...hh" - "mmmmmmmmhhhhhm", - - // Connections: - "0: 0, 5, 3: 4\n" /* Type 0, BLOCK_FACE_XM */, + // Connectors: + "0: 0, 5, 3: 4\n" /* Type 0, direction X- */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // BlazePlatformOverhang + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // BridgeCircleCrossing: + // The data has been exported from the gallery Nether, area index 49, ID 308, created by Aloe_vera + { + // Size: + 15, 8, 15, // SizeX = 15, SizeY = 8, SizeZ = 15 + + // Block definitions: + ".: 0: 0\n" /* air */ + "a:112: 0\n" /* netherbrick */ + "b:114: 7\n" /* netherbrickstairs */ + "c:114: 5\n" /* netherbrickstairs */ + "d:114: 4\n" /* netherbrickstairs */ + "e:114: 6\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, + + // Block data: + // Level 0 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmaaammmmmm" + /* 1 */ "mmmmmmaaammmmmm" + /* 2 */ "mmmmmmmmmmmmmmm" + /* 3 */ "mmmmmmmmmmmmmmm" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "aammmmmmmmmmmaa" + /* 7 */ "aammmmmmmmmmmaa" + /* 8 */ "aammmmmmmmmmmaa" + /* 9 */ "mmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmm" + /* 12 */ "mmmmmmmmmmmmmmm" + /* 13 */ "mmmmmmaaammmmmm" + /* 14 */ "mmmmmmaaammmmmm" + + // Level 1 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmaaammmmmm" + /* 1 */ "mmmmmmaaammmmmm" + /* 2 */ "mmmmmmbbbmmmmmm" + /* 3 */ "mmmmmmmmmmmmmmm" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "aacmmmmmmmmmdaa" + /* 7 */ "aacmmmmmmmmmdaa" + /* 8 */ "aacmmmmmmmmmdaa" + /* 9 */ "mmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmm" + /* 12 */ "mmmmmmeeemmmmmm" + /* 13 */ "mmmmmmaaammmmmm" + /* 14 */ "mmmmmmaaammmmmm" + + // Level 2 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmaaammmmmm" + /* 1 */ "mmmmmeaaammmmmm" + /* 2 */ "mmmmmdaaammmmmm" + /* 3 */ "mmmmmdbbbmmmmmm" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mdeemmmmmmmeecm" + /* 6 */ "aaacmmmmmmmdaaa" + /* 7 */ "aaacmmmmmmmdaaa" + /* 8 */ "aaacmmmmmmmdaaa" + /* 9 */ "mdbcmmmmmmmbbcm" + /* 10 */ "mmmmmmmmmmmmmmm" + /* 11 */ "mmmmmdeeecmmmmm" + /* 12 */ "mmmmmdaaacmmmmm" + /* 13 */ "mmmmmbaaabmmmmm" + /* 14 */ "mmmmmmaaammmmmm" + + // Level 3 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "deeeedaaaceeeec" + /* 1 */ "daaaaaaaaaaaaac" + /* 2 */ "daaaaaaaaaaaaac" + /* 3 */ "daaaaaaaaaaaaac" + /* 4 */ "daaacbbaabdaaac" + /* 5 */ "eaaacmmmmmdaaae" + /* 6 */ "aaaacmmmmmdaaaa" + /* 7 */ "aaaacmmmmmdaaaa" + /* 8 */ "aaaacmmmmmdaaaa" + /* 9 */ "baaacmmmmmdaaab" + /* 10 */ "daaaceeeeedaaac" + /* 11 */ "daaaaaaaaaaaaac" + /* 12 */ "daaaaaaaaaaaaac" + /* 13 */ "daaaaaaaaaaaaac" + /* 14 */ "dbbbbdaaacbbbbb" + + // Level 4 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaaaa" + /* 5 */ "aaaaammmmmaaaaa" + /* 6 */ "aaaaammmmmaaaaa" + /* 7 */ "aaaaammmmmaaaaa" + /* 8 */ "aaaaammmmmaaaaa" + /* 9 */ "aaaaammmmmaaaaa" + /* 10 */ "aaaaaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaaaaa" + /* 13 */ "aaaaaaaaaaaaaaa" + /* 14 */ "aaaaaaaaaaaaaaa" + + // Level 5 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaa...aaaaaa" + /* 1 */ "a.............a" + /* 2 */ "a.............a" + /* 3 */ "a.............a" + /* 4 */ "a...aaaaaaa...a" + /* 5 */ "a...ammmmma...a" + /* 6 */ "....ammmmma...." + /* 7 */ "....ammmmma...." + /* 8 */ "....ammmmma...." + /* 9 */ "a...ammmmma...a" + /* 10 */ "a...aaaaaaa...a" + /* 11 */ "a.............a" + /* 12 */ "a.............a" + /* 13 */ "a.............a" + /* 14 */ "aaaaaa...aaaaaa" + + // Level 6 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmm...mmmmmm" + /* 1 */ "m.............m" + /* 2 */ "m.............m" + /* 3 */ "m.............m" + /* 4 */ "m.............m" + /* 5 */ "m....mmmmm....m" + /* 6 */ ".....mmmmm....." + /* 7 */ ".....mmmmm....." + /* 8 */ ".....mmmmm....." + /* 9 */ "m....mmmmm....m" + /* 10 */ "m.............m" + /* 11 */ "m.............m" + /* 12 */ "m.............m" + /* 13 */ "m.............m" + /* 14 */ "mmmmmm...mmmmmm" + + // Level 7 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmm...mmmmmm" + /* 1 */ "m.............m" + /* 2 */ "m.............m" + /* 3 */ "m.............m" + /* 4 */ "m.............m" + /* 5 */ "m....mmmmm....m" + /* 6 */ ".....mmmmm....." + /* 7 */ ".....mmmmm....." + /* 8 */ ".....mmmmm....." + /* 9 */ "m....mmmmm....m" + /* 10 */ "m.............m" + /* 11 */ "m.............m" + /* 12 */ "m.............m" + /* 13 */ "m.............m" + /* 14 */ "mmmmmm...mmmmmm", + + // Connectors: + "0: 0, 5, 7: 4\n" /* Type 0, direction X- */ + "0: 7, 5, 0: 2\n" /* Type 0, direction Z- */ + "0: 14, 5, 7: 5\n" /* Type 0, direction X+ */ + "0: 7, 5, 14: 3\n" /* Type 0, direction Z+ */, + + // AllowedRotations: + 7, /* 1, 2, 3 CCW rotations */ + + // Merge strategy: + cBlockArea::msSpongePrint, + }, // BridgeCircleCrossing + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // BridgeCrossing: - // The data has been exported from gallery Nether, area index 17, ID 159 + // The data has been exported from the gallery Nether, area index 17, ID 159, created by Aloe_vera { // Size: 15, 8, 15, // SizeX = 15, SizeY = 8, SizeZ = 15 @@ -476,297 +720,811 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmaaammmmmm" + /* 1 */ "mmmmmmaaammmmmm" + /* 2 */ "mmmmmmmmmmmmmmm" + /* 3 */ "mmmmmmmmmmmmmmm" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "aammmmmmmmmmmaa" + /* 7 */ "aammmmmmmmmmmaa" + /* 8 */ "aammmmmmmmmmmaa" + /* 9 */ "mmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmm" + /* 12 */ "mmmmmmmmmmmmmmm" + /* 13 */ "mmmmmmaaammmmmm" + /* 14 */ "mmmmmmaaammmmmm" + // Level 1 - "mmmmmmaaammmmmm" - "mmmmmmaaammmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "aammmmmmmmmmmaa" - "aammmmmmmmmmmaa" - "aammmmmmmmmmmaa" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmaaammmmmm" - "mmmmmmaaammmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmaaammmmmm" + /* 1 */ "mmmmmmaaammmmmm" + /* 2 */ "mmmmmmbbbmmmmmm" + /* 3 */ "mmmmmmmmmmmmmmm" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "aacmmmmmmmmmdaa" + /* 7 */ "aacmmmmmmmmmdaa" + /* 8 */ "aacmmmmmmmmmdaa" + /* 9 */ "mmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmm" + /* 12 */ "mmmmmmeeemmmmmm" + /* 13 */ "mmmmmmaaammmmmm" + /* 14 */ "mmmmmmaaammmmmm" // Level 2 - "mmmmmmaaammmmmm" - "mmmmmmaaammmmmm" - "mmmmmmbbbmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "aacmmmmmmmmmdaa" - "aacmmmmmmmmmdaa" - "aacmmmmmmmmmdaa" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmeeemmmmmm" - "mmmmmmaaammmmmm" - "mmmmmmaaammmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmaaammmmmm" + /* 1 */ "mmmmmmaaammmmmm" + /* 2 */ "mmmmmmaaammmmmm" + /* 3 */ "mmmmmmbbbmmmmmm" + /* 4 */ "mmmmmmfffmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "aaacfmmmmmfdaaa" + /* 7 */ "aaacfmmmmmfdaaa" + /* 8 */ "aaacfmmmmmfdaaa" + /* 9 */ "mmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmfffmmmmmm" + /* 11 */ "mmmmmmeeemmmmmm" + /* 12 */ "mmmmmmaaammmmmm" + /* 13 */ "mmmmmmaaammmmmm" + /* 14 */ "mmmmmmaaammmmmm" // Level 3 - "mmmmmmaaammmmmm" - "mmmmmmaaammmmmm" - "mmmmmmaaammmmmm" - "mmmmmmbbbmmmmmm" - "mmmmmmfffmmmmmm" - "mmmmmmmmmmmmmmm" - "aaacfmmmmmfdaaa" - "aaacfmmmmmfdaaa" - "aaacfmmmmmfdaaa" - "mmmmmmmmmmmmmmm" - "mmmmmmfffmmmmmm" - "mmmmmmeeemmmmmm" - "mmmmmmaaammmmmm" - "mmmmmmaaammmmmm" - "mmmmmmaaammmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmdaaacmmmmm" + /* 1 */ "mmmmmdaaacmmmmm" + /* 2 */ "mmmmmdaaacmmmmm" + /* 3 */ "mmmmmdaaacmmmmm" + /* 4 */ "mmmmmdaaacmmmmm" + /* 5 */ "eeeeeeaaaeeeeee" + /* 6 */ "aaaaaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaaaaa" + /* 8 */ "aaaaaaaaaaaaaaa" + /* 9 */ "bbbbbdaaacbbbbb" + /* 10 */ "mmmmmdaaacmmmmm" + /* 11 */ "mmmmmdaaacmmmmm" + /* 12 */ "mmmmmdaaacmmmmm" + /* 13 */ "mmmmmdaaacmmmmm" + /* 14 */ "mmmmmdaaacmmmmm" // Level 4 - "mmmmmdaaacmmmmm" - "mmmmmdaaacmmmmm" - "mmmmmdaaacmmmmm" - "mmmmmdaaacmmmmm" - "mmmmmdaaacmmmmm" - "eeeeeeaaaeeeeee" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "bbbbbdaaacbbbbb" - "mmmmmdaaacmmmmm" - "mmmmmdaaacmmmmm" - "mmmmmdaaacmmmmm" - "mmmmmdaaacmmmmm" - "mmmmmdaaacmmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmaaaaammmmm" + /* 1 */ "mmmmmaaaaammmmm" + /* 2 */ "mmmmmaaaaammmmm" + /* 3 */ "mmmmmaaaaammmmm" + /* 4 */ "mmmmmaaaaammmmm" + /* 5 */ "aaaaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaaaaa" + /* 8 */ "aaaaaaaaaaaaaaa" + /* 9 */ "aaaaaaaaaaaaaaa" + /* 10 */ "mmmmmaaaaammmmm" + /* 11 */ "mmmmmaaaaammmmm" + /* 12 */ "mmmmmaaaaammmmm" + /* 13 */ "mmmmmaaaaammmmm" + /* 14 */ "mmmmmaaaaammmmm" // Level 5 - "mmmmmaaaaammmmm" - "mmmmmaaaaammmmm" - "mmmmmaaaaammmmm" - "mmmmmaaaaammmmm" - "mmmmmaaaaammmmm" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "mmmmmaaaaammmmm" - "mmmmmaaaaammmmm" - "mmmmmaaaaammmmm" - "mmmmmaaaaammmmm" - "mmmmmaaaaammmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmma...ammmmm" + /* 1 */ "mmmmma...ammmmm" + /* 2 */ "mmmmma...ammmmm" + /* 3 */ "mmmmma...ammmmm" + /* 4 */ "mmmmma...ammmmm" + /* 5 */ "aaaaaa...aaaaaa" + /* 6 */ "..............." + /* 7 */ "..............." + /* 8 */ "..............." + /* 9 */ "aaaaaa...aaaaaa" + /* 10 */ "mmmmma...ammmmm" + /* 11 */ "mmmmma...ammmmm" + /* 12 */ "mmmmma...ammmmm" + /* 13 */ "mmmmma...ammmmm" + /* 14 */ "mmmmma...ammmmm" // Level 6 - "mmmmma...ammmmm" - "mmmmma...ammmmm" - "mmmmma...ammmmm" - "mmmmma...ammmmm" - "mmmmma...ammmmm" - "aaaaaa...aaaaaa" - "..............." - "..............." - "..............." - "aaaaaa...aaaaaa" - "mmmmma...ammmmm" - "mmmmma...ammmmm" - "mmmmma...ammmmm" - "mmmmma...ammmmm" - "mmmmma...ammmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmm...mmmmmm" + /* 1 */ "mmmmmm...mmmmmm" + /* 2 */ "mmmmmm...mmmmmm" + /* 3 */ "mmmmmm...mmmmmm" + /* 4 */ "mmmmmm...mmmmmm" + /* 5 */ "mmmmmm...mmmmmm" + /* 6 */ "..............." + /* 7 */ "..............." + /* 8 */ "..............." + /* 9 */ "mmmmmm...mmmmmm" + /* 10 */ "mmmmmm...mmmmmm" + /* 11 */ "mmmmmm...mmmmmm" + /* 12 */ "mmmmmm...mmmmmm" + /* 13 */ "mmmmmm...mmmmmm" + /* 14 */ "mmmmmm...mmmmmm" // Level 7 - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "..............." - "..............." - "..............." - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmm...mmmmmm" + /* 1 */ "mmmmmm...mmmmmm" + /* 2 */ "mmmmmm...mmmmmm" + /* 3 */ "mmmmmm...mmmmmm" + /* 4 */ "mmmmmm...mmmmmm" + /* 5 */ "mmmmmm...mmmmmm" + /* 6 */ "..............." + /* 7 */ "..............." + /* 8 */ "..............." + /* 9 */ "mmmmmm...mmmmmm" + /* 10 */ "mmmmmm...mmmmmm" + /* 11 */ "mmmmmm...mmmmmm" + /* 12 */ "mmmmmm...mmmmmm" + /* 13 */ "mmmmmm...mmmmmm" + /* 14 */ "mmmmmm...mmmmmm", - // Level 8 - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "..............." - "..............." - "..............." - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm", - - // Connections: - "0: 0, 5, 7: 4\n" /* Type 0, BLOCK_FACE_XM */ - "0: 7, 5, 0: 2\n" /* Type 0, BLOCK_FACE_ZM */ - "0: 14, 5, 7: 5\n" /* Type 0, BLOCK_FACE_XP */ - "0: 7, 5, 14: 3\n" /* Type 0, BLOCK_FACE_ZP */, + // Connectors: + "0: 0, 5, 7: 4\n" /* Type 0, direction X- */ + "0: 7, 5, 0: 2\n" /* Type 0, direction Z- */ + "0: 7, 5, 14: 3\n" /* Type 0, direction Z+ */ + "0: 14, 5, 7: 5\n" /* Type 0, direction X+ */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // BridgeCrossing + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // BridgeCrumble1: - // The data has been exported from gallery Nether, area index 19, ID 161 + // The data has been exported from the gallery Nether, area index 19, ID 161, created by Aloe_vera { // Size: 9, 6, 5, // SizeX = 9, SizeY = 6, SizeZ = 5 // Block definitions: - ".: 19: 0\n" /* sponge */ + ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ "b:114: 5\n" /* netherbrickstairs */ "c: 44:14\n" /* step */ "d:114: 6\n" /* netherbrickstairs */ - "e:114: 7\n" /* netherbrickstairs */, + "e:114: 7\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 012345678 */ + /* 0 */ "mmmmmmmmm" + /* 1 */ "aammmmmmm" + /* 2 */ "aammmmmmm" + /* 3 */ "aammmmmmm" + /* 4 */ "mmmmmmmmm" + // Level 1 - "........." - "aa......." - "aa......." - "aa......." - "........." + /* z\x* 012345678 */ + /* 0 */ "mmmmmmmmm" + /* 1 */ "aabmmmmmm" + /* 2 */ "aabmmmmmm" + /* 3 */ "aabmmmmmm" + /* 4 */ "mmmmmmmmm" // Level 2 - "........." - "aab......" - "aab......" - "aab......" - "........." + /* z\x* 012345678 */ + /* 0 */ "mmmmmmmmm" + /* 1 */ "aaabcmmmm" + /* 2 */ "aaabcmmmm" + /* 3 */ "aaabcmmmm" + /* 4 */ "mmmmmmmmm" // Level 3 - "........." - "aaabc...." - "aaabc...." - "aaabc...." - "........." + /* z\x* 012345678 */ + /* 0 */ "dddddddmm" + /* 1 */ "aaaaaaaam" + /* 2 */ "aaaaaaaaa" + /* 3 */ "aaaaaaamm" + /* 4 */ "eeeeemmmm" // Level 4 - "ddddddd.." - "aaaaaaaa." - "aaaaaaaaa" - "aaaaaaa.." - "eeeee...." + /* z\x* 012345678 */ + /* 0 */ "aaaaaaaaa" + /* 1 */ "aaaaammmm" + /* 2 */ "aaaaaammm" + /* 3 */ "aaaaaammm" + /* 4 */ "aaaaaaaam" // Level 5 - "aaaaaaaaa" - "aaaaa...." - "aaaaaa..." - "aaaaaa..." - "aaaaaaaa." + /* z\x* 012345678 */ + /* 0 */ "aaaaaammm" + /* 1 */ "mmmmmmmmm" + /* 2 */ "mmmmmmmmm" + /* 3 */ "mmmmmmmmm" + /* 4 */ "aaaaaaamm", - // Level 6 - "aaaaaa..." - "........." - "........." - "........." - "aaaaaaa..", - - // Connections: - "0: 0, 5, 2: 4\n" /* Type 0, BLOCK_FACE_XM */, + // Connectors: + "1: 0, 5, 2: 4\n" /* Type 1, direction X- */ + "0: 0, 5, 2: 4\n" /* Type 0, direction X- */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // BridgeCrumble1 + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // BridgeCrumble2 - // The data has been exported from gallery Nether, area index 18, ID 160 + // BridgeCrumble2: + // The data has been exported from the gallery Nether, area index 18, ID 160, created by Aloe_vera { // Size: 13, 6, 5, // SizeX = 13, SizeY = 6, SizeZ = 5 // Block definitions: - ".: 19: 0\n" /* sponge */ + ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ "b:114: 5\n" /* netherbrickstairs */ "c: 44:14\n" /* step */ "d:114: 6\n" /* netherbrickstairs */ - "e:114: 7\n" /* netherbrickstairs */, + "e:114: 7\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmmmmmmmmmmm" + /* 1 */ "aammmmmmmmmmm" + /* 2 */ "aammmmmmmmmmm" + /* 3 */ "aammmmmmmmmmm" + /* 4 */ "mmmmmmmmmmmmm" + // Level 1 - "............." - "aa..........." - "aa..........." - "aa..........." - "............." + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmmmmmmmmmmm" + /* 1 */ "aabmmmmmmmmmm" + /* 2 */ "aabmmmmmmmmmm" + /* 3 */ "aabmmmmmmmmmm" + /* 4 */ "mmmmmmmmmmmmm" // Level 2 - "............." - "aab.........." - "aab.........." - "aab.........." - "............." + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmmmmmmmmmmm" + /* 1 */ "aaabcmmmmmmmm" + /* 2 */ "aaabcmmmmmmmm" + /* 3 */ "aaabcmmmmmmmm" + /* 4 */ "mmmmmmmmmmmmm" // Level 3 - "............." - "aaabc........" - "aaabc........" - "aaabc........" - "............." + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "dddddddddmmmm" + /* 1 */ "aaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaammmm" + /* 3 */ "aaaaaaaaaaaam" + /* 4 */ "eeeeeeeeemmmm" // Level 4 - "ddddddddd...." - "aaaaaaaaaaaaa" - "aaaaaaaaa...." - "aaaaaaaaaaaa." - "eeeeeeeee...." + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaam" + /* 1 */ "aaaaaaaaaammm" + /* 2 */ "aaaaaaaaaaamm" + /* 3 */ "aaaaaaaaammmm" + /* 4 */ "aaaaaaaaaaaaa" // Level 5 - "aaaaaaaaaaaa." - "aaaaaaaaaa..." - "aaaaaaaaaaa.." - "aaaaaaaaa...." - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaammmm" + /* 1 */ "mmmmmmmmmmmmm" + /* 2 */ "mmmmmmmmmmmmm" + /* 3 */ "mmmmmmmmmmmmm" + /* 4 */ "aaaaaaaaaammm", - // Level 6 - "aaaaaaaaa...." - "............." - "............." - "............." - "aaaaaaaaaa...", - - // Connections: - "0: 0, 5, 2: 4\n" /* Type 0, BLOCK_FACE_XM */, + // Connectors: + "0: 0, 5, 2: 4\n" /* Type 0, direction X- */ + "1: 0, 5, 2: 4\n" /* Type 1, direction X- */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // BridgeCrumble2 + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // BridgeDoubleCrumble: + // The data has been exported from the gallery Nether, area index 46, ID 305, created by STR_Warrior + { + // Size: + 5, 7, 16, // SizeX = 5, SizeY = 7, SizeZ = 16 + + // Block definitions: + ".: 0: 0\n" /* air */ + "a:112: 0\n" /* netherbrick */ + "b:114: 7\n" /* netherbrickstairs */ + "c:114: 6\n" /* netherbrickstairs */ + "d:114: 4\n" /* netherbrickstairs */ + "e:114: 5\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, + + // Block data: + // Level 0 + /* z\x* 01234 */ + /* 0 */ "maaam" + /* 1 */ "maaam" + /* 2 */ "mmmmm" + /* 3 */ "mmmmm" + /* 4 */ "mmmmm" + /* 5 */ "mmmmm" + /* 6 */ "mmmmm" + /* 7 */ "mmmmm" + /* 8 */ "mmmmm" + /* 9 */ "mmmmm" + /* 10 */ "mmmmm" + /* 11 */ "mmmmm" + /* 12 */ "mmmmm" + /* 13 */ "mmmmm" + /* 14 */ "maaam" + /* 15 */ "maaam" + + // Level 1 + /* z\x* 01234 */ + /* 0 */ "maaam" + /* 1 */ "maaam" + /* 2 */ "mbbbm" + /* 3 */ "mmmmm" + /* 4 */ "mmmmm" + /* 5 */ "mmmmm" + /* 6 */ "mmmmm" + /* 7 */ "mmmmm" + /* 8 */ "mmmmm" + /* 9 */ "mmmmm" + /* 10 */ "mmmmm" + /* 11 */ "mmmmm" + /* 12 */ "mmmmm" + /* 13 */ "mcccm" + /* 14 */ "maaam" + /* 15 */ "maaam" + + // Level 2 + /* z\x* 01234 */ + /* 0 */ "daaae" + /* 1 */ "daaae" + /* 2 */ "daaae" + /* 3 */ "daaae" + /* 4 */ "daaae" + /* 5 */ "mamae" + /* 6 */ "mmmam" + /* 7 */ "mmmmm" + /* 8 */ "mmmmm" + /* 9 */ "mmmmm" + /* 10 */ "mmmae" + /* 11 */ "dmaae" + /* 12 */ "daaae" + /* 13 */ "daaae" + /* 14 */ "daaae" + /* 15 */ "daaae" + + // Level 3 + /* z\x* 01234 */ + /* 0 */ "aaaaa" + /* 1 */ "aaaaa" + /* 2 */ "aaaaa" + /* 3 */ "aaama" + /* 4 */ "mamaa" + /* 5 */ "mmmmm" + /* 6 */ "mmmmm" + /* 7 */ "mmmmm" + /* 8 */ "mmmmm" + /* 9 */ "mmmmm" + /* 10 */ "mmmma" + /* 11 */ "mmmaa" + /* 12 */ "amaaa" + /* 13 */ "aaaaa" + /* 14 */ "aaaaa" + /* 15 */ "aaaaa" + + // Level 4 + /* z\x* 01234 */ + /* 0 */ "ammma" + /* 1 */ "ammma" + /* 2 */ "ammma" + /* 3 */ "mmmma" + /* 4 */ "mmmmm" + /* 5 */ "mmmmm" + /* 6 */ "mmmmm" + /* 7 */ "mmmmm" + /* 8 */ "mmmmm" + /* 9 */ "mmmmm" + /* 10 */ "mmmmm" + /* 11 */ "mmmma" + /* 12 */ "mmmmm" + /* 13 */ "ammma" + /* 14 */ "ammma" + /* 15 */ "ammma" + + // Level 5 + /* z\x* 01234 */ + /* 0 */ "mmmmm" + /* 1 */ "mmmmm" + /* 2 */ "mmmmm" + /* 3 */ "mmmmm" + /* 4 */ "mmmmm" + /* 5 */ "mmmmm" + /* 6 */ "mmmmm" + /* 7 */ "mmmmm" + /* 8 */ "mmmmm" + /* 9 */ "mmmmm" + /* 10 */ "mmmmm" + /* 11 */ "mmmmm" + /* 12 */ "mmmmm" + /* 13 */ "mmmmm" + /* 14 */ "mmmmm" + /* 15 */ "mmmmm" + + // Level 6 + /* z\x* 01234 */ + /* 0 */ "mmmmm" + /* 1 */ "mmmmm" + /* 2 */ "mmmmm" + /* 3 */ "mmmmm" + /* 4 */ "mmmmm" + /* 5 */ "mmmmm" + /* 6 */ "mmmmm" + /* 7 */ "mmmmm" + /* 8 */ "mmmmm" + /* 9 */ "mmmmm" + /* 10 */ "mmmmm" + /* 11 */ "mmmmm" + /* 12 */ "mmmmm" + /* 13 */ "mmmmm" + /* 14 */ "mmmmm" + /* 15 */ "mmmmm", + + // Connectors: + "0: 2, 4, 0: 2\n" /* Type 0, direction Z- */ + "0: 2, 4, 15: 3\n" /* Type 0, direction Z+ */, + + // AllowedRotations: + 7, /* 1, 2, 3 CCW rotations */ + + // Merge strategy: + cBlockArea::msSpongePrint, + }, // BridgeDoubleCrumble + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // BridgeLevelCrossing: + // The data has been exported from the gallery Nether, area index 45, ID 304, created by Aloe_vera + { + // Size: + 15, 14, 16, // SizeX = 15, SizeY = 14, SizeZ = 16 + + // Block definitions: + ".: 0: 0\n" /* air */ + "a:112: 0\n" /* netherbrick */ + "b:114: 6\n" /* netherbrickstairs */ + "c:114: 4\n" /* netherbrickstairs */ + "d:114: 5\n" /* netherbrickstairs */ + "e: 44:14\n" /* step */ + "f:114: 7\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, + + // Block data: + // Level 0 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "...........aaa." + /* 1 */ "aa.........aaaa" + /* 2 */ "aa...........aa" + /* 3 */ "aa...........aa" + /* 4 */ "..............." + /* 5 */ "..............." + /* 6 */ "..............." + /* 7 */ "..............." + /* 8 */ "..............." + /* 9 */ "..............." + /* 10 */ "..............." + /* 11 */ "..............." + /* 12 */ "..............." + /* 13 */ "..............." + /* 14 */ "...........aaa." + /* 15 */ "...........aaa." + + // Level 1 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "...........aaa." + /* 1 */ "aa.........aaaa" + /* 2 */ "aa...........aa" + /* 3 */ "aa...........aa" + /* 4 */ "..............." + /* 5 */ "..............." + /* 6 */ "..............." + /* 7 */ "..............." + /* 8 */ "..............." + /* 9 */ "..............." + /* 10 */ "..............." + /* 11 */ "..............." + /* 12 */ "..............." + /* 13 */ "..............." + /* 14 */ "...........aaa." + /* 15 */ "...........aaa." + + // Level 2 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "...........aaa." + /* 1 */ "aa.........aaaa" + /* 2 */ "aa...........aa" + /* 3 */ "aa...........aa" + /* 4 */ "..............." + /* 5 */ "..............." + /* 6 */ "..............." + /* 7 */ "..............." + /* 8 */ "..............." + /* 9 */ "..............." + /* 10 */ "..............." + /* 11 */ "..............." + /* 12 */ "..............." + /* 13 */ "...........bbb." + /* 14 */ "...........aaa." + /* 15 */ "...........aaa." + + // Level 3 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "..........caaad" + /* 1 */ "aa........caaaa" + /* 2 */ "aa........caaaa" + /* 3 */ "aa........caaaa" + /* 4 */ "...........aaad" + /* 5 */ "...........aaad" + /* 6 */ "...........aaad" + /* 7 */ "...........aaad" + /* 8 */ "...........aaad" + /* 9 */ "..........caaad" + /* 10 */ "..........caaad" + /* 11 */ "..........caaad" + /* 12 */ "..........caaad" + /* 13 */ "..........caaad" + /* 14 */ "..........caaad" + /* 15 */ "..........caaad" + + // Level 4 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "..........aaaaa" + /* 1 */ "aa........aaaaa" + /* 2 */ "aa........aaaaa" + /* 3 */ "aa........aaaaa" + /* 4 */ "..........aaaaa" + /* 5 */ "..........aaaaa" + /* 6 */ "..........aaaaa" + /* 7 */ "..........aaaaa" + /* 8 */ "..........aaaaa" + /* 9 */ "..........aaaaa" + /* 10 */ "..........aaaaa" + /* 11 */ "..........aaaaa" + /* 12 */ "..........aaaaa" + /* 13 */ "..........aaaaa" + /* 14 */ "..........aaaaa" + /* 15 */ "..........aaaaa" + + // Level 5 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "..........a...a" + /* 1 */ "aa........a...a" + /* 2 */ "aa........a...a" + /* 3 */ "aa........a...a" + /* 4 */ "..........a...a" + /* 5 */ "..........a...a" + /* 6 */ "........aaa...a" + /* 7 */ "........aa....a" + /* 8 */ "........aa....a" + /* 9 */ "........aa....a" + /* 10 */ "........aaa...a" + /* 11 */ "..........a...a" + /* 12 */ "..........a...a" + /* 13 */ "..........a...a" + /* 14 */ "..........a...a" + /* 15 */ "..........a...a" + + // Level 6 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "..............." + /* 1 */ "aa........a...a" + /* 2 */ "aa........a...a" + /* 3 */ "aa........a...a" + /* 4 */ "..............." + /* 5 */ "..............." + /* 6 */ "........aaa...." + /* 7 */ "....aaaaa......" + /* 8 */ "....aaaaa......" + /* 9 */ "....aaaaa......" + /* 10 */ "....aaaaaaa...." + /* 11 */ "..............." + /* 12 */ "..............." + /* 13 */ "..............." + /* 14 */ "..............." + /* 15 */ "..............." + + // Level 7 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "..............." + /* 1 */ "aad.......a...a" + /* 2 */ "aad.......a...a" + /* 3 */ "aad.......a...a" + /* 4 */ "..............." + /* 5 */ "..............." + /* 6 */ "....aaaaaa....." + /* 7 */ "....aaaa......." + /* 8 */ "....aaaa......." + /* 9 */ "....aaaa......." + /* 10 */ "....aaaaaa....." + /* 11 */ "..............." + /* 12 */ "..............." + /* 13 */ "..............." + /* 14 */ "..............." + /* 15 */ "..............." + + // Level 8 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "..............." + /* 1 */ "aaade.....a...a" + /* 2 */ "aaade.....a...a" + /* 3 */ "aaade.....a...a" + /* 4 */ "..............." + /* 5 */ "..............." + /* 6 */ "....aaaaa......" + /* 7 */ "....a.........." + /* 8 */ "....a.........." + /* 9 */ "....a.........." + /* 10 */ "....aaaa......." + /* 11 */ "..............." + /* 12 */ "..............." + /* 13 */ "..............." + /* 14 */ "..............." + /* 15 */ "..............." + + // Level 9 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "bbbbbbbbbbbbbbb" + /* 1 */ "aaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaa" + /* 4 */ "ffffffaaaffffff" + /* 5 */ "....aaaaa......" + /* 6 */ "....a...a......" + /* 7 */ "....a.........." + /* 8 */ "..............." + /* 9 */ "..............." + /* 10 */ "..............." + /* 11 */ "..............." + /* 12 */ "..............." + /* 13 */ "..............." + /* 14 */ "..............." + /* 15 */ "..............." + + // Level 10 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaaaa" + /* 5 */ "....a...a......" + /* 6 */ "....a...a......" + /* 7 */ "..............." + /* 8 */ "..............." + /* 9 */ "..............." + /* 10 */ "..............." + /* 11 */ "..............." + /* 12 */ "..............." + /* 13 */ "..............." + /* 14 */ "..............." + /* 15 */ "..............." + + // Level 11 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "..............." + /* 2 */ "..............." + /* 3 */ "..............." + /* 4 */ "aaaaa...aaaaaaa" + /* 5 */ "....a...a......" + /* 6 */ "..............." + /* 7 */ "..............." + /* 8 */ "..............." + /* 9 */ "..............." + /* 10 */ "..............." + /* 11 */ "..............." + /* 12 */ "..............." + /* 13 */ "..............." + /* 14 */ "..............." + /* 15 */ "..............." + + // Level 12 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "..............." + /* 1 */ "..............." + /* 2 */ "..............." + /* 3 */ "..............." + /* 4 */ "..............." + /* 5 */ "..............." + /* 6 */ "..............." + /* 7 */ "..............." + /* 8 */ "..............." + /* 9 */ "..............." + /* 10 */ "..............." + /* 11 */ "..............." + /* 12 */ "..............." + /* 13 */ "..............." + /* 14 */ "..............." + /* 15 */ "..............." + + // Level 13 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "..............." + /* 1 */ "..............." + /* 2 */ "..............." + /* 3 */ "..............." + /* 4 */ "..............." + /* 5 */ "..............." + /* 6 */ "..............." + /* 7 */ "..............." + /* 8 */ "..............." + /* 9 */ "..............." + /* 10 */ "..............." + /* 11 */ "..............." + /* 12 */ "..............." + /* 13 */ "..............." + /* 14 */ "..............." + /* 15 */ "...............", + + // Connectors: + "", + + // AllowedRotations: + 7, /* 1, 2, 3 CCW rotations */ + + // Merge strategy: + cBlockArea::msSpongePrint, + }, // BridgeLevelCrossing + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // BridgeSegment: - // The data has been exported from gallery Nether, area index 16, ID 158 + // The data has been exported from the gallery Nether, area index 16, ID 158, created by Aloe_vera { // Size: 15, 8, 5, // SizeX = 15, SizeY = 8, SizeZ = 5 @@ -782,76 +1540,94 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aammmmmmmmmmmaa" + /* 2 */ "aammmmmmmmmmmaa" + /* 3 */ "aammmmmmmmmmmaa" + /* 4 */ "mmmmmmmmmmmmmmm" + // Level 1 - "mmmmmmmmmmmmmmm" - "aammmmmmmmmmmaa" - "aammmmmmmmmmmaa" - "aammmmmmmmmmmaa" - "mmmmmmmmmmmmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aabmmmmmmmmmcaa" + /* 2 */ "aabmmmmmmmmmcaa" + /* 3 */ "aabmmmmmmmmmcaa" + /* 4 */ "mmmmmmmmmmmmmmm" // Level 2 - "mmmmmmmmmmmmmmm" - "aabmmmmmmmmmcaa" - "aabmmmmmmmmmcaa" - "aabmmmmmmmmmcaa" - "mmmmmmmmmmmmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aaabdmmmmmdcaaa" + /* 2 */ "aaabdmmmmmdcaaa" + /* 3 */ "aaabdmmmmmdcaaa" + /* 4 */ "mmmmmmmmmmmmmmm" // Level 3 - "mmmmmmmmmmmmmmm" - "aaabdmmmmmdcaaa" - "aaabdmmmmmdcaaa" - "aaabdmmmmmdcaaa" - "mmmmmmmmmmmmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "eeeeeeeeeeeeeee" + /* 1 */ "aaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaa" + /* 4 */ "fffffffffffffff" // Level 4 - "eeeeeeeeeeeeeee" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "fffffffffffffff" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaaaa" // Level 5 - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "..............." + /* 2 */ "..............." + /* 3 */ "..............." + /* 4 */ "aaaaaaaaaaaaaaa" // Level 6 - "aaaaaaaaaaaaaaa" - "..............." - "..............." - "..............." - "aaaaaaaaaaaaaaa" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "..............." + /* 2 */ "..............." + /* 3 */ "..............." + /* 4 */ "mmmmmmmmmmmmmmm" // Level 7 - "mmmmmmmmmmmmmmm" - "..............." - "..............." - "..............." - "mmmmmmmmmmmmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "..............." + /* 2 */ "..............." + /* 3 */ "..............." + /* 4 */ "mmmmmmmmmmmmmmm", - // Level 8 - "mmmmmmmmmmmmmmm" - "..............." - "..............." - "..............." - "mmmmmmmmmmmmmmm", - - // Connections: - "0: 0, 5, 2: 4\n" /* Type 0, BLOCK_FACE_XM */ - "0: 14, 5, 2: 5\n" /* Type 0, BLOCK_FACE_XP */, + // Connectors: + "0: 0, 5, 2: 4\n" /* Type 0, direction X- */ + "0: 14, 5, 2: 5\n" /* Type 0, direction X+ */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // BridgeSegment + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // BridgeTee: - // The data has been exported from gallery Nether, area index 39, ID 290 + // The data has been exported from the gallery Nether, area index 39, ID 290, created by STR_Warrior { // Size: 15, 8, 10, // SizeX = 15, SizeY = 8, SizeZ = 10 @@ -867,117 +1643,135 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aammmmmmmmmmmaa" + /* 2 */ "aammmmmmmmmmmaa" + /* 3 */ "aammmmmmmmmmmaa" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmmm" + /* 7 */ "mmmmmmmmmmmmmmm" + /* 8 */ "mmmmmmaaammmmmm" + /* 9 */ "mmmmmmaaammmmmm" + // Level 1 - "mmmmmmmmmmmmmmm" - "aammmmmmmmmmmaa" - "aammmmmmmmmmmaa" - "aammmmmmmmmmmaa" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmaaammmmmm" - "mmmmmmaaammmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aabmmmmmmmmmcaa" + /* 2 */ "aabmmmmmmmmmcaa" + /* 3 */ "aabmmmmmmmmmcaa" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmmm" + /* 7 */ "mmmmmmdddmmmmmm" + /* 8 */ "mmmmmmaaammmmmm" + /* 9 */ "mmmmmmaaammmmmm" // Level 2 - "mmmmmmmmmmmmmmm" - "aabmmmmmmmmmcaa" - "aabmmmmmmmmmcaa" - "aabmmmmmmmmmcaa" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmmmmmmmmmm" - "mmmmmmdddmmmmmm" - "mmmmmmaaammmmmm" - "mmmmmmaaammmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aaabemmmmmecaaa" + /* 2 */ "aaabemmmmmecaaa" + /* 3 */ "aaabemmmmmecaaa" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmeeemmmmmm" + /* 6 */ "mmmmmmdddmmmmmm" + /* 7 */ "mmmmmmaaammmmmm" + /* 8 */ "mmmmmmaaammmmmm" + /* 9 */ "mmmmmmaaammmmmm" // Level 3 - "mmmmmmmmmmmmmmm" - "aaabemmmmmecaaa" - "aaabemmmmmecaaa" - "aaabemmmmmecaaa" - "mmmmmmmmmmmmmmm" - "mmmmmmeeemmmmmm" - "mmmmmmdddmmmmmm" - "mmmmmmaaammmmmm" - "mmmmmmaaammmmmm" - "mmmmmmaaammmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "ddddddddddddddd" + /* 1 */ "aaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaa" + /* 4 */ "fffffcaaabfffff" + /* 5 */ "mmmmmcaaabmmmmm" + /* 6 */ "mmmmmcaaabmmmmm" + /* 7 */ "mmmmmcaaabmmmmm" + /* 8 */ "mmmmmcaaabmmmmm" + /* 9 */ "mmmmmcaaabmmmmm" // Level 4 - "ddddddddddddddd" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "fffffcaaabfffff" - "mmmmmcaaabmmmmm" - "mmmmmcaaabmmmmm" - "mmmmmcaaabmmmmm" - "mmmmmcaaabmmmmm" - "mmmmmcaaabmmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaaaa" + /* 5 */ "mmmmmaaaaammmmm" + /* 6 */ "mmmmmaaaaammmmm" + /* 7 */ "mmmmmaaaaammmmm" + /* 8 */ "mmmmmaaaaammmmm" + /* 9 */ "mmmmmaaaaammmmm" // Level 5 - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "mmmmmaaaaammmmm" - "mmmmmaaaaammmmm" - "mmmmmaaaaammmmm" - "mmmmmaaaaammmmm" - "mmmmmaaaaammmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "..............." + /* 2 */ "..............." + /* 3 */ "..............." + /* 4 */ "aaaaaa...aaaaaa" + /* 5 */ "mmmmma...ammmmm" + /* 6 */ "mmmmma...ammmmm" + /* 7 */ "mmmmma...ammmmm" + /* 8 */ "mmmmma...ammmmm" + /* 9 */ "mmmmma...ammmmm" // Level 6 - "aaaaaaaaaaaaaaa" - "..............." - "..............." - "..............." - "aaaaaa...aaaaaa" - "mmmmma...ammmmm" - "mmmmma...ammmmm" - "mmmmma...ammmmm" - "mmmmma...ammmmm" - "mmmmma...ammmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "..............." + /* 2 */ "..............." + /* 3 */ "..............." + /* 4 */ "mmmmmm...mmmmmm" + /* 5 */ "mmmmmm...mmmmmm" + /* 6 */ "mmmmmm...mmmmmm" + /* 7 */ "mmmmmm...mmmmmm" + /* 8 */ "mmmmmm...mmmmmm" + /* 9 */ "mmmmmm...mmmmmm" // Level 7 - "mmmmmmmmmmmmmmm" - "..............." - "..............." - "..............." - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "..............." + /* 2 */ "..............." + /* 3 */ "..............." + /* 4 */ "mmmmmm...mmmmmm" + /* 5 */ "mmmmmm...mmmmmm" + /* 6 */ "mmmmmm...mmmmmm" + /* 7 */ "mmmmmm...mmmmmm" + /* 8 */ "mmmmmm...mmmmmm" + /* 9 */ "mmmmmm...mmmmmm", - // Level 8 - "mmmmmmmmmmmmmmm" - "..............." - "..............." - "..............." - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm" - "mmmmmm...mmmmmm", - - // Connections: - "0: 0, 5, 2: 4\n" /* Type 0, BLOCK_FACE_XM */ - "0: 14, 5, 2: 5\n" /* Type 0, BLOCK_FACE_XP */ - "0: 7, 5, 9: 3\n" /* Type 0, BLOCK_FACE_ZP */, + // Connectors: + "0: 0, 5, 2: 4\n" /* Type 0, direction X- */ + "0: 7, 5, 9: 3\n" /* Type 0, direction Z+ */ + "0: 14, 5, 2: 5\n" /* Type 0, direction X+ */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // BridgeTee + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Corridor11: - // The data has been exported from gallery Nether, area index 36, ID 287 + // The data has been exported from the gallery Nether, area index 36, ID 287, created by Aloe_vera { // Size: 11, 6, 5, // SizeX = 11, SizeY = 6, SizeZ = 5 @@ -987,134 +1781,163 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = "a:112: 0\n" /* netherbrick */ "b:113: 0\n" /* netherbrickfence */ "c:114: 2\n" /* netherbrickstairs */ - "d:114: 3\n" /* netherbrickstairs */, + "d:114: 3\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "aaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaa" + // Level 1 - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "aaaaaaaaaaa" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "aaaaaaaaaaa" + /* 1 */ "..........." + /* 2 */ "..........." + /* 3 */ "..........." + /* 4 */ "aaaaaaaaaaa" // Level 2 - "aaaaaaaaaaa" - "..........." - "..........." - "..........." - "aaaaaaaaaaa" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "abababababa" + /* 1 */ "..........." + /* 2 */ "..........." + /* 3 */ "..........." + /* 4 */ "abababababa" // Level 3 - "abababababa" - "..........." - "..........." - "..........." - "abababababa" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "abababababa" + /* 1 */ "..........." + /* 2 */ "..........." + /* 3 */ "..........." + /* 4 */ "abababababa" // Level 4 - "abababababa" - "..........." - "..........." - "..........." - "abababababa" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "abababababa" + /* 1 */ "..........." + /* 2 */ "..........." + /* 3 */ "..........." + /* 4 */ "abababababa" // Level 5 - "abababababa" - "..........." - "..........." - "..........." - "abababababa" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "ccccccccccc" + /* 1 */ "aaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaa" + /* 4 */ "ddddddddddd", - // Level 6 - "ccccccccccc" - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "ddddddddddd", - - // Connections: - "1: 0, 1, 2: 4\n" /* Type 1, BLOCK_FACE_XM */ - "1: 10, 1, 2: 5\n" /* Type 1, BLOCK_FACE_XP */, + // Connectors: + "1: 10, 1, 2: 5\n" /* Type 1, direction X+ */ + "1: 0, 1, 2: 4\n" /* Type 1, direction X- */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // Corridor11 + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Corridor13: - // The data has been exported from gallery Nether, area index 35, ID 286 + // The data has been exported from the gallery Nether, area index 35, ID 286, created by Aloe_vera { // Size: 13, 6, 5, // SizeX = 13, SizeY = 6, SizeZ = 5 // Block definitions: - "a:112: 0\n" /* netherbrick */ ".: 0: 0\n" /* air */ - "c:113: 0\n" /* netherbrickfence */ - "d:114: 2\n" /* netherbrickstairs */ - "e:114: 3\n" /* netherbrickstairs */, + "a:112: 0\n" /* netherbrick */ + "b:113: 0\n" /* netherbrickfence */ + "c:114: 2\n" /* netherbrickstairs */ + "d:114: 3\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaa" + // Level 1 - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "............." + /* 2 */ "............." + /* 3 */ "............." + /* 4 */ "aaaaaaaaaaaaa" // Level 2 - "aaaaaaaaaaaaa" - "............." - "............." - "............." - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "ababababababa" + /* 1 */ "............." + /* 2 */ "............." + /* 3 */ "............." + /* 4 */ "ababababababa" // Level 3 - "acacacacacaca" - "............." - "............." - "............." - "acacacacacaca" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "ababababababa" + /* 1 */ "............." + /* 2 */ "............." + /* 3 */ "............." + /* 4 */ "ababababababa" // Level 4 - "acacacacacaca" - "............." - "............." - "............." - "acacacacacaca" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "ababababababa" + /* 1 */ "............." + /* 2 */ "............." + /* 3 */ "............." + /* 4 */ "ababababababa" // Level 5 - "acacacacacaca" - "............." - "............." - "............." - "acacacacacaca" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "ccccccccccccc" + /* 1 */ "aaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "ddddddddddddd", + + // Connectors: + "1: 12, 1, 2: 5\n" /* Type 1, direction X+ */ + "1: 0, 1, 2: 4\n" /* Type 1, direction X- */, - // Level 6 - "ddddddddddddd" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "eeeeeeeeeeeee", - - // Connections: - "1: 0, 1, 2: 4\n" /* Type 1, BLOCK_FACE_XM */ - "1: 12, 1, 2: 5\n" /* Type 1, BLOCK_FACE_XP */, - // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // Corridor13 + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CorridorCorner5: - // The data has been exported from gallery Nether, area index 10, ID 40 + // The data has been exported from the gallery Nether, area index 10, ID 40, created by xoft { // Size: 11, 6, 11, // SizeX = 11, SizeY = 6, SizeZ = 11 @@ -1130,98 +1953,112 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "aaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaa" + /* 5 */ "aaaaa......" + /* 6 */ "aaaaa......" + /* 7 */ "aaaaa......" + /* 8 */ "aaaaa......" + /* 9 */ "aaaaa......" + /* 10 */ "aaaaa......" + // Level 1 - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "aaaaammmmmm" - "aaaaammmmmm" - "aaaaammmmmm" - "aaaaammmmmm" - "aaaaammmmmm" - "aaaaammmmmm" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "aaaaaaaaaaa" + /* 1 */ "a.........." + /* 2 */ "a.........." + /* 3 */ "a.........." + /* 4 */ "a...aaaaaaa" + /* 5 */ "a...a......" + /* 6 */ "a...a......" + /* 7 */ "a...a......" + /* 8 */ "a...a......" + /* 9 */ "a...a......" + /* 10 */ "a...a......" // Level 2 - "aaaaaaaaaaa" - "a.........." - "a.........." - "a.........." - "a...aaaaaaa" - "a...ammmmmm" - "a...ammmmmm" - "a...ammmmmm" - "a...ammmmmm" - "a...ammmmmm" - "a...ammmmmm" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "abababababa" + /* 1 */ "b.........." + /* 2 */ "a.........." + /* 3 */ "b.........." + /* 4 */ "a...abababa" + /* 5 */ "b...b......" + /* 6 */ "a...a......" + /* 7 */ "b...b......" + /* 8 */ "a...a......" + /* 9 */ "b...b......" + /* 10 */ "a...a......" // Level 3 - "abababababa" - "b.........." - "a.........." - "b.........." - "a...abababa" - "b...bmmmmmm" - "a...ammmmmm" - "b...bmmmmmm" - "a...ammmmmm" - "b...bmmmmmm" - "a...ammmmmm" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "abababababa" + /* 1 */ "b.........." + /* 2 */ "a.........." + /* 3 */ "b.........." + /* 4 */ "a...abababa" + /* 5 */ "b...b......" + /* 6 */ "a...a......" + /* 7 */ "b...b......" + /* 8 */ "a...a......" + /* 9 */ "b...b......" + /* 10 */ "a...a......" // Level 4 - "abababababa" - "b.........." - "a.........." - "b.........." - "a...abababa" - "b...bmmmmmm" - "a...ammmmmm" - "b...bmmmmmm" - "a...ammmmmm" - "b...bmmmmmm" - "a...ammmmmm" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "abababababa" + /* 1 */ "b.........." + /* 2 */ "a.........." + /* 3 */ "b.........." + /* 4 */ "a...abababa" + /* 5 */ "b...b......" + /* 6 */ "a...a......" + /* 7 */ "b...b......" + /* 8 */ "a...a......" + /* 9 */ "b...b......" + /* 10 */ "a...a......" // Level 5 - "abababababa" - "b.........." - "a.........." - "b.........." - "a...abababa" - "b...bmmmmmm" - "a...ammmmmm" - "b...bmmmmmm" - "a...ammmmmm" - "b...bmmmmmm" - "a...ammmmmm" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "ccccccccccc" + /* 1 */ "daaaaaaaaaa" + /* 2 */ "daaaaaaaaaa" + /* 3 */ "daaaaaaaaaa" + /* 4 */ "daaaeeeeeee" + /* 5 */ "daaaf......" + /* 6 */ "daaaf......" + /* 7 */ "daaaf......" + /* 8 */ "daaaf......" + /* 9 */ "daaaf......" + /* 10 */ "daaaf......", - // Level 6 - "ccccccccccc" - "daaaaaaaaaa" - "daaaaaaaaaa" - "daaaaaaaaaa" - "daaaeeeeeee" - "daaafmmmmmm" - "daaafmmmmmm" - "daaafmmmmmm" - "daaafmmmmmm" - "daaafmmmmmm" - "daaafmmmmmm", - - // Connections: - "1: 10, 1, 2: 5\n" /* Type 1, BLOCK_FACE_XP */ - "1: 2, 1, 10: 3\n" /* Type 1, BLOCK_FACE_ZP */, + // Connectors: + "1: 2, 1, 10: 3\n" /* Type 1, direction Z+ */ + "1: 10, 1, 2: 5\n" /* Type 1, direction X+ */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // CorridorCorner5 - // CorridorCorner5: - // The data has been exported from gallery Nether, area index 10, ID 40 + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // CorridorCornerChest5: + // The data has been exported from the gallery Nether, area index 42, ID 293, created by STR_Warrior { // Size: 11, 6, 11, // SizeX = 11, SizeY = 6, SizeZ = 11 @@ -1229,108 +2066,121 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ - "b:113: 0\n" /* netherbrickfence */ - "c:114: 2\n" /* netherbrickstairs */ + "b: 54: 5\n" /* chest */ + "c:113: 0\n" /* netherbrickfence */ "d:114: 0\n" /* netherbrickstairs */ - "e:114: 3\n" /* netherbrickstairs */ + "e:114: 2\n" /* netherbrickstairs */ "f:114: 1\n" /* netherbrickstairs */ - "g: 54: 5\n" /* chest */ + "g:114: 3\n" /* netherbrickstairs */ "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "aaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaa" + /* 5 */ "aaaaammmmmm" + /* 6 */ "aaaaammmmmm" + /* 7 */ "aaaaammmmmm" + /* 8 */ "aaaaammmmmm" + /* 9 */ "aaaaammmmmm" + /* 10 */ "aaaaammmmmm" + // Level 1 - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "aaaaaaaaaaa" - "aaaaammmmmm" - "aaaaammmmmm" - "aaaaammmmmm" - "aaaaammmmmm" - "aaaaammmmmm" - "aaaaammmmmm" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "aaaaaaaaaaa" + /* 1 */ "ab........." + /* 2 */ "a.........." + /* 3 */ "a.........." + /* 4 */ "a...aaaaaaa" + /* 5 */ "a...ammmmmm" + /* 6 */ "a...ammmmmm" + /* 7 */ "a...ammmmmm" + /* 8 */ "a...ammmmmm" + /* 9 */ "a...ammmmmm" + /* 10 */ "a...ammmmmm" // Level 2 - "aaaaaaaaaaa" - "ag........." - "a.........." - "a.........." - "a...aaaaaaa" - "a...ammmmmm" - "a...ammmmmm" - "a...ammmmmm" - "a...ammmmmm" - "a...ammmmmm" - "a...ammmmmm" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "acacacacaca" + /* 1 */ "c.........." + /* 2 */ "a.........." + /* 3 */ "c.........." + /* 4 */ "a...acacaca" + /* 5 */ "c...cmmmmmm" + /* 6 */ "a...ammmmmm" + /* 7 */ "c...cmmmmmm" + /* 8 */ "a...ammmmmm" + /* 9 */ "c...cmmmmmm" + /* 10 */ "a...ammmmmm" // Level 3 - "abababababa" - "b.........." - "a.........." - "b.........." - "a...abababa" - "b...bmmmmmm" - "a...ammmmmm" - "b...bmmmmmm" - "a...ammmmmm" - "b...bmmmmmm" - "a...ammmmmm" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "acacacacaca" + /* 1 */ "c.........." + /* 2 */ "a.........." + /* 3 */ "c.........." + /* 4 */ "a...acacaca" + /* 5 */ "c...cmmmmmm" + /* 6 */ "a...ammmmmm" + /* 7 */ "c...cmmmmmm" + /* 8 */ "a...ammmmmm" + /* 9 */ "c...cmmmmmm" + /* 10 */ "a...ammmmmm" // Level 4 - "abababababa" - "b.........." - "a.........." - "b.........." - "a...abababa" - "b...bmmmmmm" - "a...ammmmmm" - "b...bmmmmmm" - "a...ammmmmm" - "b...bmmmmmm" - "a...ammmmmm" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "acacacacaca" + /* 1 */ "c.........." + /* 2 */ "a.........." + /* 3 */ "c.........." + /* 4 */ "a...acacaca" + /* 5 */ "c...cmmmmmm" + /* 6 */ "a...ammmmmm" + /* 7 */ "c...cmmmmmm" + /* 8 */ "a...ammmmmm" + /* 9 */ "c...cmmmmmm" + /* 10 */ "a...ammmmmm" // Level 5 - "abababababa" - "b.........." - "a.........." - "b.........." - "a...abababa" - "b...bmmmmmm" - "a...ammmmmm" - "b...bmmmmmm" - "a...ammmmmm" - "b...bmmmmmm" - "a...ammmmmm" + /* z\x* 1 */ + /* * 01234567890 */ + /* 0 */ "deeeeeeeeee" + /* 1 */ "daaaaaaaaaa" + /* 2 */ "daaaaaaaaaa" + /* 3 */ "daaaaaaaaaa" + /* 4 */ "daaafgggggg" + /* 5 */ "daaafmmmmmm" + /* 6 */ "daaafmmmmmm" + /* 7 */ "daaafmmmmmm" + /* 8 */ "daaafmmmmmm" + /* 9 */ "daaafmmmmmm" + /* 10 */ "daaafmmmmmm", - // Level 6 - "ccccccccccc" - "daaaaaaaaaa" - "daaaaaaaaaa" - "daaaaaaaaaa" - "daaaeeeeeee" - "daaafmmmmmm" - "daaafmmmmmm" - "daaafmmmmmm" - "daaafmmmmmm" - "daaafmmmmmm" - "daaafmmmmmm", - - // Connections: - "1: 10, 1, 2: 5\n" /* Type 1, BLOCK_FACE_XP */ - "1: 2, 1, 10: 3\n" /* Type 1, BLOCK_FACE_ZP */, + // Connectors: + "1: 10, 1, 2: 5\n" /* Type 1, direction X+ */ + "1: 2, 1, 10: 3\n" /* Type 1, direction Z+ */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, - }, // CorridorCorner5Chest + }, // CorridorCornerChest5 + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CorridorStairs: - // The data has been exported from gallery Nether, area index 12, ID 42 + // The data has been exported from the gallery Nether, area index 12, ID 42, created by xoft { // Size: 9, 13, 5, // SizeX = 9, SizeY = 13, SizeZ = 5 @@ -1342,114 +2192,212 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = "c:113: 0\n" /* netherbrickfence */ "d:114: 2\n" /* netherbrickstairs */ "e:114: 3\n" /* netherbrickstairs */ - "f: 19: 0\n" /* sponge */, + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 012345678 */ + /* 0 */ "aaaaaaaaa" + /* 1 */ "aaaaaaaaa" + /* 2 */ "aaaaaaaaa" + /* 3 */ "aaaaaaaaa" + /* 4 */ "aaaaaaaaa" + // Level 1 - "aaaaaaaaa" - "aaaaaaaaa" - "aaaaaaaaa" - "aaaaaaaaa" - "aaaaaaaaa" + /* z\x* 012345678 */ + /* 0 */ "aaaaaaaaa" + /* 1 */ ".baaaaaaa" + /* 2 */ ".baaaaaaa" + /* 3 */ ".baaaaaaa" + /* 4 */ "aaaaaaaaa" // Level 2 - "aaaaaaaaa" - ".baaaaaaa" - ".baaaaaaa" - ".baaaaaaa" - "aaaaaaaaa" + /* z\x* 012345678 */ + /* 0 */ "acaaaaaaa" + /* 1 */ "..baaaaaa" + /* 2 */ "..baaaaaa" + /* 3 */ "..baaaaaa" + /* 4 */ "acaaaaaaa" // Level 3 - "acaaaaaaa" - "..baaaaaa" - "..baaaaaa" - "..baaaaaa" - "acaaaaaaa" + /* z\x* 012345678 */ + /* 0 */ "acaaaaaaa" + /* 1 */ "...baaaaa" + /* 2 */ "...baaaaa" + /* 3 */ "...baaaaa" + /* 4 */ "acaaaaaaa" // Level 4 - "acaaaaaaa" - "...baaaaa" - "...baaaaa" - "...baaaaa" - "acaaaaaaa" + /* z\x* 012345678 */ + /* 0 */ "acacaaaaa" + /* 1 */ "....baaaa" + /* 2 */ "....baaaa" + /* 3 */ "....baaaa" + /* 4 */ "acacaaaaa" // Level 5 - "acacaaaaa" - "....baaaa" - "....baaaa" - "....baaaa" - "acacaaaaa" + /* z\x* 012345678 */ + /* 0 */ "aaacaaaaa" + /* 1 */ ".....baaa" + /* 2 */ ".....baaa" + /* 3 */ ".....baaa" + /* 4 */ "aaacaaaaa" // Level 6 - "aaacaaaaa" - ".....baaa" - ".....baaa" - ".....baaa" - "aaacaaaaa" + /* z\x* 012345678 */ + /* 0 */ "daacacaaa" + /* 1 */ "a.....baa" + /* 2 */ "a.....baa" + /* 3 */ "a.....baa" + /* 4 */ "eaacacaaa" // Level 7 - "daacacaaa" - "a.....baa" - "a.....baa" - "a.....baa" - "eaacacaaa" + /* z\x* 012345678 */ + /* 0 */ "mdaaacaaa" + /* 1 */ "ma.....ba" + /* 2 */ "ma.....ba" + /* 3 */ "ma.....ba" + /* 4 */ "meaaacaaa" // Level 8 - "fdaaacaaa" - "fa.....ba" - "fa.....ba" - "fa.....ba" - "feaaacaaa" + /* z\x* 012345678 */ + /* 0 */ "mmdaacaca" + /* 1 */ "mma......" + /* 2 */ "mma......" + /* 3 */ "mma......" + /* 4 */ "mmeaacaca" // Level 9 - "ffdaacaca" - "ffa......" - "ffa......" - "ffa......" - "ffeaacaca" + /* z\x* 012345678 */ + /* 0 */ "mmmdaaaca" + /* 1 */ "mmma....." + /* 2 */ "mmma....." + /* 3 */ "mmma....." + /* 4 */ "mmmeaaaca" // Level 10 - "fffdaaaca" - "fffa....." - "fffa....." - "fffa....." - "fffeaaaca" + /* z\x* 012345678 */ + /* 0 */ "mmmmdaaca" + /* 1 */ "mmmma...." + /* 2 */ "mmmma...." + /* 3 */ "mmmma...." + /* 4 */ "mmmmeaaca" // Level 11 - "ffffdaaca" - "ffffa...." - "ffffa...." - "ffffa...." - "ffffeaaca" + /* z\x* 012345678 */ + /* 0 */ "mmmmmdaaa" + /* 1 */ "mmmmma..." + /* 2 */ "mmmmma..." + /* 3 */ "mmmmma..." + /* 4 */ "mmmmmeaaa" // Level 12 - "fffffdaaa" - "fffffa..." - "fffffa..." - "fffffa..." - "fffffeaaa" + /* z\x* 012345678 */ + /* 0 */ "mmmmmmddd" + /* 1 */ "mmmmmmaaa" + /* 2 */ "mmmmmmaaa" + /* 3 */ "mmmmmmaaa" + /* 4 */ "mmmmmmeee", - // Level 13 - "ffffffddd" - "ffffffaaa" - "ffffffaaa" - "ffffffaaa" - "ffffffeee", + // Connectors: + "1: 0, 1, 2: 4\n" /* Type 1, direction X- */ + "1: 8, 8, 2: 5\n" /* Type 1, direction X+ */, - // Connections: - "1: 0, 1, 2: 4\n" /* Type 1, BLOCK_FACE_XM */ - "1: 8, 8, 2: 5\n" /* Type 1, BLOCK_FACE_XP */, - // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // CorridorStairs + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // DarkCorridor: + // The data has been exported from the gallery Nether, area index 3, ID 30, created by STR_Warrior + { + // Size: + 14, 6, 5, // SizeX = 14, SizeY = 6, SizeZ = 5 + + // Block definitions: + ".: 0: 0\n" /* air */ + "a:112: 0\n" /* netherbrick */ + "b:113: 0\n" /* netherbrickfence */ + "c:114: 2\n" /* netherbrickstairs */ + "d:114: 3\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, + + // Block data: + // Level 0 + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "aaaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaaa" + + // Level 1 + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "aaaaaaaaaaaaaa" + /* 1 */ ".............." + /* 2 */ ".............." + /* 3 */ ".............." + /* 4 */ "aaaaaaaaaaaaaa" + + // Level 2 + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "aabaaaaaaaabaa" + /* 1 */ ".............." + /* 2 */ ".............." + /* 3 */ ".............." + /* 4 */ "aabaaaaaaaabaa" + + // Level 3 + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "aabaaaaaaaabaa" + /* 1 */ ".............." + /* 2 */ ".............." + /* 3 */ ".............." + /* 4 */ "aabaaaaaaaabaa" + + // Level 4 + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "aaaaaaaaaaaaaa" + /* 1 */ ".............." + /* 2 */ ".............." + /* 3 */ ".............." + /* 4 */ "aaaaaaaaaaaaaa" + + // Level 5 + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "cccccccccccccc" + /* 1 */ "aaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaa" + /* 4 */ "dddddddddddddd", + + // Connectors: + "1: 0, 1, 2: 4\n" /* Type 1, direction X- */ + "1: 13, 1, 2: 5\n" /* Type 1, direction X+ */, + + // AllowedRotations: + 7, /* 1, 2, 3 CCW rotations */ + + // Merge strategy: + cBlockArea::msSpongePrint, + }, // DarkCorridor + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // LavaStaircase: - // The data has been exported from gallery Nether, area index 28, ID 278 + // The data has been exported from the gallery Nether, area index 28, ID 278, created by Aloe_vera { // Size: 15, 11, 15, // SizeX = 15, SizeY = 11, SizeZ = 15 @@ -1458,211 +2406,236 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ "b:113: 0\n" /* netherbrickfence */ - "c: 11: 0\n" /* lava */, + "c: 10: 0\n" /* lava */ + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaaaaa" + /* 8 */ "aaaaaaaaaaaaaaa" + /* 9 */ "aaaaaaaaaaaaaaa" + /* 10 */ "aaaaaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaaaaa" + /* 13 */ "aaaaaaaaaaaaaaa" + /* 14 */ "aaaaaaaaaaaaaaa" + // Level 1 - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaa...aaaa" + /* 1 */ "aaaaa.........a" + /* 2 */ "aaaaa.........a" + /* 3 */ "aaaaab........a" + /* 4 */ "accca...aaaa..a" + /* 5 */ "accca...acca..a" + /* 6 */ "acccaaaaacca..a" + /* 7 */ "acccccccccca..a" + /* 8 */ "acccaaaaacca..a" + /* 9 */ "accca...acca..a" + /* 10 */ "accca...aaaa..a" + /* 11 */ "aaaaab........a" + /* 12 */ "aaaaa.........a" + /* 13 */ "aaaaa.........a" + /* 14 */ "aaaaaaaa...aaaa" // Level 2 - "aaaaaaaa...aaaa" - "aaaaa.........a" - "aaaaa.........a" - "aaaaab........a" - "accca...aaaa..a" - "accca...acca..a" - "acccaaaaacca..a" - "acccccccccca..a" - "acccaaaaacca..a" - "accca...acca..a" - "accca...aaaa..a" - "aaaaab........a" - "aaaaa.........a" - "aaaaa.........a" - "aaaaaaaa...aaaa" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaa...aaaa" + /* 1 */ "aaaa..........a" + /* 2 */ "aaaa..........a" + /* 3 */ "aaaabb........a" + /* 4 */ "aaaa..........a" + /* 5 */ "a.............a" + /* 6 */ "a.............a" + /* 7 */ "a.............a" + /* 8 */ "a.............a" + /* 9 */ "a.............a" + /* 10 */ "aaaa..........a" + /* 11 */ "aaaabb........a" + /* 12 */ "aaaa..........a" + /* 13 */ "aaaa..........a" + /* 14 */ "aaaaaaaa...aaaa" // Level 3 - "aaaaaaaa...aaaa" - "aaaa..........a" - "aaaa..........a" - "aaaabb........a" - "aaaa..........a" - "a.............a" - "a.............a" - "a.............a" - "a.............a" - "a.............a" - "aaaa..........a" - "aaaabb........a" - "aaaa..........a" - "aaaa..........a" - "aaaaaaaa...aaaa" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaa...aaaa" + /* 1 */ "a.............a" + /* 2 */ "a.............a" + /* 3 */ "a..bb.........a" + /* 4 */ "aaaa..........a" + /* 5 */ "aaaa..........a" + /* 6 */ "a.............a" + /* 7 */ "a.............a" + /* 8 */ "a.............a" + /* 9 */ "aaaa..........a" + /* 10 */ "aaaa..........a" + /* 11 */ "a..bb.........a" + /* 12 */ "a.............a" + /* 13 */ "a.............a" + /* 14 */ "aaaaaaaa...aaaa" // Level 4 - "aaaaaaaa...aaaa" - "a.............a" - "a.............a" - "a..bb.........a" - "aaaa..........a" - "aaaa..........a" - "a.............a" - "a.............a" - "a.............a" - "aaaa..........a" - "aaaa..........a" - "a..bb.........a" - "a.............a" - "a.............a" - "aaaaaaaa...aaaa" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaa...aaaa" + /* 1 */ "a.............a" + /* 2 */ "a.............a" + /* 3 */ "a..b..........a" + /* 4 */ "a..b..........a" + /* 5 */ "aaaa..........a" + /* 6 */ "aaaa..........a" + /* 7 */ "a.............a" + /* 8 */ "aaaa..........a" + /* 9 */ "aaaa..........a" + /* 10 */ "a..b..........a" + /* 11 */ "a..b..........a" + /* 12 */ "a.............a" + /* 13 */ "a.............a" + /* 14 */ "aaaaaaaa...aaaa" // Level 5 - "aaaaaaaabbbaaaa" - "a.............a" - "a.............a" - "a..b..........a" - "a..b..........a" - "aaaa..........a" - "aaaa..........a" - "a.............a" - "aaaa..........a" - "aaaa..........a" - "a..b..........a" - "a..b..........a" - "a.............a" - "a.............a" - "aaaaaaaabbbaaaa" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "a.............a" + /* 2 */ "a.............a" + /* 3 */ "a.............a" + /* 4 */ "a..b..........a" + /* 5 */ "a..b..........a" + /* 6 */ "aaaa..........a" + /* 7 */ "aaaa..........a" + /* 8 */ "aaaa..........a" + /* 9 */ "a..b..........a" + /* 10 */ "a..b..........a" + /* 11 */ "a.............a" + /* 12 */ "a.............a" + /* 13 */ "a.............a" + /* 14 */ "aaaaaaaaaaaaaaa" // Level 6 - "aaaaaaaaaaaaaaa" - "a.............a" - "a.............a" - "a.............a" - "a..b..........a" - "a..b..........a" - "aaaa..........a" - "aaaa..........a" - "aaaa..........a" - "a..b..........a" - "a..b..........a" - "a.............a" - "a.............a" - "a.............a" - "aaaaaaaaaaaaaaa" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "a.............a" + /* 2 */ "a.............a" + /* 3 */ "a.............a" + /* 4 */ "a.............a" + /* 5 */ "a..b..........a" + /* 6 */ "...b..........a" + /* 7 */ "...b..........a" + /* 8 */ "...b..........a" + /* 9 */ "a..b..........a" + /* 10 */ "a.............a" + /* 11 */ "a.............a" + /* 12 */ "a.............a" + /* 13 */ "a.............a" + /* 14 */ "aaaaaaaaaaaaaaa" // Level 7 - "aaaaaaaaaaaaaaa" - "a.............a" - "a.............a" - "a.............a" - "a.............a" - "a..b..........a" - "...b..........a" - "...b..........a" - "...b..........a" - "a..b..........a" - "a.............a" - "a.............a" - "a.............a" - "a.............a" - "aaaaaaaaaaaaaaa" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aababababababaa" + /* 1 */ "a.............a" + /* 2 */ "b.............b" + /* 3 */ "a.............a" + /* 4 */ "b.............b" + /* 5 */ "a.............a" + /* 6 */ "..............b" + /* 7 */ "..............a" + /* 8 */ "..............b" + /* 9 */ "a.............a" + /* 10 */ "b.............b" + /* 11 */ "a.............a" + /* 12 */ "b.............b" + /* 13 */ "a.............a" + /* 14 */ "aababababababaa" // Level 8 - "aababababababaa" - "a.............a" - "b.............b" - "a.............a" - "b.............b" - "a.............a" - "..............b" - "..............a" - "..............b" - "a.............a" - "b.............b" - "a.............a" - "b.............b" - "a.............a" - "aababababababaa" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aababababababaa" + /* 1 */ "a.............a" + /* 2 */ "b.............b" + /* 3 */ "a.............a" + /* 4 */ "b.............b" + /* 5 */ "a.............a" + /* 6 */ "..............b" + /* 7 */ "..............a" + /* 8 */ "..............b" + /* 9 */ "a.............a" + /* 10 */ "b.............b" + /* 11 */ "a.............a" + /* 12 */ "b.............b" + /* 13 */ "a.............a" + /* 14 */ "aababababababaa" // Level 9 - "aababababababaa" - "a.............a" - "b.............b" - "a.............a" - "b.............b" - "a.............a" - "..............b" - "..............a" - "..............b" - "a.............a" - "b.............b" - "a.............a" - "b.............b" - "a.............a" - "aababababababaa" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aababababababaa" + /* 1 */ "a.............a" + /* 2 */ "b.............b" + /* 3 */ "a.............a" + /* 4 */ "b.............b" + /* 5 */ "a.............a" + /* 6 */ "..............b" + /* 7 */ "..............a" + /* 8 */ "..............b" + /* 9 */ "a.............a" + /* 10 */ "b.............b" + /* 11 */ "a.............a" + /* 12 */ "b.............b" + /* 13 */ "a.............a" + /* 14 */ "aababababababaa" // Level 10 - "aababababababaa" - "a.............a" - "b.............b" - "a.............a" - "b.............b" - "a.............a" - "..............b" - "..............a" - "..............b" - "a.............a" - "b.............b" - "a.............a" - "b.............b" - "a.............a" - "aababababababaa" + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaaaaa" + /* 8 */ "aaaaaaaaaaaaaaa" + /* 9 */ "aaaaaaaaaaaaaaa" + /* 10 */ "aaaaaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaaaaa" + /* 13 */ "aaaaaaaaaaaaaaa" + /* 14 */ "aaaaaaaaaaaaaaa", - // Level 11 - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa" - "aaaaaaaaaaaaaaa", - - // Connections: - "1: 0, 6, 7: 4\n" /* Type 1, BLOCK_FACE_XM */ - "0: 9, 1, 0: 2\n" /* Type 0, BLOCK_FACE_ZM */ - "0: 9, 1, 14: 3\n" /* Type 0, BLOCK_FACE_ZP */, + // Connectors: + "1: 0, 6, 7: 4\n" /* Type 1, direction X- */ + "1: 9, 1, 14: 3\n" /* Type 1, direction Z+ */ + "1: 9, 1, 0: 2\n" /* Type 1, direction Z- */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // LavaStaircase + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // LavaStaircaseBig: - // The data has been exported from gallery Nether, area index 31, ID 282 + // The data has been exported from the gallery Nether, area index 31, ID 282, created by STR_Warrior { // Size: 12, 15, 15, // SizeX = 12, SizeY = 15, SizeZ = 15 @@ -1671,278 +2644,573 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ "b: 10: 0\n" /* lava */ - "c:113: 0\n" /* netherbrickfence */, + "c:113: 0\n" /* netherbrickfence */ + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaa" + /* 8 */ "aaaaaaaaaaaa" + /* 9 */ "aaaaaaaaaaaa" + /* 10 */ "aaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaa" + /* 13 */ "aaaaaaaaaaaa" + /* 14 */ "aaaaaaaaaaaa" + // Level 1 - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaa" + /* 4 */ "abbbbbaaaaaa" + /* 5 */ "abbbbbbaaaaa" + /* 6 */ "abbbbbba...." + /* 7 */ "abbbbbba...." + /* 8 */ "abbbbbba...." + /* 9 */ "abbbbbbaaaaa" + /* 10 */ "abbbbb.aaaaa" + /* 11 */ "aaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaa" + /* 13 */ "aaaaaaaaaaaa" + /* 14 */ "aaaaaaaaaaaa" // Level 2 - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "abbbbbaaaaaa" - "abbbbbbaaaaa" - "abbbbbba...." - "abbbbbba...." - "abbbbbba...." - "abbbbbbaaaaa" - "abbbbb.aaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaa" + /* 4 */ "abbbbbaaaaaa" + /* 5 */ "abbbbbba...a" + /* 6 */ "abbbbbba...." + /* 7 */ "abbbbbba...." + /* 8 */ "abbbbbba...." + /* 9 */ "abbbbbba...a" + /* 10 */ "abbbbb.aaaaa" + /* 11 */ "aaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaa" + /* 13 */ "aaaaaaaaaaaa" + /* 14 */ "aaaaaaaaaaaa" // Level 3 - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "abbbbbaaaaaa" - "abbbbbba...a" - "abbbbbba...." - "abbbbbba...." - "abbbbbba...." - "abbbbbba...a" - "abbbbb.aaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaa" + /* 4 */ "abbbbbaa...a" + /* 5 */ "abbbbbba...a" + /* 6 */ "abbbbbba...." + /* 7 */ "abbbbbba...." + /* 8 */ "abbbbbba...." + /* 9 */ "abbbbbba...a" + /* 10 */ "abbbbbaa...a" + /* 11 */ "aaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaa" + /* 13 */ "aaaaaaaaaaaa" + /* 14 */ "aaaaaaaaaaaa" // Level 4 - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "abbbbbaa...a" - "abbbbbba...a" - "abbbbbba...." - "abbbbbba...." - "abbbbbba...." - "abbbbbba...a" - "abbbbbaa...a" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "aaaaa......a" + /* 2 */ "aaaaa......a" + /* 3 */ "aaaaacc....a" + /* 4 */ "a.....cc...a" + /* 5 */ "a......c...a" + /* 6 */ "a......c...a" + /* 7 */ "a......c...a" + /* 8 */ "a......c...a" + /* 9 */ "a......c...a" + /* 10 */ "a.....cc...a" + /* 11 */ "aaaaacc....a" + /* 12 */ "aaaaa......a" + /* 13 */ "aaaaa......a" + /* 14 */ "aaaaaaaaaaaa" // Level 5 - "aaaaaaaaaaaa" - "aaaaa......a" - "aaaaa......a" - "aaaaacc....a" - "a.....cc...a" - "a......c...a" - "a......c...." - "a......c...." - "a......c...." - "a......c...a" - "a.....cc...a" - "aaaaacc....a" - "aaaaa......a" - "aaaaa......a" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "aaaa.......a" + /* 2 */ "aaaa.......a" + /* 3 */ "aaaacc.....a" + /* 4 */ "aaaa.......a" + /* 5 */ "a..........a" + /* 6 */ "a..........a" + /* 7 */ "a..........a" + /* 8 */ "a..........a" + /* 9 */ "a..........a" + /* 10 */ "aaaa.......a" + /* 11 */ "aaaacc.....a" + /* 12 */ "aaaa.......a" + /* 13 */ "aaaa.......a" + /* 14 */ "aaaaaaaaaaaa" // Level 6 - "aaaaaaaaaaaa" - "aaaa.......a" - "aaaa.......a" - "aaaacc.....a" - "aaaa.......a" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "aaaa.......a" - "aaaacc.....a" - "aaaa.......a" - "aaaa.......a" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "a..........a" + /* 2 */ "a..........a" + /* 3 */ "a..cc......a" + /* 4 */ "aaaa.......a" + /* 5 */ "aaaa.......a" + /* 6 */ "a..........a" + /* 7 */ "a..........a" + /* 8 */ "a..........a" + /* 9 */ "aaaa.......a" + /* 10 */ "aaaa.......a" + /* 11 */ "a..cc......a" + /* 12 */ "a..........a" + /* 13 */ "a..........a" + /* 14 */ "aaaaaaaaaaaa" // Level 7 - "aaaaaaaaaaaa" - "a..........a" - "a..........a" - "a..cc......a" - "aaaa.......a" - "aaaa.......a" - "a..........a" - "a..........a" - "a..........a" - "aaaa.......a" - "aaaa.......a" - "a..cc......a" - "a..........a" - "a..........a" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "a..........a" + /* 2 */ "a..........a" + /* 3 */ "a..c.......a" + /* 4 */ "a..c.......a" + /* 5 */ "aaaa.......a" + /* 6 */ "aaaa.......a" + /* 7 */ "a..........a" + /* 8 */ "aaaa.......a" + /* 9 */ "aaaa.......a" + /* 10 */ "a..c.......a" + /* 11 */ "a..c.......a" + /* 12 */ "a..........a" + /* 13 */ "a..........a" + /* 14 */ "aaaaaaaaaaaa" // Level 8 - "aaaaaaaaaaaa" - "a..........a" - "a..........a" - "a..c.......a" - "a..c.......a" - "aaaa.......a" - "aaaa.......a" - "a..........a" - "aaaa.......a" - "aaaa.......a" - "a..c.......a" - "a..c.......a" - "a..........a" - "a..........a" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "a..........a" + /* 2 */ "a..........a" + /* 3 */ "a..........a" + /* 4 */ "a..c.......a" + /* 5 */ "a..c.......a" + /* 6 */ "aaaa.......a" + /* 7 */ "aaaa.......a" + /* 8 */ "aaaa.......a" + /* 9 */ "a..c.......a" + /* 10 */ "a..c.......a" + /* 11 */ "a..........a" + /* 12 */ "a..........a" + /* 13 */ "a..........a" + /* 14 */ "aaaaaaaaaaaa" // Level 9 - "aaaaaaaaaaaa" - "a..........a" - "a..........a" - "a..........a" - "a..c.......a" - "a..c.......a" - "aaaa.......a" - "aaaa.......a" - "aaaa.......a" - "a..c.......a" - "a..c.......a" - "a..........a" - "a..........a" - "a..........a" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "a..........a" + /* 2 */ "a..........a" + /* 3 */ "a..........a" + /* 4 */ "a..........a" + /* 5 */ "a..c.......a" + /* 6 */ "...c.......a" + /* 7 */ "...c.......a" + /* 8 */ "...c.......a" + /* 9 */ "a..c.......a" + /* 10 */ "a..........a" + /* 11 */ "a..........a" + /* 12 */ "a..........a" + /* 13 */ "a..........a" + /* 14 */ "aaaaaaaaaaaa" // Level 10 - "aaaaaaaaaaaa" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "a..c.......a" - "...c.......a" - "...c.......a" - "...c.......a" - "a..c.......a" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "a..........a" + /* 2 */ "a..........a" + /* 3 */ "a..........a" + /* 4 */ "a..........a" + /* 5 */ "a..........a" + /* 6 */ "...........a" + /* 7 */ "...........a" + /* 8 */ "...........a" + /* 9 */ "a..........a" + /* 10 */ "a..........a" + /* 11 */ "a..........a" + /* 12 */ "a..........a" + /* 13 */ "a..........a" + /* 14 */ "aaaaaaaaaaaa" // Level 11 - "aaaaaaaaaaaa" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "...........a" - "...........a" - "...........a" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "a..........a" + /* 2 */ "a..........a" + /* 3 */ "a..........a" + /* 4 */ "a..........a" + /* 5 */ "a..........a" + /* 6 */ "...........a" + /* 7 */ "...........a" + /* 8 */ "...........a" + /* 9 */ "a..........a" + /* 10 */ "a..........a" + /* 11 */ "a..........a" + /* 12 */ "a..........a" + /* 13 */ "a..........a" + /* 14 */ "aaaaaaaaaaaa" // Level 12 - "aaaaaaaaaaaa" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "...........a" - "...........a" - "...........a" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "a..........a" + /* 2 */ "a..........a" + /* 3 */ "a..........a" + /* 4 */ "a..........a" + /* 5 */ "a..........a" + /* 6 */ "a..........a" + /* 7 */ "a..........a" + /* 8 */ "a..........a" + /* 9 */ "a..........a" + /* 10 */ "a..........a" + /* 11 */ "a..........a" + /* 12 */ "a..........a" + /* 13 */ "a..........a" + /* 14 */ "aaaaaaaaaaaa" // Level 13 - "aaaaaaaaaaaa" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "...........a" - "...........a" - "...........a" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "a..........a" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaa" + /* 8 */ "aaaaaaaaaaaa" + /* 9 */ "aaaaaaaaaaaa" + /* 10 */ "aaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaa" + /* 13 */ "aaaaaaaaaaaa" + /* 14 */ "aaaaaaaaaaaa" // Level 14 - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" - "aaaaaaaaaaaa" + /* z\x* 11 */ + /* * 012345678901 */ + /* 0 */ "aaaaaaaaaaaa" + /* 1 */ "abbbbbbbbbba" + /* 2 */ "abbbbbbbbbba" + /* 3 */ "abbbbbbbbbba" + /* 4 */ "abbbbbbbbbba" + /* 5 */ "abbbbbbbbbba" + /* 6 */ "abbbbbbbbbba" + /* 7 */ "abbbbbbbbbba" + /* 8 */ "abbbbbbbbbba" + /* 9 */ "abbbbbbbbbba" + /* 10 */ "abbbbbbbbbba" + /* 11 */ "abbbbbbbbbba" + /* 12 */ "abbbbbbbbbba" + /* 13 */ "abbbbbbbbbba" + /* 14 */ "aaaaaaaaaaaa", - // Level 15 - "aaaaaaaaaaaa" - "abbbbbbbbbba" - "abbbbbbbbbba" - "abbbbbbbbbba" - "abbbbbbbbbba" - "abbbbbbbbbba" - "abbbbbbbbbba" - "abbbbbbbbbba" - "abbbbbbbbbba" - "abbbbbbbbbba" - "abbbbbbbbbba" - "abbbbbbbbbba" - "abbbbbbbbbba" - "abbbbbbbbbba" - "aaaaaaaaaaaa", - - // Connections: - "1: 0, 9, 7: 4\n" /* Type 1, BLOCK_FACE_XM */ - "1: 11, 1, 7: 5\n" /* Type 1, BLOCK_FACE_XP */, + // Connectors: + "1: 11, 1, 7: 5\n" /* Type 1, direction X+ */ + "1: 0, 9, 7: 4\n" /* Type 1, direction X- */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // LavaStaircaseBig + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // LavaStairsBridge: + // The data has been exported from the gallery Nether, area index 30, ID 281, created by STR_Warrior + { + // Size: + 16, 12, 15, // SizeX = 16, SizeY = 12, SizeZ = 15 + + // Block definitions: + ".: 0: 0\n" /* air */ + "a:112: 0\n" /* netherbrick */ + "b:113: 0\n" /* netherbrickfence */ + "c: 10: 0\n" /* lava */ + "d:114: 2\n" /* netherbrickstairs */ + "e:114: 3\n" /* netherbrickstairs */ + "f:114: 7\n" /* netherbrickstairs */ + "g: 44:14\n" /* step */ + "h:114: 6\n" /* netherbrickstairs */ + "i: 44: 6\n" /* step */ + "j:114: 0\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, + + // Block data: + // Level 0 + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaaaaaa" + /* 8 */ "aaaaaaaaaaaaaaaa" + /* 9 */ "aaaaaaaaaaaaaaaa" + /* 10 */ "aaaaaaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaaaaaa" + /* 13 */ "aaaaaaaaaaaaaaaa" + /* 14 */ "aaaaaaaaaaaaaaaa" + + // Level 1 + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaa...aaaaa" + /* 1 */ "aaaaa..........a" + /* 2 */ "aaaaa..........a" + /* 3 */ "aaaaab.........a" + /* 4 */ "accca...ddd.aaaa" + /* 5 */ "accca...aaa.acca" + /* 6 */ "acccaaaaaaaaacca" + /* 7 */ "acccccccccccccca" + /* 8 */ "acccaaaaaaaaacca" + /* 9 */ "accca...aaa.acca" + /* 10 */ "accca...eee.aaaa" + /* 11 */ "aaaaab.........a" + /* 12 */ "aaaaa..........a" + /* 13 */ "aaaaa..........a" + /* 14 */ "aaaaaaaa...aaaaa" + + // Level 2 + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaa...aaaaa" + /* 1 */ "aaaa...........a" + /* 2 */ "aaaa...........a" + /* 3 */ "aaaabb.........a" + /* 4 */ "aaaa........b..a" + /* 5 */ "a.......ddd....a" + /* 6 */ "a.......fff....a" + /* 7 */ "a.......ggg....a" + /* 8 */ "a.......hhh....a" + /* 9 */ "a.......eee....a" + /* 10 */ "aaaa........b..a" + /* 11 */ "aaaabb.........a" + /* 12 */ "aaaa...........a" + /* 13 */ "aaaa...........a" + /* 14 */ "aaaaaaaa...aaaaa" + + // Level 3 + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaa...aaaaa" + /* 1 */ "a..............a" + /* 2 */ "a..............a" + /* 3 */ "a..bb..........a" + /* 4 */ "aaaa........b..a" + /* 5 */ "aaaa...........a" + /* 6 */ "a..............a" + /* 7 */ "a..............a" + /* 8 */ "a..............a" + /* 9 */ "aaaa...........a" + /* 10 */ "aaaa........b..a" + /* 11 */ "a..bb..........a" + /* 12 */ "a..............a" + /* 13 */ "a..............a" + /* 14 */ "aaaaaaaa...aaaaa" + + // Level 4 + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaabbbaaaaa" + /* 1 */ "a..............a" + /* 2 */ "a..............a" + /* 3 */ "a..b...........a" + /* 4 */ "a..b........b..a" + /* 5 */ "aaaa...........a" + /* 6 */ "aaaa...........a" + /* 7 */ "a..............a" + /* 8 */ "aaaa...........a" + /* 9 */ "aaaa...........a" + /* 10 */ "a..b........b..a" + /* 11 */ "a..b...........a" + /* 12 */ "a..............a" + /* 13 */ "a..............a" + /* 14 */ "aaaaaaaabbbaaaaa" + + // Level 5 + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaaaaaaaaaa" + /* 1 */ "a..............a" + /* 2 */ "a..............a" + /* 3 */ "a...........ggga" + /* 4 */ "a..b........iija" + /* 5 */ "a..b........iija" + /* 6 */ "aaaa........iija" + /* 7 */ "aaaa........iija" + /* 8 */ "aaaa........iija" + /* 9 */ "a..b........iija" + /* 10 */ "a..b........iija" + /* 11 */ "a...........ggga" + /* 12 */ "a..............a" + /* 13 */ "a..............a" + /* 14 */ "aaaaaaaaaaaaaaaa" + + // Level 6 + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaaaaaaaaaa" + /* 1 */ "a.............ga" + /* 2 */ "a............iia" + /* 3 */ "a..............a" + /* 4 */ "a..............a" + /* 5 */ "a..b...........a" + /* 6 */ "...b...........a" + /* 7 */ "...b...........a" + /* 8 */ "...b...........a" + /* 9 */ "a..b...........a" + /* 10 */ "a..............a" + /* 11 */ "a..............a" + /* 12 */ "a............iia" + /* 13 */ "a.............ga" + /* 14 */ "aaaaaaaaaaaaaaaa" + + // Level 7 + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaaaaaaaaaa" + /* 1 */ "a..............a" + /* 2 */ "a..............a" + /* 3 */ "a..............a" + /* 4 */ "a..............a" + /* 5 */ "a..............a" + /* 6 */ "...............a" + /* 7 */ "...............a" + /* 8 */ "...............a" + /* 9 */ "a..............a" + /* 10 */ "a..............a" + /* 11 */ "a..............a" + /* 12 */ "a..............a" + /* 13 */ "a..............a" + /* 14 */ "aaaaaaaaaaaaaaaa" + + // Level 8 + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaaaaaaaaaa" + /* 1 */ "a..............a" + /* 2 */ "a..............a" + /* 3 */ "a..............a" + /* 4 */ "a..............a" + /* 5 */ "a..............a" + /* 6 */ "...............a" + /* 7 */ "...............a" + /* 8 */ "...............a" + /* 9 */ "a..............a" + /* 10 */ "a..............a" + /* 11 */ "a..............a" + /* 12 */ "a..............a" + /* 13 */ "a..............a" + /* 14 */ "aaaaaaaaaaaaaaaa" + + // Level 9 + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaaaaaaaaaa" + /* 1 */ "a..............a" + /* 2 */ "a..............a" + /* 3 */ "a..............a" + /* 4 */ "a..............a" + /* 5 */ "a..............a" + /* 6 */ "a..............a" + /* 7 */ "a..............a" + /* 8 */ "a..............a" + /* 9 */ "a..............a" + /* 10 */ "a..............a" + /* 11 */ "a..............a" + /* 12 */ "a..............a" + /* 13 */ "a..............a" + /* 14 */ "aaaaaaaaaaaaaaaa" + + // Level 10 + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaaaaaa" + /* 8 */ "aaaaaaaaaaaaaaaa" + /* 9 */ "aaaaaaaaaaaaaaaa" + /* 10 */ "aaaaaaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaaaaaa" + /* 13 */ "aaaaaaaaaaaaaaaa" + /* 14 */ "aaaaaaaaaaaaaaaa" + + // Level 11 + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "abbaabbaabbaabba" + /* 1 */ "b..............b" + /* 2 */ "a..............a" + /* 3 */ "b..............b" + /* 4 */ "a..............a" + /* 5 */ "b..............b" + /* 6 */ "a..............a" + /* 7 */ "b..............b" + /* 8 */ "a..............a" + /* 9 */ "b..............b" + /* 10 */ "a..............a" + /* 11 */ "b..............b" + /* 12 */ "a..............a" + /* 13 */ "b..............b" + /* 14 */ "abbaabbaabbaabba", + + // Connectors: + "", + + // AllowedRotations: + 7, /* 1, 2, 3 CCW rotations */ + + // Merge strategy: + cBlockArea::msSpongePrint, + }, // LavaStairsBridge + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MidStaircase: - // The data has been exported from gallery Nether, area index 23, ID 165 + // The data has been exported from the gallery Nether, area index 23, ID 165, created by Aloe_vera { // Size: 13, 8, 13, // SizeX = 13, SizeY = 8, SizeZ = 13 @@ -1957,144 +3225,162 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = "f:114: 1\n" /* netherbrickstairs */ "g:114: 2\n" /* netherbrickstairs */ "h: 10: 0\n" /* lava */ - "i:113: 0\n" /* netherbrickfence */, + "i:113: 0\n" /* netherbrickfence */ + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaabbbbbaaaa" + /* 4 */ "aaaabbbbbaaaa" + /* 5 */ "aaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaaa" + /* 8 */ "aaaabbbbbaaaa" + /* 9 */ "aaaabbbbbaaaa" + /* 10 */ "aaaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaaa" + // Level 1 - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaabbbbbaaaa" - "aaaabbbbbaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaabbbbbaaaa" - "aaaabbbbbaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaacccccaaaa" + /* 4 */ "addecccccfdda" + /* 5 */ "...eaaaaad..." + /* 6 */ "...eaaaaa...." + /* 7 */ "...eaaaaag..." + /* 8 */ "agggcccccfgga" + /* 9 */ "aaaacccccaaaa" + /* 10 */ "aaaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaaa" // Level 2 - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaacccccaaaa" - "addecccccfdda" - "...eaaaaad..." - "...eaaaaa...." - "...eaaaaag..." - "agggcccccfgga" - "aaaacccccaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "aha.......aha" + /* 2 */ "aaa.......aaa" + /* 3 */ "a...........a" + /* 4 */ "a...........a" + /* 5 */ "....eaaaa...." + /* 6 */ "....eaaaa...." + /* 7 */ "....eaaaa...." + /* 8 */ "a...........a" + /* 9 */ "a...........a" + /* 10 */ "aaa.......aaa" + /* 11 */ "aha.......aha" + /* 12 */ "aaaaaaaaaaaaa" // Level 3 - "aaaaaaaaaaaaa" - "aha.......aha" - "aaa.......aaa" - "a...........a" - "a...........a" - "....eaaaa...." - "....eaaaa...." - "....eaaaa...." - "a...........a" - "a...........a" - "aaa.......aaa" - "aha.......aha" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaiiaaaiiaaa" + /* 1 */ "a...........a" + /* 2 */ "a...........a" + /* 3 */ "a...........a" + /* 4 */ "a...........a" + /* 5 */ ".....eaaa...." + /* 6 */ ".....eaaa...." + /* 7 */ ".....eaaa...." + /* 8 */ "a...........a" + /* 9 */ "a...........a" + /* 10 */ "a...........a" + /* 11 */ "a...........a" + /* 12 */ "aaaiiaaaiiaaa" // Level 4 - "aaaiiaaaiiaaa" - "a...........a" - "a...........a" - "a...........a" - "a...........a" - ".....eaaa...." - ".....eaaa...." - ".....eaaa...." - "a...........a" - "a...........a" - "a...........a" - "a...........a" - "aaaiiaaaiiaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaiiaaaiiaaa" + /* 1 */ "a...........a" + /* 2 */ "a...........a" + /* 3 */ "a...........a" + /* 4 */ "a...........a" + /* 5 */ "......eaa...." + /* 6 */ "......eaa...." + /* 7 */ "......eaa...." + /* 8 */ "a...........a" + /* 9 */ "a...........a" + /* 10 */ "a...........a" + /* 11 */ "a...........a" + /* 12 */ "aaaiiaaaiiaaa" // Level 5 - "aaaiiaaaiiaaa" - "a...........a" - "a...........a" - "a...........a" - "a...........a" - "......eaa...." - "......eaa...." - "......eaa...." - "a...........a" - "a...........a" - "a...........a" - "a...........a" - "aaaiiaaaiiaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "a...........a" + /* 2 */ "a...........a" + /* 3 */ "a...........a" + /* 4 */ "a...........a" + /* 5 */ "a......ea...a" + /* 6 */ "a......ea...a" + /* 7 */ "a......ea...a" + /* 8 */ "a...........a" + /* 9 */ "a...........a" + /* 10 */ "a...........a" + /* 11 */ "a...........a" + /* 12 */ "aaaaaaaaaaaaa" // Level 6 - "aaaaaaaaaaaaa" - "a...........a" - "a...........a" - "a...........a" - "a...........a" - "a......ea...a" - "a......ea...a" - "a......ea...a" - "a...........a" - "a...........a" - "a...........a" - "a...........a" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaa" + /* 5 */ "aaaa....eaaaa" + /* 6 */ "aaaa....eaaaa" + /* 7 */ "aaaa....eaaaa" + /* 8 */ "aaaaaaaaaaaaa" + /* 9 */ "aaaaaaaaaaaaa" + /* 10 */ "aaaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaaa" // Level 7 - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaa....eaaaa" - "aaaa....eaaaa" - "aaaa....eaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "iaiaiaiaiaiai" + /* 1 */ "a...........a" + /* 2 */ "i...........i" + /* 3 */ "a...........a" + /* 4 */ "i...........i" + /* 5 */ "a...........a" + /* 6 */ "i...........i" + /* 7 */ "a...........a" + /* 8 */ "i...........i" + /* 9 */ "a...........a" + /* 10 */ "i...........i" + /* 11 */ "a...........a" + /* 12 */ "iaiaiaiaiaiai", - // Level 8 - "iaiaiaiaiaiai" - "a...........a" - "i...........i" - "a...........a" - "i...........i" - "a............" - "i............" - "a............" - "i...........i" - "a...........a" - "i...........i" - "a...........a" - "iaiaiaiaiaiai", - - // Connections: - "1: 0, 1, 6: 4\n" /* Type 1, BLOCK_FACE_XM */ - "1: 12, 1, 6: 5\n" /* Type 1, BLOCK_FACE_XP */ - "1: 12, 7, 6: 5\n" /* Type 1, BLOCK_FACE_XP */, + // Connectors: + "1: 12, 1, 6: 5\n" /* Type 1, direction X+ */ + "1: -1, 1, 6: 4\n" /* Type 1, direction X- */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // MidStaircase + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // StairsToOpen1: - // The data has been exported from gallery Nether, area index 27, ID 277 + // The data has been exported from the gallery Nether, area index 27, ID 277, created by Aloe_vera { // Size: 7, 10, 7, // SizeX = 7, SizeY = 10, SizeZ = 7 @@ -2106,110 +3392,122 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 0123456 */ + /* 0 */ "aaaaaaa" + /* 1 */ "aaaaaaa" + /* 2 */ "aaaaaaa" + /* 3 */ "aaaaaaa" + /* 4 */ "aaaaaaa" + /* 5 */ "aaaaaaa" + /* 6 */ "aaaaaaa" + // Level 1 - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" + /* z\x* 0123456 */ + /* 0 */ "aa...aa" + /* 1 */ "a.....a" + /* 2 */ "a.....a" + /* 3 */ "a.....a" + /* 4 */ "a.....a" + /* 5 */ "aaaaaaa" + /* 6 */ "aaaaaaa" // Level 2 - "aa...aa" - "a.....a" - "a.....a" - "a.....a" - "a.....a" - "aaaaaaa" - "aaaaaaa" + /* z\x* 0123456 */ + /* 0 */ "aa...aa" + /* 1 */ "a.....a" + /* 2 */ "b.....b" + /* 3 */ "a.....a" + /* 4 */ "b.....b" + /* 5 */ "a.aaaaa" + /* 6 */ "aabaaba" // Level 3 - "aa...aa" - "a.....a" - "b.....b" - "a.....a" - "b.....b" - "a.aaaaa" - "aabaaba" + /* z\x* 0123456 */ + /* 0 */ "aa...aa" + /* 1 */ "a.....a" + /* 2 */ "b.....b" + /* 3 */ "a.....a" + /* 4 */ "b.....b" + /* 5 */ "a..aaaa" + /* 6 */ "aabaaba" // Level 4 - "aa...aa" - "a.....a" - "b.....b" - "a.....a" - "b.....b" - "a..aaaa" - "aabaaba" + /* z\x* 0123456 */ + /* 0 */ "aabbbaa" + /* 1 */ "a.....a" + /* 2 */ "b.....b" + /* 3 */ "a.....a" + /* 4 */ "b.....b" + /* 5 */ "a...aaa" + /* 6 */ "aabaaba" // Level 5 - "aabbbaa" - "a.....a" - "b.....b" - "a.....a" - "b.....b" - "a...aaa" - "aabaaba" + /* z\x* 0123456 */ + /* 0 */ "aaaaaaa" + /* 1 */ "a.....a" + /* 2 */ "a.....a" + /* 3 */ "a.....a" + /* 4 */ "a.....a" + /* 5 */ "a....aa" + /* 6 */ "aaaaaaa" // Level 6 - "aaaaaaa" - "a.....a" - "a.....a" - "a.....a" - "a.....a" - "a....aa" - "aaaaaaa" + /* z\x* 0123456 */ + /* 0 */ "aaaaaaa" + /* 1 */ "aaaaaaa" + /* 2 */ "aaaaaaa" + /* 3 */ "aaaaaaa" + /* 4 */ "aaaaaaa" + /* 5 */ "a.....a" + /* 6 */ "aaaaaaa" // Level 7 - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "a.....a" - "aaaaaaa" + /* z\x* 0123456 */ + /* 0 */ "aaaaaaa" + /* 1 */ "a.....a" + /* 2 */ "a......" + /* 3 */ "a......" + /* 4 */ "a......" + /* 5 */ "a.....a" + /* 6 */ "aaaaaaa" // Level 8 - "aaaaaaa" - "a.....a" - "a......" - "a......" - "a......" - "a.....a" - "aaaaaaa" + /* z\x* 0123456 */ + /* 0 */ "mmmmmmm" + /* 1 */ "m.....m" + /* 2 */ "m......" + /* 3 */ "m......" + /* 4 */ "m......" + /* 5 */ "m.....m" + /* 6 */ "mmmmmmm" // Level 9 - "mmmmmmm" - "m.....m" - "m......" - "m......" - "m......" - "m.....m" - "mmmmmmm" + /* z\x* 0123456 */ + /* 0 */ "mmmmmmm" + /* 1 */ "m.....m" + /* 2 */ "m......" + /* 3 */ "m......" + /* 4 */ "m......" + /* 5 */ "m.....m" + /* 6 */ "mmmmmmm", - // Level 10 - "mmmmmmm" - "m.....m" - "m......" - "m......" - "m......" - "m.....m" - "mmmmmmm", - - // Connections: - "0: 3, 1, 0: 2\n" /* Type 0, BLOCK_FACE_ZM */ - "0: 6, 7, 3: 5\n" /* Type 0, BLOCK_FACE_XP */, + // Connectors: + "0: 6, 7, 3: 5\n" /* Type 0, direction X+ */ + "0: 3, 1, 0: 2\n" /* Type 0, direction Z- */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // StairsToOpen1 + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // StairsToOpen2: - // The data has been exported from gallery Nether, area index 8, ID 35 + // The data has been exported from the gallery Nether, area index 8, ID 35, created by xoft { // Size: 7, 10, 7, // SizeX = 7, SizeY = 10, SizeZ = 7 @@ -2221,110 +3519,122 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 0123456 */ + /* 0 */ "aaaaaaa" + /* 1 */ "aaaaaaa" + /* 2 */ "aaaaaaa" + /* 3 */ "aaaaaaa" + /* 4 */ "aaaaaaa" + /* 5 */ "aaaaaaa" + /* 6 */ "aaaaaaa" + // Level 1 - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" + /* z\x* 0123456 */ + /* 0 */ "aa...aa" + /* 1 */ "a.....a" + /* 2 */ "a.....a" + /* 3 */ "a.....a" + /* 4 */ "a.....a" + /* 5 */ "aaaaaaa" + /* 6 */ "aaaaaaa" // Level 2 - "aa...aa" - "a.....a" - "a.....a" - "a.....a" - "a.....a" - "aaaaaaa" - "aaaaaaa" + /* z\x* 0123456 */ + /* 0 */ "aa...aa" + /* 1 */ "a.....a" + /* 2 */ "b.....b" + /* 3 */ "a.....a" + /* 4 */ "b.....b" + /* 5 */ "a.aaaaa" + /* 6 */ "aabaaba" // Level 3 - "aa...aa" - "a.....a" - "b.....b" - "a.....a" - "b.....b" - "a.aaaaa" - "aabaaba" + /* z\x* 0123456 */ + /* 0 */ "aa...aa" + /* 1 */ "a.....a" + /* 2 */ "b.....b" + /* 3 */ "a.....a" + /* 4 */ "b.....b" + /* 5 */ "a..aaaa" + /* 6 */ "aabaaba" // Level 4 - "aa...aa" - "a.....a" - "b.....b" - "a.....a" - "b.....b" - "a..aaaa" - "aabaaba" + /* z\x* 0123456 */ + /* 0 */ "aabbbaa" + /* 1 */ "a.....a" + /* 2 */ "b.....b" + /* 3 */ "a.....a" + /* 4 */ "b.....b" + /* 5 */ "a...aaa" + /* 6 */ "aabaaba" // Level 5 - "aabbbaa" - "a.....a" - "b.....b" - "a.....a" - "b.....b" - "a...aaa" - "aabaaba" + /* z\x* 0123456 */ + /* 0 */ "aaaaaaa" + /* 1 */ "a.....a" + /* 2 */ "a.....a" + /* 3 */ "a.....a" + /* 4 */ "a.....a" + /* 5 */ "a....aa" + /* 6 */ "aaaaaaa" // Level 6 - "aaaaaaa" - "a.....a" - "a.....a" - "a.....a" - "a.....a" - "a....aa" - "aaaaaaa" + /* z\x* 0123456 */ + /* 0 */ "aaaaaaa" + /* 1 */ "aaaaaaa" + /* 2 */ "aaaaaaa" + /* 3 */ "aaaaaaa" + /* 4 */ "aaaaaaa" + /* 5 */ "a.....a" + /* 6 */ "aaaaaaa" // Level 7 - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "a.....a" - "aaaaaaa" + /* z\x* 0123456 */ + /* 0 */ "aaaaaaa" + /* 1 */ "a.....a" + /* 2 */ "......a" + /* 3 */ "......a" + /* 4 */ "......a" + /* 5 */ "a.....a" + /* 6 */ "aaaaaaa" // Level 8 - "aaaaaaa" - "a.....a" - "......a" - "......a" - "......a" - "a.....a" - "aaaaaaa" + /* z\x* 0123456 */ + /* 0 */ "mmmmmmm" + /* 1 */ "m.....m" + /* 2 */ "......m" + /* 3 */ "......m" + /* 4 */ "......m" + /* 5 */ "m.....m" + /* 6 */ "mmmmmmm" // Level 9 - "mmmmmmm" - "m.....m" - "......m" - "......m" - "......m" - "m.....m" - "mmmmmmm" + /* z\x* 0123456 */ + /* 0 */ "mmmmmmm" + /* 1 */ "m.....m" + /* 2 */ "......m" + /* 3 */ "......m" + /* 4 */ "......m" + /* 5 */ "m.....m" + /* 6 */ "mmmmmmm", - // Level 10 - "mmmmmmm" - "m.....m" - "......m" - "......m" - "......m" - "m.....m" - "mmmmmmm", - - // Connections: - "0: 3, 1, 0: 2\n" /* Type 0, BLOCK_FACE_ZM */ - "0: 0, 7, 3: 4\n" /* Type 0, BLOCK_FACE_XM */, + // Connectors: + "0: 0, 7, 3: 4\n" /* Type 0, direction X- */ + "0: 3, 1, 0: 2\n" /* Type 0, direction Z- */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // StairsToOpen2 + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Tee2x4: - // The data has been exported from gallery Nether, area index 40, ID 291 + // The data has been exported from the gallery Nether, area index 40, ID 291, created by Aloe_vera { // Size: 13, 6, 7, // SizeX = 13, SizeY = 6, SizeZ = 7 @@ -2340,75 +3650,89 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmmaaaaammmm" + /* 1 */ "mmmmaaaaammmm" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaa" + // Level 1 - "mmmmaaaaammmm" - "mmmmaaaaammmm" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmma...ammmm" + /* 1 */ "mmmma...ammmm" + /* 2 */ "aaaaa...aaaaa" + /* 3 */ "............." + /* 4 */ "............." + /* 5 */ "............." + /* 6 */ "aaaaaaaaaaaaa" // Level 2 - "mmmma...ammmm" - "mmmma...ammmm" - "aaaaa...aaaaa" - "............." - "............." - "............." - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmma...ammmm" + /* 1 */ "mmmmb...bmmmm" + /* 2 */ "ababa...ababa" + /* 3 */ "............." + /* 4 */ "............." + /* 5 */ "............." + /* 6 */ "ababababababa" // Level 3 - "mmmma...ammmm" - "mmmmb...bmmmm" - "ababa...ababa" - "............." - "............." - "............." - "ababababababa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmma...ammmm" + /* 1 */ "mmmmb...bmmmm" + /* 2 */ "ababa...ababa" + /* 3 */ "............." + /* 4 */ "............." + /* 5 */ "............." + /* 6 */ "ababababababa" // Level 4 - "mmmma...ammmm" - "mmmmb...bmmmm" - "ababa...ababa" - "............." - "............." - "............." - "ababababababa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmma...ammmm" + /* 1 */ "mmmmb...bmmmm" + /* 2 */ "ababa...ababa" + /* 3 */ "............." + /* 4 */ "............." + /* 5 */ "............." + /* 6 */ "ababababababa" // Level 5 - "mmmma...ammmm" - "mmmmb...bmmmm" - "ababa...ababa" - "............." - "............." - "............." - "ababababababa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmmcaaadmmmm" + /* 1 */ "mmmmcaaadmmmm" + /* 2 */ "eeeecaaadeeee" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaa" + /* 6 */ "fffffffffffff", - // Level 6 - "mmmmcaaadmmmm" - "mmmmcaaadmmmm" - "eeeecaaadeeee" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "fffffffffffff", - - // Connections: - "1: 0, 1, 4: 4\n" /* Type 1, BLOCK_FACE_XM */ - "1: 6, 1, 0: 2\n" /* Type 1, BLOCK_FACE_ZM */ - "1: 12, 1, 4: 5\n" /* Type 1, BLOCK_FACE_XP */, + // Connectors: + "1: 0, 1, 4: 4\n" /* Type 1, direction X- */ + "1: 6, 1, 0: 2\n" /* Type 1, direction Z- */ + "1: 12, 1, 4: 5\n" /* Type 1, direction X+ */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // Tee2x4 + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Tee4x4: - // The data has been exported from gallery Nether, area index 41, ID 292 + // The data has been exported from the gallery Nether, area index 41, ID 292, created by Aloe_vera { // Size: 13, 6, 9, // SizeX = 13, SizeY = 6, SizeZ = 9 @@ -2424,86 +3748,101 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmmaaaaammmm" + /* 1 */ "mmmmaaaaammmm" + /* 2 */ "mmmmaaaaammmm" + /* 3 */ "mmmmaaaaammmm" + /* 4 */ "aaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaaa" + /* 8 */ "aaaaaaaaaaaaa" + // Level 1 - "mmmmaaaaammmm" - "mmmmaaaaammmm" - "mmmmaaaaammmm" - "mmmmaaaaammmm" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmma...ammmm" + /* 1 */ "mmmma...ammmm" + /* 2 */ "mmmma...ammmm" + /* 3 */ "mmmma...ammmm" + /* 4 */ "aaaaa...aaaaa" + /* 5 */ "............." + /* 6 */ "............." + /* 7 */ "............." + /* 8 */ "aaaaaaaaaaaaa" // Level 2 - "mmmma...ammmm" - "mmmma...ammmm" - "mmmma...ammmm" - "mmmma...ammmm" - "aaaaa...aaaaa" - "............." - "............." - "............." - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmma...ammmm" + /* 1 */ "mmmmb...bmmmm" + /* 2 */ "mmmma...ammmm" + /* 3 */ "mmmmb...bmmmm" + /* 4 */ "ababa...ababa" + /* 5 */ "............." + /* 6 */ "............." + /* 7 */ "............." + /* 8 */ "ababababababa" // Level 3 - "mmmma...ammmm" - "mmmmb...bmmmm" - "mmmma...ammmm" - "mmmmb...bmmmm" - "ababa...ababa" - "............." - "............." - "............." - "ababababababa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmma...ammmm" + /* 1 */ "mmmmb...bmmmm" + /* 2 */ "mmmma...ammmm" + /* 3 */ "mmmmb...bmmmm" + /* 4 */ "ababa...ababa" + /* 5 */ "............." + /* 6 */ "............." + /* 7 */ "............." + /* 8 */ "ababababababa" // Level 4 - "mmmma...ammmm" - "mmmmb...bmmmm" - "mmmma...ammmm" - "mmmmb...bmmmm" - "ababa...ababa" - "............." - "............." - "............." - "ababababababa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmma...ammmm" + /* 1 */ "mmmmb...bmmmm" + /* 2 */ "mmmma...ammmm" + /* 3 */ "mmmmb...bmmmm" + /* 4 */ "ababa...ababa" + /* 5 */ "............." + /* 6 */ "............." + /* 7 */ "............." + /* 8 */ "ababababababa" // Level 5 - "mmmma...ammmm" - "mmmmb...bmmmm" - "mmmma...ammmm" - "mmmmb...bmmmm" - "ababa...ababa" - "............." - "............." - "............." - "ababababababa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "mmmmcaaadmmmm" + /* 1 */ "mmmmcaaadmmmm" + /* 2 */ "mmmmcaaadmmmm" + /* 3 */ "mmmmcaaadmmmm" + /* 4 */ "eeeecaaadeeee" + /* 5 */ "aaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaaa" + /* 8 */ "fffffffffffff", - // Level 6 - "mmmmcaaadmmmm" - "mmmmcaaadmmmm" - "mmmmcaaadmmmm" - "mmmmcaaadmmmm" - "eeeecaaadeeee" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "fffffffffffff", - - // Connections: - "1: 0, 1, 6: 4\n" /* Type 1, BLOCK_FACE_XM */ - "1: 12, 1, 6: 5\n" /* Type 1, BLOCK_FACE_XP */ - "1: 6, 1, 0: 2\n" /* Type 1, BLOCK_FACE_ZM */, + // Connectors: + "1: 0, 1, 6: 4\n" /* Type 1, direction X- */ + "1: 6, 1, 0: 2\n" /* Type 1, direction Z- */ + "1: 12, 1, 6: 5\n" /* Type 1, direction X+ */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // Tee4x4 + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Turret: - // The data has been exported from gallery Nether, area index 7, ID 34 + // The data has been exported from the gallery Nether, area index 7, ID 34, created by xoft { // Size: 7, 6, 7, // SizeX = 7, SizeY = 6, SizeZ = 7 @@ -2511,248 +3850,278 @@ const cPrefab::sDef g_NetherFortPrefabs1[] = // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ - "b:113: 0\n" /* netherbrickfence */, + "b:113: 0\n" /* netherbrickfence */ + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 0123456 */ + /* 0 */ "aaaaaaa" + /* 1 */ "aaaaaaa" + /* 2 */ "aaaaaaa" + /* 3 */ "aaaaaaa" + /* 4 */ "aaaaaaa" + /* 5 */ "aaaaaaa" + /* 6 */ "aaaaaaa" + // Level 1 - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" - "aaaaaaa" + /* z\x* 0123456 */ + /* 0 */ "aa...aa" + /* 1 */ "a.....a" + /* 2 */ "......." + /* 3 */ "......." + /* 4 */ "......." + /* 5 */ "a.....a" + /* 6 */ "aa...aa" // Level 2 - "aa...aa" - "a.....a" - "......." - "......." - "......." - "a.....a" - "aa...aa" + /* z\x* 0123456 */ + /* 0 */ "aa...aa" + /* 1 */ "a.....a" + /* 2 */ "......." + /* 3 */ "......." + /* 4 */ "......." + /* 5 */ "a.....a" + /* 6 */ "aa...aa" // Level 3 - "aa...aa" - "a.....a" - "......." - "......." - "......." - "a.....a" - "aa...aa" + /* z\x* 0123456 */ + /* 0 */ "aa...aa" + /* 1 */ "a.....a" + /* 2 */ "......." + /* 3 */ "......." + /* 4 */ "......." + /* 5 */ "a.....a" + /* 6 */ "aa...aa" // Level 4 - "aa...aa" - "a.....a" - "......." - "......." - "......." - "a.....a" - "aa...aa" + /* z\x* 0123456 */ + /* 0 */ "aabbbaa" + /* 1 */ "a.....a" + /* 2 */ "b.....b" + /* 3 */ "b.....b" + /* 4 */ "b.....b" + /* 5 */ "a.....a" + /* 6 */ "aabbbaa" // Level 5 - "aabbbaa" - "a.....a" - "b.....b" - "b.....b" - "b.....b" - "a.....a" - "aabbbaa" + /* z\x* 0123456 */ + /* 0 */ "aaaaaaa" + /* 1 */ "a.....a" + /* 2 */ "a.....a" + /* 3 */ "a.....a" + /* 4 */ "a.....a" + /* 5 */ "a.....a" + /* 6 */ "aaaaaaa", - // Level 6 - "aaaaaaa" - "a.....a" - "a.....a" - "a.....a" - "a.....a" - "a.....a" - "aaaaaaa", - - // Connections: - "0: 0, 1, 3: 4\n" /* Type 0, BLOCK_FACE_XM */ - "0: 3, 1, 0: 2\n" /* Type 0, BLOCK_FACE_ZM */ - "0: 6, 1, 3: 5\n" /* Type 0, BLOCK_FACE_XP */ - "0: 3, 1, 6: 3\n" /* Type 0, BLOCK_FACE_ZP */, + // Connectors: + "0: 0, 1, 3: 4\n" /* Type 0, direction X- */ + "0: 3, 1, 0: 2\n" /* Type 0, direction Z- */ + "0: 6, 1, 3: 5\n" /* Type 0, direction X+ */ + "0: 3, 1, 6: 3\n" /* Type 0, direction Z+ */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, }, // Turret - -} ; // g_NetherFortPrefabs1 +}; // g_NetherFortPrefabs -const cPrefab::sDef g_NetherFortStartingPrefabs1[] = + +const cPrefab::sDef g_NetherFortStartingPrefabs[] = { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CentralRoom: - // The data has been exported from gallery Nether, area index 22, ID 164 + // The data has been exported from the gallery Nether, area index 22, ID 164, created by Aloe_vera { // Size: 13, 9, 13, // SizeX = 13, SizeY = 9, SizeZ = 13 // Block definitions: + ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ - "b: 0: 0\n" /* air */ - "c: 10: 0\n" /* lava */ - "d:113: 0\n" /* netherbrickfence */, + "b: 10: 0\n" /* lava */ + "c:113: 0\n" /* netherbrickfence */ + "m: 19: 0\n" /* sponge */, // Block data: + // Level 0 + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaaa" + /* 8 */ "aaaaaaaaaaaaa" + /* 9 */ "aaaaaaaaaaaaa" + /* 10 */ "aaaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaaa" + // Level 1 - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaa...aaaaa" + /* 1 */ "aaaaa...aaaaa" + /* 2 */ "aa.........aa" + /* 3 */ "aa.........aa" + /* 4 */ "aa.........aa" + /* 5 */ "aa...aaa...aa" + /* 6 */ "aa...aba...aa" + /* 7 */ "aa...aaa...aa" + /* 8 */ "aa.........aa" + /* 9 */ "aa.........aa" + /* 10 */ "aa.........aa" + /* 11 */ "aaaaa...aaaaa" + /* 12 */ "aaaaa...aaaaa" // Level 2 - "aaaaabbbaaaaa" - "aaaaabbbaaaaa" - "aabbbbbbbbbaa" - "aabbbbbbbbbaa" - "aabbbbbbbbbaa" - "aabbbaaabbbaa" - "aabbbacabbbaa" - "aabbbaaabbbaa" - "aabbbbbbbbbaa" - "aabbbbbbbbbaa" - "aabbbbbbbbbaa" - "aaaaabbbaaaaa" - "aaaaabbbaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaa...aaaaa" + /* 1 */ "aaaca...acaaa" + /* 2 */ "aa.........aa" + /* 3 */ "ac.........ca" + /* 4 */ "aa.........aa" + /* 5 */ "ac.........ca" + /* 6 */ "aa.........aa" + /* 7 */ "ac.........ca" + /* 8 */ "aa.........aa" + /* 9 */ "ac.........ca" + /* 10 */ "aa.........aa" + /* 11 */ "aaaca...acaaa" + /* 12 */ "aaaaa...aaaaa" // Level 3 - "aaaaabbbaaaaa" - "aaadabbbadaaa" - "aabbbbbbbbbaa" - "adbbbbbbbbbda" - "aabbbbbbbbbaa" - "adbbbbbbbbbda" - "aabbbbbbbbbaa" - "adbbbbbbbbbda" - "aabbbbbbbbbaa" - "adbbbbbbbbbda" - "aabbbbbbbbbaa" - "aaadabbbadaaa" - "aaaaabbbaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaa...aaaaa" + /* 1 */ "aaaca...acaaa" + /* 2 */ "aa.........aa" + /* 3 */ "ac.........ca" + /* 4 */ "aa.........aa" + /* 5 */ "ac.........ca" + /* 6 */ "aa.........aa" + /* 7 */ "ac.........ca" + /* 8 */ "aa.........aa" + /* 9 */ "ac.........ca" + /* 10 */ "aa.........aa" + /* 11 */ "aaaca...acaaa" + /* 12 */ "aaaaa...aaaaa" // Level 4 - "aaaaabbbaaaaa" - "aaadabbbadaaa" - "aabbbbbbbbbaa" - "adbbbbbbbbbda" - "aabbbbbbbbbaa" - "adbbbbbbbbbda" - "aabbbbbbbbbaa" - "adbbbbbbbbbda" - "aabbbbbbbbbaa" - "adbbbbbbbbbda" - "aabbbbbbbbbaa" - "aaadabbbadaaa" - "aaaaabbbaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "acacacccacaca" + /* 1 */ "caaaa...aaaac" + /* 2 */ "aa.........aa" + /* 3 */ "ca.........ac" + /* 4 */ "aa.........aa" + /* 5 */ "ca.........ac" + /* 6 */ "aa.........aa" + /* 7 */ "ca.........ac" + /* 8 */ "aa.........aa" + /* 9 */ "ca.........ac" + /* 10 */ "aa.........aa" + /* 11 */ "caaaa...aaaac" + /* 12 */ "acaca...acaca" // Level 5 - "adadadddadada" - "daaaabbbaaaad" - "aabbbbbbbbbaa" - "dabbbbbbbbbad" - "aabbbbbbbbbaa" - "dabbbbbbbbbad" - "aabbbbbbbbbaa" - "dabbbbbbbbbad" - "aabbbbbbbbbaa" - "dabbbbbbbbbad" - "aabbbbbbbbbaa" - "daaaabbbaaaad" - "adadabbbadada" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "acacaaaaacaca" + /* 1 */ "caaaaaaaaaaac" + /* 2 */ "aa.........aa" + /* 3 */ "ca.........ac" + /* 4 */ "aa.........aa" + /* 5 */ "ca.........ac" + /* 6 */ "aa.........aa" + /* 7 */ "ca.........ac" + /* 8 */ "aa.........aa" + /* 9 */ "ca.........ac" + /* 10 */ "aa.........aa" + /* 11 */ "caaaaaaaaaaac" + /* 12 */ "acacaaaaacaca" // Level 6 - "adadaaaaadada" - "daaaaaaaaaaad" - "aabbbbbbbbbaa" - "dabbbbbbbbbad" - "aabbbbbbbbbaa" - "dabbbbbbbbbad" - "aabbbbbbbbbaa" - "dabbbbbbbbbad" - "aabbbbbbbbbaa" - "dabbbbbbbbbad" - "aabbbbbbbbbaa" - "daaaaaaaaaaad" - "adadaaaaadada" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaaa" + /* 8 */ "aaaaaaaaaaaaa" + /* 9 */ "aaaaaaaaaaaaa" + /* 10 */ "aaaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaaa" // Level 7 - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "aaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaa" + /* 5 */ "aaaaaaaaaaaaa" + /* 6 */ "aaaaaaaaaaaaa" + /* 7 */ "aaaaaaaaaaaaa" + /* 8 */ "aaaaaaaaaaaaa" + /* 9 */ "aaaaaaaaaaaaa" + /* 10 */ "aaaaaaaaaaaaa" + /* 11 */ "aaaaaaaaaaaaa" + /* 12 */ "aaaaaaaaaaaaa" // Level 8 - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" - "aaaaaaaaaaaaa" + /* z\x* 111 */ + /* * 0123456789012 */ + /* 0 */ "cacacacacacac" + /* 1 */ "a...........a" + /* 2 */ "c...........c" + /* 3 */ "a...........a" + /* 4 */ "c...........c" + /* 5 */ "a...........a" + /* 6 */ "c...........c" + /* 7 */ "a...........a" + /* 8 */ "c...........c" + /* 9 */ "a...........a" + /* 10 */ "c...........c" + /* 11 */ "a...........a" + /* 12 */ "cacacacacacac", - // Level 9 - "dadadadadadad" - "abbbbbbbbbbba" - "dbbbbbbbbbbbd" - "abbbbbbbbbbba" - "dbbbbbbbbbbbd" - "abbbbbbbbbbba" - "dbbbbbbbbbbbd" - "abbbbbbbbbbba" - "dbbbbbbbbbbbd" - "abbbbbbbbbbba" - "dbbbbbbbbbbbd" - "abbbbbbbbbbba" - "dadadadadadad", + // Connectors: + "0: 6, 1, 0: 2\n" /* Type 0, direction Z- */ + "1: 6, 1, 12: 3\n" /* Type 1, direction Z+ */, - // Connections: - "0: 6, 1, 0: 2\n" /* Type 0, BLOCK_FACE_ZM */ - "1: 6, 1, 12: 3\n" /* Type 1, BLOCK_FACE_ZP */, - // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ - + // Merge strategy: cBlockArea::msSpongePrint, - }, -} ; // g_NetherFortStartingPrefabs1 - -const size_t g_NetherFortPrefabs1Count = ARRAYCOUNT(g_NetherFortPrefabs1); -const size_t g_NetherFortStartingPrefabs1Count = ARRAYCOUNT(g_NetherFortStartingPrefabs1); + }, // CentralRoom +}; + +// The prefab counts: + +const size_t g_NetherFortPrefabsCount = ARRAYCOUNT(g_NetherFortPrefabs); + +const size_t g_NetherFortStartingPrefabsCount = ARRAYCOUNT(g_NetherFortStartingPrefabs); + diff --git a/src/Generating/Prefabs/NetherFortPrefabs.h b/src/Generating/Prefabs/NetherFortPrefabs.h index 37a91689d..04edc2953 100644 --- a/src/Generating/Prefabs/NetherFortPrefabs.h +++ b/src/Generating/Prefabs/NetherFortPrefabs.h @@ -1,7 +1,7 @@ // NetherFortPrefabs.h -// Declares the data used for nether fortress prefabs +// Declares the prefabs in the group NetherFort #include "../Prefab.h" @@ -9,7 +9,7 @@ -extern const cPrefab::sDef g_NetherFortPrefabs1[]; -extern const cPrefab::sDef g_NetherFortStartingPrefabs1[]; -extern const size_t g_NetherFortPrefabs1Count; -extern const size_t g_NetherFortStartingPrefabs1Count; +extern const cPrefab::sDef g_NetherFortPrefabs[]; +extern const cPrefab::sDef g_NetherFortStartingPrefabs[]; +extern const size_t g_NetherFortPrefabsCount; +extern const size_t g_NetherFortStartingPrefabsCount; From 75b7244f0565170ccc40a3ebdf277945e5191be8 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 12 Apr 2014 22:15:09 +0200 Subject: [PATCH 080/188] Fixed chunkstays not being removed on auto-delete. Fixes #837. --- src/ChunkMap.cpp | 26 +++++++++++++++++--------- src/ChunkStay.cpp | 3 ++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/ChunkMap.cpp b/src/ChunkMap.cpp index e695f0ab2..83eae2665 100644 --- a/src/ChunkMap.cpp +++ b/src/ChunkMap.cpp @@ -916,19 +916,21 @@ void cChunkMap::SetChunkData( } // Notify relevant ChunkStays: - for (cChunkStays::iterator itr = m_ChunkStays.begin(); itr != m_ChunkStays.end(); ) + cChunkStays ToBeDisabled; + for (cChunkStays::iterator itr = m_ChunkStays.begin(), end = m_ChunkStays.end(); itr != end; ++itr) { if ((*itr)->ChunkAvailable(a_ChunkX, a_ChunkZ)) { - cChunkStays::iterator cur = itr; - ++itr; - m_ChunkStays.erase(cur); - } - else - { - ++itr; + // The chunkstay wants to be disabled, add it to a list of to-be-disabled chunkstays for later processing: + ToBeDisabled.push_back(*itr); } } // for itr - m_ChunkStays[] + + // Disable (and possibly remove) the chunkstays that chose to get disabled: + for (cChunkStays::iterator itr = ToBeDisabled.begin(), end = ToBeDisabled.end(); itr != end; ++itr) + { + (*itr)->Disable(); + } } // Notify plugins of the chunk becoming available @@ -2974,7 +2976,12 @@ void cChunkMap::AddChunkStay(cChunkStay & a_ChunkStay) Chunk->Stay(true); if (Chunk->IsValid()) { - a_ChunkStay.ChunkAvailable(itr->m_ChunkX, itr->m_ChunkZ); + if (a_ChunkStay.ChunkAvailable(itr->m_ChunkX, itr->m_ChunkZ)) + { + // The chunkstay wants to be deactivated, disable it and bail out: + a_ChunkStay.Disable(); + return; + } } } // for itr - WantedChunks[] } @@ -3017,6 +3024,7 @@ void cChunkMap::DelChunkStay(cChunkStay & a_ChunkStay) } Chunk->Stay(false); } // for itr - Chunks[] + a_ChunkStay.OnDisabled(); } diff --git a/src/ChunkStay.cpp b/src/ChunkStay.cpp index 6b1d5ee34..a35ccf58c 100644 --- a/src/ChunkStay.cpp +++ b/src/ChunkStay.cpp @@ -97,8 +97,9 @@ void cChunkStay::Disable(void) { ASSERT(m_ChunkMap != NULL); - m_ChunkMap->DelChunkStay(*this); + cChunkMap * ChunkMap = m_ChunkMap; m_ChunkMap = NULL; + ChunkMap->DelChunkStay(*this); } From 34cf058b0257587456632536a54db0d4e119dae1 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 12 Apr 2014 22:35:04 +0200 Subject: [PATCH 081/188] ChunkStay must be disabled while being deleted. Fixes #758. --- src/ChunkStay.cpp | 5 +---- src/ChunkStay.h | 4 ++++ src/LightingThread.cpp | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ChunkStay.cpp b/src/ChunkStay.cpp index a35ccf58c..b5002a63d 100644 --- a/src/ChunkStay.cpp +++ b/src/ChunkStay.cpp @@ -31,10 +31,7 @@ cChunkStay::~cChunkStay() void cChunkStay::Clear(void) { - if (m_ChunkMap != NULL) - { - Disable(); - } + ASSERT(m_ChunkMap == NULL); m_Chunks.clear(); } diff --git a/src/ChunkStay.h b/src/ChunkStay.h index 2510cb490..29893befc 100644 --- a/src/ChunkStay.h +++ b/src/ChunkStay.h @@ -36,8 +36,12 @@ class cChunkStay { public: cChunkStay(void); + + /** Deletes the object. Note that this calls Clear(), which means that the ChunkStay needs to be disabled. */ virtual ~cChunkStay(); + /** Clears all the chunks that have been added. + To be used only while the ChunkStay object is not enabled. */ void Clear(void); /** Adds a chunk to be locked from unloading. diff --git a/src/LightingThread.cpp b/src/LightingThread.cpp index 302473d71..5ba2940d2 100644 --- a/src/LightingThread.cpp +++ b/src/LightingThread.cpp @@ -286,6 +286,7 @@ void cLightingThread::LightChunk(cLightingChunkStay & a_Item) { a_Item.m_CallbackAfter->Call(a_Item.m_ChunkX, a_Item.m_ChunkZ); } + a_Item.Disable(); delete &a_Item; } From b506a7407661c0527255466cf8b315824b0003c0 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sun, 13 Apr 2014 13:04:56 +0200 Subject: [PATCH 082/188] Added Yggdrasil Authentication System Code by Howaner. Fixes/Changes by me. --- src/Authenticator.cpp | 267 ------------------------ src/ClientHandle.cpp | 7 +- src/ClientHandle.h | 6 +- src/Protocol/Authenticator.cpp | 325 +++++++++++++++++++++++++++++ src/{ => Protocol}/Authenticator.h | 36 ++-- src/Root.cpp | 4 +- src/Root.h | 4 +- src/Server.cpp | 4 +- src/Server.h | 2 +- 9 files changed, 360 insertions(+), 295 deletions(-) delete mode 100644 src/Authenticator.cpp create mode 100644 src/Protocol/Authenticator.cpp rename src/{ => Protocol}/Authenticator.h (69%) diff --git a/src/Authenticator.cpp b/src/Authenticator.cpp deleted file mode 100644 index bd6db1c11..000000000 --- a/src/Authenticator.cpp +++ /dev/null @@ -1,267 +0,0 @@ - -#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules - -#include "Authenticator.h" -#include "OSSupport/BlockingTCPLink.h" -#include "Root.h" -#include "Server.h" - -#include "inifile/iniFile.h" - -#include - - - - - -#define DEFAULT_AUTH_SERVER "session.minecraft.net" -#define DEFAULT_AUTH_ADDRESS "/game/checkserver.jsp?user=%USERNAME%&serverId=%SERVERID%" -#define MAX_REDIRECTS 10 - - - - - -cAuthenticator::cAuthenticator(void) : - super("cAuthenticator"), - m_Server(DEFAULT_AUTH_SERVER), - m_Address(DEFAULT_AUTH_ADDRESS), - m_ShouldAuthenticate(true) -{ -} - - - - - -cAuthenticator::~cAuthenticator() -{ - Stop(); -} - - - - - -void cAuthenticator::ReadINI(cIniFile & IniFile) -{ - m_Server = IniFile.GetValueSet("Authentication", "Server", DEFAULT_AUTH_SERVER); - m_Address = IniFile.GetValueSet("Authentication", "Address", DEFAULT_AUTH_ADDRESS); - m_ShouldAuthenticate = IniFile.GetValueSetB("Authentication", "Authenticate", true); -} - - - - - -void cAuthenticator::Authenticate(int a_ClientID, const AString & a_UserName, const AString & a_ServerHash) -{ - if (!m_ShouldAuthenticate) - { - cRoot::Get()->AuthenticateUser(a_ClientID); - return; - } - - cCSLock Lock(m_CS); - m_Queue.push_back(cUser(a_ClientID, a_UserName, a_ServerHash)); - m_QueueNonempty.Set(); -} - - - - - -void cAuthenticator::Start(cIniFile & IniFile) -{ - ReadINI(IniFile); - m_ShouldTerminate = false; - super::Start(); -} - - - - - -void cAuthenticator::Stop(void) -{ - m_ShouldTerminate = true; - m_QueueNonempty.Set(); - Wait(); -} - - - - - -void cAuthenticator::Execute(void) -{ - for (;;) - { - cCSLock Lock(m_CS); - while (!m_ShouldTerminate && (m_Queue.size() == 0)) - { - cCSUnlock Unlock(Lock); - m_QueueNonempty.Wait(); - } - if (m_ShouldTerminate) - { - return; - } - ASSERT(!m_Queue.empty()); - - int ClientID = m_Queue.front().m_ClientID; - AString UserName = m_Queue.front().m_Name; - AString ActualAddress = m_Address; - ReplaceString(ActualAddress, "%USERNAME%", UserName); - ReplaceString(ActualAddress, "%SERVERID%", m_Queue.front().m_ServerID); - m_Queue.pop_front(); - Lock.Unlock(); - - if (!AuthFromAddress(m_Server, ActualAddress, UserName)) - { - cRoot::Get()->KickUser(ClientID, "Failed to authenticate account!"); - } - else - { - cRoot::Get()->AuthenticateUser(ClientID); - } - } // for (-ever) -} - - - - - -bool cAuthenticator::AuthFromAddress(const AString & a_Server, const AString & a_Address, const AString & a_UserName, int a_Level /* = 1 */) -{ - // Returns true if the user authenticated okay, false on error; iLevel is the recursion deptht (bails out if too deep) - - cBlockingTCPLink Link; - if (!Link.Connect(a_Server.c_str(), 80)) - { - LOGWARNING("%s: cannot connect to auth server \"%s\", kicking user \"%s\"", - __FUNCTION__, a_Server.c_str(), a_UserName.c_str() - ); - return false; - } - - Link.SendMessage( AString( "GET " + a_Address + " HTTP/1.1\r\n" ).c_str()); - Link.SendMessage( AString( "User-Agent: MCServer\r\n" ).c_str()); - Link.SendMessage( AString( "Host: " + a_Server + "\r\n" ).c_str()); - //Link.SendMessage( AString( "Host: session.minecraft.net\r\n" ).c_str()); - Link.SendMessage( AString( "Accept: */*\r\n" ).c_str()); - Link.SendMessage( AString( "Connection: close\r\n" ).c_str()); //Close so we don´t have to mess with the Content-Length :) - Link.SendMessage( AString( "\r\n" ).c_str()); - AString DataRecvd; - Link.ReceiveData(DataRecvd); - Link.CloseSocket(); - - std::stringstream ss(DataRecvd); - - // Parse the data received: - std::string temp; - ss >> temp; - bool bRedirect = false; - bool bOK = false; - if ((temp.compare("HTTP/1.1") == 0) || (temp.compare("HTTP/1.0") == 0)) - { - int code; - ss >> code; - if (code == 302) - { - // redirect blabla - LOGD("%s: Need to redirect, current level %d!", __FUNCTION__, a_Level); - if (a_Level > MAX_REDIRECTS) - { - LOGERROR("cAuthenticator: received too many levels of redirection from auth server \"%s\" for user \"%s\", bailing out and kicking the user", a_Server.c_str(), a_UserName.c_str()); - return false; - } - bRedirect = true; - } - else if (code == 200) - { - LOGD("cAuthenticator: Received status 200 OK! :D"); - bOK = true; - } - } - else - { - LOGERROR("cAuthenticator: cannot parse auth reply from server \"%s\" for user \"%s\", kicking the user.", a_Server.c_str(), a_UserName.c_str()); - return false; - } - - if( bRedirect ) - { - AString Location; - // Search for "Location:" - bool bFoundLocation = false; - while( !bFoundLocation && ss.good() ) - { - char c = 0; - while( c != '\n' ) - { - ss.get( c ); - } - AString Name; - ss >> Name; - if (Name.compare("Location:") == 0) - { - bFoundLocation = true; - ss >> Location; - } - } - if (!bFoundLocation) - { - LOGERROR("cAuthenticator: received invalid redirection from auth server \"%s\" for user \"%s\", kicking user.", a_Server.c_str(), a_UserName.c_str()); - return false; - } - - Location = Location.substr(strlen("http://"), std::string::npos); // Strip http:// - std::string Server = Location.substr( 0, Location.find( "/" ) ); // Only leave server address - Location = Location.substr( Server.length(), std::string::npos); - return AuthFromAddress(Server, Location, a_UserName, a_Level + 1); - } - - if (!bOK) - { - LOGERROR("cAuthenticator: received an error from auth server \"%s\" for user \"%s\", kicking user.", a_Server.c_str(), a_UserName.c_str()); - return false; - } - - // Header says OK, so receive the rest. - // Go past header, double \n means end of headers - char c = 0; - while (ss.good()) - { - while (c != '\n') - { - ss.get(c); - } - ss.get(c); - if( c == '\n' || c == '\r' || ss.peek() == '\r' || ss.peek() == '\n' ) - break; - } - if (!ss.good()) - { - LOGERROR("cAuthenticator: error while parsing response body from auth server \"%s\" for user \"%s\", kicking user.", a_Server.c_str(), a_UserName.c_str()); - return false; - } - - std::string Result; - ss >> Result; - LOGD("cAuthenticator: Authentication result was %s", Result.c_str()); - - if (Result.compare("YES") == 0) //Works well - { - LOGINFO("Authentication result \"YES\", player authentication success!"); - return true; - } - - - LOGINFO("Authentication result was \"%s\", player authentication failure!", Result.c_str()); - return false; -} - - - - diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 5876e55c7..615039949 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -24,7 +24,7 @@ #include "Root.h" -#include "Authenticator.h" +#include "Protocol/Authenticator.h" #include "MersenneTwister.h" #include "Protocol/ProtocolRecognizer.h" @@ -188,7 +188,7 @@ void cClientHandle::Kick(const AString & a_Reason) -void cClientHandle::Authenticate(void) +void cClientHandle::Authenticate(const AString & a_Name, const AString & a_UUID) { if (m_State != csAuthenticating) { @@ -197,6 +197,9 @@ void cClientHandle::Authenticate(void) ASSERT( m_Player == NULL ); + m_Username = a_Name; + m_UUID = a_UUID; + // Spawn player (only serversided, so data is loaded) m_Player = new cPlayer(this, GetUsername()); diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 0c367ec7d..0f07c980b 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -62,8 +62,11 @@ public: cPlayer* GetPlayer() { return m_Player; } // tolua_export + const AString & GetUUID(void) const { return m_UUID; } // tolua_export + void setUUID(const AString & a_UUID) { m_UUID = a_UUID; } + void Kick(const AString & a_Reason); // tolua_export - void Authenticate(void); // Called by cAuthenticator when the user passes authentication + void Authenticate(const AString & a_Name, const AString & a_UUID); // Called by cAuthenticator when the user passes authentication void StreamChunks(void); @@ -326,6 +329,7 @@ private: static int s_ClientCount; int m_UniqueID; + AString m_UUID; /** Set to true when the chunk where the player is is sent to the client. Used for spawning the player */ bool m_HasSentPlayerChunk; diff --git a/src/Protocol/Authenticator.cpp b/src/Protocol/Authenticator.cpp new file mode 100644 index 000000000..ba435e9ce --- /dev/null +++ b/src/Protocol/Authenticator.cpp @@ -0,0 +1,325 @@ + +#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules + +#include "Authenticator.h" +#include "OSSupport/BlockingTCPLink.h" +#include "Root.h" +#include "Server.h" + +#include "inifile/iniFile.h" +#include "json/json.h" + +#include "polarssl/config.h" +#include "polarssl/net.h" +#include "polarssl/ssl.h" +#include "polarssl/entropy.h" +#include "polarssl/ctr_drbg.h" +#include "polarssl/error.h" +#include "polarssl/certs.h" + +#include +#include + + + + + +#define DEFAULT_AUTH_SERVER "sessionserver.mojang.com" +#define DEFAULT_AUTH_ADDRESS "/session/minecraft/hasJoined?username=%USERNAME%&serverId=%SERVERID%" +#define MAX_REDIRECTS 10 + + + + + +cAuthenticator::cAuthenticator(void) : +super("cAuthenticator"), +m_Server(DEFAULT_AUTH_SERVER), +m_Address(DEFAULT_AUTH_ADDRESS), +m_ShouldAuthenticate(true) +{ +} + + + + + +cAuthenticator::~cAuthenticator() +{ + Stop(); +} + + + + + +void cAuthenticator::ReadINI(cIniFile & IniFile) +{ + m_Server = IniFile.GetValueSet("Authentication", "Server", DEFAULT_AUTH_SERVER); + m_Address = IniFile.GetValueSet("Authentication", "Address", DEFAULT_AUTH_ADDRESS); + m_ShouldAuthenticate = IniFile.GetValueSetB("Authentication", "Authenticate", true); +} + + + + + +void cAuthenticator::Authenticate(int a_ClientID, const AString & a_UserName, const AString & a_ServerHash) +{ + if (!m_ShouldAuthenticate) + { + cRoot::Get()->AuthenticateUser(a_ClientID, a_UserName, Printf("%d", a_ClientID)); + return; + } + + cCSLock LOCK(m_CS); + m_Queue.push_back(cUser(a_ClientID, a_UserName, a_ServerHash)); + m_QueueNonempty.Set(); +} + + + + + +void cAuthenticator::Start(cIniFile & IniFile) +{ + ReadINI(IniFile); + m_ShouldTerminate = false; + super::Start(); +} + + + + + +void cAuthenticator::Stop(void) +{ + m_ShouldTerminate = true; + m_QueueNonempty.Set(); + Wait(); +} + + + + + +void cAuthenticator::Execute(void) +{ + for (;;) + { + cCSLock Lock(m_CS); + while (!m_ShouldTerminate && (m_Queue.size() == 0)) + { + cCSUnlock Unlock(Lock); + m_QueueNonempty.Wait(); + } + if (m_ShouldTerminate) + { + return; + } + ASSERT(!m_Queue.empty()); + + int ClientID = m_Queue.front().m_ClientID; + AString UserName = m_Queue.front().m_Name; + AString ServerID = m_Queue.front().m_ServerID; + m_Queue.pop_front(); + Lock.Unlock(); + + AString NewUserName = UserName; + AString UUID; + if (AuthWithYggdrasil(NewUserName, ServerID, UUID)) + { + LOGINFO("User %s authenticated with UUID '%s'", NewUserName.c_str(), UUID.c_str()); + cRoot::Get()->AuthenticateUser(ClientID, NewUserName, UUID); + } + else + { + cRoot::Get()->KickUser(ClientID, "Failed to authenticate account!"); + } + } // for (-ever) +} + + + + + +bool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_ServerId, AString & a_UUID) +{ + AString REQUEST; + int ret, len, server_fd = -1; + unsigned char buf[1024]; + const char *pers = "cAuthenticator"; + + entropy_context entropy; + ctr_drbg_context ctr_drbg; + ssl_context ssl; + x509_crt cacert; + + /* Initialize the RNG and the session data */ + memset(&ssl, 0, sizeof(ssl_context)); + x509_crt_init(&cacert); + + entropy_init(&entropy); + if ((ret = ctr_drbg_init(&ctr_drbg, entropy_func, &entropy, (const unsigned char *)pers, strlen(pers))) != 0) + { + LOGERROR("cAuthenticator: ctr_drbg_init returned %d", ret); + return false; + } + + /* Initialize certificates */ + +#if defined(POLARSSL_CERTS_C) + ret = x509_crt_parse(&cacert, (const unsigned char *)test_ca_list, strlen(test_ca_list)); +#else + ret = 1; + LOGWARNING("cAuthenticator: POLARSSL_CERTS_C is not defined."); +#endif + + if (ret < 0) + { + LOGERROR("cAuthenticator: x509_crt_parse returned -0x%x", -ret); + return false; + } + + /* Connect */ + if ((ret = net_connect(&server_fd, m_Server.c_str(), 443)) != 0) + { + LOGERROR("cAuthenticator: Can't connect to %s: %d", m_Server.c_str(), ret); + return false; + } + + /* Setup */ + if ((ret = ssl_init(&ssl)) != 0) + { + LOGERROR("cAuthenticator: ssl_init returned %d", ret); + return false; + } + ssl_set_endpoint(&ssl, SSL_IS_CLIENT); + ssl_set_authmode(&ssl, SSL_VERIFY_OPTIONAL); + ssl_set_ca_chain(&ssl, &cacert, NULL, "PolarSSL Server 1"); + ssl_set_rng(&ssl, ctr_drbg_random, &ctr_drbg); + ssl_set_bio(&ssl, net_recv, &server_fd, net_send, &server_fd); + + /* Handshake */ + while ((ret = ssl_handshake(&ssl)) != 0) + { + if (ret != POLARSSL_ERR_NET_WANT_READ && ret != POLARSSL_ERR_NET_WANT_WRITE) + { + LOGERROR("cAuthenticator: ssl_handshake returned -0x%x", -ret); + return false; + } + } + + /* Write the GET request */ + AString ActualAddress = m_Address; + ReplaceString(ActualAddress, "%USERNAME%", a_UserName); + ReplaceString(ActualAddress, "%SERVERID%", a_ServerId); + + REQUEST += "GET " + ActualAddress + " HTTP/1.1\r\n"; + REQUEST += "Host: " + m_Server + "\r\n"; + REQUEST += "User-Agent: MCServer\r\n"; + REQUEST += "Connection: close\r\n"; + REQUEST += "\r\n"; + + len = sprintf_s((char *)buf, sizeof(buf), REQUEST.c_str()); + + while ((ret = ssl_write(&ssl, buf, len)) <= 0) + { + if (ret != POLARSSL_ERR_NET_WANT_READ && ret != POLARSSL_ERR_NET_WANT_WRITE) + { + LOGERROR("cAuthenticator: ssl_write returned %d", ret); + return false; + } + } + + /* Read the HTTP response */ + std::string Builder; + for (;;) + { + len = sizeof(buf)-1; + memset(buf, 0, sizeof(buf)); + ret = ssl_read(&ssl, buf, len); + if (ret > 0) + { + buf[ret] = '\0'; + } + + if (ret == POLARSSL_ERR_NET_WANT_READ || ret == POLARSSL_ERR_NET_WANT_WRITE) + continue; + if (ret == POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY) + break; + if (ret < 0) + { + LOGERROR("cAuthenticator: ssl_read returned %d", ret); + break; + } + if (ret == 0) + { + LOGERROR("cAuthenticator: EOF"); + break; + } + + std::string str; + str.append(reinterpret_cast(buf)); + Builder += str; + } + + ssl_close_notify(&ssl); + x509_crt_free(&cacert); + net_close(server_fd); + ssl_free(&ssl); + entropy_free(&entropy); + memset(&ssl, 0, sizeof(ssl)); + + std::string prefix("HTTP/1.1 200 OK"); + if (Builder.compare(0, prefix.size(), prefix)) + return false; + + std::stringstream ResponseBuilder; + bool NewLine = false; + bool IsNewLine = false; + for (std::string::const_iterator i = Builder.begin(); i <= Builder.end(); ++i) + { + if (NewLine) + { + ResponseBuilder << *i; + } + else if (!NewLine && *i == '\n') + { + if (IsNewLine) + { + NewLine = true; + } + else + { + IsNewLine = true; + } + } + else if (*i != '\r') + { + IsNewLine = false; + } + } + + AString RESPONSE = ResponseBuilder.str(); + + if (RESPONSE.empty()) + return false; + + Json::Value root; + Json::Reader reader; + if (!reader.parse(RESPONSE, root, false)) + { + LOGWARNING("cAuthenticator: Cannot parse Received Data to json!"); + return false; + } + + a_UserName = root.get("name", "Unknown").asString(); + a_UUID = root.get("id", "").asString(); + return true; +} + + + + + diff --git a/src/Authenticator.h b/src/Protocol/Authenticator.h similarity index 69% rename from src/Authenticator.h rename to src/Protocol/Authenticator.h index 02cd6f4c5..211f51394 100644 --- a/src/Authenticator.h +++ b/src/Protocol/Authenticator.h @@ -14,7 +14,7 @@ #ifndef CAUTHENTICATOR_H_INCLUDED #define CAUTHENTICATOR_H_INCLUDED -#include "OSSupport/IsThread.h" +#include "../OSSupport/IsThread.h" @@ -31,23 +31,23 @@ class cAuthenticator : public cIsThread { typedef cIsThread super; - + public: cAuthenticator(void); ~cAuthenticator(); - /// (Re-)read server and address from INI: + /** (Re-)read server and address from INI: */ void ReadINI(cIniFile & IniFile); - /// Queues a request for authenticating a user. If the auth fails, the user is kicked + /** Queues a request for authenticating a user. If the auth fails, the user will be kicked */ void Authenticate(int a_ClientID, const AString & a_UserName, const AString & a_ServerHash); - /// Starts the authenticator thread. The thread may be started and stopped repeatedly + /** Starts the authenticator thread. The thread may be started and stopped repeatedly */ void Start(cIniFile & IniFile); - - /// Stops the authenticator thread. The thread may be started and stopped repeatedly + + /** Stops the authenticator thread. The thread may be started and stopped repeatedly */ void Stop(void); - + private: class cUser @@ -56,30 +56,30 @@ private: int m_ClientID; AString m_Name; AString m_ServerID; - + cUser(int a_ClientID, const AString & a_Name, const AString & a_ServerID) : m_ClientID(a_ClientID), m_Name(a_Name), m_ServerID(a_ServerID) { } - } ; - + }; + typedef std::deque cUserList; - + cCriticalSection m_CS; cUserList m_Queue; cEvent m_QueueNonempty; - + AString m_Server; AString m_Address; bool m_ShouldAuthenticate; - - // cIsThread override: + + /** cIsThread override: */ virtual void Execute(void) override; - - // Returns true if the user authenticated okay, false on error; iLevel is the recursion deptht (bails out if too deep) - bool AuthFromAddress(const AString & a_Server, const AString & a_Address, const AString & a_UserName, int a_Level = 1); + + /** Returns true if the user authenticated okay, false on error; iLevel is the recursion deptht (bails out if too deep) */ + bool AuthWithYggdrasil(AString & a_UserName, const AString & a_ServerId, AString & a_UUID); }; diff --git a/src/Root.cpp b/src/Root.cpp index ba4398b35..5d32bdd87 100644 --- a/src/Root.cpp +++ b/src/Root.cpp @@ -499,9 +499,9 @@ void cRoot::KickUser(int a_ClientID, const AString & a_Reason) -void cRoot::AuthenticateUser(int a_ClientID) +void cRoot::AuthenticateUser(int a_ClientID, const AString & a_Name, const AString & a_UUID) { - m_Server->AuthenticateUser(a_ClientID); + m_Server->AuthenticateUser(a_ClientID, a_Name, a_UUID); } diff --git a/src/Root.h b/src/Root.h index 4bbd7586f..d2a4d1eed 100644 --- a/src/Root.h +++ b/src/Root.h @@ -1,7 +1,7 @@ #pragma once -#include "Authenticator.h" +#include "Protocol/Authenticator.h" #include "HTTPServer/HTTPServer.h" #include "Defines.h" @@ -89,7 +89,7 @@ public: void KickUser(int a_ClientID, const AString & a_Reason); /// Called by cAuthenticator to auth the specified user - void AuthenticateUser(int a_ClientID); + void AuthenticateUser(int a_ClientID, const AString & a_Name, const AString & a_UUID); /// Executes commands queued in the command queue void TickCommands(void); diff --git a/src/Server.cpp b/src/Server.cpp index d1e53bfff..e0feaf0d8 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -615,14 +615,14 @@ void cServer::KickUser(int a_ClientID, const AString & a_Reason) -void cServer::AuthenticateUser(int a_ClientID) +void cServer::AuthenticateUser(int a_ClientID, const AString & a_Name, const AString & a_UUID) { cCSLock Lock(m_CSClients); for (ClientList::iterator itr = m_Clients.begin(); itr != m_Clients.end(); ++itr) { if ((*itr)->GetUniqueID() == a_ClientID) { - (*itr)->Authenticate(); + (*itr)->Authenticate(a_Name, a_UUID); return; } } // for itr - m_Clients[] diff --git a/src/Server.h b/src/Server.h index b5280c59d..b5c384a44 100644 --- a/src/Server.h +++ b/src/Server.h @@ -83,7 +83,7 @@ public: // tolua_export void Shutdown(void); void KickUser(int a_ClientID, const AString & a_Reason); - void AuthenticateUser(int a_ClientID); // Called by cAuthenticator to auth the specified user + void AuthenticateUser(int a_ClientID, const AString & a_Name, const AString & a_UUID); // Called by cAuthenticator to auth the specified user const AString & GetServerID(void) const { return m_ServerID; } // tolua_export From 1429d2f1b1802e1be5f5551df890562b4a014342 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sun, 13 Apr 2014 13:33:47 +0200 Subject: [PATCH 083/188] Some Fixes --- src/ClientHandle.cpp | 9 ++++++++- src/UI/SlotArea.cpp | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 90165b432..2d068ea07 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -3107,7 +3107,14 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) Item.m_Enchantments.AddFromString(Enchantment3.ToString()); enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment3), enchantments.end()); - m_Player->GetWindow()->SetSlot(*m_Player, 0, Item); + if (m_Player->DeltaExperience(Window->GetPropertyValue(Enchantment)) >= 0 || m_Player->IsGameModeCreative()) + { + m_Player->GetWindow()->SetSlot(*m_Player, 0, Item); + + Window->SetProperty(0, 0, *m_Player); + Window->SetProperty(1, 0, *m_Player); + Window->SetProperty(2, 0, *m_Player); + } } diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index d43b91700..352558d9e 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -647,7 +647,7 @@ void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) m_ParentWindow.SetProperty(1, 0, a_Player); m_ParentWindow.SetProperty(2, 0, a_Player); } - else if (a_Player.GetDraggingItem().IsEnchantable) + else if (cItem::IsEnchantable(a_Player.GetDraggingItem().m_ItemType)) { int PosX = 0; int PosY = 0; From c88464e62aefb104f59391162b8e39da6041d37a Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sun, 13 Apr 2014 13:36:03 +0200 Subject: [PATCH 084/188] Fixed Server Crash --- src/ClientHandle.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 2d068ea07..a5ce510a3 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2690,6 +2690,12 @@ void cClientHandle::SocketClosed(void) void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) { cItem Item = m_Player->GetDraggingItem(); + + if (!cItem::IsEnchantable(Item.m_ItemType)) + { + return; + } + cEnchantingWindow * Window = (cEnchantingWindow*)m_Player->GetWindow(); int BaseEnchantmentLevel = Window->GetPropertyValue(Enchantment); From 9dc4617e8d6ad6d3fa874e67dff2f79f4d1a651e Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sun, 13 Apr 2014 13:53:10 +0200 Subject: [PATCH 085/188] Fixed mistake --- src/ClientHandle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index a5ce510a3..96afff5bc 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -3113,7 +3113,7 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) Item.m_Enchantments.AddFromString(Enchantment3.ToString()); enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment3), enchantments.end()); - if (m_Player->DeltaExperience(Window->GetPropertyValue(Enchantment)) >= 0 || m_Player->IsGameModeCreative()) + if (m_Player->DeltaExperience(-m_Player->XpForLevel(Window->GetPropertyValue(Enchantment))) >= 0 || m_Player->IsGameModeCreative()) { m_Player->GetWindow()->SetSlot(*m_Player, 0, Item); From 3733ee2c0ee84c054bb98d714dad49d0384208a0 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sun, 13 Apr 2014 15:32:15 +0200 Subject: [PATCH 086/188] Code Update --- src/Protocol/Authenticator.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Protocol/Authenticator.cpp b/src/Protocol/Authenticator.cpp index ba435e9ce..24695b726 100644 --- a/src/Protocol/Authenticator.cpp +++ b/src/Protocol/Authenticator.cpp @@ -26,7 +26,6 @@ #define DEFAULT_AUTH_SERVER "sessionserver.mojang.com" #define DEFAULT_AUTH_ADDRESS "/session/minecraft/hasJoined?username=%USERNAME%&serverId=%SERVERID%" -#define MAX_REDIRECTS 10 @@ -146,8 +145,9 @@ void cAuthenticator::Execute(void) bool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_ServerId, AString & a_UUID) { AString REQUEST; - int ret, len, server_fd = -1; - unsigned char buf[1024]; + int ret, server_fd = -1; + size_t len = -1; + unsigned char * buf; const char *pers = "cAuthenticator"; entropy_context entropy; @@ -221,7 +221,8 @@ bool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_S REQUEST += "Connection: close\r\n"; REQUEST += "\r\n"; - len = sprintf_s((char *)buf, sizeof(buf), REQUEST.c_str()); + len = REQUEST.size(); + buf = (unsigned char *)REQUEST.c_str(); while ((ret = ssl_write(&ssl, buf, len)) <= 0) { From d258be678a7ea2d027434c2acc51243dd2253beb Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sun, 13 Apr 2014 16:15:57 +0200 Subject: [PATCH 087/188] Fixed Error? --- src/Protocol/Authenticator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Protocol/Authenticator.cpp b/src/Protocol/Authenticator.cpp index 24695b726..a79f0b7e0 100644 --- a/src/Protocol/Authenticator.cpp +++ b/src/Protocol/Authenticator.cpp @@ -147,7 +147,7 @@ bool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_S AString REQUEST; int ret, server_fd = -1; size_t len = -1; - unsigned char * buf; + unsigned char buf[1024]; const char *pers = "cAuthenticator"; entropy_context entropy; @@ -222,7 +222,7 @@ bool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_S REQUEST += "\r\n"; len = REQUEST.size(); - buf = (unsigned char *)REQUEST.c_str(); + strcpy((char *)buf, REQUEST.c_str()); while ((ret = ssl_write(&ssl, buf, len)) <= 0) { From 2618569e0100fdfdbf07f98da8f3e0f83e82b822 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sun, 13 Apr 2014 17:09:18 +0200 Subject: [PATCH 088/188] Fixed mistake --- src/Protocol/Authenticator.cpp | 2 +- src/Protocol/Protocol17x.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Protocol/Authenticator.cpp b/src/Protocol/Authenticator.cpp index a79f0b7e0..8943b3c21 100644 --- a/src/Protocol/Authenticator.cpp +++ b/src/Protocol/Authenticator.cpp @@ -146,7 +146,7 @@ bool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_S { AString REQUEST; int ret, server_fd = -1; - size_t len = -1; + size_t len = 0; unsigned char buf[1024]; const char *pers = "cAuthenticator"; diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index a4319df37..6c1af61fa 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -1559,7 +1559,7 @@ void cProtocol172::HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffe // Send login success: { cPacketizer Pkt(*this, 0x02); // Login success packet - Pkt.WriteString(Printf("%d", m_Client->GetUniqueID())); // TODO: proper UUID + Pkt.WriteString(m_Client->GetUUID()); Pkt.WriteString(m_Client->GetUsername()); } From fce9ea65c35ab7f94c23bb361386b5ce223279eb Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sun, 13 Apr 2014 22:15:10 +0200 Subject: [PATCH 089/188] Fixed invisibility enchantments --- src/ClientHandle.cpp | 4 +++- src/ClientHandle.h | 1 + src/UI/SlotArea.cpp | 2 ++ src/UI/Window.h | 2 ++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 96afff5bc..2dd9cb91e 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -3115,7 +3115,9 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) if (m_Player->DeltaExperience(-m_Player->XpForLevel(Window->GetPropertyValue(Enchantment))) >= 0 || m_Player->IsGameModeCreative()) { - m_Player->GetWindow()->SetSlot(*m_Player, 0, Item); + Window->m_SlotArea->SetSlot(0, *m_Player, Item); + Window->SendSlot(*m_Player, Window->m_SlotArea, 0); + Window->BroadcastWholeWindow(); Window->SetProperty(0, 0, *m_Player); Window->SetProperty(1, 0, *m_Player); diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 4c88d79e2..b4b1d0da3 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -19,6 +19,7 @@ #include "Scoreboard.h" #include "Map.h" #include "Enchantments.h" +#include "UI/SlotArea.h" diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 352558d9e..35230cffb 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -600,6 +600,8 @@ cCraftingRecipe & cSlotAreaCrafting::GetRecipeForPlayer(cPlayer & a_Player) cSlotAreaEnchanting::cSlotAreaEnchanting(int a_NumSlots, cWindow & a_ParentWindow) : cSlotAreaTemporary(a_NumSlots, a_ParentWindow) { + cEnchantingWindow * Window = (cEnchantingWindow *)&m_ParentWindow; + Window->m_SlotArea = this; } diff --git a/src/UI/Window.h b/src/UI/Window.h index 52ab6c3ae..5e799248c 100644 --- a/src/UI/Window.h +++ b/src/UI/Window.h @@ -246,6 +246,8 @@ public: /** Set the Position Values to the Position of the Enchantment Table */ void GetBlockPos(int & a_PosX, int & a_PosY, int & a_PosZ); + cSlotArea * m_SlotArea; + protected: int m_PropertyValue0, m_PropertyValue1, m_PropertyValue2; int m_BlockX, m_BlockY, m_BlockZ; From 856e900bf8e74cb478904d6322dcb6310ff7a3b2 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Mon, 14 Apr 2014 11:48:12 +0200 Subject: [PATCH 090/188] Bug fixes --- src/ClientHandle.cpp | 4 ++-- src/Protocol/Protocol17x.cpp | 3 --- src/UI/SlotArea.cpp | 32 +++++++++++++++++--------------- src/UI/SlotArea.h | 8 ++------ 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 2dd9cb91e..fc4db1d10 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2689,14 +2689,14 @@ void cClientHandle::SocketClosed(void) void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) { - cItem Item = m_Player->GetDraggingItem(); + cEnchantingWindow * Window = (cEnchantingWindow*)m_Player->GetWindow(); + cItem Item = *Window->m_SlotArea->GetSlot(0, *m_Player); if (!cItem::IsEnchantable(Item.m_ItemType)) { return; } - cEnchantingWindow * Window = (cEnchantingWindow*)m_Player->GetWindow(); int BaseEnchantmentLevel = Window->GetPropertyValue(Enchantment); // Step 1 from Enchanting diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index 785dbf935..a31643ccf 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -1918,10 +1918,7 @@ void cProtocol172::HandlePacketEnchantItem(cByteBuffer & a_ByteBuffer) HANDLE_READ(a_ByteBuffer, ReadByte, Byte, WindowID); HANDLE_READ(a_ByteBuffer, ReadByte, Byte, Enchantment); - LOGWARN("Protocol 1.7: Enchantment Packet received!"); - m_Client->HandleEnchantItem(WindowID, Enchantment); - } diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 35230cffb..673c036b6 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -608,8 +608,21 @@ cSlotAreaTemporary(a_NumSlots, a_ParentWindow) +void cSlotAreaEnchanting::OnPlayerRemoved(cPlayer & a_Player) +{ + // Toss the item in the enchanting slot + TossItems(a_Player, 0, 1); + // Player not found - that is acceptable +} + + + + + void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) { + super::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem); + // Check if Slot is in the Enchantment Table if (a_SlotNum == 0) { @@ -621,20 +634,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio { ClickedResult(a_Player); } - return; } - super::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem); -} - - - - - -void cSlotAreaEnchanting::OnPlayerRemoved(cPlayer & a_Player) -{ - // Toss the item in the enchanting slot - TossItems(a_Player, 0, 0); - // Player not found - that is acceptable } @@ -643,13 +643,15 @@ void cSlotAreaEnchanting::OnPlayerRemoved(cPlayer & a_Player) void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) { - if (a_Player.GetDraggingItem().IsEmpty()) + cItem Item = *GetSlot(0, a_Player); + + if (Item.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(a_Player.GetDraggingItem().m_ItemType)) + else if (cItem::IsEnchantable(Item.m_ItemType)) { int PosX = 0; int PosY = 0; diff --git a/src/UI/SlotArea.h b/src/UI/SlotArea.h index 82360ffbe..7feb74aa1 100644 --- a/src/UI/SlotArea.h +++ b/src/UI/SlotArea.h @@ -258,21 +258,17 @@ class cSlotAreaEnchanting : typedef cSlotAreaTemporary super; public: - /// a_GridSize is allowed to be only 2 or 3 cSlotAreaEnchanting(int a_NumSlots, cWindow & a_ParentWindow); // cSlotAreaTemporary overrides: virtual void Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override; virtual void OnPlayerRemoved(cPlayer & a_Player) override; - // Distributing items into this area is completely disabled - virtual void DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots) override {} - protected: - /// Handles a click in the result slot. Crafts using the current recipe, if possible + /// Handles a click in the item slot. void ClickedResult(cPlayer & a_Player); - /// Handles a shift-click in the result slot. Crafts using the current recipe until it changes or no more space for result. + /// Handles a shift-click in the item slot. void ShiftClickedResult(cPlayer & a_Player); }; From fb26d2ba870f63deb5515521ecf5ce0c35780a2b Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Mon, 14 Apr 2014 11:56:50 +0200 Subject: [PATCH 091/188] Fixed Bookshelf Checking Code by LO1ZB --- src/UI/SlotArea.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 673c036b6..23108c256 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -659,29 +659,31 @@ void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) cEnchantingWindow * Window = (cEnchantingWindow*)&m_ParentWindow; Window->GetBlockPos(PosX, PosY, PosZ); + int bookshelves = 0; cBlockArea Area; Area.Read(a_Player.GetWorld(), PosX - 2, PosX + 2, PosY, PosY + 1, PosZ - 2, PosZ + 2); - for (int x = 0; x < 6; x++) + for (int y = 0; y <= 2; y++) { - for (int y = 0; y < 3; y++) + for (int x = 0; x <= 4; x++) { - for (int z = 0; z < 6; z++) + for (int z = 0; z <= 4; z++) { - if ((((x == 0) || (x == 5)) || ((z == 0) || (z == 5))) && ((y == 0) || y == 1)) + if ((((x == 0) || (x == 4)) || ((z == 0) || (z == 4))) && ((y == 0) || y == 1)) { - LOG("%i", Area.GetRelBlockType(x, y, z)); - if (Area.GetRelBlockType(x, y, z) == E_BLOCK_BOOKCASE) { - LOG("BookShelf"); + bookshelves++; } } } } } - int bookshelves = 15; // TODO: Check Bookshelves + if (bookshelves > 15) + { + bookshelves = 15; + } cFastRandom Random; int base = (Random.GenerateRandomInteger(1, 8) + floor(bookshelves / 2) + Random.GenerateRandomInteger(0, bookshelves)); From a51a099c81f34f875c76d560e6729889b2fdd4fa Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Mon, 14 Apr 2014 13:39:44 +0200 Subject: [PATCH 092/188] Blocked enchanting a item twice --- src/UI/SlotArea.cpp | 14 ++++++++------ src/UI/SlotArea.h | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 23108c256..eb528d7ca 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -628,11 +628,11 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio { if ((a_ClickAction == caShiftLeftClick) || (a_ClickAction == caShiftRightClick)) { - ShiftClickedResult(a_Player); + ShiftClickedSlot(a_Player); } else { - ClickedResult(a_Player); + ClickedSlot(a_Player); } } } @@ -641,7 +641,7 @@ void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickActio -void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) +void cSlotAreaEnchanting::ClickedSlot(cPlayer & a_Player) { cItem Item = *GetSlot(0, a_Player); @@ -651,7 +651,7 @@ void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) m_ParentWindow.SetProperty(1, 0, a_Player); m_ParentWindow.SetProperty(2, 0, a_Player); } - else if (cItem::IsEnchantable(Item.m_ItemType)) + else if (cItem::IsEnchantable(Item.m_ItemType) && Item.m_Enchantments.IsEmpty()) { int PosX = 0; int PosY = 0; @@ -707,9 +707,11 @@ void cSlotAreaEnchanting::ClickedResult(cPlayer & a_Player) -void cSlotAreaEnchanting::ShiftClickedResult(cPlayer & a_Player) +void cSlotAreaEnchanting::ShiftClickedSlot(cPlayer & a_Player) { - LOGWARN("Shift Click!"); + m_ParentWindow.SetProperty(0, 0, a_Player); + m_ParentWindow.SetProperty(1, 0, a_Player); + m_ParentWindow.SetProperty(2, 0, a_Player); } diff --git a/src/UI/SlotArea.h b/src/UI/SlotArea.h index 7feb74aa1..a6af72273 100644 --- a/src/UI/SlotArea.h +++ b/src/UI/SlotArea.h @@ -266,10 +266,10 @@ public: protected: /// Handles a click in the item slot. - void ClickedResult(cPlayer & a_Player); + void ClickedSlot(cPlayer & a_Player); /// Handles a shift-click in the item slot. - void ShiftClickedResult(cPlayer & a_Player); + void ShiftClickedSlot(cPlayer & a_Player); }; From 0ba0e39db4a3fae9139c5b875462fcd81faec3fc Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Mon, 14 Apr 2014 16:46:59 +0200 Subject: [PATCH 093/188] Added/Modified last things for Enchanting System --- src/ClientHandle.cpp | 68 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index fc4db1d10..c00047ecd 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2699,6 +2699,8 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) int BaseEnchantmentLevel = Window->GetPropertyValue(Enchantment); + LOG("499"); + // Step 1 from Enchanting int Enchantability = 1; @@ -2744,7 +2746,7 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) } cFastRandom Random; - int ModifiedEnchantmentLevel = BaseEnchantmentLevel + Random.NextInt(Enchantability / 4) + Random.NextInt(Enchantability / 4) + 1; + int ModifiedEnchantmentLevel = BaseEnchantmentLevel + (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); @@ -3090,28 +3092,64 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=1")); } - int RandomEnchantment1 = floor(Random.NextFloat(1) * enchantments.size()); + int RandomEnchantment1 = (int) floor(Random.NextFloat(1) * enchantments.size()); cEnchantments Enchantment1 = enchantments[RandomEnchantment1]; Item.m_Enchantments.AddFromString(Enchantment1.ToString()); enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment1), enchantments.end()); - // TODO: Don't add every time so much enchantments + float NewEnchantmentLevel = (float) BaseEnchantmentLevel; - // Checking for conflicting enchantments - enchantments = CheckEnchantmentConflicts(enchantments, Enchantment1); + // Next Enchantment (Second) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if (Random.NextFloat(100) <= SecondEnchantmentChance) + { + // Checking for conflicting enchantments + enchantments = CheckEnchantmentConflicts(enchantments, Enchantment1); - int RandomEnchantment2 = floor(Random.NextFloat(1) * enchantments.size()); - cEnchantments Enchantment2 = enchantments[RandomEnchantment2]; - Item.m_Enchantments.AddFromString(Enchantment2.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment2), enchantments.end()); + if (enchantments.size() > 0) + { + int RandomEnchantment2 = (int) floor(Random.NextFloat(1) * enchantments.size()); - // Checking for conflicting enchantments - enchantments = CheckEnchantmentConflicts(enchantments, Enchantment2); + cEnchantments Enchantment2 = enchantments[RandomEnchantment2]; + Item.m_Enchantments.AddFromString(Enchantment2.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment2), enchantments.end()); - int RandomEnchantment3 = floor(Random.NextFloat(1) * enchantments.size()); - cEnchantments Enchantment3 = enchantments[RandomEnchantment3]; - Item.m_Enchantments.AddFromString(Enchantment3.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment3), enchantments.end()); + // Checking for conflicting enchantments + enchantments = CheckEnchantmentConflicts(enchantments, Enchantment2); + } + } + + // Next Enchantment (Third) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if (Random.NextFloat(100) <= ThirdEnchantmentChance) + { + if (enchantments.size() > 0) + { + int RandomEnchantment3 = (int) floor(Random.NextFloat(1) * enchantments.size()); + cEnchantments Enchantment3 = enchantments[RandomEnchantment3]; + Item.m_Enchantments.AddFromString(Enchantment3.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment3), enchantments.end()); + + // Checking for conflicting enchantments + enchantments = CheckEnchantmentConflicts(enchantments, Enchantment3); + } + } + + // Next Enchantment (Fourth) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if (Random.NextFloat(100) <= FourthEnchantmentChance) + { + if (enchantments.size() > 0) + { + int RandomEnchantment4 = (int) floor(Random.NextFloat(1) * enchantments.size()); + cEnchantments Enchantment4 = enchantments[RandomEnchantment4]; + Item.m_Enchantments.AddFromString(Enchantment4.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment4), enchantments.end()); + } + } if (m_Player->DeltaExperience(-m_Player->XpForLevel(Window->GetPropertyValue(Enchantment))) >= 0 || m_Player->IsGameModeCreative()) { From 55224d25ef67e69ead2d54885a5a1f12c3e7990e Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Mon, 14 Apr 2014 16:48:14 +0200 Subject: [PATCH 094/188] Removed Debug Message --- src/ClientHandle.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index c00047ecd..9605aa004 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2699,8 +2699,6 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) int BaseEnchantmentLevel = Window->GetPropertyValue(Enchantment); - LOG("499"); - // Step 1 from Enchanting int Enchantability = 1; From 449afa850e78874c5a5669bcda82da83f25d0b90 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Mon, 14 Apr 2014 18:24:44 +0200 Subject: [PATCH 095/188] ProtoProxy: Added 1.7.9 compatibility. --- Tools/ProtoProxy/Connection.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Tools/ProtoProxy/Connection.cpp b/Tools/ProtoProxy/Connection.cpp index d9b8e3dd1..8dc82157a 100644 --- a/Tools/ProtoProxy/Connection.cpp +++ b/Tools/ProtoProxy/Connection.cpp @@ -2202,6 +2202,28 @@ bool cConnection::HandleServerSpawnNamedEntity(void) HANDLE_SERVER_PACKET_READ(ReadVarInt, UInt32, EntityID); HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, EntityUUID); HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, EntityName); + HANDLE_SERVER_PACKET_READ(ReadVarInt, UInt32, DataCount); + struct sData + { + AString m_Name; + AString m_Value; + AString m_Signature; + sData(const AString & a_Name, const AString & a_Value, const AString & a_Signature) : + m_Name(a_Name), + m_Value(a_Value), + m_Signature(a_Signature) + { + } + }; + typedef std::vector sDataVec; + sDataVec Data; + for (UInt32 i = 0; i < DataCount; i++) + { + HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Name) + HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Value) + HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Signature) + Data.push_back(sData(Name, Value, Signature)); + } HANDLE_SERVER_PACKET_READ(ReadBEInt, int, PosX); HANDLE_SERVER_PACKET_READ(ReadBEInt, int, PosY); HANDLE_SERVER_PACKET_READ(ReadBEInt, int, PosZ); @@ -2219,6 +2241,13 @@ bool cConnection::HandleServerSpawnNamedEntity(void) Log(" EntityID = %u (0x%x)", EntityID, EntityID); Log(" UUID = \"%s\"", EntityUUID.c_str()); Log(" Name = \"%s\"", EntityName.c_str()); + Log(" NumData = %u", DataCount); + for (sDataVec::const_iterator itr = Data.begin(), end = Data.end(); itr != end; ++itr) + { + Log(" Name = \"%s\", Value = \"%s\", Signature = \"%s\"", + itr->m_Name.c_str(), itr->m_Value.c_str(), itr->m_Signature.c_str() + ); + } // for itr - Data[] Log(" Pos = %s", PrintableAbsIntTriplet(PosX, PosY, PosZ).c_str()); Log(" Rotation = ", Yaw, Pitch); Log(" CurrentItem = %d", CurrentItem); From 21e569081148c098c043cc2665b8384cceb5e3d5 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Mon, 14 Apr 2014 18:50:44 +0200 Subject: [PATCH 096/188] ProtoProxy: Fixed weird gcc compilation errors. --- Tools/ProtoProxy/Connection.cpp | 38 +++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/Tools/ProtoProxy/Connection.cpp b/Tools/ProtoProxy/Connection.cpp index 8dc82157a..b21d2ae59 100644 --- a/Tools/ProtoProxy/Connection.cpp +++ b/Tools/ProtoProxy/Connection.cpp @@ -2197,32 +2197,38 @@ bool cConnection::HandleServerSpawnMob(void) +struct sSpawnData +{ + AString m_Name; + AString m_Value; + AString m_Signature; + sSpawnData(const AString & a_Name, const AString & a_Value, const AString & a_Signature) : + m_Name(a_Name), + m_Value(a_Value), + m_Signature(a_Signature) + { + } +}; + +typedef std::vector sSpawnDatas; + + + + + bool cConnection::HandleServerSpawnNamedEntity(void) { HANDLE_SERVER_PACKET_READ(ReadVarInt, UInt32, EntityID); HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, EntityUUID); HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, EntityName); HANDLE_SERVER_PACKET_READ(ReadVarInt, UInt32, DataCount); - struct sData - { - AString m_Name; - AString m_Value; - AString m_Signature; - sData(const AString & a_Name, const AString & a_Value, const AString & a_Signature) : - m_Name(a_Name), - m_Value(a_Value), - m_Signature(a_Signature) - { - } - }; - typedef std::vector sDataVec; - sDataVec Data; + sSpawnDatas Data; for (UInt32 i = 0; i < DataCount; i++) { HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Name) HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Value) HANDLE_SERVER_PACKET_READ(ReadVarUTF8String, AString, Signature) - Data.push_back(sData(Name, Value, Signature)); + Data.push_back(sSpawnData(Name, Value, Signature)); } HANDLE_SERVER_PACKET_READ(ReadBEInt, int, PosX); HANDLE_SERVER_PACKET_READ(ReadBEInt, int, PosY); @@ -2242,7 +2248,7 @@ bool cConnection::HandleServerSpawnNamedEntity(void) Log(" UUID = \"%s\"", EntityUUID.c_str()); Log(" Name = \"%s\"", EntityName.c_str()); Log(" NumData = %u", DataCount); - for (sDataVec::const_iterator itr = Data.begin(), end = Data.end(); itr != end; ++itr) + for (sSpawnDatas::const_iterator itr = Data.begin(), end = Data.end(); itr != end; ++itr) { Log(" Name = \"%s\", Value = \"%s\", Signature = \"%s\"", itr->m_Name.c_str(), itr->m_Value.c_str(), itr->m_Signature.c_str() From 0f55dcf036381f951fb22219158182729453f841 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Mon, 14 Apr 2014 18:52:21 +0200 Subject: [PATCH 097/188] Initial 1.7.6 protocol support. Doesn't work yet because of missing UUIDs. --- src/Protocol/Protocol17x.cpp | 36 +++++++++++++++++++++++++++++ src/Protocol/Protocol17x.h | 17 ++++++++++++++ src/Protocol/ProtocolRecognizer.cpp | 13 +++++++++++ src/Protocol/ProtocolRecognizer.h | 5 ++-- 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index a4319df37..57cc9118f 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -2755,3 +2755,39 @@ void cProtocol172::cPacketizer::WriteEntityProperties(const cEntity & a_Entity) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// cProtocol176: + +cProtocol176::cProtocol176(cClientHandle * a_Client, const AString &a_ServerAddress, UInt16 a_ServerPort, UInt32 a_State) : + super(a_Client, a_ServerAddress, a_ServerPort, a_State) +{ +} + + + + + +void cProtocol176::SendPlayerSpawn(const cPlayer & a_Player) +{ + // Called to spawn another player for the client + cPacketizer Pkt(*this, 0x0c); // Spawn Player packet + Pkt.WriteVarInt(a_Player.GetUniqueID()); + Pkt.WriteString(Printf("00000000-0000-3000-8000-aaaa%08x", a_Player.GetUniqueID())); // TODO: Proper UUID + Pkt.WriteString(a_Player.GetName()); + Pkt.WriteVarInt(0); // We have no data to send here + Pkt.WriteFPInt(a_Player.GetPosX()); + Pkt.WriteFPInt(a_Player.GetPosY()); + Pkt.WriteFPInt(a_Player.GetPosZ()); + Pkt.WriteByteAngle(a_Player.GetYaw()); + Pkt.WriteByteAngle(a_Player.GetPitch()); + short ItemType = a_Player.GetEquippedItem().IsEmpty() ? 0 : a_Player.GetEquippedItem().m_ItemType; + Pkt.WriteShort(ItemType); + Pkt.WriteByte((3 << 5) | 6); // Metadata: float + index 6 + Pkt.WriteFloat((float)a_Player.GetHealth()); + Pkt.WriteByte(0x7f); // Metadata: end +} + + + + diff --git a/src/Protocol/Protocol17x.h b/src/Protocol/Protocol17x.h index 91186b270..7d0196a21 100644 --- a/src/Protocol/Protocol17x.h +++ b/src/Protocol/Protocol17x.h @@ -306,3 +306,20 @@ protected: + +/** The version 5 lengthed protocol, used by 1.7.6 through 1.7.9. */ +class cProtocol176 : + public cProtocol172 +{ + typedef cProtocol172 super; + +public: + cProtocol176(cClientHandle * a_Client, const AString & a_ServerAddress, UInt16 a_ServerPort, UInt32 a_State); + + // cProtocol172 overrides: + virtual void SendPlayerSpawn(const cPlayer & a_Player) override; +} ; + + + + diff --git a/src/Protocol/ProtocolRecognizer.cpp b/src/Protocol/ProtocolRecognizer.cpp index 3f7d7b254..6a1f2fbbd 100644 --- a/src/Protocol/ProtocolRecognizer.cpp +++ b/src/Protocol/ProtocolRecognizer.cpp @@ -59,6 +59,7 @@ AString cProtocolRecognizer::GetVersionTextFromInt(int a_ProtocolVersion) case PROTO_VERSION_1_6_3: return "1.6.3"; case PROTO_VERSION_1_6_4: return "1.6.4"; case PROTO_VERSION_1_7_2: return "1.7.2"; + case PROTO_VERSION_1_7_6: return "1.7.6"; } ASSERT(!"Unknown protocol version"); return Printf("Unknown protocol (%d)", a_ProtocolVersion); @@ -965,6 +966,18 @@ bool cProtocolRecognizer::TryRecognizeLengthedProtocol(UInt32 a_PacketLengthRema m_Protocol = new cProtocol172(m_Client, ServerAddress, (UInt16)ServerPort, NextState); return true; } + case PROTO_VERSION_1_7_6: + { + AString ServerAddress; + short ServerPort; + UInt32 NextState; + m_Buffer.ReadVarUTF8String(ServerAddress); + m_Buffer.ReadBEShort(ServerPort); + m_Buffer.ReadVarInt(NextState); + m_Buffer.CommitRead(); + m_Protocol = new cProtocol176(m_Client, ServerAddress, (UInt16)ServerPort, NextState); + return true; + } } LOGINFO("Client \"%s\" uses an unsupported protocol (lengthed, version %u)", m_Client->GetIPString().c_str(), ProtocolVersion diff --git a/src/Protocol/ProtocolRecognizer.h b/src/Protocol/ProtocolRecognizer.h index 072d7c2d2..e53fc9514 100644 --- a/src/Protocol/ProtocolRecognizer.h +++ b/src/Protocol/ProtocolRecognizer.h @@ -18,8 +18,8 @@ // Adjust these if a new protocol is added or an old one is removed: -#define MCS_CLIENT_VERSIONS "1.2.4, 1.2.5, 1.3.1, 1.3.2, 1.4.2, 1.4.4, 1.4.5, 1.4.6, 1.4.7, 1.5, 1.5.1, 1.5.2, 1.6.1, 1.6.2, 1.6.3, 1.6.4, 1.7.2, 1.7.4" -#define MCS_PROTOCOL_VERSIONS "29, 39, 47, 49, 51, 60, 61, 73, 74, 77, 78, 4" +#define MCS_CLIENT_VERSIONS "1.2.4, 1.2.5, 1.3.1, 1.3.2, 1.4.2, 1.4.4, 1.4.5, 1.4.6, 1.4.7, 1.5, 1.5.1, 1.5.2, 1.6.1, 1.6.2, 1.6.3, 1.6.4, 1.7.2, 1.7.4, 1.7.5, 1.7.6, 1.7.7, 1.7.8, 1.7.9" +#define MCS_PROTOCOL_VERSIONS "29, 39, 47, 49, 51, 60, 61, 73, 74, 77, 78, 4, 5" @@ -50,6 +50,7 @@ public: // These will be kept "under" the next / latest, because the next and latest are only needed for previous protocols PROTO_VERSION_1_7_2 = 4, + PROTO_VERSION_1_7_6 = 5, } ; cProtocolRecognizer(cClientHandle * a_Client); From d505ffc704d85cc1b31ae87647ba979fda84f46f Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Mon, 14 Apr 2014 20:21:00 +0200 Subject: [PATCH 098/188] A client UUID is generated when the server is in offline mode. 1.7.9 client works with these changes in offline mode. --- src/ClientHandle.cpp | 24 ++++++++++++++++++++++++ src/ClientHandle.h | 7 ++++++- src/Protocol/Protocol17x.cpp | 14 ++++++++++---- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 615039949..7e8c11d67 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -31,6 +31,8 @@ #include "CompositeChat.h" #include "Items/ItemSword.h" +#include "md5/md5.h" + /** Maximum number of explosions to send this tick, server will start dropping if exceeded */ @@ -175,6 +177,28 @@ void cClientHandle::Destroy(void) +void cClientHandle::GenerateOfflineUUID(void) +{ + // Proper format for a version 3 UUID is: + // xxxxxxxx-xxxx-3xxx-yxxx-xxxxxxxxxxxx where x is any hexadecimal digit and y is one of 8, 9, A, or B + + // Generate an md5 checksum, and use it as base for the ID: + MD5 Checksum(m_Username); + m_UUID = Checksum.hexdigest(); + m_UUID[12] = '3'; // Version 3 UUID + m_UUID[16] = '8'; // Variant 1 UUID + + // Now the digest doesn't have the UUID slashes, but the client requires them, so add them into the appropriate positions: + m_UUID.insert(8, "-"); + m_UUID.insert(13, "-"); + m_UUID.insert(18, "-"); + m_UUID.insert(23, "-"); +} + + + + + void cClientHandle::Kick(const AString & a_Reason) { if (m_State >= csAuthenticating) // Don't log pings diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 0f07c980b..90b971e16 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -63,7 +63,12 @@ public: cPlayer* GetPlayer() { return m_Player; } // tolua_export const AString & GetUUID(void) const { return m_UUID; } // tolua_export - void setUUID(const AString & a_UUID) { m_UUID = a_UUID; } + void SetUUID(const AString & a_UUID) { m_UUID = a_UUID; } + + /** Generates an UUID based on the player name provided. + This is used for the offline (non-auth) mode, when there's no UUID source. + Each username generates a unique and constant UUID, so that when the player reconnects with the same name, their UUID is the same. */ + void GenerateOfflineUUID(void); void Kick(const AString & a_Reason); // tolua_export void Authenticate(const AString & a_Name, const AString & a_UUID); // Called by cAuthenticator when the user passes authentication diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index 278b29485..b44c9f919 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -88,8 +88,9 @@ cProtocol172::cProtocol172(cClientHandle * a_Client, const AString & a_ServerAdd // Create the comm log file, if so requested: if (g_ShouldLogCommIn || g_ShouldLogCommOut) { + static int sCounter = 0; cFile::CreateFolder("CommLogs"); - AString FileName = Printf("CommLogs/%x__%s.log", (unsigned)time(NULL), a_Client->GetIPString().c_str()); + AString FileName = Printf("CommLogs/%x_%d__%s.log", (unsigned)time(NULL), sCounter++, a_Client->GetIPString().c_str()); m_CommLogFile.Open(FileName, cFile::fmWrite); } } @@ -796,7 +797,7 @@ void cProtocol172::SendPlayerSpawn(const cPlayer & a_Player) // Called to spawn another player for the client cPacketizer Pkt(*this, 0x0c); // Spawn Player packet Pkt.WriteVarInt(a_Player.GetUniqueID()); - Pkt.WriteString(Printf("%d", a_Player.GetUniqueID())); // TODO: Proper UUID + Pkt.WriteString(a_Player.GetClientHandle()->GetUUID()); Pkt.WriteString(a_Player.GetName()); Pkt.WriteFPInt(a_Player.GetPosX()); Pkt.WriteFPInt(a_Player.GetPosY()); @@ -1556,6 +1557,7 @@ void cProtocol172::HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffe StartEncryption(DecryptedKey); + /* // Send login success: { cPacketizer Pkt(*this, 0x02); // Login success packet @@ -1565,6 +1567,7 @@ void cProtocol172::HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffe m_State = 3; // State = Game m_Client->HandleLogin(4, m_Client->GetUsername()); + */ } @@ -1596,10 +1599,13 @@ void cProtocol172::HandlePacketLoginStart(cByteBuffer & a_ByteBuffer) return; } + // Generate an offline UUID for the player: + m_Client->GenerateOfflineUUID(); + // Send login success: { cPacketizer Pkt(*this, 0x02); // Login success packet - Pkt.WriteString(Printf("%d", m_Client->GetUniqueID())); // TODO: proper UUID + Pkt.WriteString(m_Client->GetUUID()); Pkt.WriteString(Username); } @@ -2773,7 +2779,7 @@ void cProtocol176::SendPlayerSpawn(const cPlayer & a_Player) // Called to spawn another player for the client cPacketizer Pkt(*this, 0x0c); // Spawn Player packet Pkt.WriteVarInt(a_Player.GetUniqueID()); - Pkt.WriteString(Printf("00000000-0000-3000-8000-aaaa%08x", a_Player.GetUniqueID())); // TODO: Proper UUID + Pkt.WriteString(a_Player.GetClientHandle()->GetUUID()); Pkt.WriteString(a_Player.GetName()); Pkt.WriteVarInt(0); // We have no data to send here Pkt.WriteFPInt(a_Player.GetPosX()); From b5401ec03ad74782129e6a68eac3e9c0ccb573e2 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Mon, 14 Apr 2014 22:05:04 +0200 Subject: [PATCH 099/188] Added ItemPlaceCount in SlotArea Thanks to Howaner for helping --- src/UI/SlotArea.cpp | 32 ++++++++++++++++++++++++++++++++ src/UI/SlotArea.h | 3 +++ 2 files changed, 35 insertions(+) diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index eb528d7ca..9ea2e0021 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -135,6 +135,12 @@ void cSlotArea::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickA cItem tmp(DraggingItem); DraggingItem = Slot; Slot = tmp; + int ItemPlaceCount = GetItemPlaceCount(Slot); + if (Slot.m_ItemCount > ItemPlaceCount) + { + DraggingItem.m_ItemCount += Slot.m_ItemCount - ItemPlaceCount; + Slot.m_ItemCount = ItemPlaceCount; + } } else { @@ -147,6 +153,13 @@ void cSlotArea::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickA FreeSlots = 0; } int Filling = (FreeSlots > DraggingItem.m_ItemCount) ? DraggingItem.m_ItemCount : FreeSlots; + + int ItemPlaceCount = GetItemPlaceCount(DraggingItem); + if (Filling > ItemPlaceCount) + { + Filling = ItemPlaceCount; + } + Slot.m_ItemCount += (char)Filling; DraggingItem.m_ItemCount -= (char)Filling; if (DraggingItem.m_ItemCount <= 0) @@ -315,6 +328,16 @@ bool cSlotArea::CollectItemsToHand(cItem & a_Dragging, cPlayer & a_Player, bool +int cSlotArea::GetItemPlaceCount(cItem & a_Item) +{ + cItemHandler * Handler = ItemHandler(a_Item.m_ItemType); + return Handler->GetMaxStackSize(); +} + + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cSlotAreaChest: @@ -718,6 +741,15 @@ void cSlotAreaEnchanting::ShiftClickedSlot(cPlayer & a_Player) +int cSlotAreaEnchanting::GetItemPlaceCount(cItem & a_Item) +{ + return 1; +} + + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cSlotAreaEnderChest: diff --git a/src/UI/SlotArea.h b/src/UI/SlotArea.h index a6af72273..431ad753c 100644 --- a/src/UI/SlotArea.h +++ b/src/UI/SlotArea.h @@ -66,6 +66,8 @@ public: /// If a_CollectFullStacks is false, slots with full stacks are skipped while collecting. /// Returns true if full stack has been collected in a_Dragging, false if there's space remaining to fill. virtual bool CollectItemsToHand(cItem & a_Dragging, cPlayer & a_Player, bool a_CollectFullStacks); + + virtual int GetItemPlaceCount(cItem & a_Item); protected: int m_NumSlots; @@ -263,6 +265,7 @@ public: // cSlotAreaTemporary overrides: virtual void Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override; virtual void OnPlayerRemoved(cPlayer & a_Player) override; + virtual int GetItemPlaceCount(cItem & a_Item) override; protected: /// Handles a click in the item slot. From d12d7b671523f79f760403f3f4c0ef4efb497c79 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Mon, 14 Apr 2014 22:52:59 +0200 Subject: [PATCH 100/188] Implemented the 1.7.6 protocol and authenticator. Server works both in online and offline modes with 1.7.9. --- src/ClientHandle.cpp | 30 ++++-- src/ClientHandle.h | 8 +- src/Protocol/Authenticator.cpp | 149 +++++++++++++--------------- src/Protocol/Protocol.h | 1 + src/Protocol/Protocol125.cpp | 42 ++++++++ src/Protocol/Protocol125.h | 20 +--- src/Protocol/Protocol17x.cpp | 62 ++++++++---- src/Protocol/Protocol17x.h | 5 +- src/Protocol/ProtocolRecognizer.cpp | 10 ++ src/Protocol/ProtocolRecognizer.h | 1 + 10 files changed, 199 insertions(+), 129 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 7e8c11d67..79738ff0b 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -178,21 +178,32 @@ void cClientHandle::Destroy(void) void cClientHandle::GenerateOfflineUUID(void) +{ + m_UUID = GenerateOfflineUUID(m_Username); +} + + + + + +AString cClientHandle::GenerateOfflineUUID(const AString & a_Username) { // Proper format for a version 3 UUID is: // xxxxxxxx-xxxx-3xxx-yxxx-xxxxxxxxxxxx where x is any hexadecimal digit and y is one of 8, 9, A, or B // Generate an md5 checksum, and use it as base for the ID: - MD5 Checksum(m_Username); - m_UUID = Checksum.hexdigest(); - m_UUID[12] = '3'; // Version 3 UUID - m_UUID[16] = '8'; // Variant 1 UUID + MD5 Checksum(a_Username); + AString UUID = Checksum.hexdigest(); + UUID[12] = '3'; // Version 3 UUID + UUID[16] = '8'; // Variant 1 UUID // Now the digest doesn't have the UUID slashes, but the client requires them, so add them into the appropriate positions: - m_UUID.insert(8, "-"); - m_UUID.insert(13, "-"); - m_UUID.insert(18, "-"); - m_UUID.insert(23, "-"); + UUID.insert(8, "-"); + UUID.insert(13, "-"); + UUID.insert(18, "-"); + UUID.insert(23, "-"); + + return UUID; } @@ -223,6 +234,9 @@ void cClientHandle::Authenticate(const AString & a_Name, const AString & a_UUID) m_Username = a_Name; m_UUID = a_UUID; + + // Send login success (if the protocol supports it): + m_Protocol->SendLoginSuccess(); // Spawn player (only serversided, so data is loaded) m_Player = new cPlayer(this, GetUsername()); diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 90b971e16..12e0256de 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -65,10 +65,16 @@ public: const AString & GetUUID(void) const { return m_UUID; } // tolua_export void SetUUID(const AString & a_UUID) { m_UUID = a_UUID; } + /** Generates an UUID based on the username stored for this client, and stores it in the m_UUID member. + This is used for the offline (non-auth) mode, when there's no UUID source. + Each username generates a unique and constant UUID, so that when the player reconnects with the same name, their UUID is the same. + Internally calls the GenerateOfflineUUID static function. */ + void GenerateOfflineUUID(void); + /** Generates an UUID based on the player name provided. This is used for the offline (non-auth) mode, when there's no UUID source. Each username generates a unique and constant UUID, so that when the player reconnects with the same name, their UUID is the same. */ - void GenerateOfflineUUID(void); + static AString GenerateOfflineUUID(const AString & a_Username); // tolua_export void Kick(const AString & a_Reason); // tolua_export void Authenticate(const AString & a_Name, const AString & a_UUID); // Called by cAuthenticator when the user passes authentication diff --git a/src/Protocol/Authenticator.cpp b/src/Protocol/Authenticator.cpp index 8943b3c21..a30131b36 100644 --- a/src/Protocol/Authenticator.cpp +++ b/src/Protocol/Authenticator.cpp @@ -2,9 +2,10 @@ #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "Authenticator.h" -#include "OSSupport/BlockingTCPLink.h" -#include "Root.h" -#include "Server.h" +#include "../OSSupport/BlockingTCPLink.h" +#include "../Root.h" +#include "../Server.h" +#include "../ClientHandle.h" #include "inifile/iniFile.h" #include "json/json.h" @@ -32,10 +33,10 @@ cAuthenticator::cAuthenticator(void) : -super("cAuthenticator"), -m_Server(DEFAULT_AUTH_SERVER), -m_Address(DEFAULT_AUTH_ADDRESS), -m_ShouldAuthenticate(true) + super("cAuthenticator"), + m_Server(DEFAULT_AUTH_SERVER), + m_Address(DEFAULT_AUTH_ADDRESS), + m_ShouldAuthenticate(true) { } @@ -67,7 +68,7 @@ void cAuthenticator::Authenticate(int a_ClientID, const AString & a_UserName, co { if (!m_ShouldAuthenticate) { - cRoot::Get()->AuthenticateUser(a_ClientID, a_UserName, Printf("%d", a_ClientID)); + cRoot::Get()->AuthenticateUser(a_ClientID, a_UserName, cClientHandle::GenerateOfflineUUID(a_UserName)); return; } @@ -144,9 +145,9 @@ void cAuthenticator::Execute(void) bool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_ServerId, AString & a_UUID) { - AString REQUEST; + LOGD("Trying to auth user %s", a_UserName.c_str()); + int ret, server_fd = -1; - size_t len = 0; unsigned char buf[1024]; const char *pers = "cAuthenticator"; @@ -162,36 +163,31 @@ bool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_S entropy_init(&entropy); if ((ret = ctr_drbg_init(&ctr_drbg, entropy_func, &entropy, (const unsigned char *)pers, strlen(pers))) != 0) { - LOGERROR("cAuthenticator: ctr_drbg_init returned %d", ret); + LOGWARNING("cAuthenticator: ctr_drbg_init returned %d", ret); return false; } /* Initialize certificates */ - -#if defined(POLARSSL_CERTS_C) + // TODO: Grab the sessionserver's root CA and any intermediates and hard-code them here, instead of test_ca_list ret = x509_crt_parse(&cacert, (const unsigned char *)test_ca_list, strlen(test_ca_list)); -#else - ret = 1; - LOGWARNING("cAuthenticator: POLARSSL_CERTS_C is not defined."); -#endif if (ret < 0) { - LOGERROR("cAuthenticator: x509_crt_parse returned -0x%x", -ret); + LOGWARNING("cAuthenticator: x509_crt_parse returned -0x%x", -ret); return false; } /* Connect */ if ((ret = net_connect(&server_fd, m_Server.c_str(), 443)) != 0) { - LOGERROR("cAuthenticator: Can't connect to %s: %d", m_Server.c_str(), ret); + LOGWARNING("cAuthenticator: Can't connect to %s: %d", m_Server.c_str(), ret); return false; } /* Setup */ if ((ret = ssl_init(&ssl)) != 0) { - LOGERROR("cAuthenticator: ssl_init returned %d", ret); + LOGWARNING("cAuthenticator: ssl_init returned %d", ret); return false; } ssl_set_endpoint(&ssl, SSL_IS_CLIENT); @@ -203,9 +199,9 @@ bool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_S /* Handshake */ while ((ret = ssl_handshake(&ssl)) != 0) { - if (ret != POLARSSL_ERR_NET_WANT_READ && ret != POLARSSL_ERR_NET_WANT_WRITE) + if ((ret != POLARSSL_ERR_NET_WANT_READ) && (ret != POLARSSL_ERR_NET_WANT_WRITE)) { - LOGERROR("cAuthenticator: ssl_handshake returned -0x%x", -ret); + LOGWARNING("cAuthenticator: ssl_handshake returned -0x%x", -ret); return false; } } @@ -215,54 +211,47 @@ bool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_S ReplaceString(ActualAddress, "%USERNAME%", a_UserName); ReplaceString(ActualAddress, "%SERVERID%", a_ServerId); - REQUEST += "GET " + ActualAddress + " HTTP/1.1\r\n"; - REQUEST += "Host: " + m_Server + "\r\n"; - REQUEST += "User-Agent: MCServer\r\n"; - REQUEST += "Connection: close\r\n"; - REQUEST += "\r\n"; + AString Request; + Request += "GET " + ActualAddress + " HTTP/1.1\r\n"; + Request += "Host: " + m_Server + "\r\n"; + Request += "User-Agent: MCServer\r\n"; + Request += "Connection: close\r\n"; + Request += "\r\n"; - len = REQUEST.size(); - strcpy((char *)buf, REQUEST.c_str()); - - while ((ret = ssl_write(&ssl, buf, len)) <= 0) + ret = ssl_write(&ssl, (const unsigned char *)Request.c_str(), Request.size()); + if (ret <= 0) { - if (ret != POLARSSL_ERR_NET_WANT_READ && ret != POLARSSL_ERR_NET_WANT_WRITE) - { - LOGERROR("cAuthenticator: ssl_write returned %d", ret); - return false; - } + LOGWARNING("cAuthenticator: ssl_write returned %d", ret); + return false; } /* Read the HTTP response */ - std::string Builder; + std::string Response; for (;;) { - len = sizeof(buf)-1; memset(buf, 0, sizeof(buf)); - ret = ssl_read(&ssl, buf, len); - if (ret > 0) - { - buf[ret] = '\0'; - } + ret = ssl_read(&ssl, buf, sizeof(buf)); - if (ret == POLARSSL_ERR_NET_WANT_READ || ret == POLARSSL_ERR_NET_WANT_WRITE) + if ((ret == POLARSSL_ERR_NET_WANT_READ) || (ret == POLARSSL_ERR_NET_WANT_WRITE)) + { continue; + } if (ret == POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY) + { break; + } if (ret < 0) { - LOGERROR("cAuthenticator: ssl_read returned %d", ret); + LOGWARNING("cAuthenticator: ssl_read returned %d", ret); break; } if (ret == 0) { - LOGERROR("cAuthenticator: EOF"); + LOGWARNING("cAuthenticator: EOF"); break; } - std::string str; - str.append(reinterpret_cast(buf)); - Builder += str; + Response.append((const char *)buf, ret); } ssl_close_notify(&ssl); @@ -272,51 +261,49 @@ bool cAuthenticator::AuthWithYggdrasil(AString & a_UserName, const AString & a_S entropy_free(&entropy); memset(&ssl, 0, sizeof(ssl)); - std::string prefix("HTTP/1.1 200 OK"); - if (Builder.compare(0, prefix.size(), prefix)) - return false; - - std::stringstream ResponseBuilder; - bool NewLine = false; - bool IsNewLine = false; - for (std::string::const_iterator i = Builder.begin(); i <= Builder.end(); ++i) + // Check the HTTP status line: + AString prefix("HTTP/1.1 200 OK"); + AString HexDump; + if (Response.compare(0, prefix.size(), prefix)) { - if (NewLine) - { - ResponseBuilder << *i; - } - else if (!NewLine && *i == '\n') - { - if (IsNewLine) - { - NewLine = true; - } - else - { - IsNewLine = true; - } - } - else if (*i != '\r') - { - IsNewLine = false; - } + LOGINFO("User \"%s\" failed to auth, bad http status line received", a_UserName.c_str()); + LOG("Response: \n%s", CreateHexDump(HexDump, Response.data(), Response.size(), 16).c_str()); + return false; } - AString RESPONSE = ResponseBuilder.str(); - - if (RESPONSE.empty()) + // Erase the HTTP headers from the response: + size_t idxHeadersEnd = Response.find("\r\n\r\n"); + if (idxHeadersEnd == AString::npos) + { + LOGINFO("User \"%s\" failed to authenticate, bad http response header received", a_UserName.c_str()); + LOG("Response: \n%s", CreateHexDump(HexDump, Response.data(), Response.size(), 16).c_str()); return false; + } + Response.erase(0, idxHeadersEnd + 4); + // Parse the Json response: + if (Response.empty()) + { + return false; + } Json::Value root; Json::Reader reader; - if (!reader.parse(RESPONSE, root, false)) + if (!reader.parse(Response, root, false)) { LOGWARNING("cAuthenticator: Cannot parse Received Data to json!"); return false; } - a_UserName = root.get("name", "Unknown").asString(); a_UUID = root.get("id", "").asString(); + + // If the UUID doesn't contain the hashes, insert them at the proper places: + if (a_UUID.size() == 32) + { + a_UUID.insert(8, "-"); + a_UUID.insert(13, "-"); + a_UUID.insert(18, "-"); + a_UUID.insert(23, "-"); + } return true; } diff --git a/src/Protocol/Protocol.h b/src/Protocol/Protocol.h index 939170f0e..2fbeef0fa 100644 --- a/src/Protocol/Protocol.h +++ b/src/Protocol/Protocol.h @@ -83,6 +83,7 @@ public: virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) = 0; virtual void SendKeepAlive (int a_PingID) = 0; virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) = 0; + virtual void SendLoginSuccess (void) = 0; virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) = 0; virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators) = 0; virtual void SendMapInfo (int a_ID, unsigned int a_Scale) = 0; diff --git a/src/Protocol/Protocol125.cpp b/src/Protocol/Protocol125.cpp index bf946ef19..af1b1c604 100644 --- a/src/Protocol/Protocol125.cpp +++ b/src/Protocol/Protocol125.cpp @@ -594,6 +594,15 @@ void cProtocol125::SendLogin(const cPlayer & a_Player, const cWorld & a_World) +void cProtocol125::SendLoginSuccess(void) +{ + // Not supported in this protocol version +} + + + + + void cProtocol125::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) { cCSLock Lock(m_CSPacket); @@ -642,6 +651,17 @@ void cProtocol125::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decor +void cProtocol125::SendMapInfo(int a_ID, unsigned int a_Scale) +{ + // This protocol doesn't support such message + UNUSED(a_ID); + UNUSED(a_Scale); +} + + + + + void cProtocol125::SendPickupSpawn(const cPickup & a_Pickup) { cCSLock Lock(m_CSPacket); @@ -683,6 +703,16 @@ void cProtocol125::SendParticleEffect(const AString & a_ParticleName, float a_Sr +void cProtocol125::SendPaintingSpawn(const cPainting & a_Painting) +{ + // Not implemented in this protocol version + UNUSED(a_Painting); +} + + + + + void cProtocol125::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline) { cCSLock Lock(m_CSPacket); @@ -842,6 +872,18 @@ void cProtocol125::SendExperienceOrb(const cExpOrb & a_ExpOrb) +void cProtocol125::SendScoreboardObjective(const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) +{ + // This protocol version doesn't support such message + UNUSED(a_Name); + UNUSED(a_DisplayName); + UNUSED(a_Mode); +} + + + + + void cProtocol125::SendSoundEffect(const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch) { // Not needed in this protocol version diff --git a/src/Protocol/Protocol125.h b/src/Protocol/Protocol125.h index 08d3ebbe9..16f31bd0e 100644 --- a/src/Protocol/Protocol125.h +++ b/src/Protocol/Protocol125.h @@ -56,19 +56,12 @@ public: virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override; virtual void SendKeepAlive (int a_PingID) override; virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override; + virtual void SendLoginSuccess (void) override; virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) override; virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators) override; - virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override - { - // This protocol doesn't support such message - UNUSED(a_ID); - UNUSED(a_Scale); - } + virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override; virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) override; - virtual void SendPaintingSpawn (const cPainting & a_Painting) override - { - UNUSED(a_Painting); - }; + virtual void SendPaintingSpawn (const cPainting & a_Painting) override; virtual void SendPickupSpawn (const cPickup & a_Pickup) override; virtual void SendPlayerAbilities (void) override {} // This protocol doesn't support such message virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override; @@ -82,12 +75,7 @@ public: virtual void SendRespawn (void) override; virtual void SendExperience (void) override; virtual void SendExperienceOrb (const cExpOrb & a_ExpOrb) override; - virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override - { - UNUSED(a_Name); - UNUSED(a_DisplayName); - UNUSED(a_Mode); - } // This protocol doesn't support such message + virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override; virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override {} // This protocol doesn't support such message virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override {} // This protocol doesn't support such message virtual void SendSoundEffect (const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch) override; // a_Src coords are Block * 8 diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index b44c9f919..c8105c03a 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -574,6 +574,21 @@ void cProtocol172::SendLogin(const cPlayer & a_Player, const cWorld & a_World) +void cProtocol172::SendLoginSuccess(void) +{ + ASSERT(m_State == 2); // State: login? + + cPacketizer Pkt(*this, 0x02); // Login success packet + Pkt.WriteString(m_Client->GetUUID()); + Pkt.WriteString(m_Client->GetUsername()); + + m_State = 3; // State = Game +} + + + + + void cProtocol172::SendPaintingSpawn(const cPainting & a_Painting) { cPacketizer Pkt(*this, 0x10); // Spawn Painting packet @@ -1556,18 +1571,7 @@ void cProtocol172::HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffe } StartEncryption(DecryptedKey); - - /* - // Send login success: - { - cPacketizer Pkt(*this, 0x02); // Login success packet - Pkt.WriteString(m_Client->GetUUID()); - Pkt.WriteString(m_Client->GetUsername()); - } - - m_State = 3; // State = Game m_Client->HandleLogin(4, m_Client->GetUsername()); - */ } @@ -1599,17 +1603,6 @@ void cProtocol172::HandlePacketLoginStart(cByteBuffer & a_ByteBuffer) return; } - // Generate an offline UUID for the player: - m_Client->GenerateOfflineUUID(); - - // Send login success: - { - cPacketizer Pkt(*this, 0x02); // Login success packet - Pkt.WriteString(m_Client->GetUUID()); - Pkt.WriteString(Username); - } - - m_State = 3; // State = Game m_Client->HandleLogin(4, Username); } @@ -2797,3 +2790,28 @@ void cProtocol176::SendPlayerSpawn(const cPlayer & a_Player) + +void cProtocol176::HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer) +{ + // Send the response: + AString Response = "{\"version\":{\"name\":\"1.7.6\",\"protocol\":5},\"players\":{"; + AppendPrintf(Response, "\"max\":%u,\"online\":%u,\"sample\":[]},", + cRoot::Get()->GetServer()->GetMaxPlayers(), + cRoot::Get()->GetServer()->GetNumPlayers() + ); + AppendPrintf(Response, "\"description\":{\"text\":\"%s\"},", + cRoot::Get()->GetServer()->GetDescription().c_str() + ); + AppendPrintf(Response, "\"favicon\":\"data:image/png;base64,%s\"", + cRoot::Get()->GetServer()->GetFaviconData().c_str() + ); + Response.append("}"); + + cPacketizer Pkt(*this, 0x00); // Response packet + Pkt.WriteString(Response); +} + + + + + diff --git a/src/Protocol/Protocol17x.h b/src/Protocol/Protocol17x.h index 7d0196a21..5cafc4722 100644 --- a/src/Protocol/Protocol17x.h +++ b/src/Protocol/Protocol17x.h @@ -87,6 +87,7 @@ public: virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override; virtual void SendKeepAlive (int a_PingID) override; virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override; + virtual void SendLoginSuccess (void) override; virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) override; virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators) override; virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override; @@ -252,7 +253,7 @@ protected: // Packet handlers while in the Status state (m_State == 1): void HandlePacketStatusPing (cByteBuffer & a_ByteBuffer); - void HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer); + virtual void HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer); // Packet handlers while in the Login state (m_State == 2): void HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffer); @@ -318,6 +319,8 @@ public: // cProtocol172 overrides: virtual void SendPlayerSpawn(const cPlayer & a_Player) override; + virtual void HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer) override; + } ; diff --git a/src/Protocol/ProtocolRecognizer.cpp b/src/Protocol/ProtocolRecognizer.cpp index 6a1f2fbbd..8a97b9713 100644 --- a/src/Protocol/ProtocolRecognizer.cpp +++ b/src/Protocol/ProtocolRecognizer.cpp @@ -397,6 +397,16 @@ void cProtocolRecognizer::SendLogin(const cPlayer & a_Player, const cWorld & a_W +void cProtocolRecognizer::SendLoginSuccess(void) +{ + ASSERT(m_Protocol != NULL); + m_Protocol->SendLoginSuccess(); +} + + + + + void cProtocolRecognizer::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) { ASSERT(m_Protocol != NULL); diff --git a/src/Protocol/ProtocolRecognizer.h b/src/Protocol/ProtocolRecognizer.h index e53fc9514..408109ef4 100644 --- a/src/Protocol/ProtocolRecognizer.h +++ b/src/Protocol/ProtocolRecognizer.h @@ -91,6 +91,7 @@ public: virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override; virtual void SendKeepAlive (int a_PingID) override; virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override; + virtual void SendLoginSuccess (void) override; virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) override; virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators) override; virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override; From 146824cb68193fd20a1f1dd441f8ceb7803e363a Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 13 Apr 2014 17:26:15 +0200 Subject: [PATCH 101/188] NetherFortPrefabs: Fixed a connector in MidStaircase. --- src/Generating/Prefabs/NetherFortPrefabs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Generating/Prefabs/NetherFortPrefabs.cpp b/src/Generating/Prefabs/NetherFortPrefabs.cpp index 29b35a5a4..164bd9557 100644 --- a/src/Generating/Prefabs/NetherFortPrefabs.cpp +++ b/src/Generating/Prefabs/NetherFortPrefabs.cpp @@ -3367,7 +3367,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Connectors: "1: 12, 1, 6: 5\n" /* Type 1, direction X+ */ - "1: -1, 1, 6: 4\n" /* Type 1, direction X- */, + "1: 0, 1, 6: 4\n" /* Type 1, direction X- */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotations */ From b5ea5fbf905c0917594188635b11d577d4e27f5c Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 13 Apr 2014 17:27:36 +0200 Subject: [PATCH 102/188] Added support for per-piece per-placement weights in cPieceGenerator. Ref.: #753. --- src/Generating/PieceGenerator.cpp | 56 ++++++++++++++++--------------- src/Generating/PieceGenerator.h | 20 ++++++++++- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/src/Generating/PieceGenerator.cpp b/src/Generating/PieceGenerator.cpp index 8999a5ff7..8e9a48be6 100644 --- a/src/Generating/PieceGenerator.cpp +++ b/src/Generating/PieceGenerator.cpp @@ -392,14 +392,17 @@ bool cPieceGenerator::TryPlacePieceAtConnector( Connections.reserve(AvailablePieces.size()); Vector3i ConnPos = a_Connector.m_Pos; // The position at which the new connector should be placed - 1 block away from the connector AddFaceDirection(ConnPos.x, ConnPos.y, ConnPos.z, a_Connector.m_Direction); - - /* - // DEBUG: - printf("Placing piece at connector pos {%d, %d, %d}, direction %s\n", ConnPos.x, ConnPos.y, ConnPos.z, BlockFaceToString(a_Connector.m_Direction).c_str()); - //*/ - + int WeightTotal = 0; for (cPieces::iterator itrP = AvailablePieces.begin(), endP = AvailablePieces.end(); itrP != endP; ++itrP) { + // Get the relative chance of this piece being generated in this path: + int Weight = m_PiecePool.GetPieceWeight(a_ParentPiece, a_Connector, **itrP); + if (Weight <= 0) + { + continue; + } + + // Try fitting each of the piece's connector: cPiece::cConnectors Connectors = (*itrP)->GetConnectors(); for (cPiece::cConnectors::iterator itrC = Connectors.begin(), endC = Connectors.end(); itrC != endC; ++itrC) { @@ -419,7 +422,9 @@ bool cPieceGenerator::TryPlacePieceAtConnector( // Doesn't fit in this rotation continue; } - Connections.push_back(cConnection(**itrP, *itrC, NumCCWRotations)); + // Fits, add it to list of possibile connections: + Connections.push_back(cConnection(**itrP, *itrC, NumCCWRotations, Weight)); + WeightTotal += Weight; } // for itrC - Connectors[] } // for itrP - AvailablePieces[] if (Connections.empty()) @@ -427,21 +432,23 @@ bool cPieceGenerator::TryPlacePieceAtConnector( // No available connections, bail out return false; } + ASSERT(WeightTotal > 0); - // Choose a random connection from the list: - int rnd = m_Noise.IntNoise3DInt(a_Connector.m_Pos.x, a_Connector.m_Pos.y, a_Connector.m_Pos.z) / 7; - cConnection & Conn = Connections[rnd % Connections.size()]; + // Choose a random connection from the list, based on the weights: + int rnd = (m_Noise.IntNoise3DInt(a_Connector.m_Pos.x, a_Connector.m_Pos.y, a_Connector.m_Pos.z) / 7) % WeightTotal; + size_t ChosenIndex = 0; + for (cConnections::const_iterator itr = Connections.begin(), end = Connections.end(); itr != end; ++itr, ++ChosenIndex) + { + rnd -= itr->m_Weight; + if (rnd <= 0) + { + // This is the piece to choose + break; + } + } + cConnection & Conn = Connections[ChosenIndex]; // Place the piece: - /* - // DEBUG - printf("Chosen connector at {%d, %d, %d}, direction %s, needs %d rotations\n", - Conn.m_Connector.m_Pos.x, Conn.m_Connector.m_Pos.y, Conn.m_Connector.m_Pos.z, - BlockFaceToString(Conn.m_Connector.m_Direction).c_str(), - Conn.m_NumCCWRotations - ); - //*/ - Vector3i NewPos = Conn.m_Piece->RotatePos(Conn.m_Connector.m_Pos, Conn.m_NumCCWRotations); ConnPos -= NewPos; cPlacedPiece * PlacedPiece = new cPlacedPiece(&a_ParentPiece, *(Conn.m_Piece), ConnPos, Conn.m_NumCCWRotations); @@ -449,12 +456,6 @@ bool cPieceGenerator::TryPlacePieceAtConnector( // Add the new piece's connectors to the list of free connectors: cPiece::cConnectors Connectors = Conn.m_Piece->GetConnectors(); - - /* - // DEBUG: - printf("Adding %u connectors to the pool\n", Connectors.size() - 1); - //*/ - for (cPiece::cConnectors::const_iterator itr = Connectors.begin(), end = Connectors.end(); itr != end; ++itr) { if (itr->m_Pos.Equals(Conn.m_Connector.m_Pos)) @@ -524,10 +525,11 @@ void cPieceGenerator::DebugConnectorPool(const cPieceGenerator::cFreeConnectors /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cPieceGenerator::cConnection: -cPieceGenerator::cConnection::cConnection(cPiece & a_Piece, cPiece::cConnector & a_Connector, int a_NumCCWRotations) : +cPieceGenerator::cConnection::cConnection(cPiece & a_Piece, cPiece::cConnector & a_Connector, int a_NumCCWRotations, int a_Weight) : m_Piece(&a_Piece), m_Connector(a_Connector), - m_NumCCWRotations(a_NumCCWRotations) + m_NumCCWRotations(a_NumCCWRotations), + m_Weight(a_Weight) { } diff --git a/src/Generating/PieceGenerator.h b/src/Generating/PieceGenerator.h index bef9d3463..f4433b947 100644 --- a/src/Generating/PieceGenerator.h +++ b/src/Generating/PieceGenerator.h @@ -85,6 +85,13 @@ typedef std::vector cPieces; +// fwd: +class cPlacedPiece; + + + + + /** This class is an interface that provides pieces for the generator. It can keep track of what pieces were placed and adjust the returned piece vectors. */ class cPiecePool @@ -101,6 +108,16 @@ public: Multiple starting points are supported, one of the returned piece will be chosen. */ virtual cPieces GetStartingPieces(void) = 0; + /** Returns the relative weight with which the a_NewPiece is to be selected for placing under a_PlacedPiece through a_ExistingConnector. + This allows the pool to tweak the piece's chances, based on the previous pieces in the tree and the connector used. + The higher the number returned, the higher the chance the piece will be chosen. 0 means the piece will never be chosen. + */ + virtual int GetPieceWeight( + const cPlacedPiece & a_PlacedPiece, + const cPiece::cConnector & a_ExistingConnector, + const cPiece & a_NewPiece + ) { return 1; } + /** Called after a piece is placed, to notify the pool that it has been used. The pool may adjust the pieces it will return the next time. */ virtual void PiecePlaced(const cPiece & a_Piece) = 0; @@ -157,8 +174,9 @@ protected: cPiece * m_Piece; // The piece being connected cPiece::cConnector m_Connector; // The piece's connector being used (relative non-rotated coords) int m_NumCCWRotations; // Number of rotations necessary to match the two connectors + int m_Weight; // Relative chance that this connection will be chosen - cConnection(cPiece & a_Piece, cPiece::cConnector & a_Connector, int a_NumCCWRotations); + cConnection(cPiece & a_Piece, cPiece::cConnector & a_Connector, int a_NumCCWRotations, int a_Weight); }; typedef std::vector cConnections; From 82b3d543e7bcdbffb34f9fb555c2acb6fb9b10d9 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Tue, 15 Apr 2014 13:15:56 +0100 Subject: [PATCH 103/188] Rewrote redstone powering to use power levels --- .../IncrementalRedstoneSimulator.cpp | 296 ++++++++---------- src/Simulator/IncrementalRedstoneSimulator.h | 31 +- src/Vector3.h | 5 + src/World.cpp | 2 +- src/WorldStorage/FireworksSerializer.cpp | 2 +- src/WorldStorage/FireworksSerializer.h | 2 +- 6 files changed, 156 insertions(+), 182 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index 50cac8d7e..e0640a409 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -69,18 +69,19 @@ void cIncrementalRedstoneSimulator::RedstoneAddBlock(int a_BlockX, int a_BlockY, // Checking only when a block is changed, as opposed to every tick, also improves performance PoweredBlocksList * PoweredBlocks = a_Chunk->GetRedstoneSimulatorPoweredBlocksList(); - for (PoweredBlocksList::iterator itr = PoweredBlocks->begin(); itr != PoweredBlocks->end(); ++itr) + for (PoweredBlocksList::iterator itr = PoweredBlocks->begin(); itr != PoweredBlocks->end();) { if (!itr->a_SourcePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { + ++itr; continue; } if (!IsPotentialSource(Block)) { LOGD("cIncrementalRedstoneSimulator: Erased block @ {%i, %i, %i} from powered blocks list as it no longer connected to a source", itr->a_BlockPos.x, itr->a_BlockPos.y, itr->a_BlockPos.z); - PoweredBlocks->erase(itr); - break; + itr = PoweredBlocks->erase(itr); + continue; } else if ( // Changeable sources @@ -93,9 +94,10 @@ void cIncrementalRedstoneSimulator::RedstoneAddBlock(int a_BlockX, int a_BlockY, ) { LOGD("cIncrementalRedstoneSimulator: Erased block @ {%i, %i, %i} from powered blocks list due to present/past metadata mismatch", itr->a_BlockPos.x, itr->a_BlockPos.y, itr->a_BlockPos.z); - PoweredBlocks->erase(itr); - break; + itr = PoweredBlocks->erase(itr); + continue; } + ++itr; } LinkedBlocksList * LinkedPoweredBlocks = a_Chunk->GetRedstoneSimulatorLinkedBlocksList(); @@ -532,128 +534,95 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block }; // Check to see if directly beside a power source - if (IsWirePowered(a_BlockX, a_BlockY, a_BlockZ)) + unsigned char MyPower; + if (!IsWirePowered(a_BlockX, a_BlockY, a_BlockZ, MyPower)) { - m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, 15); // Maximum power + m_World.SetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, 0); + return; } - else + + m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, MyPower); // Maximum power + + if (MyPower < 2) { - NIBBLETYPE MyMeta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); - NIBBLETYPE MetaToSet = MyMeta; - int TimesMetaSmaller = 0, TimesFoundAWire = 0; + return; + } - for (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++) // Loop through all directions to transfer or receive power + MyPower--; + + for (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++) // Loop through all directions to transfer or receive power + { + if ((i >= 4) && (i <= 7)) // If we are currently checking for wire surrounding ourself one block above... { - if ((i >= 4) && (i <= 7)) // If we are currently checking for wire surrounding ourself one block above... + if (cBlockInfo::IsSolid(m_World.GetBlock(a_BlockX, a_BlockY + 1, a_BlockZ))) // If there is something solid above us (wire cut off)... { - if (cBlockInfo::IsSolid(m_World.GetBlock(a_BlockX, a_BlockY + 1, a_BlockZ))) // If there is something solid above us (wire cut off)... - { - continue; // We don't receive power from that wire - } + continue; // We don't receive power from that wire } - else if ((i >= 8) && (i <= 11)) // See above, but this is for wire below us + } + else if ((i >= 8) && (i <= 11)) // See above, but this is for wire below us + { + if (cBlockInfo::IsSolid(m_World.GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ))) { - if (cBlockInfo::IsSolid(m_World.GetBlock(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y + 1, a_BlockZ + gCrossCoords[i].z))) - { - continue; - } + continue; } - - BLOCKTYPE SurroundType; - NIBBLETYPE SurroundMeta; - m_World.GetBlockTypeMeta(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y, a_BlockZ + gCrossCoords[i].z, SurroundType, SurroundMeta); - - if (SurroundType == E_BLOCK_REDSTONE_WIRE) - { - TimesFoundAWire++; - - if (SurroundMeta > 1) // Wires of power 1 or 0 cannot transfer power TO ME, don't bother checking - { - // Does surrounding wire have a higher power level than the highest so far (MetaToSet)? - // >= to fix a bug where wires bordering each other with the same power level will appear (in terms of meta) to power each other, when they aren't actually in the powered list - if (SurroundMeta >= MetaToSet) - { - MetaToSet = SurroundMeta - 1; // To improve performance - } - } - - if (SurroundMeta < MyMeta) // Go through all surroundings to see if self power is larger than everyone else's - { - TimesMetaSmaller++; - } - } } - if ((TimesMetaSmaller == TimesFoundAWire) && (MyMeta != 0)) + if (m_World.GetBlock(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y, a_BlockZ + gCrossCoords[i].z) == E_BLOCK_REDSTONE_WIRE) { - // All surrounding metas were smaller - self must have been a wire that was - // transferring power to other wires around. - // However, self not directly powered anymore, so source must have been removed, - // therefore, self must be set to meta zero - m_World.SetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, 0); // SetMeta & WakeUpSims doesn't seem to work here, so SetBlock - return; // No need to process block power sets because self not powered - } - else if (MyMeta != MetaToSet) - { - m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, MetaToSet); + SetBlockPowered(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y, a_BlockZ + gCrossCoords[i].z, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower); } } - if (m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ) != 0) // A powered wire + for (size_t i = 0; i < ARRAYCOUNT(gSideCoords); i++) // Look for repeaters immediately surrounding self and try to power them { - for (size_t i = 0; i < ARRAYCOUNT(gSideCoords); i++) // Look for repeaters immediately surrounding self and try to power them + if (m_World.GetBlock(a_BlockX + gSideCoords[i].x, a_BlockY + gSideCoords[i].y, a_BlockZ + gSideCoords[i].z) == E_BLOCK_REDSTONE_REPEATER_OFF) { - if (m_World.GetBlock(a_BlockX + gSideCoords[i].x, a_BlockY + gSideCoords[i].y, a_BlockZ + gSideCoords[i].z) == E_BLOCK_REDSTONE_REPEATER_OFF) - { - SetBlockPowered(a_BlockX + gSideCoords[i].x, a_BlockY + gSideCoords[i].y, a_BlockZ + gSideCoords[i].z, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE); - } + SetBlockPowered(a_BlockX + gSideCoords[i].x, a_BlockY + gSideCoords[i].y, a_BlockZ + gSideCoords[i].z, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower); } + } - // Wire still powered, power blocks beneath - SetBlockPowered(a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE); - SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_YM, E_BLOCK_REDSTONE_WIRE); + // Wire still powered, power blocks beneath + SetBlockPowered(a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower); + SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_YM, E_BLOCK_REDSTONE_WIRE, MyPower); - switch (GetWireDirection(a_BlockX, a_BlockY, a_BlockZ)) + switch (GetWireDirection(a_BlockX, a_BlockY, a_BlockZ)) + { + case REDSTONE_NONE: { - case REDSTONE_NONE: - { - SetBlockPowered(a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE); - SetBlockPowered(a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE); - SetBlockPowered(a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE); - SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE); - SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE); + SetBlockPowered(a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower); + SetBlockPowered(a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower); + SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower); + SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower); - SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XM, E_BLOCK_REDSTONE_WIRE); - SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XP, E_BLOCK_REDSTONE_WIRE); - SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_YM, E_BLOCK_REDSTONE_WIRE); - SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZM, E_BLOCK_REDSTONE_WIRE); - SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZP, E_BLOCK_REDSTONE_WIRE); - break; - } - case REDSTONE_X_POS: - { - SetBlockPowered(a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE); - SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XP, E_BLOCK_REDSTONE_WIRE); - break; - } - case REDSTONE_X_NEG: - { - SetBlockPowered(a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE); - SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XM, E_BLOCK_REDSTONE_WIRE); - break; - } - case REDSTONE_Z_POS: - { - SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE); - SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZP, E_BLOCK_REDSTONE_WIRE); - break; - } - case REDSTONE_Z_NEG: - { - SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE); - SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZM, E_BLOCK_REDSTONE_WIRE); - break; - } + SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XM, E_BLOCK_REDSTONE_WIRE, MyPower); + SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XP, E_BLOCK_REDSTONE_WIRE, MyPower); + SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZM, E_BLOCK_REDSTONE_WIRE, MyPower); + SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZP, E_BLOCK_REDSTONE_WIRE, MyPower); + break; + } + case REDSTONE_X_POS: + { + SetBlockPowered(a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower); + SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XP, E_BLOCK_REDSTONE_WIRE, MyPower); + break; + } + case REDSTONE_X_NEG: + { + SetBlockPowered(a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower); + SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_XM, E_BLOCK_REDSTONE_WIRE, MyPower); + break; + } + case REDSTONE_Z_POS: + { + SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower); + SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZP, E_BLOCK_REDSTONE_WIRE, MyPower); + break; + } + case REDSTONE_Z_NEG: + { + SetBlockPowered(a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, MyPower); + SetDirectionLinkedPowered(a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_ZM, E_BLOCK_REDSTONE_WIRE, MyPower); + break; } } } @@ -1323,28 +1292,23 @@ bool cIncrementalRedstoneSimulator::IsPistonPowered(int a_BlockX, int a_BlockY, -bool cIncrementalRedstoneSimulator::IsWirePowered(int a_BlockX, int a_BlockY, int a_BlockZ) +bool cIncrementalRedstoneSimulator::IsWirePowered(int a_BlockX, int a_BlockY, int a_BlockZ, unsigned char & a_PowerLevel) { - for (PoweredBlocksList::const_iterator itr = m_PoweredBlocks->begin(); itr != m_PoweredBlocks->end(); ++itr) + a_PowerLevel = 0; + + for (auto itr = m_PoweredBlocks->cbegin(); itr != m_PoweredBlocks->cend(); ++itr) // Check powered list { if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; } - - if (m_World.GetBlock(itr->a_SourcePos) != E_BLOCK_REDSTONE_WIRE) - { - return true; - } + a_PowerLevel = std::max(a_PowerLevel, itr->a_PowerLevel); } - for (LinkedBlocksList::const_iterator itr = m_LinkedPoweredBlocks->begin(); itr != m_LinkedPoweredBlocks->end(); ++itr) + for (auto itr = m_LinkedPoweredBlocks->cbegin(); itr != m_LinkedPoweredBlocks->cend(); ++itr) // Check linked powered list { if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; } - - if (m_World.GetBlock(itr->a_SourcePos) != E_BLOCK_REDSTONE_WIRE) - { - return true; - } + a_PowerLevel = std::max(a_PowerLevel, itr->a_PowerLevel); } - return false; // Source was in front of the piston's front face + + return (a_PowerLevel != 0); // Source was in front of the piston's front face } @@ -1374,7 +1338,7 @@ bool cIncrementalRedstoneSimulator::AreCoordsSimulated(int a_BlockX, int a_Block -void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Direction, BLOCKTYPE a_SourceType) +void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Direction, BLOCKTYPE a_SourceType, unsigned char a_PowerLevel) { switch (a_Direction) { @@ -1382,11 +1346,11 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int { BLOCKTYPE MiddleBlock = m_World.GetBlock(a_BlockX - 1, a_BlockY, a_BlockZ); - SetBlockLinkedPowered(a_BlockX - 2, a_BlockY, a_BlockZ, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX - 1, a_BlockY + 1, a_BlockZ, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX - 1, a_BlockY - 1, a_BlockZ, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ + 1, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ - 1, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); + SetBlockLinkedPowered(a_BlockX - 2, a_BlockY, a_BlockZ, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX - 1, a_BlockY + 1, a_BlockZ, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX - 1, a_BlockY - 1, a_BlockZ, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ + 1, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ - 1, a_BlockX - 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); break; } @@ -1394,11 +1358,11 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int { BLOCKTYPE MiddleBlock = m_World.GetBlock(a_BlockX + 1, a_BlockY, a_BlockZ); - SetBlockLinkedPowered(a_BlockX + 2, a_BlockY, a_BlockZ, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX + 1, a_BlockY + 1, a_BlockZ, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX + 1, a_BlockY - 1, a_BlockZ, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ + 1, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ - 1, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); + SetBlockLinkedPowered(a_BlockX + 2, a_BlockY, a_BlockZ, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX + 1, a_BlockY + 1, a_BlockZ, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX + 1, a_BlockY - 1, a_BlockZ, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ + 1, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ - 1, a_BlockX + 1, a_BlockY, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); break; } @@ -1406,11 +1370,11 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int { BLOCKTYPE MiddleBlock = m_World.GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ); - SetBlockLinkedPowered(a_BlockX, a_BlockY - 2, a_BlockZ, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX + 1, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX - 1, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ + 1, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ - 1, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); + SetBlockLinkedPowered(a_BlockX, a_BlockY - 2, a_BlockZ, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX + 1, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX - 1, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ + 1, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ - 1, a_BlockX, a_BlockY - 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); break; } @@ -1418,11 +1382,11 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int { BLOCKTYPE MiddleBlock = m_World.GetBlock(a_BlockX, a_BlockY + 1, a_BlockZ); - SetBlockLinkedPowered(a_BlockX, a_BlockY + 2, a_BlockZ, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX + 1, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX - 1, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ + 1, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ - 1, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); + SetBlockLinkedPowered(a_BlockX, a_BlockY + 2, a_BlockZ, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX + 1, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX - 1, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ + 1, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ - 1, a_BlockX, a_BlockY + 1, a_BlockZ, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); break; } @@ -1430,11 +1394,11 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int { BLOCKTYPE MiddleBlock = m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ - 1); - SetBlockLinkedPowered(a_BlockX, a_BlockY, a_BlockZ - 2, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); + SetBlockLinkedPowered(a_BlockX, a_BlockY, a_BlockZ - 2, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ - 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); break; } @@ -1442,11 +1406,11 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int { BLOCKTYPE MiddleBlock = m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ + 1); - SetBlockLinkedPowered(a_BlockX, a_BlockY, a_BlockZ + 2, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); - SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock); + SetBlockLinkedPowered(a_BlockX, a_BlockY, a_BlockZ + 2, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX + 1, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX - 1, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX, a_BlockY + 1, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); + SetBlockLinkedPowered(a_BlockX, a_BlockY - 1, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ + 1, a_BlockX, a_BlockY, a_BlockZ, a_SourceType, MiddleBlock, a_PowerLevel); break; } @@ -1487,7 +1451,7 @@ void cIncrementalRedstoneSimulator::SetAllDirsAsPowered(int a_BlockX, int a_Bloc -void cIncrementalRedstoneSimulator::SetBlockPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock) +void cIncrementalRedstoneSimulator::SetBlockPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel) { BLOCKTYPE Block = m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ); if (Block == E_BLOCK_AIR) @@ -1497,7 +1461,6 @@ void cIncrementalRedstoneSimulator::SetBlockPowered(int a_BlockX, int a_BlockY, } PoweredBlocksList * Powered = m_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ)->GetRedstoneSimulatorPoweredBlocksList(); - for (PoweredBlocksList::const_iterator itr = Powered->begin(); itr != Powered->end(); ++itr) // Check powered list { if ( @@ -1510,9 +1473,23 @@ void cIncrementalRedstoneSimulator::SetBlockPowered(int a_BlockX, int a_BlockY, } } + PoweredBlocksList * OtherPowered = m_Chunk->GetNeighborChunk(a_SourceX, a_SourceZ)->GetRedstoneSimulatorPoweredBlocksList(); + for (PoweredBlocksList::const_iterator itr = OtherPowered->begin(); itr != OtherPowered->end(); ++itr) // Check powered list + { + if ( + itr->a_BlockPos.Equals(Vector3i(a_SourceX, a_SourceY, a_SourceZ)) && + itr->a_SourcePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)) + ) + { + // Powered wires try to power their source - don't let them! + return; + } + } + sPoweredBlocks RC; RC.a_BlockPos = Vector3i(a_BlockX, a_BlockY, a_BlockZ); RC.a_SourcePos = Vector3i(a_SourceX, a_SourceY, a_SourceZ); + RC.a_PowerLevel = a_PowerLevel; Powered->push_back(RC); } @@ -1524,7 +1501,7 @@ void cIncrementalRedstoneSimulator::SetBlockLinkedPowered( int a_BlockX, int a_BlockY, int a_BlockZ, int a_MiddleX, int a_MiddleY, int a_MiddleZ, int a_SourceX, int a_SourceY, int a_SourceZ, - BLOCKTYPE a_SourceBlock, BLOCKTYPE a_MiddleBlock + BLOCKTYPE a_SourceBlock, BLOCKTYPE a_MiddleBlock, unsigned char a_PowerLevel ) { BLOCKTYPE DestBlock = m_World.GetBlock(a_BlockX, a_BlockY, a_BlockZ); @@ -1539,7 +1516,6 @@ void cIncrementalRedstoneSimulator::SetBlockLinkedPowered( } LinkedBlocksList * Linked = m_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ)->GetRedstoneSimulatorLinkedBlocksList(); - for (LinkedBlocksList::const_iterator itr = Linked->begin(); itr != Linked->end(); ++itr) // Check linked powered list { if ( @@ -1557,6 +1533,7 @@ void cIncrementalRedstoneSimulator::SetBlockLinkedPowered( RC.a_BlockPos = Vector3i(a_BlockX, a_BlockY, a_BlockZ); RC.a_MiddlePos = Vector3i(a_MiddleX, a_MiddleY, a_MiddleZ); RC.a_SourcePos = Vector3i(a_SourceX, a_SourceY, a_SourceZ); + RC.a_PowerLevel = a_PowerLevel; Linked->push_back(RC); } @@ -1621,7 +1598,7 @@ void cIncrementalRedstoneSimulator::QueueRepeaterPowerChange(int a_BlockX, int a RC.a_BlockPos = Vector3i(a_BlockX, a_BlockY, a_BlockZ); // Gets the top two bits (delay time), shifts them into the lower two bits, and adds one (meta 0 = 1 tick; 1 = 2 etc.) - // * 2 because apparently, MCS ticks are way faster than vanilla ticks, so repeater aren't noticeably delayed + // * 2 because in MCS, 1 redstone tick = 1 world tick, but in Vanilla, 1 redstone tick = 2 world ticks, and we need to maintain compatibility RC.a_DelayTicks = (((a_Meta & 0xC) >> 0x2) + 1) * 2; RC.a_ElapsedTicks = 0; @@ -1697,12 +1674,3 @@ bool cIncrementalRedstoneSimulator::IsLeverOn(NIBBLETYPE a_BlockMeta) - -bool cIncrementalRedstoneSimulator::IsButtonOn(NIBBLETYPE a_BlockMeta) -{ - return IsLeverOn(a_BlockMeta); -} - - - - diff --git a/src/Simulator/IncrementalRedstoneSimulator.h b/src/Simulator/IncrementalRedstoneSimulator.h index f93f86898..21bf11887 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.h +++ b/src/Simulator/IncrementalRedstoneSimulator.h @@ -40,27 +40,29 @@ private: { Vector3i a_BlockPos; // Position of powered block Vector3i a_SourcePos; // Position of source powering the block at a_BlockPos + unsigned char a_PowerLevel; }; struct sLinkedPoweredBlocks // Define structure of the indirectly powered blocks list (i.e. repeaters powering through a block to the block at the other side) { Vector3i a_BlockPos; - Vector3i a_MiddlePos; + Vector3i a_MiddlePos; // Position of block that is betwixt a source and the destination Vector3i a_SourcePos; + unsigned char a_PowerLevel; }; - struct sSimulatedPlayerToggleableList + struct sSimulatedPlayerToggleableList // Define structure of the list containing simulate-on-update blocks (such as trapdoors that respond once to a block update, and can be toggled by a player) { Vector3i a_BlockPos; - bool WasLastStatePowered; + bool WasLastStatePowered; // Was the last state powered or not? Determines whether a source update has happened and if I should resimulate }; - struct sRepeatersDelayList + struct sRepeatersDelayList // Define structure of list containing repeaters' delay states { Vector3i a_BlockPos; - unsigned char a_DelayTicks; - unsigned char a_ElapsedTicks; - bool ShouldPowerOn; + unsigned char a_DelayTicks; // For how many ticks should the repeater delay + unsigned char a_ElapsedTicks; // How much of the previous has been elapsed? + bool ShouldPowerOn; // What happens when the delay time is fulfilled? }; public: @@ -132,13 +134,13 @@ private: /* ====== Helper functions ====== */ /** Marks a block as powered */ - void SetBlockPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock); + void SetBlockPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel = 15); /** Marks a block as being powered through another block */ - void SetBlockLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_MiddleX, int a_MiddleY, int a_MiddleZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, BLOCKTYPE a_MiddeBlock); + void SetBlockLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_MiddleX, int a_MiddleY, int a_MiddleZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, BLOCKTYPE a_MiddeBlock, unsigned char a_PowerLevel = 15); /** Marks a block as simulated, who should not be simulated further unless their power state changes, to accomodate a player manually toggling the block without triggering the simulator toggling it back */ void SetPlayerToggleableBlockAsSimulated(int a_BlockX, int a_BlockY, int a_BlockZ, bool WasLastStatePowered); /** Marks the second block in a direction as linked powered */ - void SetDirectionLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Direction, BLOCKTYPE a_SourceBlock); + void SetDirectionLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Direction, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel = 15); /** Marks all blocks immediately surrounding a coordinate as powered */ void SetAllDirsAsPowered(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_SourceBlock); /** Queues a repeater to be powered or unpowered */ @@ -159,15 +161,14 @@ private: /** Returns if a piston is powered */ bool IsPistonPowered(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta); /** Returns if a wire is powered - The only diffence between this and a normal AreCoordsPowered is that this function checks for a wire powering another wire - */ - bool IsWirePowered(int a_BlockX, int a_BlockY, int a_BlockZ); + The only diffence between this and a normal AreCoordsPowered is that this function checks for a wire powering another wire */ + bool IsWirePowered(int a_BlockX, int a_BlockY, int a_BlockZ, unsigned char & a_PowerLevel); /** Returns if lever metadata marks it as emitting power */ - bool IsLeverOn(NIBBLETYPE a_BlockMeta); + inline bool IsLeverOn(NIBBLETYPE a_BlockMeta); /** Returns if button metadata marks it as emitting power */ - bool IsButtonOn(NIBBLETYPE a_BlockMeta); + inline bool IsButtonOn(NIBBLETYPE a_BlockMeta) { return IsLeverOn(a_BlockMeta); } /* ============================== */ /* ====== Misc Functions ====== */ diff --git a/src/Vector3.h b/src/Vector3.h index a00e14508..2c79f9ff1 100644 --- a/src/Vector3.h +++ b/src/Vector3.h @@ -108,6 +108,11 @@ public: return x == a_Rhs.x && y == a_Rhs.y && z == a_Rhs.z; } + inline bool operator == (const Vector3 & a_Rhs) const + { + return Equals(a_Rhs); + } + inline bool operator < (const Vector3 & a_Rhs) { // return (x < a_Rhs.x) && (y < a_Rhs.y) && (z < a_Rhs.z); ? diff --git a/src/World.cpp b/src/World.cpp index 1ba849806..c23e255f8 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -574,7 +574,7 @@ void cWorld::Start(void) m_IsSugarcaneBonemealable = IniFile.GetValueSetB("Plants", "IsSugarcaneBonemealable", false); m_IsDeepSnowEnabled = IniFile.GetValueSetB("Physics", "DeepSnow", true); m_ShouldLavaSpawnFire = IniFile.GetValueSetB("Physics", "ShouldLavaSpawnFire", true); - int TNTShrapnelLevel = IniFile.GetValueSetI("Physics", "TNTShrapnelLevel", (int)slNone); + int TNTShrapnelLevel = IniFile.GetValueSetI("Physics", "TNTShrapnelLevel", (int)slAll); m_bCommandBlocksEnabled = IniFile.GetValueSetB("Mechanics", "CommandBlocksEnabled", false); m_bEnabledPVP = IniFile.GetValueSetB("Mechanics", "PVPEnabled", true); m_bUseChatPrefixes = IniFile.GetValueSetB("Mechanics", "UseChatPrefixes", true); diff --git a/src/WorldStorage/FireworksSerializer.cpp b/src/WorldStorage/FireworksSerializer.cpp index 744fc731f..e0cd69634 100644 --- a/src/WorldStorage/FireworksSerializer.cpp +++ b/src/WorldStorage/FireworksSerializer.cpp @@ -231,7 +231,7 @@ void cFireworkItem::FadeColoursFromString(const AString & a_String, cFireworkIte -int cFireworkItem::GetVanillaColourCodeFromDye(short a_DyeMeta) +int cFireworkItem::GetVanillaColourCodeFromDye(NIBBLETYPE a_DyeMeta) { /* Colours are supposed to be calculated via: R << 16 + G << 8 + B diff --git a/src/WorldStorage/FireworksSerializer.h b/src/WorldStorage/FireworksSerializer.h index cbc544a14..59f1b09b0 100644 --- a/src/WorldStorage/FireworksSerializer.h +++ b/src/WorldStorage/FireworksSerializer.h @@ -81,7 +81,7 @@ public: static void FadeColoursFromString(const AString & a_String, cFireworkItem & a_FireworkItem); /** Returns a colour code for fireworks used by the network code */ - static int GetVanillaColourCodeFromDye(short a_DyeMeta); + static int GetVanillaColourCodeFromDye(NIBBLETYPE a_DyeMeta); bool m_HasFlicker; bool m_HasTrail; From 8df922e3e0f94dca067926db3cb1229956df96db Mon Sep 17 00:00:00 2001 From: Howaner Date: Mon, 14 Apr 2014 23:10:13 +0200 Subject: [PATCH 104/188] Add linux compatibility --- src/ClientHandle.cpp | 132 +++++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 61 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 9605aa004..bcec20973 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -3181,136 +3181,146 @@ cEnchantmentsVector cClientHandle::AddEnchantmentWeight(cEnchantmentsVector a_Ma cEnchantmentsVector cClientHandle::CheckEnchantmentConflicts(cEnchantmentsVector a_Map, cEnchantments a_FirstEnchantment) { - int FirstEnchantmentID = std::stoi(StringSplit(a_FirstEnchantment.ToString(), "=")[0]); + int FirstEnchantmentID = atoi(StringSplit(a_FirstEnchantment.ToString(), "=")[0].c_str()); if (FirstEnchantmentID == cEnchantments::enchProtection) { - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchFireProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); + + if (EnchantmentID == cEnchantments::enchFireProtection) + { + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + break; + } + } + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + { + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchBlastProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchProjectileProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchFireProtection) { - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchBlastProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchProjectileProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchBlastProtection) { - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchFireProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchProjectileProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchProjectileProtection) { - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchFireProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchBlastProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } @@ -3318,95 +3328,95 @@ cEnchantmentsVector cClientHandle::CheckEnchantmentConflicts(cEnchantmentsVector else if (FirstEnchantmentID == cEnchantments::enchSharpness) { - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchSmite) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchBaneOfArthropods) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchSmite) { - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchSharpness) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchBaneOfArthropods) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchBaneOfArthropods) { - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchSharpness) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchSmite) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchSilkTouch) { - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchFortune) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchFortune) { - for (cEnchantments enchantment : a_Map) + for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) { - int EnchantmentID = std::stoi(StringSplit(enchantment.ToString(), "=")[0]); + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchSilkTouch) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), enchantment), a_Map.end()); + a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); break; } } From fb3c755c0a6d1ccaae8e990375229afee4827e0c Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Tue, 15 Apr 2014 20:55:37 +0200 Subject: [PATCH 105/188] Modified names --- src/ClientHandle.cpp | 94 ++++++++++++++++++++++---------------------- src/ClientHandle.h | 4 +- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index bcec20973..ee94cd08d 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -3165,162 +3165,162 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) -cEnchantmentsVector cClientHandle::AddEnchantmentWeight(cEnchantmentsVector a_Map, int a_Weight, cEnchantments a_Enchantment) +cEnchantmentsVector cClientHandle::AddEnchantmentWeight(cEnchantmentsVector a_Enchantments, int a_Weight, cEnchantments a_Enchantment) { for (int i = 0; i < a_Weight; i++) { - a_Map.push_back(a_Enchantment); + a_Enchantments.push_back(a_Enchantment); } - return a_Map; + return a_Enchantments; } -cEnchantmentsVector cClientHandle::CheckEnchantmentConflicts(cEnchantmentsVector a_Map, cEnchantments a_FirstEnchantment) +cEnchantmentsVector cClientHandle::CheckEnchantmentConflicts(cEnchantmentsVector a_Enchantments, cEnchantments a_FirstEnchantment) { int FirstEnchantmentID = atoi(StringSplit(a_FirstEnchantment.ToString(), "=")[0].c_str()); if (FirstEnchantmentID == cEnchantments::enchProtection) { - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchFireProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchFireProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchBlastProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchProjectileProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchFireProtection) { - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchBlastProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchProjectileProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchBlastProtection) { - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchFireProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchProjectileProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchProjectileProtection) { - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchFireProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchBlastProtection) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } @@ -3328,101 +3328,101 @@ cEnchantmentsVector cClientHandle::CheckEnchantmentConflicts(cEnchantmentsVector else if (FirstEnchantmentID == cEnchantments::enchSharpness) { - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchSmite) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchBaneOfArthropods) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchSmite) { - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchSharpness) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchBaneOfArthropods) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchBaneOfArthropods) { - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchSharpness) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchSmite) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchSilkTouch) { - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchFortune) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } } else if (FirstEnchantmentID == cEnchantments::enchFortune) { - for (cEnchantmentsVector::iterator it = a_Map.begin(); it != a_Map.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == cEnchantments::enchSilkTouch) { - a_Map.erase(std::remove(a_Map.begin(), a_Map.end(), *it), a_Map.end()); + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); break; } } } - return a_Map; + return a_Enchantments; } diff --git a/src/ClientHandle.h b/src/ClientHandle.h index b4b1d0da3..b9e470653 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -234,8 +234,8 @@ public: /** Called when the player will enchant a Item */ void HandleEnchantItem(Byte & WindowID, Byte & Enchantment); - cEnchantmentsVector AddEnchantmentWeight(cEnchantmentsVector a_Map, int a_Weight, cEnchantments a_Enchantment); - cEnchantmentsVector CheckEnchantmentConflicts(cEnchantmentsVector a_Map, cEnchantments a_FirstEnchantment); + cEnchantmentsVector AddEnchantmentWeight(cEnchantmentsVector a_Enchantments, int a_Weight, cEnchantments a_Enchantment); + cEnchantmentsVector CheckEnchantmentConflicts(cEnchantmentsVector a_Enchantments, cEnchantments a_FirstEnchantment); private: From e81fc2779e4b9a8ce847d63864537259033c9cb9 Mon Sep 17 00:00:00 2001 From: Howaner Date: Tue, 15 Apr 2014 21:10:44 +0200 Subject: [PATCH 106/188] Add more checks to cSlotAreaEnchanting --- src/UI/SlotArea.cpp | 298 ++++++++++++++++++++++++++++++-------------- src/UI/SlotArea.h | 23 ++-- src/UI/Window.cpp | 2 +- 3 files changed, 218 insertions(+), 105 deletions(-) diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 9ea2e0021..46ed493d8 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -135,12 +135,6 @@ void cSlotArea::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickA cItem tmp(DraggingItem); DraggingItem = Slot; Slot = tmp; - int ItemPlaceCount = GetItemPlaceCount(Slot); - if (Slot.m_ItemCount > ItemPlaceCount) - { - DraggingItem.m_ItemCount += Slot.m_ItemCount - ItemPlaceCount; - Slot.m_ItemCount = ItemPlaceCount; - } } else { @@ -154,12 +148,6 @@ void cSlotArea::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickA } int Filling = (FreeSlots > DraggingItem.m_ItemCount) ? DraggingItem.m_ItemCount : FreeSlots; - int ItemPlaceCount = GetItemPlaceCount(DraggingItem); - if (Filling > ItemPlaceCount) - { - Filling = ItemPlaceCount; - } - Slot.m_ItemCount += (char)Filling; DraggingItem.m_ItemCount -= (char)Filling; if (DraggingItem.m_ItemCount <= 0) @@ -182,7 +170,6 @@ void cSlotArea::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickA { m_ParentWindow.BroadcastWholeWindow(); } - } @@ -328,16 +315,6 @@ bool cSlotArea::CollectItemsToHand(cItem & a_Dragging, cPlayer & a_Player, bool -int cSlotArea::GetItemPlaceCount(cItem & a_Item) -{ - cItemHandler * Handler = ItemHandler(a_Item.m_ItemType); - return Handler->GetMaxStackSize(); -} - - - - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cSlotAreaChest: @@ -620,11 +597,182 @@ cCraftingRecipe & cSlotAreaCrafting::GetRecipeForPlayer(cPlayer & a_Player) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cSlotAreaEnchanting: -cSlotAreaEnchanting::cSlotAreaEnchanting(int a_NumSlots, cWindow & a_ParentWindow) : -cSlotAreaTemporary(a_NumSlots, a_ParentWindow) +cSlotAreaEnchanting::cSlotAreaEnchanting(cEnchantingWindow & a_ParentWindow) : + cSlotAreaTemporary(1, a_ParentWindow) { - cEnchantingWindow * Window = (cEnchantingWindow *)&m_ParentWindow; - Window->m_SlotArea = this; + a_ParentWindow.m_SlotArea = this; +} + + + + + +void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) +{ + ASSERT((a_SlotNum >= 0) && (a_SlotNum < GetNumSlots())); + + bool bAsync = false; + if (GetSlot(a_SlotNum, a_Player) == NULL) + { + LOGWARNING("GetSlot(%d) returned NULL! Ignoring click", a_SlotNum); + return; + } + + switch (a_ClickAction) + { + case caShiftLeftClick: + case caShiftRightClick: + { + ShiftClicked(a_Player, a_SlotNum, a_ClickedItem); + return; + } + + case caDblClick: + { + DblClicked(a_Player, a_SlotNum); + return; + } + default: + { + break; + } + } + + cItem Slot(*GetSlot(a_SlotNum, a_Player)); + if (!Slot.IsSameType(a_ClickedItem)) + { + LOGWARNING("*** Window lost sync at item %d in SlotArea with %d items ***", a_SlotNum, m_NumSlots); + LOGWARNING("My item: %s", ItemToFullString(Slot).c_str()); + LOGWARNING("Their item: %s", ItemToFullString(a_ClickedItem).c_str()); + bAsync = true; + } + cItem & DraggingItem = a_Player.GetDraggingItem(); + switch (a_ClickAction) + { + case caRightClick: + { + // 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; + } + + case caLeftClick: + { + // 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; + } + default: + { + LOGWARNING("SlotArea: Unhandled click action: %d (%s)", a_ClickAction, ClickActionToString(a_ClickAction)); + m_ParentWindow.BroadcastWholeWindow(); + return; + } + } // switch (a_ClickAction + + 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); + } +} + + + + + +void cSlotAreaEnchanting::DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_Apply, bool a_KeepEmptySlots) +{ + const cItem * Slot = GetSlot(0, a_Player); + if (!Slot->IsEmpty()) + { + return; + } + + if (a_Apply) + { + SetSlot(0, a_Player, a_ItemStack.CopyOne()); + } + a_ItemStack.m_ItemCount -= 1; + if (a_ItemStack.m_ItemCount <= 0) + { + a_ItemStack.Empty(); + } + + UpdateResult(a_Player); } @@ -642,29 +790,7 @@ void cSlotAreaEnchanting::OnPlayerRemoved(cPlayer & a_Player) -void cSlotAreaEnchanting::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) -{ - super::Clicked(a_Player, a_SlotNum, a_ClickAction, a_ClickedItem); - - // Check if Slot is in the Enchantment Table - if (a_SlotNum == 0) - { - if ((a_ClickAction == caShiftLeftClick) || (a_ClickAction == caShiftRightClick)) - { - ShiftClickedSlot(a_Player); - } - else - { - ClickedSlot(a_Player); - } - } -} - - - - - -void cSlotAreaEnchanting::ClickedSlot(cPlayer & a_Player) +void cSlotAreaEnchanting::UpdateResult(cPlayer & a_Player) { cItem Item = *GetSlot(0, a_Player); @@ -676,43 +802,13 @@ void cSlotAreaEnchanting::ClickedSlot(cPlayer & a_Player) } else if (cItem::IsEnchantable(Item.m_ItemType) && Item.m_Enchantments.IsEmpty()) { - int PosX = 0; - int PosY = 0; - int PosZ = 0; - cEnchantingWindow * Window = (cEnchantingWindow*)&m_ParentWindow; - Window->GetBlockPos(PosX, PosY, PosZ); - - int bookshelves = 0; - cBlockArea Area; - Area.Read(a_Player.GetWorld(), PosX - 2, PosX + 2, PosY, PosY + 1, PosZ - 2, PosZ + 2); - - for (int y = 0; y <= 2; y++) - { - for (int x = 0; x <= 4; x++) - { - for (int z = 0; z <= 4; z++) - { - if ((((x == 0) || (x == 4)) || ((z == 0) || (z == 4))) && ((y == 0) || y == 1)) - { - if (Area.GetRelBlockType(x, y, z) == E_BLOCK_BOOKCASE) - { - bookshelves++; - } - } - } - } - } - - if (bookshelves > 15) - { - bookshelves = 15; - } + int Bookshelves = GetBookshelvesCount(a_Player.GetWorld()); cFastRandom Random; - int base = (Random.GenerateRandomInteger(1, 8) + floor(bookshelves / 2) + Random.GenerateRandomInteger(0, bookshelves)); + int base = (Random.GenerateRandomInteger(1, 8) + floor(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 bottomSlot = std::max(base, Bookshelves * 2); m_ParentWindow.SetProperty(0, topSlot, a_Player); m_ParentWindow.SetProperty(1, middleSlot, a_Player); @@ -730,20 +826,34 @@ void cSlotAreaEnchanting::ClickedSlot(cPlayer & a_Player) -void cSlotAreaEnchanting::ShiftClickedSlot(cPlayer & a_Player) +int cSlotAreaEnchanting::GetBookshelvesCount(cWorld * a_World) { - m_ParentWindow.SetProperty(0, 0, a_Player); - m_ParentWindow.SetProperty(1, 0, a_Player); - m_ParentWindow.SetProperty(2, 0, a_Player); -} + 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); - - - -int cSlotAreaEnchanting::GetItemPlaceCount(cItem & a_Item) -{ - return 1; + for (int y = 0; y <= 2; y++) + { + for (int x = 0; x <= 4; x++) + { + for (int z = 0; z <= 4; z++) + { + if ((((x == 0) || (x == 4)) || ((z == 0) || (z == 4))) && ((y == 0) || y == 1)) + { + if (Area.GetRelBlockType(x, y, z) == E_BLOCK_BOOKCASE) + { + Bookshelves++; + } + } + } + } + } + + Bookshelves = std::min(Bookshelves, 15); + return Bookshelves; } diff --git a/src/UI/SlotArea.h b/src/UI/SlotArea.h index 431ad753c..bab1098bb 100644 --- a/src/UI/SlotArea.h +++ b/src/UI/SlotArea.h @@ -19,6 +19,8 @@ class cDropSpenserEntity; class cEnderChestEntity; class cFurnaceEntity; class cCraftingRecipe; +class cEnchantingWindow; +class cWorld; @@ -67,8 +69,6 @@ public: /// Returns true if full stack has been collected in a_Dragging, false if there's space remaining to fill. virtual bool CollectItemsToHand(cItem & a_Dragging, cPlayer & a_Player, bool a_CollectFullStacks); - virtual int GetItemPlaceCount(cItem & a_Item); - protected: int m_NumSlots; cWindow & m_ParentWindow; @@ -260,19 +260,22 @@ class cSlotAreaEnchanting : typedef cSlotAreaTemporary super; public: - cSlotAreaEnchanting(int a_NumSlots, cWindow & a_ParentWindow); + cSlotAreaEnchanting(cEnchantingWindow & a_ParentWindow); + + // 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; // cSlotAreaTemporary overrides: - virtual void Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override; virtual void OnPlayerRemoved(cPlayer & a_Player) override; - virtual int GetItemPlaceCount(cItem & a_Item) override; + + /* Get the count of bookshelves who stand in the near of the enchanting table */ + int GetBookshelvesCount(cWorld * a_World); protected: - /// Handles a click in the item slot. - void ClickedSlot(cPlayer & a_Player); - - /// Handles a shift-click in the item slot. - void ShiftClickedSlot(cPlayer & a_Player); + /** Handles a click in the item slot. */ + void UpdateResult(cPlayer & a_Player); }; diff --git a/src/UI/Window.cpp b/src/UI/Window.cpp index c514e76e7..c7b9b6aaf 100644 --- a/src/UI/Window.cpp +++ b/src/UI/Window.cpp @@ -813,7 +813,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(1, *this)); + m_SlotAreas.push_back(new cSlotAreaEnchanting(*this)); m_SlotAreas.push_back(new cSlotAreaInventory(*this)); m_SlotAreas.push_back(new cSlotAreaHotBar(*this)); } From 36f747d6746b32c4352354933b25ae7ead6f1b7f Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Tue, 15 Apr 2014 21:43:52 +0200 Subject: [PATCH 107/188] Added Book Enchanting --- src/ClientHandle.cpp | 311 ++++++++++++++++++++++++++++++++++++++++++- src/UI/SlotArea.cpp | 2 +- 2 files changed, 311 insertions(+), 2 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index ee94cd08d..905be5438 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2692,7 +2692,7 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) cEnchantingWindow * Window = (cEnchantingWindow*)m_Player->GetWindow(); cItem Item = *Window->m_SlotArea->GetSlot(0, *m_Player); - if (!cItem::IsEnchantable(Item.m_ItemType)) + if (!cItem::IsEnchantable(Item.m_ItemType) && Item.m_ItemType != E_ITEM_BOOK) { return; } @@ -3076,6 +3076,315 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) } } + else if (Item.m_ItemType == E_ITEM_BOOK) + { + // All enchantments + + // Sharpness + if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=4")); + } + else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=3")); + } + else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=1")); + } + + // Smite + if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=1")); + } + + // Bane of Arthropods + if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=1")); + } + + // Knockback + if (FinalEnchantmentLevel >= 25 && FinalEnchantmentLevel <= 75) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=1")); + } + + // Fire Aspect + if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=1")); + } + + // Looting + if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=3")); + } + else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=2")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=1")); + } + + // Efficiency + if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 81) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=3")); + } + else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 61) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 51) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=1")); + } + + // Silk Touch + if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("SilkTouch=1")); + } + + // Fortune + if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=3")); + } + else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=2")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=1")); + } + + // Protection + if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=4")); + } + else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=3")); + } + else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=1")); + } + + // Fire Protection + if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 46) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=4")); + } + else if (FinalEnchantmentLevel >= 26 && FinalEnchantmentLevel <= 38) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=3")); + } + else if (FinalEnchantmentLevel >= 18 && FinalEnchantmentLevel <= 30) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 22) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=1")); + } + + // Blast Protection + if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 41) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 33) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 25) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 17) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=1")); + } + + // Projectile Protection + if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=4")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 30) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=3")); + } + else if (FinalEnchantmentLevel >= 9 && FinalEnchantmentLevel <= 24) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=2")); + } + else if (FinalEnchantmentLevel >= 3 && FinalEnchantmentLevel <= 18) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=1")); + } + + // Thorns + if (FinalEnchantmentLevel >= 50 && FinalEnchantmentLevel <= 100) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=3")); + } + else if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=1")); + } + + // Respiration + if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 60) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=3")); + } + else if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 40) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=1")); + } + + // Aqua Affinity + if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 41) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("AquaAffinity=1")); + } + + // Feather Fall + if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 33) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=4")); + } + else if (FinalEnchantmentLevel >= 17 && FinalEnchantmentLevel <= 27) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=3")); + } + else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 21) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 15) + { + enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=1")); + } + + // Power + if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 46) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=3")); + } + else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 26) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 16) + { + enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=1")); + } + + // Punch + if (FinalEnchantmentLevel >= 32 && FinalEnchantmentLevel <= 57) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=2")); + } + else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 37) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=1")); + } + + // Flame and Infinity + if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) + { + enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Flame=1")); + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Infinity=1")); + } + + // Luck of the Sea and Lure + if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=3")); + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=3")); + } + else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=2")); + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=2")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=1")); + enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=1")); + } + + Item.m_ItemType = E_ITEM_ENCHANTED_BOOK; + } + // Unbreaking if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) { diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 46ed493d8..d8d02f458 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -800,7 +800,7 @@ void cSlotAreaEnchanting::UpdateResult(cPlayer & 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_Enchantments.IsEmpty()) + else if (cItem::IsEnchantable(Item.m_ItemType) || Item.m_ItemType == E_ITEM_BOOK && Item.m_Enchantments.IsEmpty()) { int Bookshelves = GetBookshelvesCount(a_Player.GetWorld()); From 2cb8538e2e60309bc9d1f13dc90dd5cbface8967 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Tue, 15 Apr 2014 22:03:15 +0200 Subject: [PATCH 108/188] Code Optimization --- src/ClientHandle.cpp | 540 +++++++++++++++---------------------------- src/ClientHandle.h | 5 +- 2 files changed, 185 insertions(+), 360 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 905be5438..406ca6e19 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2757,89 +2757,89 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) // Sharpness if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=4")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=4")); } else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=3")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=3")); } else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=2")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=2")); } else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=1")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=1")); } // Smite if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=4")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=4")); } else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=3")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=3")); } else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=2")); } else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=1")); } // Bane of Arthropods if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=4")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=4")); } else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=3")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=3")); } else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=2")); } else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=1")); } // Knockback if (FinalEnchantmentLevel >= 25 && FinalEnchantmentLevel <= 75) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=2")); } else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=1")); } // Fire Aspect if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=2")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=2")); } else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=1")); } // Looting if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=3")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=3")); } else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=2")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=2")); } else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=1")); } } @@ -2848,39 +2848,39 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) // Efficiency if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 81) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=4")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=4")); } else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=3")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=3")); } else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 61) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=2")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=2")); } else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 51) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=1")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=1")); } // Silk Touch if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("SilkTouch=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("SilkTouch=1")); } // Fortune if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=3")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=3")); } else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=2")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=2")); } else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=1")); } } @@ -2889,87 +2889,87 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) // Protection if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=4")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=4")); } else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=3")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=3")); } else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=2")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=2")); } else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=1")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=1")); } // Fire Protection if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 46) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=4")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=4")); } else if (FinalEnchantmentLevel >= 26 && FinalEnchantmentLevel <= 38) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=3")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=3")); } else if (FinalEnchantmentLevel >= 18 && FinalEnchantmentLevel <= 30) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=2")); } else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 22) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=1")); } // Blast Protection if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 41) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=4")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=4")); } else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 33) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=3")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=3")); } else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 25) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=2")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=2")); } else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 17) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=1")); } // Projectile Protection if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=4")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=4")); } else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 30) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=3")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=3")); } else if (FinalEnchantmentLevel >= 9 && FinalEnchantmentLevel <= 24) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=2")); } else if (FinalEnchantmentLevel >= 3 && FinalEnchantmentLevel <= 18) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=1")); } // Thorns if (FinalEnchantmentLevel >= 50 && FinalEnchantmentLevel <= 100) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=3")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=3")); } else if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=2")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=2")); } else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=1")); } @@ -2978,21 +2978,21 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) // Respiration if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 60) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=3")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=3")); } else if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=2")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=2")); } else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 40) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=1")); } // Aqua Affinity if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 41) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("AquaAffinity=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("AquaAffinity=1")); } } @@ -3001,19 +3001,19 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) // Feather Fall if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 33) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=4")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=4")); } else if (FinalEnchantmentLevel >= 17 && FinalEnchantmentLevel <= 27) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=3")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=3")); } else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 21) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=2")); } else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 15) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=1")); } } } @@ -3023,36 +3023,36 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) // Power if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 46) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=4")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=4")); } else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=3")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=3")); } else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 26) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=2")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=2")); } else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 16) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=1")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=1")); } // Punch if (FinalEnchantmentLevel >= 32 && FinalEnchantmentLevel <= 57) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=2")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=2")); } else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 37) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=1")); } // Flame and Infinity if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Flame=1")); - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Infinity=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Flame=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Infinity=1")); } } @@ -3061,18 +3061,18 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) // Luck of the Sea and Lure if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=3")); - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=3")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=3")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=3")); } else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=2")); - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=2")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=2")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=2")); } else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=1")); - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=1")); } } @@ -3083,303 +3083,303 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) // Sharpness if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=4")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=4")); } else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=3")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=3")); } else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=2")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=2")); } else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=1")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=1")); } // Smite if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=4")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=4")); } else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=3")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=3")); } else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=2")); } else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=1")); } // Bane of Arthropods if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=4")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=4")); } else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=3")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=3")); } else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=2")); } else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=1")); } // Knockback if (FinalEnchantmentLevel >= 25 && FinalEnchantmentLevel <= 75) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=2")); } else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=1")); } // Fire Aspect if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=2")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=2")); } else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=1")); } // Looting if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=3")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=3")); } else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=2")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=2")); } else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=1")); } // Efficiency if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 81) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=4")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=4")); } else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=3")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=3")); } else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 61) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=2")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=2")); } else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 51) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=1")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=1")); } // Silk Touch if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("SilkTouch=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("SilkTouch=1")); } // Fortune if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=3")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=3")); } else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=2")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=2")); } else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=1")); } // Protection if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=4")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=4")); } else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=3")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=3")); } else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=2")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=2")); } else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=1")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=1")); } // Fire Protection if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 46) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=4")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=4")); } else if (FinalEnchantmentLevel >= 26 && FinalEnchantmentLevel <= 38) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=3")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=3")); } else if (FinalEnchantmentLevel >= 18 && FinalEnchantmentLevel <= 30) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=2")); } else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 22) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=1")); } // Blast Protection if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 41) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=4")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=4")); } else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 33) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=3")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=3")); } else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 25) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=2")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=2")); } else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 17) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=1")); } // Projectile Protection if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=4")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=4")); } else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 30) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=3")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=3")); } else if (FinalEnchantmentLevel >= 9 && FinalEnchantmentLevel <= 24) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=2")); } else if (FinalEnchantmentLevel >= 3 && FinalEnchantmentLevel <= 18) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=1")); } // Thorns if (FinalEnchantmentLevel >= 50 && FinalEnchantmentLevel <= 100) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=3")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=3")); } else if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=2")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=2")); } else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=1")); } // Respiration if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 60) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=3")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=3")); } else if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=2")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=2")); } else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 40) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=1")); } // Aqua Affinity if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 41) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("AquaAffinity=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("AquaAffinity=1")); } // Feather Fall if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 33) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=4")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=4")); } else if (FinalEnchantmentLevel >= 17 && FinalEnchantmentLevel <= 27) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=3")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=3")); } else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 21) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=2")); } else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 15) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=1")); } // Power if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 46) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=4")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=4")); } else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=3")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=3")); } else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 26) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=2")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=2")); } else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 16) { - enchantments = AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=1")); + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=1")); } // Punch if (FinalEnchantmentLevel >= 32 && FinalEnchantmentLevel <= 57) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=2")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=2")); } else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 37) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=1")); } // Flame and Infinity if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) { - enchantments = AddEnchantmentWeight(enchantments, 2, cEnchantments("Flame=1")); - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Infinity=1")); + AddEnchantmentWeight(enchantments, 2, cEnchantments("Flame=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Infinity=1")); } // Luck of the Sea and Lure if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=3")); - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=3")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=3")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=3")); } else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=2")); - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=2")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=2")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=2")); } else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) { - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=1")); - enchantments = AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=1")); } Item.m_ItemType = E_ITEM_ENCHANTED_BOOK; @@ -3388,15 +3388,15 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) // Unbreaking if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=3")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=3")); } else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 63) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=2")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=2")); } else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) { - enchantments = AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=1")); + AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=1")); } int RandomEnchantment1 = (int) floor(Random.NextFloat(1) * enchantments.size()); @@ -3412,7 +3412,7 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) if (Random.NextFloat(100) <= SecondEnchantmentChance) { // Checking for conflicting enchantments - enchantments = CheckEnchantmentConflicts(enchantments, Enchantment1); + CheckEnchantmentConflicts(enchantments, Enchantment1); if (enchantments.size() > 0) { @@ -3423,7 +3423,7 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment2), enchantments.end()); // Checking for conflicting enchantments - enchantments = CheckEnchantmentConflicts(enchantments, Enchantment2); + CheckEnchantmentConflicts(enchantments, Enchantment2); } } @@ -3440,7 +3440,7 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment3), enchantments.end()); // Checking for conflicting enchantments - enchantments = CheckEnchantmentConflicts(enchantments, Enchantment3); + CheckEnchantmentConflicts(enchantments, Enchantment3); } } @@ -3474,264 +3474,88 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) -cEnchantmentsVector cClientHandle::AddEnchantmentWeight(cEnchantmentsVector a_Enchantments, int a_Weight, cEnchantments a_Enchantment) +void cClientHandle::AddEnchantmentWeight(cEnchantmentsVector & a_Enchantments, int a_Weight, cEnchantments a_Enchantment) { for (int i = 0; i < a_Weight; i++) { a_Enchantments.push_back(a_Enchantment); } - - return a_Enchantments; } -cEnchantmentsVector cClientHandle::CheckEnchantmentConflicts(cEnchantmentsVector a_Enchantments, cEnchantments a_FirstEnchantment) +void cClientHandle::RemoveEnchantmentFromVector(cEnchantmentsVector & a_Enchantments, int a_EnchantmentID) +{ + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) + { + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); + + if (EnchantmentID == a_EnchantmentID) + { + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); + break; + } + } +} + + + + + +void cClientHandle::CheckEnchantmentConflicts(cEnchantmentsVector & a_Enchantments, cEnchantments a_FirstEnchantment) { int FirstEnchantmentID = atoi(StringSplit(a_FirstEnchantment.ToString(), "=")[0].c_str()); if (FirstEnchantmentID == cEnchantments::enchProtection) { - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchFireProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchFireProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchBlastProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchProjectileProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBlastProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); } else if (FirstEnchantmentID == cEnchantments::enchFireProtection) { - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchBlastProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchProjectileProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBlastProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); } else if (FirstEnchantmentID == cEnchantments::enchBlastProtection) { - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchFireProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchProjectileProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); } else if (FirstEnchantmentID == cEnchantments::enchProjectileProtection) { - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchFireProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchBlastProtection) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBlastProtection); } else if (FirstEnchantmentID == cEnchantments::enchSharpness) { - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchSmite) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchBaneOfArthropods) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSmite); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBaneOfArthropods); } else if (FirstEnchantmentID == cEnchantments::enchSmite) { - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchSharpness) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchBaneOfArthropods) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSharpness); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBaneOfArthropods); } else if (FirstEnchantmentID == cEnchantments::enchBaneOfArthropods) { - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchSharpness) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchSmite) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSharpness); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSmite); } else if (FirstEnchantmentID == cEnchantments::enchSilkTouch) { - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchFortune) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFortune); } else if (FirstEnchantmentID == cEnchantments::enchFortune) { - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == cEnchantments::enchSilkTouch) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSilkTouch); } - - return a_Enchantments; } diff --git a/src/ClientHandle.h b/src/ClientHandle.h index b9e470653..f6d0af3b4 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -234,8 +234,9 @@ public: /** Called when the player will enchant a Item */ void HandleEnchantItem(Byte & WindowID, Byte & Enchantment); - cEnchantmentsVector AddEnchantmentWeight(cEnchantmentsVector a_Enchantments, int a_Weight, cEnchantments a_Enchantment); - cEnchantmentsVector CheckEnchantmentConflicts(cEnchantmentsVector a_Enchantments, cEnchantments a_FirstEnchantment); + void AddEnchantmentWeight(cEnchantmentsVector & a_Enchantments, int a_Weight, cEnchantments a_Enchantment); + void RemoveEnchantmentFromVector(cEnchantmentsVector & a_Enchantments, int a_EnchantmentID); + void CheckEnchantmentConflicts(cEnchantmentsVector & a_Enchantments, cEnchantments a_FirstEnchantment); private: From 99e4225269776d4e79b7d0d14dc8bbe11a2ad32d Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Tue, 15 Apr 2014 23:40:06 +0200 Subject: [PATCH 109/188] Attempted fix for the client crash with the new protocols. --- src/ClientHandle.cpp | 15 +++++++++------ src/Protocol/Protocol17x.cpp | 7 +++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 79738ff0b..9ab32d6ec 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1718,13 +1718,16 @@ void cClientHandle::Tick(float a_Dt) } // Send a ping packet: - cTimer t1; - if ((m_LastPingTime + cClientHandle::PING_TIME_MS <= t1.GetNowTime())) + if (m_State == csPlaying) { - m_PingID++; - m_PingStartTime = t1.GetNowTime(); - m_Protocol->SendKeepAlive(m_PingID); - m_LastPingTime = m_PingStartTime; + cTimer t1; + if ((m_LastPingTime + cClientHandle::PING_TIME_MS <= t1.GetNowTime())) + { + m_PingID++; + m_PingStartTime = t1.GetNowTime(); + m_Protocol->SendKeepAlive(m_PingID); + m_LastPingTime = m_PingStartTime; + } } // Handle block break animation: diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index c8105c03a..aae87f994 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -538,6 +538,13 @@ void cProtocol172::SendInventorySlot(char a_WindowID, short a_SlotNum, const cIt void cProtocol172::SendKeepAlive(int a_PingID) { + // Drop the packet if the protocol is not in the Game state yet (caused a client crash): + if (m_State != 3) + { + LOGWARNING("Trying to send a KeepAlive packet to a player who's not yet fully logged in (%d). The protocol class prevented the packet.", m_State); + return; + } + cPacketizer Pkt(*this, 0x00); // Keep Alive packet Pkt.WriteInt(a_PingID); } From 8c33b3c4155b030e2174a453ca067be969473736 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Wed, 16 Apr 2014 13:31:37 +0200 Subject: [PATCH 110/188] Fixed double enchanting items --- src/UI/SlotArea.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index d8d02f458..621854518 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -794,13 +794,13 @@ void cSlotAreaEnchanting::UpdateResult(cPlayer & a_Player) { cItem Item = *GetSlot(0, a_Player); - if (Item.IsEmpty()) + 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 && Item.m_Enchantments.IsEmpty()) + else if (cItem::IsEnchantable(Item.m_ItemType) || Item.m_ItemType == E_ITEM_BOOK) { int Bookshelves = GetBookshelvesCount(a_Player.GetWorld()); From 8d67562238b1772b763766b85779c1afd211d3f5 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Wed, 16 Apr 2014 14:30:55 +0200 Subject: [PATCH 111/188] Fixed merge conflict --- src/ClientHandle.cpp | 877 ------------------------------------------- 1 file changed, 877 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 406ca6e19..5876e55c7 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -31,8 +31,6 @@ #include "CompositeChat.h" #include "Items/ItemSword.h" -#include "FastRandom.h" - /** Maximum number of explosions to send this tick, server will start dropping if exceeded */ @@ -2687,879 +2685,4 @@ void cClientHandle::SocketClosed(void) -void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) -{ - cEnchantingWindow * Window = (cEnchantingWindow*)m_Player->GetWindow(); - cItem Item = *Window->m_SlotArea->GetSlot(0, *m_Player); - - if (!cItem::IsEnchantable(Item.m_ItemType) && Item.m_ItemType != E_ITEM_BOOK) - { - return; - } - - int BaseEnchantmentLevel = Window->GetPropertyValue(Enchantment); - - // Step 1 from Enchanting - int Enchantability = 1; - - if (Item.m_ItemType == E_ITEM_WOODEN_SWORD || Item.m_ItemType == E_ITEM_WOODEN_PICKAXE || Item.m_ItemType == E_ITEM_WOODEN_SHOVEL || Item.m_ItemType == E_ITEM_WOODEN_AXE || Item.m_ItemType == E_ITEM_WOODEN_HOE) - { - Enchantability = 15; - } - else if (Item.m_ItemType == E_ITEM_LEATHER_CAP || Item.m_ItemType == E_ITEM_LEATHER_TUNIC || Item.m_ItemType == E_ITEM_LEATHER_PANTS || Item.m_ItemType == E_ITEM_LEATHER_BOOTS) - { - Enchantability = 15; - } - else if (Item.m_ItemType == E_ITEM_STONE_SWORD || Item.m_ItemType == E_ITEM_STONE_PICKAXE || Item.m_ItemType == E_ITEM_STONE_SHOVEL || Item.m_ItemType == E_ITEM_STONE_AXE || Item.m_ItemType == E_ITEM_STONE_HOE) - { - Enchantability = 5; - } - else if (Item.m_ItemType == E_ITEM_IRON_HELMET || Item.m_ItemType == E_ITEM_IRON_CHESTPLATE || Item.m_ItemType == E_ITEM_IRON_LEGGINGS || Item.m_ItemType == E_ITEM_IRON_BOOTS) - { - Enchantability = 9; - } - else if (Item.m_ItemType == E_ITEM_IRON_SWORD || Item.m_ItemType == E_ITEM_IRON_PICKAXE || Item.m_ItemType == E_ITEM_IRON_SHOVEL || Item.m_ItemType == E_ITEM_IRON_AXE || Item.m_ItemType == E_ITEM_IRON_HOE) - { - Enchantability = 14; - } - else if (Item.m_ItemType == E_ITEM_CHAIN_HELMET || Item.m_ItemType == E_ITEM_CHAIN_CHESTPLATE || Item.m_ItemType == E_ITEM_CHAIN_LEGGINGS || Item.m_ItemType == E_ITEM_CHAIN_BOOTS) - { - Enchantability = 12; - } - else if (Item.m_ItemType == E_ITEM_DIAMOND_HELMET || Item.m_ItemType == E_ITEM_DIAMOND_CHESTPLATE || Item.m_ItemType == E_ITEM_DIAMOND_LEGGINGS || Item.m_ItemType == E_ITEM_DIAMOND_BOOTS) - { - Enchantability = 10; - } - else if (Item.m_ItemType == E_ITEM_DIAMOND_SWORD || Item.m_ItemType == E_ITEM_DIAMOND_PICKAXE || Item.m_ItemType == E_ITEM_DIAMOND_SHOVEL || Item.m_ItemType == E_ITEM_DIAMOND_AXE || Item.m_ItemType == E_ITEM_DIAMOND_HOE) - { - Enchantability = 10; - } - else if (Item.m_ItemType == E_ITEM_GOLD_HELMET || Item.m_ItemType == E_ITEM_GOLD_CHESTPLATE || Item.m_ItemType == E_ITEM_GOLD_LEGGINGS || Item.m_ItemType == E_ITEM_GOLD_BOOTS) - { - Enchantability = 25; - } - else if (Item.m_ItemType == E_ITEM_GOLD_SWORD || Item.m_ItemType == E_ITEM_GOLD_PICKAXE || Item.m_ItemType == E_ITEM_GOLD_SHOVEL || Item.m_ItemType == E_ITEM_GOLD_AXE || Item.m_ItemType == E_ITEM_GOLD_HOE) - { - Enchantability = 22; - } - - cFastRandom Random; - int ModifiedEnchantmentLevel = BaseEnchantmentLevel + (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); - - // Step 2 and 3 from Enchanting - cEnchantmentsVector enchantments; - - if (ItemCategory::IsSword(Item.m_ItemType)) - { - // Sharpness - if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=4")); - } - else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=3")); - } - else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=1")); - } - - // Smite - if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=1")); - } - - // Bane of Arthropods - if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=1")); - } - - // Knockback - if (FinalEnchantmentLevel >= 25 && FinalEnchantmentLevel <= 75) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=1")); - } - - // Fire Aspect - if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=1")); - } - - // Looting - if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=3")); - } - else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=2")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=1")); - } - } - - else if (ItemCategory::IsTool(Item.m_ItemType)) - { - // Efficiency - if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 81) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=3")); - } - else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 61) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 51) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=1")); - } - - // Silk Touch - if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("SilkTouch=1")); - } - - // Fortune - if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=3")); - } - else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=2")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=1")); - } - } - - else if (ItemCategory::IsArmor(Item.m_ItemType)) - { - // Protection - if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=4")); - } - else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=3")); - } - else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=1")); - } - - // Fire Protection - if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 46) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=4")); - } - else if (FinalEnchantmentLevel >= 26 && FinalEnchantmentLevel <= 38) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=3")); - } - else if (FinalEnchantmentLevel >= 18 && FinalEnchantmentLevel <= 30) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 22) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=1")); - } - - // Blast Protection - if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 25) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 17) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=1")); - } - - // Projectile Protection - if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=4")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 30) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=3")); - } - else if (FinalEnchantmentLevel >= 9 && FinalEnchantmentLevel <= 24) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=2")); - } - else if (FinalEnchantmentLevel >= 3 && FinalEnchantmentLevel <= 18) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=1")); - } - - // Thorns - if (FinalEnchantmentLevel >= 50 && FinalEnchantmentLevel <= 100) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=3")); - } - else if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=1")); - } - - - if (ItemCategory::IsHelmet(Item.m_ItemType)) - { - // Respiration - if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 60) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=3")); - } - else if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 40) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=1")); - } - - // Aqua Affinity - if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("AquaAffinity=1")); - } - } - - else if (ItemCategory::IsBoots(Item.m_ItemType)) - { - // Feather Fall - if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=4")); - } - else if (FinalEnchantmentLevel >= 17 && FinalEnchantmentLevel <= 27) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=3")); - } - else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 21) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 15) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=1")); - } - } - } - - else if (Item.m_ItemType == E_ITEM_BOW) - { - // Power - if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 46) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=3")); - } - else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 26) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 16) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=1")); - } - - // Punch - if (FinalEnchantmentLevel >= 32 && FinalEnchantmentLevel <= 57) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=2")); - } - else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 37) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=1")); - } - - // Flame and Infinity - if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Flame=1")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Infinity=1")); - } - } - - else if (Item.m_ItemType == E_ITEM_FISHING_ROD) - { - // Luck of the Sea and Lure - if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=3")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=3")); - } - else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=2")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=2")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=1")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=1")); - } - } - - else if (Item.m_ItemType == E_ITEM_BOOK) - { - // All enchantments - - // Sharpness - if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=4")); - } - else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=3")); - } - else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=1")); - } - - // Smite - if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=1")); - } - - // Bane of Arthropods - if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=1")); - } - - // Knockback - if (FinalEnchantmentLevel >= 25 && FinalEnchantmentLevel <= 75) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=1")); - } - - // Fire Aspect - if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=1")); - } - - // Looting - if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=3")); - } - else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=2")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=1")); - } - - // Efficiency - if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 81) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=3")); - } - else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 61) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 51) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=1")); - } - - // Silk Touch - if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("SilkTouch=1")); - } - - // Fortune - if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=3")); - } - else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=2")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=1")); - } - - // Protection - if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=4")); - } - else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=3")); - } - else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=1")); - } - - // Fire Protection - if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 46) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=4")); - } - else if (FinalEnchantmentLevel >= 26 && FinalEnchantmentLevel <= 38) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=3")); - } - else if (FinalEnchantmentLevel >= 18 && FinalEnchantmentLevel <= 30) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 22) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=1")); - } - - // Blast Protection - if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 25) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 17) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=1")); - } - - // Projectile Protection - if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=4")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 30) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=3")); - } - else if (FinalEnchantmentLevel >= 9 && FinalEnchantmentLevel <= 24) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=2")); - } - else if (FinalEnchantmentLevel >= 3 && FinalEnchantmentLevel <= 18) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=1")); - } - - // Thorns - if (FinalEnchantmentLevel >= 50 && FinalEnchantmentLevel <= 100) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=3")); - } - else if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=1")); - } - - // Respiration - if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 60) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=3")); - } - else if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 40) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=1")); - } - - // Aqua Affinity - if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("AquaAffinity=1")); - } - - // Feather Fall - if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=4")); - } - else if (FinalEnchantmentLevel >= 17 && FinalEnchantmentLevel <= 27) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=3")); - } - else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 21) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 15) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=1")); - } - - // Power - if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 46) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=3")); - } - else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 26) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 16) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=1")); - } - - // Punch - if (FinalEnchantmentLevel >= 32 && FinalEnchantmentLevel <= 57) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=2")); - } - else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 37) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=1")); - } - - // Flame and Infinity - if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Flame=1")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Infinity=1")); - } - - // Luck of the Sea and Lure - if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=3")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=3")); - } - else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=2")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=2")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=1")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=1")); - } - - Item.m_ItemType = E_ITEM_ENCHANTED_BOOK; - } - - // Unbreaking - if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 63) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=1")); - } - - int RandomEnchantment1 = (int) floor(Random.NextFloat(1) * enchantments.size()); - cEnchantments Enchantment1 = enchantments[RandomEnchantment1]; - Item.m_Enchantments.AddFromString(Enchantment1.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment1), enchantments.end()); - - float NewEnchantmentLevel = (float) BaseEnchantmentLevel; - - // Next Enchantment (Second) - NewEnchantmentLevel = NewEnchantmentLevel / 2; - float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (Random.NextFloat(100) <= SecondEnchantmentChance) - { - // Checking for conflicting enchantments - CheckEnchantmentConflicts(enchantments, Enchantment1); - - if (enchantments.size() > 0) - { - int RandomEnchantment2 = (int) floor(Random.NextFloat(1) * enchantments.size()); - - cEnchantments Enchantment2 = enchantments[RandomEnchantment2]; - Item.m_Enchantments.AddFromString(Enchantment2.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment2), enchantments.end()); - - // Checking for conflicting enchantments - CheckEnchantmentConflicts(enchantments, Enchantment2); - } - } - - // Next Enchantment (Third) - NewEnchantmentLevel = NewEnchantmentLevel / 2; - float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (Random.NextFloat(100) <= ThirdEnchantmentChance) - { - if (enchantments.size() > 0) - { - int RandomEnchantment3 = (int) floor(Random.NextFloat(1) * enchantments.size()); - cEnchantments Enchantment3 = enchantments[RandomEnchantment3]; - Item.m_Enchantments.AddFromString(Enchantment3.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment3), enchantments.end()); - - // Checking for conflicting enchantments - CheckEnchantmentConflicts(enchantments, Enchantment3); - } - } - - // Next Enchantment (Fourth) - NewEnchantmentLevel = NewEnchantmentLevel / 2; - float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (Random.NextFloat(100) <= FourthEnchantmentChance) - { - if (enchantments.size() > 0) - { - int RandomEnchantment4 = (int) floor(Random.NextFloat(1) * enchantments.size()); - cEnchantments Enchantment4 = enchantments[RandomEnchantment4]; - Item.m_Enchantments.AddFromString(Enchantment4.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment4), enchantments.end()); - } - } - - if (m_Player->DeltaExperience(-m_Player->XpForLevel(Window->GetPropertyValue(Enchantment))) >= 0 || m_Player->IsGameModeCreative()) - { - Window->m_SlotArea->SetSlot(0, *m_Player, Item); - Window->SendSlot(*m_Player, Window->m_SlotArea, 0); - Window->BroadcastWholeWindow(); - - Window->SetProperty(0, 0, *m_Player); - Window->SetProperty(1, 0, *m_Player); - Window->SetProperty(2, 0, *m_Player); - } -} - - - - - -void cClientHandle::AddEnchantmentWeight(cEnchantmentsVector & a_Enchantments, int a_Weight, cEnchantments a_Enchantment) -{ - for (int i = 0; i < a_Weight; i++) - { - a_Enchantments.push_back(a_Enchantment); - } -} - - - - - -void cClientHandle::RemoveEnchantmentFromVector(cEnchantmentsVector & a_Enchantments, int a_EnchantmentID) -{ - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == a_EnchantmentID) - { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); - break; - } - } -} - - - - - -void cClientHandle::CheckEnchantmentConflicts(cEnchantmentsVector & a_Enchantments, cEnchantments a_FirstEnchantment) -{ - int FirstEnchantmentID = atoi(StringSplit(a_FirstEnchantment.ToString(), "=")[0].c_str()); - - if (FirstEnchantmentID == cEnchantments::enchProtection) - { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFireProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBlastProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); - } - else if (FirstEnchantmentID == cEnchantments::enchFireProtection) - { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBlastProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); - } - else if (FirstEnchantmentID == cEnchantments::enchBlastProtection) - { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFireProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); - } - else if (FirstEnchantmentID == cEnchantments::enchProjectileProtection) - { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFireProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBlastProtection); - } - - else if (FirstEnchantmentID == cEnchantments::enchSharpness) - { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSmite); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBaneOfArthropods); - } - else if (FirstEnchantmentID == cEnchantments::enchSmite) - { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSharpness); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBaneOfArthropods); - } - else if (FirstEnchantmentID == cEnchantments::enchBaneOfArthropods) - { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSharpness); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSmite); - } - else if (FirstEnchantmentID == cEnchantments::enchSilkTouch) - { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFortune); - } - else if (FirstEnchantmentID == cEnchantments::enchFortune) - { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSilkTouch); - } -} - - - - - From a12a9117c2cfe2339a633c678e86597bed876f4a Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Wed, 16 Apr 2014 14:33:03 +0200 Subject: [PATCH 112/188] Added deletions from merge conflict --- src/ClientHandle.cpp | 875 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 875 insertions(+) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 9ab32d6ec..319af9ed3 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -31,6 +31,8 @@ #include "CompositeChat.h" #include "Items/ItemSword.h" +#include "FastRandom.h" + #include "md5/md5.h" @@ -2729,4 +2731,877 @@ void cClientHandle::SocketClosed(void) +void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) +{ + cEnchantingWindow * Window = (cEnchantingWindow*)m_Player->GetWindow(); + cItem Item = *Window->m_SlotArea->GetSlot(0, *m_Player); + + if (!cItem::IsEnchantable(Item.m_ItemType) && Item.m_ItemType != E_ITEM_BOOK) + { + return; + } + + int BaseEnchantmentLevel = Window->GetPropertyValue(Enchantment); + + // Step 1 from Enchanting + int Enchantability = 1; + + if (Item.m_ItemType == E_ITEM_WOODEN_SWORD || Item.m_ItemType == E_ITEM_WOODEN_PICKAXE || Item.m_ItemType == E_ITEM_WOODEN_SHOVEL || Item.m_ItemType == E_ITEM_WOODEN_AXE || Item.m_ItemType == E_ITEM_WOODEN_HOE) + { + Enchantability = 15; + } + else if (Item.m_ItemType == E_ITEM_LEATHER_CAP || Item.m_ItemType == E_ITEM_LEATHER_TUNIC || Item.m_ItemType == E_ITEM_LEATHER_PANTS || Item.m_ItemType == E_ITEM_LEATHER_BOOTS) + { + Enchantability = 15; + } + else if (Item.m_ItemType == E_ITEM_STONE_SWORD || Item.m_ItemType == E_ITEM_STONE_PICKAXE || Item.m_ItemType == E_ITEM_STONE_SHOVEL || Item.m_ItemType == E_ITEM_STONE_AXE || Item.m_ItemType == E_ITEM_STONE_HOE) + { + Enchantability = 5; + } + else if (Item.m_ItemType == E_ITEM_IRON_HELMET || Item.m_ItemType == E_ITEM_IRON_CHESTPLATE || Item.m_ItemType == E_ITEM_IRON_LEGGINGS || Item.m_ItemType == E_ITEM_IRON_BOOTS) + { + Enchantability = 9; + } + else if (Item.m_ItemType == E_ITEM_IRON_SWORD || Item.m_ItemType == E_ITEM_IRON_PICKAXE || Item.m_ItemType == E_ITEM_IRON_SHOVEL || Item.m_ItemType == E_ITEM_IRON_AXE || Item.m_ItemType == E_ITEM_IRON_HOE) + { + Enchantability = 14; + } + else if (Item.m_ItemType == E_ITEM_CHAIN_HELMET || Item.m_ItemType == E_ITEM_CHAIN_CHESTPLATE || Item.m_ItemType == E_ITEM_CHAIN_LEGGINGS || Item.m_ItemType == E_ITEM_CHAIN_BOOTS) + { + Enchantability = 12; + } + else if (Item.m_ItemType == E_ITEM_DIAMOND_HELMET || Item.m_ItemType == E_ITEM_DIAMOND_CHESTPLATE || Item.m_ItemType == E_ITEM_DIAMOND_LEGGINGS || Item.m_ItemType == E_ITEM_DIAMOND_BOOTS) + { + Enchantability = 10; + } + else if (Item.m_ItemType == E_ITEM_DIAMOND_SWORD || Item.m_ItemType == E_ITEM_DIAMOND_PICKAXE || Item.m_ItemType == E_ITEM_DIAMOND_SHOVEL || Item.m_ItemType == E_ITEM_DIAMOND_AXE || Item.m_ItemType == E_ITEM_DIAMOND_HOE) + { + Enchantability = 10; + } + else if (Item.m_ItemType == E_ITEM_GOLD_HELMET || Item.m_ItemType == E_ITEM_GOLD_CHESTPLATE || Item.m_ItemType == E_ITEM_GOLD_LEGGINGS || Item.m_ItemType == E_ITEM_GOLD_BOOTS) + { + Enchantability = 25; + } + else if (Item.m_ItemType == E_ITEM_GOLD_SWORD || Item.m_ItemType == E_ITEM_GOLD_PICKAXE || Item.m_ItemType == E_ITEM_GOLD_SHOVEL || Item.m_ItemType == E_ITEM_GOLD_AXE || Item.m_ItemType == E_ITEM_GOLD_HOE) + { + Enchantability = 22; + } + + cFastRandom Random; + int ModifiedEnchantmentLevel = BaseEnchantmentLevel + (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); + + // Step 2 and 3 from Enchanting + cEnchantmentsVector enchantments; + + if (ItemCategory::IsSword(Item.m_ItemType)) + { + // Sharpness + if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=4")); + } + else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=3")); + } + else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=1")); + } + + // Smite + if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=1")); + } + + // Bane of Arthropods + if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=1")); + } + + // Knockback + if (FinalEnchantmentLevel >= 25 && FinalEnchantmentLevel <= 75) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=1")); + } + + // Fire Aspect + if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=1")); + } + + // Looting + if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=3")); + } + else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=2")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=1")); + } + } + + else if (ItemCategory::IsTool(Item.m_ItemType)) + { + // Efficiency + if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 81) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=3")); + } + else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 61) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 51) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=1")); + } + + // Silk Touch + if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("SilkTouch=1")); + } + + // Fortune + if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=3")); + } + else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=2")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=1")); + } + } + + else if (ItemCategory::IsArmor(Item.m_ItemType)) + { + // Protection + if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=4")); + } + else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=3")); + } + else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=1")); + } + + // Fire Protection + if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 46) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=4")); + } + else if (FinalEnchantmentLevel >= 26 && FinalEnchantmentLevel <= 38) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=3")); + } + else if (FinalEnchantmentLevel >= 18 && FinalEnchantmentLevel <= 30) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 22) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=1")); + } + + // Blast Protection + if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 41) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 33) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 25) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 17) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=1")); + } + + // Projectile Protection + if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=4")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 30) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=3")); + } + else if (FinalEnchantmentLevel >= 9 && FinalEnchantmentLevel <= 24) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=2")); + } + else if (FinalEnchantmentLevel >= 3 && FinalEnchantmentLevel <= 18) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=1")); + } + + // Thorns + if (FinalEnchantmentLevel >= 50 && FinalEnchantmentLevel <= 100) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=3")); + } + else if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=1")); + } + + + if (ItemCategory::IsHelmet(Item.m_ItemType)) + { + // Respiration + if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 60) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=3")); + } + else if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 40) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=1")); + } + + // Aqua Affinity + if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 41) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("AquaAffinity=1")); + } + } + + else if (ItemCategory::IsBoots(Item.m_ItemType)) + { + // Feather Fall + if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 33) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=4")); + } + else if (FinalEnchantmentLevel >= 17 && FinalEnchantmentLevel <= 27) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=3")); + } + else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 21) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 15) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=1")); + } + } + } + + else if (Item.m_ItemType == E_ITEM_BOW) + { + // Power + if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 46) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=3")); + } + else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 26) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 16) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=1")); + } + + // Punch + if (FinalEnchantmentLevel >= 32 && FinalEnchantmentLevel <= 57) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=2")); + } + else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 37) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=1")); + } + + // Flame and Infinity + if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Flame=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Infinity=1")); + } + } + + else if (Item.m_ItemType == E_ITEM_FISHING_ROD) + { + // Luck of the Sea and Lure + if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=3")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=3")); + } + else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=2")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=2")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=1")); + } + } + + else if (Item.m_ItemType == E_ITEM_BOOK) + { + // All enchantments + + // Sharpness + if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=4")); + } + else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=3")); + } + else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=1")); + } + + // Smite + if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=1")); + } + + // Bane of Arthropods + if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=1")); + } + + // Knockback + if (FinalEnchantmentLevel >= 25 && FinalEnchantmentLevel <= 75) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=1")); + } + + // Fire Aspect + if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=1")); + } + + // Looting + if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=3")); + } + else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=2")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=1")); + } + + // Efficiency + if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 81) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=3")); + } + else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 61) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 51) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=1")); + } + + // Silk Touch + if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("SilkTouch=1")); + } + + // Fortune + if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=3")); + } + else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=2")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=1")); + } + + // Protection + if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=4")); + } + else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=3")); + } + else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=1")); + } + + // Fire Protection + if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 46) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=4")); + } + else if (FinalEnchantmentLevel >= 26 && FinalEnchantmentLevel <= 38) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=3")); + } + else if (FinalEnchantmentLevel >= 18 && FinalEnchantmentLevel <= 30) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 22) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=1")); + } + + // Blast Protection + if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 41) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 33) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 25) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 17) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=1")); + } + + // Projectile Protection + if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=4")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 30) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=3")); + } + else if (FinalEnchantmentLevel >= 9 && FinalEnchantmentLevel <= 24) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=2")); + } + else if (FinalEnchantmentLevel >= 3 && FinalEnchantmentLevel <= 18) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=1")); + } + + // Thorns + if (FinalEnchantmentLevel >= 50 && FinalEnchantmentLevel <= 100) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=3")); + } + else if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=1")); + } + + // Respiration + if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 60) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=3")); + } + else if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=2")); + } + else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 40) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=1")); + } + + // Aqua Affinity + if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 41) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("AquaAffinity=1")); + } + + // Feather Fall + if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 33) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=4")); + } + else if (FinalEnchantmentLevel >= 17 && FinalEnchantmentLevel <= 27) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=3")); + } + else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 21) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 15) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=1")); + } + + // Power + if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 46) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=4")); + } + else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=3")); + } + else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 26) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=2")); + } + else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 16) + { + AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=1")); + } + + // Punch + if (FinalEnchantmentLevel >= 32 && FinalEnchantmentLevel <= 57) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=2")); + } + else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 37) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=1")); + } + + // Flame and Infinity + if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) + { + AddEnchantmentWeight(enchantments, 2, cEnchantments("Flame=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Infinity=1")); + } + + // Luck of the Sea and Lure + if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=3")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=3")); + } + else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=2")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=2")); + } + else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) + { + AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=1")); + AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=1")); + } + + Item.m_ItemType = E_ITEM_ENCHANTED_BOOK; + } + + // Unbreaking + if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=3")); + } + else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 63) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=2")); + } + else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) + { + AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=1")); + } + + int RandomEnchantment1 = (int)floor(Random.NextFloat(1) * enchantments.size()); + cEnchantments Enchantment1 = enchantments[RandomEnchantment1]; + Item.m_Enchantments.AddFromString(Enchantment1.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment1), enchantments.end()); + + float NewEnchantmentLevel = (float)BaseEnchantmentLevel; + + // Next Enchantment (Second) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if (Random.NextFloat(100) <= SecondEnchantmentChance) + { + // Checking for conflicting enchantments + CheckEnchantmentConflicts(enchantments, Enchantment1); + + if (enchantments.size() > 0) + { + int RandomEnchantment2 = (int)floor(Random.NextFloat(1) * enchantments.size()); + + cEnchantments Enchantment2 = enchantments[RandomEnchantment2]; + Item.m_Enchantments.AddFromString(Enchantment2.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment2), enchantments.end()); + + // Checking for conflicting enchantments + CheckEnchantmentConflicts(enchantments, Enchantment2); + } + } + + // Next Enchantment (Third) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if (Random.NextFloat(100) <= ThirdEnchantmentChance) + { + if (enchantments.size() > 0) + { + int RandomEnchantment3 = (int)floor(Random.NextFloat(1) * enchantments.size()); + cEnchantments Enchantment3 = enchantments[RandomEnchantment3]; + Item.m_Enchantments.AddFromString(Enchantment3.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment3), enchantments.end()); + + // Checking for conflicting enchantments + CheckEnchantmentConflicts(enchantments, Enchantment3); + } + } + + // Next Enchantment (Fourth) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if (Random.NextFloat(100) <= FourthEnchantmentChance) + { + if (enchantments.size() > 0) + { + int RandomEnchantment4 = (int)floor(Random.NextFloat(1) * enchantments.size()); + cEnchantments Enchantment4 = enchantments[RandomEnchantment4]; + Item.m_Enchantments.AddFromString(Enchantment4.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment4), enchantments.end()); + } + } + + if (m_Player->DeltaExperience(-m_Player->XpForLevel(Window->GetPropertyValue(Enchantment))) >= 0 || m_Player->IsGameModeCreative()) + { + Window->m_SlotArea->SetSlot(0, *m_Player, Item); + Window->SendSlot(*m_Player, Window->m_SlotArea, 0); + Window->BroadcastWholeWindow(); + + Window->SetProperty(0, 0, *m_Player); + Window->SetProperty(1, 0, *m_Player); + Window->SetProperty(2, 0, *m_Player); + } +} + + + + + +void cClientHandle::AddEnchantmentWeight(cEnchantmentsVector & a_Enchantments, int a_Weight, cEnchantments a_Enchantment) +{ + for (int i = 0; i < a_Weight; i++) + { + a_Enchantments.push_back(a_Enchantment); + } +} + + + + + +void cClientHandle::RemoveEnchantmentFromVector(cEnchantmentsVector & a_Enchantments, int a_EnchantmentID) +{ + for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) + { + int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); + + if (EnchantmentID == a_EnchantmentID) + { + a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); + break; + } + } +} + + + + + +void cClientHandle::CheckEnchantmentConflicts(cEnchantmentsVector & a_Enchantments, cEnchantments a_FirstEnchantment) +{ + int FirstEnchantmentID = atoi(StringSplit(a_FirstEnchantment.ToString(), "=")[0].c_str()); + + if (FirstEnchantmentID == cEnchantments::enchProtection) + { + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBlastProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); + } + else if (FirstEnchantmentID == cEnchantments::enchFireProtection) + { + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBlastProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); + } + else if (FirstEnchantmentID == cEnchantments::enchBlastProtection) + { + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); + } + else if (FirstEnchantmentID == cEnchantments::enchProjectileProtection) + { + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBlastProtection); + } + + else if (FirstEnchantmentID == cEnchantments::enchSharpness) + { + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSmite); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBaneOfArthropods); + } + else if (FirstEnchantmentID == cEnchantments::enchSmite) + { + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSharpness); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBaneOfArthropods); + } + else if (FirstEnchantmentID == cEnchantments::enchBaneOfArthropods) + { + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSharpness); + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSmite); + } + else if (FirstEnchantmentID == cEnchantments::enchSilkTouch) + { + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFortune); + } + else if (FirstEnchantmentID == cEnchantments::enchFortune) + { + RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSilkTouch); + } +} + + + From a0725747af9581744577be7ed06c07ec9c9fe3f2 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Wed, 16 Apr 2014 14:52:09 +0200 Subject: [PATCH 113/188] Fixed conflicting enchantments checking --- src/ClientHandle.cpp | 46 ++++++++++++++++++++++---------------------- src/ClientHandle.h | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 319af9ed3..688441d39 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -3530,15 +3530,15 @@ void cClientHandle::AddEnchantmentWeight(cEnchantmentsVector & a_Enchantments, i -void cClientHandle::RemoveEnchantmentFromVector(cEnchantmentsVector & a_Enchantments, int a_EnchantmentID) +void cClientHandle::RemoveEnchantmentFromVector(cEnchantmentsVector * a_Enchantments, int a_EnchantmentID) { - for (cEnchantmentsVector::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) + for (cEnchantmentsVector::iterator it = a_Enchantments->begin(); it != a_Enchantments->end(); ++it) { int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); if (EnchantmentID == a_EnchantmentID) { - a_Enchantments.erase(std::remove(a_Enchantments.begin(), a_Enchantments.end(), *it), a_Enchantments.end()); + a_Enchantments->erase(std::remove(a_Enchantments->begin(), a_Enchantments->end(), *it), a_Enchantments->end()); break; } } @@ -3554,51 +3554,51 @@ void cClientHandle::CheckEnchantmentConflicts(cEnchantmentsVector & a_Enchantmen if (FirstEnchantmentID == cEnchantments::enchProtection) { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFireProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBlastProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchBlastProtection); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchProjectileProtection); } else if (FirstEnchantmentID == cEnchantments::enchFireProtection) { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBlastProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchBlastProtection); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchProjectileProtection); } else if (FirstEnchantmentID == cEnchantments::enchBlastProtection) { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFireProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchProjectileProtection); } else if (FirstEnchantmentID == cEnchantments::enchProjectileProtection) { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFireProtection); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBlastProtection); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchBlastProtection); } else if (FirstEnchantmentID == cEnchantments::enchSharpness) { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSmite); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBaneOfArthropods); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchSmite); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchBaneOfArthropods); } else if (FirstEnchantmentID == cEnchantments::enchSmite) { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSharpness); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchBaneOfArthropods); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchSharpness); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchBaneOfArthropods); } else if (FirstEnchantmentID == cEnchantments::enchBaneOfArthropods) { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSharpness); - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSmite); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchSharpness); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchSmite); } else if (FirstEnchantmentID == cEnchantments::enchSilkTouch) { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchFortune); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchFortune); } else if (FirstEnchantmentID == cEnchantments::enchFortune) { - RemoveEnchantmentFromVector(a_Enchantments, cEnchantments::enchSilkTouch); + RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchSilkTouch); } } diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 8bba0d27c..1829e3b4d 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -249,7 +249,7 @@ public: /** Called when the player will enchant a Item */ void HandleEnchantItem(Byte & WindowID, Byte & Enchantment); void AddEnchantmentWeight(cEnchantmentsVector & a_Enchantments, int a_Weight, cEnchantments a_Enchantment); - void RemoveEnchantmentFromVector(cEnchantmentsVector & a_Enchantments, int a_EnchantmentID); + void RemoveEnchantmentFromVector(cEnchantmentsVector * a_Enchantments, int a_EnchantmentID); void CheckEnchantmentConflicts(cEnchantmentsVector & a_Enchantments, cEnchantments a_FirstEnchantment); private: From 09866bb382cde2fda6fb3ebcf0c71d49ae6e3429 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Wed, 16 Apr 2014 18:10:48 +0200 Subject: [PATCH 114/188] Added asserts for proper game state. This is to help hunt #889. --- src/Protocol/Protocol17x.cpp | 136 +++++++++++++++++++++++++++++++++-- 1 file changed, 131 insertions(+), 5 deletions(-) diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index aae87f994..403046760 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -125,6 +125,8 @@ void cProtocol172::DataReceived(const char * a_Data, size_t a_Size) void cProtocol172::SendAttachEntity(const cEntity & a_Entity, const cEntity * a_Vehicle) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x1b); // Attach Entity packet Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteInt((a_Vehicle != NULL) ? a_Vehicle->GetUniqueID() : 0); @@ -137,6 +139,8 @@ void cProtocol172::SendAttachEntity(const cEntity & a_Entity, const cEntity * a_ void cProtocol172::SendBlockAction(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x24); // Block Action packet Pkt.WriteInt(a_BlockX); Pkt.WriteShort(a_BlockY); @@ -152,6 +156,8 @@ void cProtocol172::SendBlockAction(int a_BlockX, int a_BlockY, int a_BlockZ, cha void cProtocol172::SendBlockBreakAnim(int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x25); // Block Break Animation packet Pkt.WriteVarInt(a_EntityID); Pkt.WriteInt(a_BlockX); @@ -166,6 +172,8 @@ void cProtocol172::SendBlockBreakAnim(int a_EntityID, int a_BlockX, int a_BlockY void cProtocol172::SendBlockChange(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x23); // Block Change packet Pkt.WriteInt(a_BlockX); Pkt.WriteByte(a_BlockY); @@ -180,6 +188,8 @@ void cProtocol172::SendBlockChange(int a_BlockX, int a_BlockY, int a_BlockZ, BLO void cProtocol172::SendBlockChanges(int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x22); // Multi Block Change packet Pkt.WriteInt(a_ChunkX); Pkt.WriteInt(a_ChunkZ); @@ -199,6 +209,8 @@ void cProtocol172::SendBlockChanges(int a_ChunkX, int a_ChunkZ, const sSetBlockV void cProtocol172::SendChat(const AString & a_Message) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x02); // Chat Message packet Pkt.WriteString(Printf("{\"text\":\"%s\"}", EscapeString(a_Message).c_str())); } @@ -209,6 +221,8 @@ void cProtocol172::SendChat(const AString & a_Message) void cProtocol172::SendChat(const cCompositeChat & a_Message) { + ASSERT(m_State == 3); // In game mode? + // Compose the complete Json string to send: Json::Value msg; msg["text"] = ""; // The client crashes without this @@ -281,6 +295,8 @@ void cProtocol172::SendChat(const cCompositeChat & a_Message) void cProtocol172::SendChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer) { + ASSERT(m_State == 3); // In game mode? + // Serialize first, before creating the Packetizer (the packetizer locks a CS) // This contains the flags and bitmasks, too const AString & ChunkData = a_Serializer.Serialize(cChunkDataSerializer::RELEASE_1_3_2); @@ -297,6 +313,8 @@ void cProtocol172::SendChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataSerialize void cProtocol172::SendCollectPickup(const cPickup & a_Pickup, const cPlayer & a_Player) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x0d); // Collect Item packet Pkt.WriteInt(a_Pickup.GetUniqueID()); Pkt.WriteInt(a_Player.GetUniqueID()); @@ -308,6 +326,8 @@ void cProtocol172::SendCollectPickup(const cPickup & a_Pickup, const cPlayer & a void cProtocol172::SendDestroyEntity(const cEntity & a_Entity) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x13); // Destroy Entities packet Pkt.WriteByte(1); Pkt.WriteInt(a_Entity.GetUniqueID()); @@ -344,6 +364,8 @@ void cProtocol172::SendDisconnect(const AString & a_Reason) void cProtocol172::SendEditSign(int a_BlockX, int a_BlockY, int a_BlockZ) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x36); // Sign Editor Open packet Pkt.WriteInt(a_BlockX); Pkt.WriteInt(a_BlockY); @@ -356,6 +378,8 @@ void cProtocol172::SendEditSign(int a_BlockX, int a_BlockY, int a_BlockZ) void cProtocol172::SendEntityEffect(const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x1D); // Entity Effect packet Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteByte(a_EffectID); @@ -369,6 +393,8 @@ void cProtocol172::SendEntityEffect(const cEntity & a_Entity, int a_EffectID, in void cProtocol172::SendEntityEquipment(const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x04); // Entity Equipment packet Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteShort(a_SlotNum); @@ -381,6 +407,8 @@ void cProtocol172::SendEntityEquipment(const cEntity & a_Entity, short a_SlotNum void cProtocol172::SendEntityHeadLook(const cEntity & a_Entity) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x19); // Entity Head Look packet Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteByteAngle(a_Entity.GetHeadYaw()); @@ -392,6 +420,8 @@ void cProtocol172::SendEntityHeadLook(const cEntity & a_Entity) void cProtocol172::SendEntityLook(const cEntity & a_Entity) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x16); // Entity Look packet Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteByteAngle(a_Entity.GetYaw()); @@ -404,6 +434,8 @@ void cProtocol172::SendEntityLook(const cEntity & a_Entity) void cProtocol172::SendEntityMetadata(const cEntity & a_Entity) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x1c); // Entity Metadata packet Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteEntityMetadata(a_Entity); @@ -416,6 +448,8 @@ void cProtocol172::SendEntityMetadata(const cEntity & a_Entity) void cProtocol172::SendEntityProperties(const cEntity & a_Entity) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x20); // Entity Properties packet Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteEntityProperties(a_Entity); @@ -427,6 +461,8 @@ void cProtocol172::SendEntityProperties(const cEntity & a_Entity) void cProtocol172::SendEntityRelMove(const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x15); // Entity Relative Move packet Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteByte(a_RelX); @@ -440,6 +476,8 @@ void cProtocol172::SendEntityRelMove(const cEntity & a_Entity, char a_RelX, char void cProtocol172::SendEntityRelMoveLook(const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x17); // Entity Look And Relative Move packet Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteByte(a_RelX); @@ -455,6 +493,8 @@ void cProtocol172::SendEntityRelMoveLook(const cEntity & a_Entity, char a_RelX, void cProtocol172::SendEntityStatus(const cEntity & a_Entity, char a_Status) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x1a); // Entity Status packet Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteChar(a_Status); @@ -466,6 +506,8 @@ void cProtocol172::SendEntityStatus(const cEntity & a_Entity, char a_Status) void cProtocol172::SendEntityVelocity(const cEntity & a_Entity) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x12); // Entity Velocity packet Pkt.WriteInt(a_Entity.GetUniqueID()); // 400 = 8000 / 20 ... Conversion from our speed in m/s to 8000 m/tick @@ -480,6 +522,8 @@ void cProtocol172::SendEntityVelocity(const cEntity & a_Entity) void cProtocol172::SendExplosion(double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x27); // Explosion packet Pkt.WriteFloat((float)a_BlockX); Pkt.WriteFloat((float)a_BlockY); @@ -503,6 +547,8 @@ void cProtocol172::SendExplosion(double a_BlockX, double a_BlockY, double a_Bloc void cProtocol172::SendGameMode(eGameMode a_GameMode) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x2b); // Change Game State packet Pkt.WriteByte(3); // Reason: Change game mode Pkt.WriteFloat((float)a_GameMode); @@ -514,6 +560,8 @@ void cProtocol172::SendGameMode(eGameMode a_GameMode) void cProtocol172::SendHealth(void) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x06); // Update Health packet Pkt.WriteFloat((float)m_Client->GetPlayer()->GetHealth()); Pkt.WriteShort(m_Client->GetPlayer()->GetFoodLevel()); @@ -526,6 +574,8 @@ void cProtocol172::SendHealth(void) void cProtocol172::SendInventorySlot(char a_WindowID, short a_SlotNum, const cItem & a_Item) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x2f); // Set Slot packet Pkt.WriteChar(a_WindowID); Pkt.WriteShort(a_SlotNum); @@ -598,6 +648,8 @@ void cProtocol172::SendLoginSuccess(void) void cProtocol172::SendPaintingSpawn(const cPainting & a_Painting) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x10); // Spawn Painting packet Pkt.WriteVarInt(a_Painting.GetUniqueID()); Pkt.WriteString(a_Painting.GetName().c_str()); @@ -613,6 +665,8 @@ void cProtocol172::SendPaintingSpawn(const cPainting & a_Painting) void cProtocol172::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x34); Pkt.WriteVarInt(a_ID); Pkt.WriteShort (3 + a_Length); @@ -633,6 +687,8 @@ void cProtocol172::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colo void cProtocol172::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decorators) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x34); Pkt.WriteVarInt(a_ID); Pkt.WriteShort (1 + (3 * a_Decorators.size())); @@ -653,6 +709,8 @@ void cProtocol172::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decor void cProtocol172::SendMapInfo(int a_ID, unsigned int a_Scale) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x34); Pkt.WriteVarInt(a_ID); Pkt.WriteShort (2); @@ -668,6 +726,8 @@ void cProtocol172::SendMapInfo(int a_ID, unsigned int a_Scale) void cProtocol172::SendPickupSpawn(const cPickup & a_Pickup) { + ASSERT(m_State == 3); // In game mode? + { cPacketizer Pkt(*this, 0x0e); // Spawn Object packet Pkt.WriteVarInt(a_Pickup.GetUniqueID()); @@ -694,6 +754,8 @@ void cProtocol172::SendPickupSpawn(const cPickup & a_Pickup) void cProtocol172::SendPlayerAbilities(void) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x39); // Player Abilities packet Byte Flags = 0; if (m_Client->GetPlayer()->IsGameModeCreative()) @@ -720,6 +782,8 @@ void cProtocol172::SendPlayerAbilities(void) void cProtocol172::SendEntityAnimation(const cEntity & a_Entity, char a_Animation) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x0b); // Animation packet Pkt.WriteVarInt(a_Entity.GetUniqueID()); Pkt.WriteChar(a_Animation); @@ -731,6 +795,8 @@ void cProtocol172::SendEntityAnimation(const cEntity & a_Entity, char a_Animatio void cProtocol172::SendParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x2A); Pkt.WriteString(a_ParticleName); Pkt.WriteFloat(a_SrcX); @@ -749,6 +815,8 @@ void cProtocol172::SendParticleEffect(const AString & a_ParticleName, float a_Sr void cProtocol172::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x38); // Playerlist Item packet Pkt.WriteString(a_Player.GetName()); Pkt.WriteBool(a_IsOnline); @@ -761,6 +829,8 @@ void cProtocol172::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline) void cProtocol172::SendPlayerMaxSpeed(void) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x20); // Entity Properties Pkt.WriteInt(m_Client->GetPlayer()->GetUniqueID()); Pkt.WriteInt(1); // Count @@ -787,6 +857,8 @@ void cProtocol172::SendPlayerMaxSpeed(void) void cProtocol172::SendPlayerMoveLook(void) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x08); // Player Position And Look packet Pkt.WriteDouble(m_Client->GetPlayer()->GetPosX()); @@ -816,6 +888,8 @@ void cProtocol172::SendPlayerPosition(void) void cProtocol172::SendPlayerSpawn(const cPlayer & a_Player) { + ASSERT(m_State == 3); // In game mode? + // Called to spawn another player for the client cPacketizer Pkt(*this, 0x0c); // Spawn Player packet Pkt.WriteVarInt(a_Player.GetUniqueID()); @@ -839,6 +913,8 @@ void cProtocol172::SendPlayerSpawn(const cPlayer & a_Player) void cProtocol172::SendPluginMessage(const AString & a_Channel, const AString & a_Message) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x3f); Pkt.WriteString(a_Channel); Pkt.WriteShort((short)a_Message.size()); @@ -851,7 +927,9 @@ void cProtocol172::SendPluginMessage(const AString & a_Channel, const AString & void cProtocol172::SendRemoveEntityEffect(const cEntity & a_Entity, int a_EffectID) { - cPacketizer Pkt(*this, 0x1E); + ASSERT(m_State == 3); // In game mode? + + cPacketizer Pkt(*this, 0x1e); Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteByte(a_EffectID); } @@ -875,7 +953,9 @@ void cProtocol172::SendRespawn(void) void cProtocol172::SendExperience (void) { - cPacketizer Pkt(*this, 0x1F); //Experience Packet + ASSERT(m_State == 3); // In game mode? + + cPacketizer Pkt(*this, 0x1f); // Experience Packet Pkt.WriteFloat(m_Client->GetPlayer()->GetXpPercentage()); Pkt.WriteShort(m_Client->GetPlayer()->GetXpLevel()); Pkt.WriteShort(m_Client->GetPlayer()->GetCurrentXp()); @@ -887,6 +967,8 @@ void cProtocol172::SendExperience (void) void cProtocol172::SendExperienceOrb(const cExpOrb & a_ExpOrb) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x11); Pkt.WriteVarInt(a_ExpOrb.GetUniqueID()); Pkt.WriteInt((int) a_ExpOrb.GetPosX()); @@ -901,7 +983,9 @@ void cProtocol172::SendExperienceOrb(const cExpOrb & a_ExpOrb) void cProtocol172::SendScoreboardObjective(const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) { - cPacketizer Pkt(*this, 0x3B); + ASSERT(m_State == 3); // In game mode? + + cPacketizer Pkt(*this, 0x3b); Pkt.WriteString(a_Name); Pkt.WriteString(a_DisplayName); Pkt.WriteByte(a_Mode); @@ -913,7 +997,9 @@ void cProtocol172::SendScoreboardObjective(const AString & a_Name, const AString void cProtocol172::SendScoreUpdate(const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) { - cPacketizer Pkt(*this, 0x3C); + ASSERT(m_State == 3); // In game mode? + + cPacketizer Pkt(*this, 0x3c); Pkt.WriteString(a_Player); Pkt.WriteByte(a_Mode); @@ -930,7 +1016,9 @@ void cProtocol172::SendScoreUpdate(const AString & a_Objective, const AString & void cProtocol172::SendDisplayObjective(const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) { - cPacketizer Pkt(*this, 0x3D); + ASSERT(m_State == 3); // In game mode? + + cPacketizer Pkt(*this, 0x3d); Pkt.WriteByte((int) a_Display); Pkt.WriteString(a_Objective); } @@ -941,6 +1029,8 @@ void cProtocol172::SendDisplayObjective(const AString & a_Objective, cScoreboard void cProtocol172::SendSoundEffect(const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch) // a_Src coords are Block * 8 { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x29); // Sound Effect packet Pkt.WriteString(a_SoundName); Pkt.WriteInt(a_SrcX); @@ -956,6 +1046,8 @@ void cProtocol172::SendSoundEffect(const AString & a_SoundName, int a_SrcX, int void cProtocol172::SendSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x28); // Effect packet Pkt.WriteInt(a_EffectID); Pkt.WriteInt(a_SrcX); @@ -971,6 +1063,8 @@ void cProtocol172::SendSoundParticleEffect(int a_EffectID, int a_SrcX, int a_Src void cProtocol172::SendSpawnFallingBlock(const cFallingBlock & a_FallingBlock) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x0e); // Spawn Object packet Pkt.WriteVarInt(a_FallingBlock.GetUniqueID()); Pkt.WriteByte(70); // Falling block @@ -991,6 +1085,8 @@ void cProtocol172::SendSpawnFallingBlock(const cFallingBlock & a_FallingBlock) void cProtocol172::SendSpawnMob(const cMonster & a_Mob) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x0f); // Spawn Mob packet Pkt.WriteVarInt(a_Mob.GetUniqueID()); Pkt.WriteByte((Byte)a_Mob.GetMobType()); @@ -1013,6 +1109,8 @@ void cProtocol172::SendSpawnMob(const cMonster & a_Mob) void cProtocol172::SendSpawnObject(const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0xe); // Spawn Object packet Pkt.WriteVarInt(a_Entity.GetUniqueID()); Pkt.WriteByte(a_ObjectType); @@ -1036,6 +1134,8 @@ void cProtocol172::SendSpawnObject(const cEntity & a_Entity, char a_ObjectType, void cProtocol172::SendSpawnVehicle(const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0xe); // Spawn Object packet Pkt.WriteVarInt(a_Vehicle.GetUniqueID()); Pkt.WriteByte(a_VehicleType); @@ -1059,6 +1159,8 @@ void cProtocol172::SendSpawnVehicle(const cEntity & a_Vehicle, char a_VehicleTyp void cProtocol172::SendTabCompletionResults(const AStringVector & a_Results) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x3a); // Tab-Complete packet Pkt.WriteVarInt(a_Results.size()); @@ -1074,6 +1176,8 @@ void cProtocol172::SendTabCompletionResults(const AStringVector & a_Results) void cProtocol172::SendTeleportEntity(const cEntity & a_Entity) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x18); Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteFPInt(a_Entity.GetPosX()); @@ -1089,6 +1193,8 @@ void cProtocol172::SendTeleportEntity(const cEntity & a_Entity) void cProtocol172::SendThunderbolt(int a_BlockX, int a_BlockY, int a_BlockZ) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x2c); // Spawn Global Entity packet Pkt.WriteVarInt(0); // EntityID = 0, always Pkt.WriteByte(1); // Type = Thunderbolt @@ -1103,6 +1209,8 @@ void cProtocol172::SendThunderbolt(int a_BlockX, int a_BlockY, int a_BlockZ) void cProtocol172::SendTimeUpdate(Int64 a_WorldAge, Int64 a_TimeOfDay) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x03); Pkt.WriteInt64(a_WorldAge); Pkt.WriteInt64(a_TimeOfDay); @@ -1114,6 +1222,8 @@ void cProtocol172::SendTimeUpdate(Int64 a_WorldAge, Int64 a_TimeOfDay) void cProtocol172::SendUnloadChunk(int a_ChunkX, int a_ChunkZ) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x21); // Chunk Data packet Pkt.WriteInt(a_ChunkX); Pkt.WriteInt(a_ChunkZ); @@ -1128,6 +1238,8 @@ void cProtocol172::SendUnloadChunk(int a_ChunkX, int a_ChunkZ) void cProtocol172::SendUpdateBlockEntity(cBlockEntity & a_BlockEntity) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x35); // Update tile entity packet Pkt.WriteInt(a_BlockEntity.GetPosX()); Pkt.WriteShort(a_BlockEntity.GetPosY()); @@ -1153,6 +1265,8 @@ void cProtocol172::SendUpdateBlockEntity(cBlockEntity & a_BlockEntity) void cProtocol172::SendUpdateSign(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) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x33); Pkt.WriteInt(a_BlockX); Pkt.WriteShort((short)a_BlockY); @@ -1170,6 +1284,8 @@ void cProtocol172::SendUpdateSign(int a_BlockX, int a_BlockY, int a_BlockZ, cons void cProtocol172::SendUseBed(const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x0a); Pkt.WriteInt(a_Entity.GetUniqueID()); Pkt.WriteInt(a_BlockX); @@ -1183,6 +1299,8 @@ void cProtocol172::SendUseBed(const cEntity & a_Entity, int a_BlockX, int a_Bloc void cProtocol172::SendWeather(eWeather a_Weather) { + ASSERT(m_State == 3); // In game mode? + { cPacketizer Pkt(*this, 0x2b); // Change Game State packet Pkt.WriteByte((a_Weather == wSunny) ? 1 : 2); // End rain / begin rain @@ -1198,6 +1316,8 @@ void cProtocol172::SendWeather(eWeather a_Weather) void cProtocol172::SendWholeInventory(const cWindow & a_Window) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x30); // Window Items packet Pkt.WriteChar(a_Window.GetWindowID()); Pkt.WriteShort(a_Window.GetNumSlots()); @@ -1215,6 +1335,8 @@ void cProtocol172::SendWholeInventory(const cWindow & a_Window) void cProtocol172::SendWindowClose(const cWindow & a_Window) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x2e); Pkt.WriteChar(a_Window.GetWindowID()); } @@ -1225,6 +1347,8 @@ void cProtocol172::SendWindowClose(const cWindow & a_Window) void cProtocol172::SendWindowOpen(const cWindow & a_Window) { + ASSERT(m_State == 3); // In game mode? + if (a_Window.GetWindowType() < 0) { // Do not send this packet for player inventory windows @@ -1249,6 +1373,8 @@ void cProtocol172::SendWindowOpen(const cWindow & a_Window) void cProtocol172::SendWindowProperty(const cWindow & a_Window, short a_Property, short a_Value) { + ASSERT(m_State == 3); // In game mode? + cPacketizer Pkt(*this, 0x31); // Window Property packet Pkt.WriteChar(a_Window.GetWindowID()); Pkt.WriteShort(a_Property); From 7bcc920662ba9785b68788f61f614088e87f24e8 Mon Sep 17 00:00:00 2001 From: "r.ramazanov" Date: Thu, 17 Apr 2014 09:35:26 +0400 Subject: [PATCH 115/188] Mobs rotation --- src/Defines.h | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Defines.h b/src/Defines.h index 1a8b3fa4a..9fa3b3a8e 100644 --- a/src/Defines.h +++ b/src/Defines.h @@ -493,15 +493,17 @@ inline void EulerToVector(double a_Pan, double a_Pitch, double & a_X, double & a inline void VectorToEuler(double a_X, double a_Y, double a_Z, double & a_Pan, double & a_Pitch) { - if (fabs(a_X) < std::numeric_limits::epsilon()) - { - a_Pan = atan2(a_Z, a_X) * 180 / PI - 90; - } - else + double r = sqrt((a_X * a_X) + (a_Z * a_Z)); + if (r < std::numeric_limits::epsilon()) { a_Pan = 0; } - a_Pitch = atan2(a_Y, sqrt((a_X * a_X) + (a_Z * a_Z))) * 180 / PI; + else + { + a_Pan = atan2(a_Z, a_X) * 180 / PI - 90; + } + + a_Pitch = atan2(a_Y, r) * 180 / PI; } From 2151ee997c0cca214a722249e7f0df132e194955 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Thu, 17 Apr 2014 12:11:31 +0100 Subject: [PATCH 116/188] Implemented weighted pressure plates --- src/BlockID.h | 4 + .../IncrementalRedstoneSimulator.cpp | 194 +++++++++++++++--- src/Simulator/IncrementalRedstoneSimulator.h | 10 +- 3 files changed, 177 insertions(+), 31 deletions(-) diff --git a/src/BlockID.h b/src/BlockID.h index 2fec512e2..a227245aa 100644 --- a/src/BlockID.h +++ b/src/BlockID.h @@ -503,6 +503,10 @@ enum E_META_PLANKS_CONIFER = 1, E_META_PLANKS_BIRCH = 2, E_META_PLANKS_JUNGLE = 3, + + // E_BLOCK_(XXX_WEIGHTED)_PRESSURE_PLATE metas: + E_META_PRESSURE_PLATE_RAISED = 0, + E_META_PRESSURE_PLATE_DEPRESSED = 1, // E_BLOCK_QUARTZ_BLOCK metas: E_META_QUARTZ_NORMAL = 0, diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index e0640a409..1bedf7e5e 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -537,13 +537,14 @@ void cIncrementalRedstoneSimulator::HandleRedstoneWire(int a_BlockX, int a_Block unsigned char MyPower; if (!IsWirePowered(a_BlockX, a_BlockY, a_BlockZ, MyPower)) { - m_World.SetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_WIRE, 0); + m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, 0); + m_World.WakeUpSimulators(a_BlockX, a_BlockY, a_BlockZ); return; } - m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, MyPower); // Maximum power + m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, MyPower); - if (MyPower < 2) + if (MyPower < 1) { return; } @@ -1015,16 +1016,13 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_BlockX, int a_Bloc break; } case E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE: - case E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE: - case E_BLOCK_WOODEN_PRESSURE_PLATE: { class cPressurePlateCallback : public cEntityCallback { public: - cPressurePlateCallback(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World) : - m_Entity(NULL), - m_World(a_World), + cPressurePlateCallback(int a_BlockX, int a_BlockY, int a_BlockZ) : + m_NumberOfEntities(0), m_X(a_BlockX), m_Y(a_BlockY), m_Z(a_BlockZ) @@ -1039,7 +1037,140 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_BlockX, int a_Bloc if (Distance <= 0.7) { - m_Entity = a_Entity; + m_NumberOfEntities++; + } + return false; + } + + bool GetPowerLevel(unsigned char & a_PowerLevel) const + { + a_PowerLevel = std::min(m_NumberOfEntities, MAX_POWER_LEVEL); + return (a_PowerLevel > 0); + } + + protected: + int m_NumberOfEntities; + + int m_X; + int m_Y; + int m_Z; + }; + + cPressurePlateCallback PressurePlateCallback(a_BlockX, a_BlockY, a_BlockZ); + m_World.ForEachEntity(PressurePlateCallback); + + unsigned char Power; + NIBBLETYPE Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); + if (PressurePlateCallback.GetPowerLevel(Power)) + { + if (Meta == E_META_PRESSURE_PLATE_RAISED) + { + m_World.BroadcastSoundEffect("random.click", (int)((a_BlockX + 0.5) * 8.0), (int)((a_BlockY + 0.1) * 8.0), (int)((a_BlockZ + 0.5) * 8.0), 0.3F, 0.5F); + } + m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, E_META_PRESSURE_PLATE_DEPRESSED); + SetAllDirsAsPowered(a_BlockX, a_BlockY, a_BlockZ, a_MyType, Power); + } + else + { + if (Meta == E_META_PRESSURE_PLATE_DEPRESSED) + { + m_World.BroadcastSoundEffect("random.click", (int)((a_BlockX + 0.5) * 8.0), (int)((a_BlockY + 0.1) * 8.0), (int)((a_BlockZ + 0.5) * 8.0), 0.3F, 0.6F); + } + m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, E_META_PRESSURE_PLATE_RAISED); + m_World.WakeUpSimulators(a_BlockX, a_BlockY, a_BlockZ); + } + + break; + } + case E_BLOCK_HEAVY_WEIGHTED_PRESSURE_PLATE: + {class cPressurePlateCallback : + public cEntityCallback + { + public: + cPressurePlateCallback(int a_BlockX, int a_BlockY, int a_BlockZ) : + m_NumberOfEntities(0), + m_X(a_BlockX), + m_Y(a_BlockY), + m_Z(a_BlockZ) + { + } + + virtual bool Item(cEntity * a_Entity) override + { + Vector3f EntityPos = a_Entity->GetPosition(); + Vector3f BlockPos(m_X + 0.5f, (float)m_Y, m_Z + 0.5f); + double Distance = (EntityPos - BlockPos).Length(); + + if (Distance <= 0.7) + { + m_NumberOfEntities++; + } + return false; + } + + bool GetPowerLevel(unsigned char & a_PowerLevel) const + { + a_PowerLevel = std::min((int)ceil(m_NumberOfEntities / (float)10), MAX_POWER_LEVEL); + return (a_PowerLevel > 0); + } + + protected: + int m_NumberOfEntities; + + int m_X; + int m_Y; + int m_Z; + }; + + cPressurePlateCallback PressurePlateCallback(a_BlockX, a_BlockY, a_BlockZ); + m_World.ForEachEntity(PressurePlateCallback); + + unsigned char Power; + NIBBLETYPE Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); + if (PressurePlateCallback.GetPowerLevel(Power)) + { + if (Meta == E_META_PRESSURE_PLATE_RAISED) + { + m_World.BroadcastSoundEffect("random.click", (int)((a_BlockX + 0.5) * 8.0), (int)((a_BlockY + 0.1) * 8.0), (int)((a_BlockZ + 0.5) * 8.0), 0.3F, 0.5F); + } + m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, E_META_PRESSURE_PLATE_DEPRESSED); + SetAllDirsAsPowered(a_BlockX, a_BlockY, a_BlockZ, a_MyType, Power); + } + else + { + if (Meta == E_META_PRESSURE_PLATE_DEPRESSED) + { + m_World.BroadcastSoundEffect("random.click", (int)((a_BlockX + 0.5) * 8.0), (int)((a_BlockY + 0.1) * 8.0), (int)((a_BlockZ + 0.5) * 8.0), 0.3F, 0.6F); + } + m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, E_META_PRESSURE_PLATE_RAISED); + m_World.WakeUpSimulators(a_BlockX, a_BlockY, a_BlockZ); + } + + break; + } + case E_BLOCK_WOODEN_PRESSURE_PLATE: + { + class cPressurePlateCallback : + public cEntityCallback + { + public: + cPressurePlateCallback(int a_BlockX, int a_BlockY, int a_BlockZ) : + m_FoundEntity(false), + m_X(a_BlockX), + m_Y(a_BlockY), + m_Z(a_BlockZ) + { + } + + virtual bool Item(cEntity * a_Entity) override + { + Vector3f EntityPos = a_Entity->GetPosition(); + Vector3f BlockPos(m_X + 0.5f, (float)m_Y, m_Z + 0.5f); + double Distance = (EntityPos - BlockPos).Length(); + + if (Distance <= 0.7) + { + m_FoundEntity = true; return true; // Break out, we only need to know for plates that at least one entity is on top } return false; @@ -1047,45 +1178,46 @@ void cIncrementalRedstoneSimulator::HandlePressurePlate(int a_BlockX, int a_Bloc bool FoundEntity(void) const { - return m_Entity != NULL; + return m_FoundEntity; } protected: - cEntity * m_Entity; - cWorld * m_World; + bool m_FoundEntity; int m_X; int m_Y; int m_Z; } ; - cPressurePlateCallback PressurePlateCallback(a_BlockX, a_BlockY, a_BlockZ, &m_World); + cPressurePlateCallback PressurePlateCallback(a_BlockX, a_BlockY, a_BlockZ); m_World.ForEachEntity(PressurePlateCallback); NIBBLETYPE Meta = m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); if (PressurePlateCallback.FoundEntity()) { - if (Meta == 0x0) + if (Meta == E_META_PRESSURE_PLATE_RAISED) { m_World.BroadcastSoundEffect("random.click", (int) ((a_BlockX + 0.5) * 8.0), (int) ((a_BlockY + 0.1) * 8.0), (int) ((a_BlockZ + 0.5) * 8.0), 0.3F, 0.5F); } - m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, 0x1); + m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, E_META_PRESSURE_PLATE_DEPRESSED); SetAllDirsAsPowered(a_BlockX, a_BlockY, a_BlockZ, a_MyType); } else { - if (Meta == 0x1) + if (Meta == E_META_PRESSURE_PLATE_DEPRESSED) { m_World.BroadcastSoundEffect("random.click", (int) ((a_BlockX + 0.5) * 8.0), (int) ((a_BlockY + 0.1) * 8.0), (int) ((a_BlockZ + 0.5) * 8.0), 0.3F, 0.6F); } - m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, 0x0); + m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, E_META_PRESSURE_PLATE_RAISED); m_World.WakeUpSimulators(a_BlockX, a_BlockY, a_BlockZ); } break; } default: + { LOGD("Unimplemented pressure plate type %s in cRedstoneSimulator", ItemToFullString(a_MyType).c_str()); break; + } } } @@ -1426,7 +1558,7 @@ void cIncrementalRedstoneSimulator::SetDirectionLinkedPowered(int a_BlockX, int -void cIncrementalRedstoneSimulator::SetAllDirsAsPowered(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_SourceBlock) +void cIncrementalRedstoneSimulator::SetAllDirsAsPowered(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel) { static const struct { @@ -1443,7 +1575,7 @@ void cIncrementalRedstoneSimulator::SetAllDirsAsPowered(int a_BlockX, int a_Bloc for (size_t i = 0; i < ARRAYCOUNT(gCrossCoords); i++) // Loop through struct to power all directions { - SetBlockPowered(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y, a_BlockZ + gCrossCoords[i].z, a_BlockX, a_BlockY, a_BlockZ, a_SourceBlock); + SetBlockPowered(a_BlockX + gCrossCoords[i].x, a_BlockY + gCrossCoords[i].y, a_BlockZ + gCrossCoords[i].z, a_BlockX, a_BlockY, a_BlockZ, a_SourceBlock, a_PowerLevel); } } @@ -1460,21 +1592,25 @@ void cIncrementalRedstoneSimulator::SetBlockPowered(int a_BlockX, int a_BlockY, return; } - PoweredBlocksList * Powered = m_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ)->GetRedstoneSimulatorPoweredBlocksList(); - for (PoweredBlocksList::const_iterator itr = Powered->begin(); itr != Powered->end(); ++itr) // Check powered list + auto Powered = m_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ)->GetRedstoneSimulatorPoweredBlocksList(); + for (auto itr = Powered->begin(); itr != Powered->end(); ++itr) // Check powered list { if ( itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)) && itr->a_SourcePos.Equals(Vector3i(a_SourceX, a_SourceY, a_SourceZ)) ) { - // Check for duplicates + // Check for duplicates, update power level if everything else the same but either way, don't add a new listing + if (itr->a_PowerLevel != a_PowerLevel) + { + itr->a_PowerLevel = a_PowerLevel; + } return; } } - PoweredBlocksList * OtherPowered = m_Chunk->GetNeighborChunk(a_SourceX, a_SourceZ)->GetRedstoneSimulatorPoweredBlocksList(); - for (PoweredBlocksList::const_iterator itr = OtherPowered->begin(); itr != OtherPowered->end(); ++itr) // Check powered list + auto OtherPowered = m_Chunk->GetNeighborChunk(a_SourceX, a_SourceZ)->GetRedstoneSimulatorPoweredBlocksList(); + for (auto itr = OtherPowered->cbegin(); itr != OtherPowered->cend(); ++itr) // Check powered list { if ( itr->a_BlockPos.Equals(Vector3i(a_SourceX, a_SourceY, a_SourceZ)) && @@ -1515,8 +1651,8 @@ void cIncrementalRedstoneSimulator::SetBlockLinkedPowered( return; } - LinkedBlocksList * Linked = m_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ)->GetRedstoneSimulatorLinkedBlocksList(); - for (LinkedBlocksList::const_iterator itr = Linked->begin(); itr != Linked->end(); ++itr) // Check linked powered list + auto Linked = m_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ)->GetRedstoneSimulatorLinkedBlocksList(); + for (auto itr = Linked->begin(); itr != Linked->end(); ++itr) // Check linked powered list { if ( itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)) && @@ -1524,7 +1660,11 @@ void cIncrementalRedstoneSimulator::SetBlockLinkedPowered( itr->a_SourcePos.Equals(Vector3i(a_SourceX, a_SourceY, a_SourceZ)) ) { - // Check for duplicates + // Check for duplicates, update power level if everything else the same but either way, don't add a new listing + if (itr->a_PowerLevel != a_PowerLevel) + { + itr->a_PowerLevel = a_PowerLevel; + } return; } } diff --git a/src/Simulator/IncrementalRedstoneSimulator.h b/src/Simulator/IncrementalRedstoneSimulator.h index 21bf11887..f52c50f9c 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.h +++ b/src/Simulator/IncrementalRedstoneSimulator.h @@ -36,6 +36,8 @@ public: private: + #define MAX_POWER_LEVEL 15 + struct sPoweredBlocks // Define structure of the directly powered blocks list { Vector3i a_BlockPos; // Position of powered block @@ -134,15 +136,15 @@ private: /* ====== Helper functions ====== */ /** Marks a block as powered */ - void SetBlockPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel = 15); + void SetBlockPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel = MAX_POWER_LEVEL); /** Marks a block as being powered through another block */ - void SetBlockLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_MiddleX, int a_MiddleY, int a_MiddleZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, BLOCKTYPE a_MiddeBlock, unsigned char a_PowerLevel = 15); + void SetBlockLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_MiddleX, int a_MiddleY, int a_MiddleZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, BLOCKTYPE a_MiddeBlock, unsigned char a_PowerLevel = MAX_POWER_LEVEL); /** Marks a block as simulated, who should not be simulated further unless their power state changes, to accomodate a player manually toggling the block without triggering the simulator toggling it back */ void SetPlayerToggleableBlockAsSimulated(int a_BlockX, int a_BlockY, int a_BlockZ, bool WasLastStatePowered); /** Marks the second block in a direction as linked powered */ - void SetDirectionLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Direction, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel = 15); + void SetDirectionLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Direction, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel = MAX_POWER_LEVEL); /** Marks all blocks immediately surrounding a coordinate as powered */ - void SetAllDirsAsPowered(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_SourceBlock); + void SetAllDirsAsPowered(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_SourceBlock, unsigned char a_PowerLevel = MAX_POWER_LEVEL); /** Queues a repeater to be powered or unpowered */ void QueueRepeaterPowerChange(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta, bool ShouldPowerOn); From f9343a8490b50cb28a62c7327c0013da48ca2745 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Thu, 17 Apr 2014 13:15:35 +0200 Subject: [PATCH 117/188] Modified many things --- src/ClientHandle.cpp | 857 +---------------------------------- src/ClientHandle.h | 3 - src/Enchantments.cpp | 769 +++++++++++++++++++++++++++++++ src/Enchantments.h | 30 +- src/Item.cpp | 141 ++++++ src/Item.h | 7 + src/Protocol/Protocol125.cpp | 2 - src/UI/SlotArea.cpp | 66 ++- src/UI/Window.cpp | 41 +- src/UI/Window.h | 2 +- 10 files changed, 1000 insertions(+), 918 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 688441d39..a3d0501c3 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -31,8 +31,6 @@ #include "CompositeChat.h" #include "Items/ItemSword.h" -#include "FastRandom.h" - #include "md5/md5.h" @@ -2735,774 +2733,9 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) { cEnchantingWindow * Window = (cEnchantingWindow*)m_Player->GetWindow(); cItem Item = *Window->m_SlotArea->GetSlot(0, *m_Player); - - if (!cItem::IsEnchantable(Item.m_ItemType) && Item.m_ItemType != E_ITEM_BOOK) - { - return; - } - int BaseEnchantmentLevel = Window->GetPropertyValue(Enchantment); - // Step 1 from Enchanting - int Enchantability = 1; - - if (Item.m_ItemType == E_ITEM_WOODEN_SWORD || Item.m_ItemType == E_ITEM_WOODEN_PICKAXE || Item.m_ItemType == E_ITEM_WOODEN_SHOVEL || Item.m_ItemType == E_ITEM_WOODEN_AXE || Item.m_ItemType == E_ITEM_WOODEN_HOE) - { - Enchantability = 15; - } - else if (Item.m_ItemType == E_ITEM_LEATHER_CAP || Item.m_ItemType == E_ITEM_LEATHER_TUNIC || Item.m_ItemType == E_ITEM_LEATHER_PANTS || Item.m_ItemType == E_ITEM_LEATHER_BOOTS) - { - Enchantability = 15; - } - else if (Item.m_ItemType == E_ITEM_STONE_SWORD || Item.m_ItemType == E_ITEM_STONE_PICKAXE || Item.m_ItemType == E_ITEM_STONE_SHOVEL || Item.m_ItemType == E_ITEM_STONE_AXE || Item.m_ItemType == E_ITEM_STONE_HOE) - { - Enchantability = 5; - } - else if (Item.m_ItemType == E_ITEM_IRON_HELMET || Item.m_ItemType == E_ITEM_IRON_CHESTPLATE || Item.m_ItemType == E_ITEM_IRON_LEGGINGS || Item.m_ItemType == E_ITEM_IRON_BOOTS) - { - Enchantability = 9; - } - else if (Item.m_ItemType == E_ITEM_IRON_SWORD || Item.m_ItemType == E_ITEM_IRON_PICKAXE || Item.m_ItemType == E_ITEM_IRON_SHOVEL || Item.m_ItemType == E_ITEM_IRON_AXE || Item.m_ItemType == E_ITEM_IRON_HOE) - { - Enchantability = 14; - } - else if (Item.m_ItemType == E_ITEM_CHAIN_HELMET || Item.m_ItemType == E_ITEM_CHAIN_CHESTPLATE || Item.m_ItemType == E_ITEM_CHAIN_LEGGINGS || Item.m_ItemType == E_ITEM_CHAIN_BOOTS) - { - Enchantability = 12; - } - else if (Item.m_ItemType == E_ITEM_DIAMOND_HELMET || Item.m_ItemType == E_ITEM_DIAMOND_CHESTPLATE || Item.m_ItemType == E_ITEM_DIAMOND_LEGGINGS || Item.m_ItemType == E_ITEM_DIAMOND_BOOTS) - { - Enchantability = 10; - } - else if (Item.m_ItemType == E_ITEM_DIAMOND_SWORD || Item.m_ItemType == E_ITEM_DIAMOND_PICKAXE || Item.m_ItemType == E_ITEM_DIAMOND_SHOVEL || Item.m_ItemType == E_ITEM_DIAMOND_AXE || Item.m_ItemType == E_ITEM_DIAMOND_HOE) - { - Enchantability = 10; - } - else if (Item.m_ItemType == E_ITEM_GOLD_HELMET || Item.m_ItemType == E_ITEM_GOLD_CHESTPLATE || Item.m_ItemType == E_ITEM_GOLD_LEGGINGS || Item.m_ItemType == E_ITEM_GOLD_BOOTS) - { - Enchantability = 25; - } - else if (Item.m_ItemType == E_ITEM_GOLD_SWORD || Item.m_ItemType == E_ITEM_GOLD_PICKAXE || Item.m_ItemType == E_ITEM_GOLD_SHOVEL || Item.m_ItemType == E_ITEM_GOLD_AXE || Item.m_ItemType == E_ITEM_GOLD_HOE) - { - Enchantability = 22; - } - - cFastRandom Random; - int ModifiedEnchantmentLevel = BaseEnchantmentLevel + (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); - - // Step 2 and 3 from Enchanting - cEnchantmentsVector enchantments; - - if (ItemCategory::IsSword(Item.m_ItemType)) - { - // Sharpness - if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=4")); - } - else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=3")); - } - else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=1")); - } - - // Smite - if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=1")); - } - - // Bane of Arthropods - if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=1")); - } - - // Knockback - if (FinalEnchantmentLevel >= 25 && FinalEnchantmentLevel <= 75) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=1")); - } - - // Fire Aspect - if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=1")); - } - - // Looting - if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=3")); - } - else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=2")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=1")); - } - } - - else if (ItemCategory::IsTool(Item.m_ItemType)) - { - // Efficiency - if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 81) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=3")); - } - else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 61) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 51) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=1")); - } - - // Silk Touch - if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("SilkTouch=1")); - } - - // Fortune - if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=3")); - } - else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=2")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=1")); - } - } - - else if (ItemCategory::IsArmor(Item.m_ItemType)) - { - // Protection - if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=4")); - } - else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=3")); - } - else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=1")); - } - - // Fire Protection - if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 46) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=4")); - } - else if (FinalEnchantmentLevel >= 26 && FinalEnchantmentLevel <= 38) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=3")); - } - else if (FinalEnchantmentLevel >= 18 && FinalEnchantmentLevel <= 30) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 22) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=1")); - } - - // Blast Protection - if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 25) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 17) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=1")); - } - - // Projectile Protection - if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=4")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 30) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=3")); - } - else if (FinalEnchantmentLevel >= 9 && FinalEnchantmentLevel <= 24) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=2")); - } - else if (FinalEnchantmentLevel >= 3 && FinalEnchantmentLevel <= 18) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=1")); - } - - // Thorns - if (FinalEnchantmentLevel >= 50 && FinalEnchantmentLevel <= 100) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=3")); - } - else if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=1")); - } - - - if (ItemCategory::IsHelmet(Item.m_ItemType)) - { - // Respiration - if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 60) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=3")); - } - else if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 40) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=1")); - } - - // Aqua Affinity - if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("AquaAffinity=1")); - } - } - - else if (ItemCategory::IsBoots(Item.m_ItemType)) - { - // Feather Fall - if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=4")); - } - else if (FinalEnchantmentLevel >= 17 && FinalEnchantmentLevel <= 27) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=3")); - } - else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 21) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 15) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=1")); - } - } - } - - else if (Item.m_ItemType == E_ITEM_BOW) - { - // Power - if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 46) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=3")); - } - else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 26) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 16) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=1")); - } - - // Punch - if (FinalEnchantmentLevel >= 32 && FinalEnchantmentLevel <= 57) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=2")); - } - else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 37) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=1")); - } - - // Flame and Infinity - if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Flame=1")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Infinity=1")); - } - } - - else if (Item.m_ItemType == E_ITEM_FISHING_ROD) - { - // Luck of the Sea and Lure - if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=3")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=3")); - } - else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=2")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=2")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=1")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=1")); - } - } - - else if (Item.m_ItemType == E_ITEM_BOOK) - { - // All enchantments - - // Sharpness - if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=4")); - } - else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=3")); - } - else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Sharpness=1")); - } - - // Smite - if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Smite=1")); - } - - // Bane of Arthropods - if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 49) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 25) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("BaneOfArthropods=1")); - } - - // Knockback - if (FinalEnchantmentLevel >= 25 && FinalEnchantmentLevel <= 75) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Knockback=1")); - } - - // Fire Aspect - if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("FireAspect=1")); - } - - // Looting - if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=3")); - } - else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=2")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Looting=1")); - } - - // Efficiency - if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 81) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=3")); - } - else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 61) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 51) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Efficiency=1")); - } - - // Silk Touch - if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("SilkTouch=1")); - } - - // Fortune - if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=3")); - } - else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=2")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Fortune=1")); - } - - // Protection - if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 54) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=4")); - } - else if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 43) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=3")); - } - else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 32) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 21) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Protection=1")); - } - - // Fire Protection - if (FinalEnchantmentLevel >= 34 && FinalEnchantmentLevel <= 46) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=4")); - } - else if (FinalEnchantmentLevel >= 26 && FinalEnchantmentLevel <= 38) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=3")); - } - else if (FinalEnchantmentLevel >= 18 && FinalEnchantmentLevel <= 30) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 22) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FireProtection=1")); - } - - // Blast Protection - if (FinalEnchantmentLevel >= 29 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 25) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 17) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("BlastProtection=1")); - } - - // Projectile Protection - if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=4")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 30) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=3")); - } - else if (FinalEnchantmentLevel >= 9 && FinalEnchantmentLevel <= 24) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=2")); - } - else if (FinalEnchantmentLevel >= 3 && FinalEnchantmentLevel <= 18) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("ProjectileProtection=1")); - } - - // Thorns - if (FinalEnchantmentLevel >= 50 && FinalEnchantmentLevel <= 100) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=3")); - } - else if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 80) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 60) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("Thorns=1")); - } - - // Respiration - if (FinalEnchantmentLevel >= 30 && FinalEnchantmentLevel <= 60) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=3")); - } - else if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=2")); - } - else if (FinalEnchantmentLevel >= 10 && FinalEnchantmentLevel <= 40) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Respiration=1")); - } - - // Aqua Affinity - if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 41) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("AquaAffinity=1")); - } - - // Feather Fall - if (FinalEnchantmentLevel >= 23 && FinalEnchantmentLevel <= 33) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=4")); - } - else if (FinalEnchantmentLevel >= 17 && FinalEnchantmentLevel <= 27) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=3")); - } - else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 21) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 15) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("FeatherFalling=1")); - } - - // Power - if (FinalEnchantmentLevel >= 31 && FinalEnchantmentLevel <= 46) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=4")); - } - else if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 36) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=3")); - } - else if (FinalEnchantmentLevel >= 11 && FinalEnchantmentLevel <= 26) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=2")); - } - else if (FinalEnchantmentLevel >= 1 && FinalEnchantmentLevel <= 16) - { - AddEnchantmentWeight(enchantments, 10, cEnchantments("Power=1")); - } - - // Punch - if (FinalEnchantmentLevel >= 32 && FinalEnchantmentLevel <= 57) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=2")); - } - else if (FinalEnchantmentLevel >= 12 && FinalEnchantmentLevel <= 37) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Punch=1")); - } - - // Flame and Infinity - if (FinalEnchantmentLevel >= 20 && FinalEnchantmentLevel <= 50) - { - AddEnchantmentWeight(enchantments, 2, cEnchantments("Flame=1")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Infinity=1")); - } - - // Luck of the Sea and Lure - if (FinalEnchantmentLevel >= 33 && FinalEnchantmentLevel <= 83) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=3")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=3")); - } - else if (FinalEnchantmentLevel >= 24 && FinalEnchantmentLevel <= 74) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=2")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=2")); - } - else if (FinalEnchantmentLevel >= 15 && FinalEnchantmentLevel <= 65) - { - AddEnchantmentWeight(enchantments, 1, cEnchantments("LuckOfTheSea=1")); - AddEnchantmentWeight(enchantments, 1, cEnchantments("Lure=1")); - } - - Item.m_ItemType = E_ITEM_ENCHANTED_BOOK; - } - - // Unbreaking - if (FinalEnchantmentLevel >= 21 && FinalEnchantmentLevel <= 71) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=3")); - } - else if (FinalEnchantmentLevel >= 13 && FinalEnchantmentLevel <= 63) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=2")); - } - else if (FinalEnchantmentLevel >= 5 && FinalEnchantmentLevel <= 55) - { - AddEnchantmentWeight(enchantments, 5, cEnchantments("Unbreaking=1")); - } - - int RandomEnchantment1 = (int)floor(Random.NextFloat(1) * enchantments.size()); - cEnchantments Enchantment1 = enchantments[RandomEnchantment1]; - Item.m_Enchantments.AddFromString(Enchantment1.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment1), enchantments.end()); - - float NewEnchantmentLevel = (float)BaseEnchantmentLevel; - - // Next Enchantment (Second) - NewEnchantmentLevel = NewEnchantmentLevel / 2; - float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (Random.NextFloat(100) <= SecondEnchantmentChance) - { - // Checking for conflicting enchantments - CheckEnchantmentConflicts(enchantments, Enchantment1); - - if (enchantments.size() > 0) - { - int RandomEnchantment2 = (int)floor(Random.NextFloat(1) * enchantments.size()); - - cEnchantments Enchantment2 = enchantments[RandomEnchantment2]; - Item.m_Enchantments.AddFromString(Enchantment2.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment2), enchantments.end()); - - // Checking for conflicting enchantments - CheckEnchantmentConflicts(enchantments, Enchantment2); - } - } - - // Next Enchantment (Third) - NewEnchantmentLevel = NewEnchantmentLevel / 2; - float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (Random.NextFloat(100) <= ThirdEnchantmentChance) - { - if (enchantments.size() > 0) - { - int RandomEnchantment3 = (int)floor(Random.NextFloat(1) * enchantments.size()); - cEnchantments Enchantment3 = enchantments[RandomEnchantment3]; - Item.m_Enchantments.AddFromString(Enchantment3.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment3), enchantments.end()); - - // Checking for conflicting enchantments - CheckEnchantmentConflicts(enchantments, Enchantment3); - } - } - - // Next Enchantment (Fourth) - NewEnchantmentLevel = NewEnchantmentLevel / 2; - float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (Random.NextFloat(100) <= FourthEnchantmentChance) - { - if (enchantments.size() > 0) - { - int RandomEnchantment4 = (int)floor(Random.NextFloat(1) * enchantments.size()); - cEnchantments Enchantment4 = enchantments[RandomEnchantment4]; - Item.m_Enchantments.AddFromString(Enchantment4.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment4), enchantments.end()); - } - } - - if (m_Player->DeltaExperience(-m_Player->XpForLevel(Window->GetPropertyValue(Enchantment))) >= 0 || m_Player->IsGameModeCreative()) + if (Item.EnchantByXPLevels(BaseEnchantmentLevel, *m_Player, true, true)) { Window->m_SlotArea->SetSlot(0, *m_Player, Item); Window->SendSlot(*m_Player, Window->m_SlotArea, 0); @@ -3517,91 +2750,3 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) - -void cClientHandle::AddEnchantmentWeight(cEnchantmentsVector & a_Enchantments, int a_Weight, cEnchantments a_Enchantment) -{ - for (int i = 0; i < a_Weight; i++) - { - a_Enchantments.push_back(a_Enchantment); - } -} - - - - - -void cClientHandle::RemoveEnchantmentFromVector(cEnchantmentsVector * a_Enchantments, int a_EnchantmentID) -{ - for (cEnchantmentsVector::iterator it = a_Enchantments->begin(); it != a_Enchantments->end(); ++it) - { - int EnchantmentID = atoi(StringSplit((*it).ToString(), "=")[0].c_str()); - - if (EnchantmentID == a_EnchantmentID) - { - a_Enchantments->erase(std::remove(a_Enchantments->begin(), a_Enchantments->end(), *it), a_Enchantments->end()); - break; - } - } -} - - - - - -void cClientHandle::CheckEnchantmentConflicts(cEnchantmentsVector & a_Enchantments, cEnchantments a_FirstEnchantment) -{ - int FirstEnchantmentID = atoi(StringSplit(a_FirstEnchantment.ToString(), "=")[0].c_str()); - - if (FirstEnchantmentID == cEnchantments::enchProtection) - { - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchFireProtection); - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchBlastProtection); - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchProjectileProtection); - } - else if (FirstEnchantmentID == cEnchantments::enchFireProtection) - { - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchProtection); - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchBlastProtection); - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchProjectileProtection); - } - else if (FirstEnchantmentID == cEnchantments::enchBlastProtection) - { - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchProtection); - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchFireProtection); - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchProjectileProtection); - } - else if (FirstEnchantmentID == cEnchantments::enchProjectileProtection) - { - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchProtection); - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchFireProtection); - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchBlastProtection); - } - - else if (FirstEnchantmentID == cEnchantments::enchSharpness) - { - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchSmite); - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchBaneOfArthropods); - } - else if (FirstEnchantmentID == cEnchantments::enchSmite) - { - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchSharpness); - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchBaneOfArthropods); - } - else if (FirstEnchantmentID == cEnchantments::enchBaneOfArthropods) - { - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchSharpness); - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchSmite); - } - else if (FirstEnchantmentID == cEnchantments::enchSilkTouch) - { - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchFortune); - } - else if (FirstEnchantmentID == cEnchantments::enchFortune) - { - RemoveEnchantmentFromVector(&a_Enchantments, cEnchantments::enchSilkTouch); - } -} - - - - diff --git a/src/ClientHandle.h b/src/ClientHandle.h index 1829e3b4d..3d01d8034 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -248,9 +248,6 @@ public: /** Called when the player will enchant a Item */ void HandleEnchantItem(Byte & WindowID, Byte & Enchantment); - void AddEnchantmentWeight(cEnchantmentsVector & a_Enchantments, int a_Weight, cEnchantments a_Enchantment); - void RemoveEnchantmentFromVector(cEnchantmentsVector * a_Enchantments, int a_EnchantmentID); - void CheckEnchantmentConflicts(cEnchantmentsVector & a_Enchantments, cEnchantments a_FirstEnchantment); private: diff --git a/src/Enchantments.cpp b/src/Enchantments.cpp index 9d4e23e0a..3caebdff5 100644 --- a/src/Enchantments.cpp +++ b/src/Enchantments.cpp @@ -5,6 +5,7 @@ #include "Globals.h" #include "Enchantments.h" #include "WorldStorage/FastNBT.h" +#include "FastRandom.h" @@ -218,6 +219,774 @@ bool cEnchantments::operator !=(const cEnchantments & a_Other) const +void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantments, short & a_ItemType, int a_EnchantmentLevel) +{ + if (ItemCategory::IsSword(a_ItemType)) + { + // Sharpness + if (a_EnchantmentLevel >= 34 && a_EnchantmentLevel <= 54) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=4")); + } + else if (a_EnchantmentLevel >= 23 && a_EnchantmentLevel <= 43) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=3")); + } + else if (a_EnchantmentLevel >= 12 && a_EnchantmentLevel <= 32) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=2")); + } + else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 21) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=1")); + } + + // Smite + if (a_EnchantmentLevel >= 29 && a_EnchantmentLevel <= 49) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=4")); + } + else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 41) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=3")); + } + else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 33) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=2")); + } + else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 25) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=1")); + } + + // Bane of Arthropods + if (a_EnchantmentLevel >= 29 && a_EnchantmentLevel <= 49) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=4")); + } + else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 41) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=3")); + } + else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 33) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=2")); + } + else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 25) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=1")); + } + + // Knockback + if (a_EnchantmentLevel >= 25 && a_EnchantmentLevel <= 75) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Knockback=2")); + } + else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 55) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Knockback=1")); + } + + // Fire Aspect + if (a_EnchantmentLevel >= 30 && a_EnchantmentLevel <= 80) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("FireAspect=2")); + } + else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 60) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("FireAspect=1")); + } + + // Looting + if (a_EnchantmentLevel >= 33 && a_EnchantmentLevel <= 83) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Looting=3")); + } + else if (a_EnchantmentLevel >= 24 && a_EnchantmentLevel <= 74) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Looting=2")); + } + else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Looting=1")); + } + } + + else if (ItemCategory::IsTool(a_ItemType)) + { + // Efficiency + if (a_EnchantmentLevel >= 31 && a_EnchantmentLevel <= 81) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=4")); + } + else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 71) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=3")); + } + else if (a_EnchantmentLevel >= 11 && a_EnchantmentLevel <= 61) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=2")); + } + else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 51) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=1")); + } + + // Silk Touch + if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("SilkTouch=1")); + } + + // Fortune + if (a_EnchantmentLevel >= 33 && a_EnchantmentLevel <= 83) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Fortune=3")); + } + else if (a_EnchantmentLevel >= 24 && a_EnchantmentLevel <= 74) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Fortune=2")); + } + else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Fortune=1")); + } + } + + else if (ItemCategory::IsArmor(a_ItemType)) + { + // Protection + if (a_EnchantmentLevel >= 34 && a_EnchantmentLevel <= 54) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=4")); + } + else if (a_EnchantmentLevel >= 23 && a_EnchantmentLevel <= 43) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=3")); + } + else if (a_EnchantmentLevel >= 12 && a_EnchantmentLevel <= 32) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=2")); + } + else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 21) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=1")); + } + + // Fire Protection + if (a_EnchantmentLevel >= 34 && a_EnchantmentLevel <= 46) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=4")); + } + else if (a_EnchantmentLevel >= 26 && a_EnchantmentLevel <= 38) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=3")); + } + else if (a_EnchantmentLevel >= 18 && a_EnchantmentLevel <= 30) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=2")); + } + else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 22) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=1")); + } + + // Blast Protection + if (a_EnchantmentLevel >= 29 && a_EnchantmentLevel <= 41) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=4")); + } + else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 33) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=3")); + } + else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 25) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=2")); + } + else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 17) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=1")); + } + + // Projectile Protection + if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 36) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=4")); + } + else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 30) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=3")); + } + else if (a_EnchantmentLevel >= 9 && a_EnchantmentLevel <= 24) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=2")); + } + else if (a_EnchantmentLevel >= 3 && a_EnchantmentLevel <= 18) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=1")); + } + + // Thorns + if (a_EnchantmentLevel >= 50 && a_EnchantmentLevel <= 100) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Thorns=3")); + } + else if (a_EnchantmentLevel >= 30 && a_EnchantmentLevel <= 80) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Thorns=2")); + } + else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 60) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Thorns=1")); + } + + + if (ItemCategory::IsHelmet(a_ItemType)) + { + // Respiration + if (a_EnchantmentLevel >= 30 && a_EnchantmentLevel <= 60) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Respiration=3")); + } + else if (a_EnchantmentLevel >= 20 && a_EnchantmentLevel <= 50) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Respiration=2")); + } + else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 40) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Respiration=1")); + } + + // Aqua Affinity + if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 41) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("AquaAffinity=1")); + } + } + + else if (ItemCategory::IsBoots(a_ItemType)) + { + // Feather Fall + if (a_EnchantmentLevel >= 23 && a_EnchantmentLevel <= 33) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=4")); + } + else if (a_EnchantmentLevel >= 17 && a_EnchantmentLevel <= 27) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=3")); + } + else if (a_EnchantmentLevel >= 11 && a_EnchantmentLevel <= 21) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=2")); + } + else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 15) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=1")); + } + } + } + + else if (a_ItemType == E_ITEM_BOW) + { + // Power + if (a_EnchantmentLevel >= 31 && a_EnchantmentLevel <= 46) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=4")); + } + else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 36) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=3")); + } + else if (a_EnchantmentLevel >= 11 && a_EnchantmentLevel <= 26) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=2")); + } + else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 16) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=1")); + } + + // Punch + if (a_EnchantmentLevel >= 32 && a_EnchantmentLevel <= 57) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Punch=2")); + } + else if (a_EnchantmentLevel >= 12 && a_EnchantmentLevel <= 37) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Punch=1")); + } + + // Flame and Infinity + if (a_EnchantmentLevel >= 20 && a_EnchantmentLevel <= 50) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Flame=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Infinity=1")); + } + } + + else if (a_ItemType == E_ITEM_FISHING_ROD) + { + // Luck of the Sea and Lure + if (a_EnchantmentLevel >= 33 && a_EnchantmentLevel <= 83) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("LuckOfTheSea=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Lure=3")); + } + else if (a_EnchantmentLevel >= 24 && a_EnchantmentLevel <= 74) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("LuckOfTheSea=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Lure=2")); + } + else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("LuckOfTheSea=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Lure=1")); + } + } + + else if (a_ItemType == E_ITEM_BOOK) + { + // All &a_Enchantments + + // Sharpness + if (a_EnchantmentLevel >= 34 && a_EnchantmentLevel <= 54) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=4")); + } + else if (a_EnchantmentLevel >= 23 && a_EnchantmentLevel <= 43) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=3")); + } + else if (a_EnchantmentLevel >= 12 && a_EnchantmentLevel <= 32) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=2")); + } + else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 21) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=1")); + } + + // Smite + if (a_EnchantmentLevel >= 29 && a_EnchantmentLevel <= 49) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=4")); + } + else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 41) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=3")); + } + else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 33) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=2")); + } + else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 25) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=1")); + } + + // Bane of Arthropods + if (a_EnchantmentLevel >= 29 && a_EnchantmentLevel <= 49) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=4")); + } + else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 41) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=3")); + } + else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 33) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=2")); + } + else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 25) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=1")); + } + + // Knockback + if (a_EnchantmentLevel >= 25 && a_EnchantmentLevel <= 75) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Knockback=2")); + } + else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 55) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Knockback=1")); + } + + // Fire Aspect + if (a_EnchantmentLevel >= 30 && a_EnchantmentLevel <= 80) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("FireAspect=2")); + } + else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 60) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("FireAspect=1")); + } + + // Looting + if (a_EnchantmentLevel >= 33 && a_EnchantmentLevel <= 83) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Looting=3")); + } + else if (a_EnchantmentLevel >= 24 && a_EnchantmentLevel <= 74) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Looting=2")); + } + else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Looting=1")); + } + + // Efficiency + if (a_EnchantmentLevel >= 31 && a_EnchantmentLevel <= 81) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=4")); + } + else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 71) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=3")); + } + else if (a_EnchantmentLevel >= 11 && a_EnchantmentLevel <= 61) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=2")); + } + else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 51) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=1")); + } + + // Silk Touch + if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("SilkTouch=1")); + } + + // Fortune + if (a_EnchantmentLevel >= 33 && a_EnchantmentLevel <= 83) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Fortune=3")); + } + else if (a_EnchantmentLevel >= 24 && a_EnchantmentLevel <= 74) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Fortune=2")); + } + else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Fortune=1")); + } + + // Protection + if (a_EnchantmentLevel >= 34 && a_EnchantmentLevel <= 54) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=4")); + } + else if (a_EnchantmentLevel >= 23 && a_EnchantmentLevel <= 43) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=3")); + } + else if (a_EnchantmentLevel >= 12 && a_EnchantmentLevel <= 32) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=2")); + } + else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 21) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=1")); + } + + // Fire Protection + if (a_EnchantmentLevel >= 34 && a_EnchantmentLevel <= 46) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=4")); + } + else if (a_EnchantmentLevel >= 26 && a_EnchantmentLevel <= 38) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=3")); + } + else if (a_EnchantmentLevel >= 18 && a_EnchantmentLevel <= 30) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=2")); + } + else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 22) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=1")); + } + + // Blast Protection + if (a_EnchantmentLevel >= 29 && a_EnchantmentLevel <= 41) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=4")); + } + else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 33) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=3")); + } + else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 25) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=2")); + } + else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 17) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=1")); + } + + // Projectile Protection + if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 36) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=4")); + } + else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 30) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=3")); + } + else if (a_EnchantmentLevel >= 9 && a_EnchantmentLevel <= 24) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=2")); + } + else if (a_EnchantmentLevel >= 3 && a_EnchantmentLevel <= 18) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=1")); + } + + // Thorns + if (a_EnchantmentLevel >= 50 && a_EnchantmentLevel <= 100) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Thorns=3")); + } + else if (a_EnchantmentLevel >= 30 && a_EnchantmentLevel <= 80) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Thorns=2")); + } + else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 60) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Thorns=1")); + } + + // Respiration + if (a_EnchantmentLevel >= 30 && a_EnchantmentLevel <= 60) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Respiration=3")); + } + else if (a_EnchantmentLevel >= 20 && a_EnchantmentLevel <= 50) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Respiration=2")); + } + else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 40) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Respiration=1")); + } + + // Aqua Affinity + if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 41) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("AquaAffinity=1")); + } + + // Feather Fall + if (a_EnchantmentLevel >= 23 && a_EnchantmentLevel <= 33) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=4")); + } + else if (a_EnchantmentLevel >= 17 && a_EnchantmentLevel <= 27) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=3")); + } + else if (a_EnchantmentLevel >= 11 && a_EnchantmentLevel <= 21) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=2")); + } + else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 15) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=1")); + } + + // Power + if (a_EnchantmentLevel >= 31 && a_EnchantmentLevel <= 46) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=4")); + } + else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 36) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=3")); + } + else if (a_EnchantmentLevel >= 11 && a_EnchantmentLevel <= 26) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=2")); + } + else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 16) + { + AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=1")); + } + + // Punch + if (a_EnchantmentLevel >= 32 && a_EnchantmentLevel <= 57) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Punch=2")); + } + else if (a_EnchantmentLevel >= 12 && a_EnchantmentLevel <= 37) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Punch=1")); + } + + // Flame and Infinity + if (a_EnchantmentLevel >= 20 && a_EnchantmentLevel <= 50) + { + AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Flame=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Infinity=1")); + } + + // Luck of the Sea and Lure + if (a_EnchantmentLevel >= 33 && a_EnchantmentLevel <= 83) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("LuckOfTheSea=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Lure=3")); + } + else if (a_EnchantmentLevel >= 24 && a_EnchantmentLevel <= 74) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("LuckOfTheSea=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Lure=2")); + } + else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + { + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("LuckOfTheSea=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Lure=1")); + } + + a_ItemType = E_ITEM_ENCHANTED_BOOK; + } + + // Unbreaking + if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 71) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Unbreaking=3")); + } + else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 63) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Unbreaking=2")); + } + else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 55) + { + AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Unbreaking=1")); + } +} + + + + + +void cEnchantments::AddEnchantmentWeightToVector(cWeightedEnchantments * a_Enchantments, int a_Weight, cEnchantments a_Enchantment) +{ + cWeightedEnchantment enchantment; + enchantment.m_Weight = a_Weight; + enchantment.m_Enchantments = a_Enchantment; + a_Enchantments->push_back(enchantment); +} + + + + + +void cEnchantments::RemoveEnchantmentWeightFromVector(cWeightedEnchantments * a_Enchantments, int a_EnchantmentID) +{ + for (cWeightedEnchantments::iterator it = a_Enchantments->begin(); it != a_Enchantments->end(); ++it) + { + int EnchantmentID = atoi(StringSplit((*it).m_Enchantments.ToString(), "=")[0].c_str()); + + if (EnchantmentID == a_EnchantmentID) + { + a_Enchantments->erase(std::remove(a_Enchantments->begin(), a_Enchantments->end(), *it), a_Enchantments->end()); + break; + } + } +} + + + + + +void cEnchantments::CheckEnchantmentConflictsFromVector(cWeightedEnchantments & a_Enchantments, cEnchantments a_FirstEnchantment) +{ + int FirstEnchantmentID = atoi(StringSplit(a_FirstEnchantment.ToString(), "=")[0].c_str()); + + if (FirstEnchantmentID == cEnchantments::enchProtection) + { + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchBlastProtection); + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchProjectileProtection); + } + else if (FirstEnchantmentID == cEnchantments::enchFireProtection) + { + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchBlastProtection); + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchProjectileProtection); + } + else if (FirstEnchantmentID == cEnchantments::enchBlastProtection) + { + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchProjectileProtection); + } + else if (FirstEnchantmentID == cEnchantments::enchProjectileProtection) + { + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchBlastProtection); + } + + else if (FirstEnchantmentID == cEnchantments::enchSharpness) + { + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchSmite); + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchBaneOfArthropods); + } + else if (FirstEnchantmentID == cEnchantments::enchSmite) + { + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchSharpness); + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchBaneOfArthropods); + } + else if (FirstEnchantmentID == cEnchantments::enchBaneOfArthropods) + { + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchSharpness); + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchSmite); + } + else if (FirstEnchantmentID == cEnchantments::enchSilkTouch) + { + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchFortune); + } + else if (FirstEnchantmentID == cEnchantments::enchFortune) + { + RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchSilkTouch); + } +} + + + + + +cEnchantments cEnchantments::GetRandomEnchantmentFromVector(cWeightedEnchantments & a_Enchantments) +{ + cFastRandom Random; + + int AllWeights = 0; + for (cWeightedEnchantments::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) + { + AllWeights += (*it).m_Weight; + } + int RandomNumber = Random.GenerateRandomInteger(0, AllWeights - 1); + cEnchantments enchantment; + for (cWeightedEnchantments::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) + { + RandomNumber -= (*it).m_Weight; + if (RandomNumber < 0) + { + return (*it).m_Enchantments; + } + } +} + + + + + + diff --git a/src/Enchantments.h b/src/Enchantments.h index 70d6b6613..1d226330a 100644 --- a/src/Enchantments.h +++ b/src/Enchantments.h @@ -8,7 +8,9 @@ #pragma once +#include "Defines.h" #include "WorldStorage/EnchantmentSerializer.h" +#include "Entities/Player.h" @@ -29,7 +31,6 @@ Level value of 0 means no such enchantment, and it will not be stored in the m_E Serialization will never put zero-level enchantments into the stringspec and will always use numeric IDs. */ -typedef std::vector cEnchantmentsVector; // tolua_begin class cEnchantments @@ -94,9 +95,24 @@ public: /// Returns true if a_Other contains exactly the same enchantments and levels bool operator ==(const cEnchantments & a_Other) const; - + // tolua_end + + /** Add enchantment weights from item to the vector */ + static void AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantments, short & a_ItemType, int a_EnchantmentLevel); + + /** Add a enchantment weight to the vector */ + static void AddEnchantmentWeightToVector(cWeightedEnchantments * a_Enchantments, int a_Weight, cEnchantments a_Enchantment); + /** Remove a enchantment weight from the vector */ + static void RemoveEnchantmentWeightFromVector(cWeightedEnchantments * a_Enchantments, int a_EnchantmentID); + + /** Check enchantment conflicts from enchantments from the vector */ + static void CheckEnchantmentConflictsFromVector(cWeightedEnchantments & a_Enchantments, cEnchantments a_FirstEnchantment); + + /** Gets random enchantment from Vector and returns it */ + static cEnchantments GetRandomEnchantmentFromVector(cWeightedEnchantments & a_Enchantments); + /// Returns true if a_Other doesn't contain exactly the same enchantments and levels bool operator !=(const cEnchantments & a_Other) const; @@ -115,5 +131,15 @@ protected: } ; // tolua_export +/** Things below for the Enchanting System */ +struct cWeightedEnchantment +{ + int m_Weight; + cEnchantments m_Enchantments; +}; + +typedef std::vector cWeightedEnchantments; + + diff --git a/src/Item.cpp b/src/Item.cpp index 856b68be6..8bc25d242 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -5,6 +5,8 @@ #include "json/json.h" #include "Items/ItemHandler.h" +#include "FastRandom.h" + @@ -209,6 +211,145 @@ bool cItem::IsEnchantable(short item) +int cItem::GetEnchantability() +{ + int Enchantability = 0; + + if (m_ItemType == E_ITEM_WOODEN_SWORD || m_ItemType == E_ITEM_WOODEN_PICKAXE || m_ItemType == E_ITEM_WOODEN_SHOVEL || m_ItemType == E_ITEM_WOODEN_AXE || m_ItemType == E_ITEM_WOODEN_HOE) + { + Enchantability = 15; + } + else if (m_ItemType == E_ITEM_LEATHER_CAP || m_ItemType == E_ITEM_LEATHER_TUNIC || m_ItemType == E_ITEM_LEATHER_PANTS || m_ItemType == E_ITEM_LEATHER_BOOTS) + { + Enchantability = 15; + } + else if (m_ItemType == E_ITEM_STONE_SWORD || m_ItemType == E_ITEM_STONE_PICKAXE || m_ItemType == E_ITEM_STONE_SHOVEL || m_ItemType == E_ITEM_STONE_AXE || m_ItemType == E_ITEM_STONE_HOE) + { + Enchantability = 5; + } + else if (m_ItemType == E_ITEM_IRON_HELMET || m_ItemType == E_ITEM_IRON_CHESTPLATE || m_ItemType == E_ITEM_IRON_LEGGINGS || m_ItemType == E_ITEM_IRON_BOOTS) + { + Enchantability = 9; + } + else if (m_ItemType == E_ITEM_IRON_SWORD || m_ItemType == E_ITEM_IRON_PICKAXE || m_ItemType == E_ITEM_IRON_SHOVEL || m_ItemType == E_ITEM_IRON_AXE || m_ItemType == E_ITEM_IRON_HOE) + { + Enchantability = 14; + } + else if (m_ItemType == E_ITEM_CHAIN_HELMET || m_ItemType == E_ITEM_CHAIN_CHESTPLATE || m_ItemType == E_ITEM_CHAIN_LEGGINGS || m_ItemType == E_ITEM_CHAIN_BOOTS) + { + Enchantability = 12; + } + else if (m_ItemType == E_ITEM_DIAMOND_HELMET || m_ItemType == E_ITEM_DIAMOND_CHESTPLATE || m_ItemType == E_ITEM_DIAMOND_LEGGINGS || m_ItemType == E_ITEM_DIAMOND_BOOTS) + { + Enchantability = 10; + } + else if (m_ItemType == E_ITEM_DIAMOND_SWORD || m_ItemType == E_ITEM_DIAMOND_PICKAXE || m_ItemType == E_ITEM_DIAMOND_SHOVEL || m_ItemType == E_ITEM_DIAMOND_AXE || m_ItemType == E_ITEM_DIAMOND_HOE) + { + Enchantability = 10; + } + else if (m_ItemType == E_ITEM_GOLD_HELMET || m_ItemType == E_ITEM_GOLD_CHESTPLATE || m_ItemType == E_ITEM_GOLD_LEGGINGS || m_ItemType == E_ITEM_GOLD_BOOTS) + { + Enchantability = 25; + } + else if (m_ItemType == E_ITEM_GOLD_SWORD || m_ItemType == E_ITEM_GOLD_PICKAXE || m_ItemType == E_ITEM_GOLD_SHOVEL || m_ItemType == E_ITEM_GOLD_AXE || m_ItemType == E_ITEM_GOLD_HOE) + { + Enchantability = 22; + } + else if (m_ItemType == E_ITEM_FISHING_ROD || m_ItemType == E_ITEM_BOW || m_ItemType == E_ITEM_BOOK) + { + Enchantability = 1; + } + + return Enchantability; +} + + + + + +bool cItem::EnchantByXPLevels(int a_NumXPLevels, cPlayer & a_Player, bool a_BlockConflictingEnchantments, bool a_DeleteLevelFromPlayer) +{ + if (!cItem::IsEnchantable(m_ItemType) && m_ItemType != E_ITEM_BOOK) + { + return false; + } + + int Enchantability = GetEnchantability(); + + 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); + + cEnchantments Enchantment1 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + m_Enchantments.AddFromString(Enchantment1.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment1), enchantments.end()); + + // Checking for conflicting enchantments + cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment1); + + float NewEnchantmentLevel = (float)a_NumXPLevels; + + // Next Enchantment (Second) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if (Random.NextFloat(100) <= SecondEnchantmentChance) + { + if (enchantments.size() > 0) + { + cEnchantments Enchantment2 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + m_Enchantments.AddFromString(Enchantment2.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment2), enchantments.end()); + + // Checking for conflicting enchantments + cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment2); + } + } + + // Next Enchantment (Third) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if (Random.NextFloat(100) <= ThirdEnchantmentChance) + { + if (enchantments.size() > 0) + { + cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + m_Enchantments.AddFromString(Enchantment3.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment3), enchantments.end()); + + // Checking for conflicting enchantments + cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment3); + } + } + + // Next Enchantment (Fourth) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if (Random.NextFloat(100) <= FourthEnchantmentChance) + { + if (enchantments.size() > 0) + { + cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + m_Enchantments.AddFromString(Enchantment4.ToString()); + enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment4), enchantments.end()); + } + } + + if (a_Player.DeltaExperience(-a_Player.XpForLevel(a_NumXPLevels)) >= 0 || a_Player.IsGameModeCreative()) + { + return true; + } + + return false; +} + + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cItems: diff --git a/src/Item.h b/src/Item.h index 910ecb382..987dea2a9 100644 --- a/src/Item.h +++ b/src/Item.h @@ -175,6 +175,13 @@ public: /** Returns true if the specified item type is enchantable (as per 1.2.5 protocol requirements) */ static bool IsEnchantable(short a_ItemType); // tolua_export + /** Returns the enchantability of the item. When the item hasn't a enchantability, it will returns 0 */ + int GetEnchantability(); // tolua_export + + /** Enchants the item using the specified number of XP levels. + Returns true if item enchanted, false if not. */ + bool EnchantByXPLevels(int a_NumXPLevels, cPlayer & a_Player, bool a_BlockConflictingEnchantments, bool a_DeleteLevelFromPlayer); // tolua_export + // tolua_begin short m_ItemType; diff --git a/src/Protocol/Protocol125.cpp b/src/Protocol/Protocol125.cpp index 6cf611d90..9b8db0b7b 100644 --- a/src/Protocol/Protocol125.cpp +++ b/src/Protocol/Protocol125.cpp @@ -1646,8 +1646,6 @@ int cProtocol125::ParseEnchantItem(void) HANDLE_PACKET_READ(ReadByte, Byte, WindowID); HANDLE_PACKET_READ(ReadByte, Byte, Enchantment); - LOGWARN("Older Protocol: Enchantment Packet received!"); - m_Client->HandleEnchantItem(WindowID, Enchantment); return PARSE_OK; diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 621854518..26fdfe928 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -802,7 +802,7 @@ void cSlotAreaEnchanting::UpdateResult(cPlayer & a_Player) } else if (cItem::IsEnchantable(Item.m_ItemType) || Item.m_ItemType == E_ITEM_BOOK) { - int Bookshelves = GetBookshelvesCount(a_Player.GetWorld()); + int Bookshelves = std::min(GetBookshelvesCount(a_Player.GetWorld()), 15); cFastRandom Random; int base = (Random.GenerateRandomInteger(1, 8) + floor(Bookshelves / 2) + Random.GenerateRandomInteger(0, Bookshelves)); @@ -835,24 +835,58 @@ int cSlotAreaEnchanting::GetBookshelvesCount(cWorld * a_World) cBlockArea Area; Area.Read(a_World, PosX - 2, PosX + 2, PosY, PosY + 1, PosZ - 2, PosZ + 2); - for (int y = 0; y <= 2; y++) + static const struct { - for (int x = 0; x <= 4; x++) + int m_BookX, m_BookY, m_BookZ; // Coords to check for bookcases + int m_AirX, m_AirY, m_AirZ; // Coords to check for air; if not air, the bookcase won\'t be counted + } CheckCoords[] = + { + { 0, 0, 0, 1, 0, 1 }, // Bookcase at {0, 0, 0}, air at {1, 0, 1} + { 0, 0, 1, 1, 0, 1 }, // Bookcase at {0, 0, 1}, air at {1, 0, 1} + { 0, 0, 2, 1, 0, 2 }, // Bookcase at {0, 0, 2}, air at {1, 0, 2} + { 0, 0, 3, 1, 0, 3 }, // Bookcase at {0, 0, 3}, air at {1, 0, 3} + { 0, 0, 4, 1, 0, 3 }, // Bookcase at {0, 0, 4}, air at {1, 0, 3} + { 1, 0, 4, 1, 0, 3 }, // Bookcase at {1, 0, 4}, air at {1, 0, 3} + { 2, 0, 4, 2, 0, 3 }, // Bookcase at {2, 0, 4}, air at {2, 0, 3} + { 3, 0, 4, 3, 0, 3 }, // Bookcase at {3, 0, 4}, air at {3, 0, 3} + { 4, 0, 4, 3, 0, 3 }, // Bookcase at {4, 0, 4}, air at {3, 0, 3} + { 4, 0, 3, 3, 0, 3 }, // Bookcase at {4, 0, 3}, air at {3, 0, 3} + { 4, 0, 2, 3, 0, 2 }, // Bookcase at {4, 0, 2}, air at {3, 0, 2} + { 4, 0, 1, 3, 0, 1 }, // Bookcase at {4, 0, 1}, air at {3, 0, 1} + { 4, 0, 0, 3, 0, 1 }, // Bookcase at {4, 0, 0}, air at {3, 0, 1} + { 3, 0, 0, 3, 0, 1 }, // Bookcase at {3, 0, 0}, air at {3, 0, 1} + { 2, 0, 0, 2, 0, 1 }, // Bookcase at {2, 0, 0}, air at {2, 0, 1} + { 1, 0, 0, 1, 0, 1 }, // Bookcase at {1, 0, 0}, air at {1, 0, 1} + + { 0, 1, 0, 1, 1, 1 }, // Bookcase at {0, 1, 0}, air at {1, 1, 1} + { 0, 1, 1, 1, 1, 1 }, // Bookcase at {0, 1, 1}, air at {1, 1, 1} + { 0, 1, 2, 1, 1, 2 }, // Bookcase at {0, 1, 2}, air at {1, 1, 2} + { 0, 1, 3, 1, 1, 3 }, // Bookcase at {0, 1, 3}, air at {1, 1, 3} + { 0, 1, 4, 1, 1, 3 }, // Bookcase at {0, 1, 4}, air at {1, 1, 3} + { 1, 1, 4, 1, 1, 3 }, // Bookcase at {1, 1, 4}, air at {1, 1, 3} + { 2, 1, 4, 2, 1, 3 }, // Bookcase at {2, 1, 4}, air at {2, 1, 3} + { 3, 1, 4, 3, 1, 3 }, // Bookcase at {3, 1, 4}, air at {3, 1, 3} + { 4, 1, 4, 3, 1, 3 }, // Bookcase at {4, 1, 4}, air at {3, 1, 3} + { 4, 1, 3, 3, 1, 3 }, // Bookcase at {4, 1, 3}, air at {3, 1, 3} + { 4, 1, 2, 3, 1, 2 }, // Bookcase at {4, 1, 2}, air at {3, 1, 2} + { 4, 1, 1, 3, 1, 1 }, // Bookcase at {4, 1, 1}, air at {3, 1, 1} + { 4, 1, 0, 3, 1, 1 }, // Bookcase at {4, 1, 0}, air at {3, 1, 1} + { 3, 1, 0, 3, 1, 1 }, // Bookcase at {3, 1, 0}, air at {3, 1, 1} + { 2, 1, 0, 2, 1, 1 }, // Bookcase at {2, 1, 0}, air at {2, 1, 1} + { 1, 1, 0, 1, 1, 1 }, // Bookcase at {1, 1, 0}, air at {1, 1, 1} + }; + + for (size_t i = 0; i < ARRAYCOUNT(CheckCoords); i++) + { + 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 + ) { - for (int z = 0; z <= 4; z++) - { - if ((((x == 0) || (x == 4)) || ((z == 0) || (z == 4))) && ((y == 0) || y == 1)) - { - if (Area.GetRelBlockType(x, y, z) == E_BLOCK_BOOKCASE) - { - Bookshelves++; - } - } - } + Bookshelves++; } - } - - Bookshelves = std::min(Bookshelves, 15); + } // for i - CheckCoords + return Bookshelves; } diff --git a/src/UI/Window.cpp b/src/UI/Window.cpp index c7b9b6aaf..fffe0e3fd 100644 --- a/src/UI/Window.cpp +++ b/src/UI/Window.cpp @@ -824,18 +824,7 @@ cEnchantingWindow::cEnchantingWindow(int a_BlockX, int a_BlockY, int a_BlockZ) : void cEnchantingWindow::SetProperty(int a_Property, int a_Value) { - if (a_Property == 0) - { - m_PropertyValue0 = a_Value; - } - else if (a_Property == 1) - { - m_PropertyValue1 = a_Value; - } - else if (a_Property == 2) - { - m_PropertyValue2 = a_Value; - } + m_PropertyValue[a_Property] = a_Value; cCSLock Lock(m_CS); for (cPlayerList::iterator itr = m_OpenedBy.begin(), end = m_OpenedBy.end(); itr != end; ++itr) @@ -850,18 +839,7 @@ void cEnchantingWindow::SetProperty(int a_Property, int a_Value) void cEnchantingWindow::SetProperty(int a_Property, int a_Value, cPlayer & a_Player) { - if (a_Property == 0) - { - m_PropertyValue0 = a_Value; - } - else if (a_Property == 1) - { - m_PropertyValue1 = a_Value; - } - else if (a_Property == 2) - { - m_PropertyValue2 = a_Value; - } + m_PropertyValue[a_Property] = a_Value; a_Player.GetClientHandle()->SendWindowProperty(*this, a_Property, a_Value); } @@ -872,20 +850,7 @@ void cEnchantingWindow::SetProperty(int a_Property, int a_Value, cPlayer & a_Pla int cEnchantingWindow::GetPropertyValue(int a_Property) { - if (a_Property == 0) - { - return m_PropertyValue0; - } - else if (a_Property == 1) - { - return m_PropertyValue1; - } - else if (a_Property == 2) - { - return m_PropertyValue2; - } - - return -1; + return m_PropertyValue[a_Property]; } diff --git a/src/UI/Window.h b/src/UI/Window.h index 5e799248c..1ca67bfd8 100644 --- a/src/UI/Window.h +++ b/src/UI/Window.h @@ -249,7 +249,7 @@ public: cSlotArea * m_SlotArea; protected: - int m_PropertyValue0, m_PropertyValue1, m_PropertyValue2; + int m_PropertyValue[3]; int m_BlockX, m_BlockY, m_BlockZ; }; From 18c3b18a3fa1c2cfc14a321884744e5985383991 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Thu, 17 Apr 2014 13:02:20 +0100 Subject: [PATCH 118/188] Compile fix? --- SetFlags.cmake | 8 ++++++++ src/Simulator/IncrementalRedstoneSimulator.h | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/SetFlags.cmake b/SetFlags.cmake index c5a3a0697..6c974ea94 100644 --- a/SetFlags.cmake +++ b/SetFlags.cmake @@ -46,6 +46,10 @@ macro(set_flags) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11") else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++0x") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++0x") + add_flags_cxx("-pthread") endif() @@ -56,6 +60,10 @@ macro(set_flags) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++0x") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++0x") endif() # We use a signed char (fixes #640 on RasPi) diff --git a/src/Simulator/IncrementalRedstoneSimulator.h b/src/Simulator/IncrementalRedstoneSimulator.h index f52c50f9c..a42cce79a 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.h +++ b/src/Simulator/IncrementalRedstoneSimulator.h @@ -168,9 +168,9 @@ private: /** Returns if lever metadata marks it as emitting power */ - inline bool IsLeverOn(NIBBLETYPE a_BlockMeta); + bool IsLeverOn(NIBBLETYPE a_BlockMeta); /** Returns if button metadata marks it as emitting power */ - inline bool IsButtonOn(NIBBLETYPE a_BlockMeta) { return IsLeverOn(a_BlockMeta); } + bool IsButtonOn(NIBBLETYPE a_BlockMeta) { return IsLeverOn(a_BlockMeta); } /* ============================== */ /* ====== Misc Functions ====== */ From be091800f8a39024935b9692a7dae5964979d997 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Thu, 17 Apr 2014 17:31:29 +0200 Subject: [PATCH 119/188] Prefabs can have per-piece per-placement weights. Fixes #753. Also upgraded NetherFortPrefabs to lates Gallery contents. --- src/Generating/NetherFortGen.cpp | 9 + src/Generating/NetherFortGen.h | 1 + src/Generating/Prefab.cpp | 74 ++- src/Generating/Prefab.h | 68 +- src/Generating/Prefabs/NetherFortPrefabs.cpp | 632 ++++++++++++++++++- 5 files changed, 752 insertions(+), 32 deletions(-) diff --git a/src/Generating/NetherFortGen.cpp b/src/Generating/NetherFortGen.cpp index b6ec46986..7dc702e3a 100644 --- a/src/Generating/NetherFortGen.cpp +++ b/src/Generating/NetherFortGen.cpp @@ -258,6 +258,15 @@ cPieces cNetherFortGen::GetStartingPieces(void) +int cNetherFortGen::GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector, const cPiece & a_NewPiece) +{ + return ((const cPrefab &)a_NewPiece).GetPieceWeight(a_PlacedPiece, a_ExistingConnector); +} + + + + + void cNetherFortGen::PiecePlaced(const cPiece & a_Piece) { UNUSED(a_Piece); diff --git a/src/Generating/NetherFortGen.h b/src/Generating/NetherFortGen.h index 10ba01396..b82b6adf3 100644 --- a/src/Generating/NetherFortGen.h +++ b/src/Generating/NetherFortGen.h @@ -77,6 +77,7 @@ protected: // cPiecePool overrides: virtual cPieces GetPiecesWithConnector(int a_ConnectorType) override; virtual cPieces GetStartingPieces(void) override; + virtual int GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector, const cPiece & a_NewPiece) override; virtual void PiecePlaced(const cPiece & a_Piece) override; virtual void Reset(void) override; } ; diff --git a/src/Generating/Prefab.cpp b/src/Generating/Prefab.cpp index 131b6acb2..b1964e2a0 100644 --- a/src/Generating/Prefab.cpp +++ b/src/Generating/Prefab.cpp @@ -105,13 +105,17 @@ cPrefab::cPrefab(const cPrefab::sDef & a_Def) : m_Size(a_Def.m_SizeX, a_Def.m_SizeY, a_Def.m_SizeZ), m_HitBox(0, 0, 0, a_Def.m_SizeX - 1, a_Def.m_SizeY - 1, a_Def.m_SizeZ - 1), m_AllowedRotations(a_Def.m_AllowedRotations), - m_MergeStrategy(a_Def.m_MergeStrategy) + m_MergeStrategy(a_Def.m_MergeStrategy), + m_ShouldExtendFloor(a_Def.m_ShouldExtendFloor), + m_DefaultWeight(a_Def.m_DefaultWeight), + m_AddWeightIfSame(a_Def.m_AddWeightIfSame) { m_BlockArea[0].Create(m_Size); CharMap cm; ParseCharMap(cm, a_Def.m_CharMap); ParseBlockImage(cm, a_Def.m_Image); ParseConnectors(a_Def.m_Connectors); + ParseDepthWeight(a_Def.m_DepthWeight); // 1 CCW rotation: if ((m_AllowedRotations & 0x01) != 0) @@ -170,6 +174,26 @@ bool cPrefab::HasConnectorType(int a_ConnectorType) const +int cPrefab::GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector) const +{ + // Use the default or per-depth weight: + cDepthWeight::const_iterator itr = m_DepthWeight.find(a_PlacedPiece.GetDepth() + 1); + int res = (itr == m_DepthWeight.end()) ? m_DefaultWeight : itr->second; + + // If the piece is the same as the parent, apply the m_AddWeightIfSame modifier: + const cPiece * ParentPiece = &a_PlacedPiece.GetPiece(); + const cPiece * ThisPiece = this; + if (ThisPiece == ParentPiece) + { + res += m_AddWeightIfSame; + } + return res; +} + + + + + void cPrefab::ParseCharMap(CharMap & a_CharMapOut, const char * a_CharMapDef) { ASSERT(a_CharMapDef != NULL); @@ -277,6 +301,54 @@ void cPrefab::ParseConnectors(const char * a_ConnectorsDef) +void cPrefab::ParseDepthWeight(const char * a_DepthWeightDef) +{ + // The member needn't be defined at all, if so, skip: + if (a_DepthWeightDef == NULL) + { + return; + } + + // Split into individual records: "Record | Record | Record" + AStringVector Defs = StringSplitAndTrim(a_DepthWeightDef, "|"); + + // Add each record's contents: + for (AStringVector::const_iterator itr = Defs.begin(), end = Defs.end(); itr != end; ++itr) + { + // Split into components: "Depth : Weight" + AStringVector Components = StringSplitAndTrim(*itr, ":"); + if (Components.size() != 2) + { + LOGWARNING("Bad prefab DepthWeight record: \"%s\", skipping.", itr->c_str()); + continue; + } + + // Parse depth: + int Depth = atoi(Components[0].c_str()); + if ((Depth == 0) && (Components[0] != "0")) + { + LOGWARNING("Bad prefab DepthWeight record, cannot parse depth \"%s\", skipping.", Components[0].c_str()); + continue; + } + + // Parse weight: + int Weight = atoi(Components[1].c_str()); + if ((Weight == 0) && (Components[1] != "0")) + { + LOGWARNING("Bad prefab DepthWeight record, cannot parse weight \"%s\", skipping.", Components[1].c_str()); + continue; + } + + // Save to map: + ASSERT(m_DepthWeight.find(Depth) == m_DepthWeight.end()); // Not a duplicate + m_DepthWeight[Depth] = Weight; + } // for itr - Defs[] +} + + + + + cPiece::cConnectors cPrefab::GetConnectors(void) const { return m_Connectors; diff --git a/src/Generating/Prefab.h b/src/Generating/Prefab.h index 04c4f09da..dbf882e21 100644 --- a/src/Generating/Prefab.h +++ b/src/Generating/Prefab.h @@ -37,11 +37,47 @@ public: int m_SizeX; int m_SizeY; int m_SizeZ; + + /** The mapping between characters in m_Image and the blocktype / blockmeta. + Format: "Char: BlockType: BlockMeta \n Char: BlockType : BlockMeta \n ..." */ const char * m_CharMap; + + /** The actual image to be used for the prefab. Organized YZX (Y changes the least often). + Each character represents a single block, the type is mapped through m_CharMap. */ const char * m_Image; + + /** List of connectors. + Format: "Type: X, Y, Z : Direction \n Type : X, Y, Z : Direction \n ...". + Type is an arbitrary number, Direction is the BlockFace constant value (0 .. 5). */ const char * m_Connectors; + + /** Bitmask specifying the allowed rotations. + N rotations CCW are allowed if bit N is set. */ int m_AllowedRotations; + + /** The merge strategy to use while drawing the prefab. */ cBlockArea::eMergeStrategy m_MergeStrategy; + + /** If set to true, the prefab will extend its lowermost blocks until a solid block is found, + thus creating a foundation for the prefab. This is used for houses to be "on the ground", as well as + nether fortresses not to float. */ + bool m_ShouldExtendFloor; + + /** Chance of this piece being used, if no other modifier is active. */ + int m_DefaultWeight; + + /** Chances of this piece being used, per depth of the generated piece tree. + The starting piece has a depth of 0, the pieces connected to it are depth 1, etc. + The specified depth stands for the depth of the new piece (not the existing already-placed piece), + so valid depths start at 1. + Format: "Depth : Weight | Depth : Weight | Depth : Weight ..." + Depths that are not specified will use the m_DefaultWeight value. */ + const char * m_DepthWeight; + + /** The weight to add to this piece's base per-depth chance if the previous piece is the same. + Can be positive or negative. + This is used e. g. to make nether bridges prefer spanning multiple segments or to penalize turrets next to each other. */ + int m_AddWeightIfSame; }; cPrefab(const sDef & a_Def); @@ -51,6 +87,10 @@ public: /** Returns true if the prefab has any connector of the specified type. */ bool HasConnectorType(int a_ConnectorType) const; + + /** Returns the weight (chance) of this prefab generating as the next piece after the specified placed piece. + PiecePool implementations can use this for their GetPieceWeight() implementations. */ + int GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector) const; protected: /** Packs complete definition of a single block, for per-letter assignment. */ @@ -60,9 +100,12 @@ protected: NIBBLETYPE m_BlockMeta; }; - /** Maps letters in the sDef::m_Image onto a number, BlockType * 16 | BlockMeta */ + /** Maps letters in the sDef::m_Image onto a sBlockTypeDef block type definition. */ typedef sBlockTypeDef CharMap[256]; + /** Maps generator tree depth to weight. */ + typedef std::map cDepthWeight; + /** The cBlockArea that contains the block definitions for the prefab. The index identifies the number of CCW rotations applied (0 = no rotation, 1 = 1 CCW rotation, ...). */ @@ -82,6 +125,26 @@ protected: /** The merge strategy to use when drawing the prefab into a block area */ cBlockArea::eMergeStrategy m_MergeStrategy; + + /** If set to true, the prefab will extend its lowermost blocks until a solid block is found, + thus creating a foundation for the prefab. This is used for houses to be "on the ground", as well as + nether fortresses not to float. */ + bool m_ShouldExtendFloor; + + /** Chance of this piece being used, if no other modifier is active. */ + int m_DefaultWeight; + + /** Chances of this piece being used, per depth of the generated piece tree. + The starting piece has a depth of 0, the pieces connected to it are depth 1, etc. + The specified depth stands for the depth of the new piece (not the existing already-placed piece), + so valid depths start at 1. + Depths that are not specified will use the m_DefaultWeight value. */ + cDepthWeight m_DepthWeight; + + /** The weight to add to this piece's base per-depth chance if the previous piece is the same. + Can be positive or negative. + This is used e. g. to make nether bridges prefer spanning multiple segments or to penalize turrets next to each other. */ + int m_AddWeightIfSame; // cPiece overrides: @@ -98,6 +161,9 @@ protected: /** Parses the connectors definition text into m_Connectors member. */ void ParseConnectors(const char * a_ConnectorsDef); + + /** Parses the per-depth weight into m_DepthWeight member. */ + void ParseDepthWeight(const char * a_DepthWeightDef); }; diff --git a/src/Generating/Prefabs/NetherFortPrefabs.cpp b/src/Generating/Prefabs/NetherFortPrefabs.cpp index 164bd9557..7a46df5d8 100644 --- a/src/Generating/Prefabs/NetherFortPrefabs.cpp +++ b/src/Generating/Prefabs/NetherFortPrefabs.cpp @@ -133,10 +133,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 0, 2, 2: 4\n" /* Type 1, direction X- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 20, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // BalconyCorridor @@ -274,10 +286,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 0, 2, 4: 4\n" /* Type 1, direction X- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 20, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // BalconyTee2 @@ -378,10 +402,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "0: 0, 1, 3: 4\n" /* Type 0, direction X- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // BlazePlatform @@ -510,10 +546,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "0: 0, 5, 3: 4\n" /* Type 0, direction X- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // BlazePlatformOverhang @@ -694,10 +742,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "0: 7, 5, 14: 3\n" /* Type 0, direction Z+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 5, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // BridgeCircleCrossing @@ -879,10 +939,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "0: 14, 5, 7: 5\n" /* Type 0, direction X+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 10, + + // DepthWeight: + "1:1000", + + // AddWeightIfSame: + 0, }, // BridgeCrossing @@ -957,10 +1029,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "0: 0, 5, 2: 4\n" /* Type 0, direction X- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "1:0", + + // AddWeightIfSame: + 0, }, // BridgeCrumble1 @@ -1041,10 +1125,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 0, 5, 2: 4\n" /* Type 1, direction X- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "1:0", + + // AddWeightIfSame: + 0, }, // BridgeCrumble2 @@ -1204,14 +1300,262 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "0: 2, 4, 15: 3\n" /* Type 0, direction Z+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 10, + + // DepthWeight: + "", + + // AddWeightIfSame: + 1000, }, // BridgeDoubleCrumble + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // BridgeFunnelDown: + // The data has been exported from the gallery Nether, area index 0, ID 2, created by Aloe_vera + { + // Size: + 15, 12, 12, // SizeX = 15, SizeY = 12, SizeZ = 12 + + // Block definitions: + ".: 0: 0\n" /* air */ + "a:112: 0\n" /* netherbrick */ + "b:114: 6\n" /* netherbrickstairs */ + "c:114: 4\n" /* netherbrickstairs */ + "d:114: 5\n" /* netherbrickstairs */ + "e: 44:14\n" /* step */ + "f:114: 7\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, + + // Block data: + // Level 0 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aammmmmmmmmmmaa" + /* 2 */ "aammmmmmmmmmmaa" + /* 3 */ "aammmmmmmmmmmaa" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmmm" + /* 7 */ "mmmmmmmmmmmmmmm" + /* 8 */ "mmmmmmmmmmmmmmm" + /* 9 */ "mmmmmmaaammmmmm" + /* 10 */ "mmmmmmaaammmmmm" + /* 11 */ "mmmmmmaaammmmmm" + + // Level 1 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aammmmmmmmmmmaa" + /* 2 */ "aammmmmmmmmmmaa" + /* 3 */ "aammmmmmmmmmmaa" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmmm" + /* 7 */ "mmmmmmmmmmmmmmm" + /* 8 */ "mmmmmmbbbmmmmmm" + /* 9 */ "mmmmmmaaammmmmm" + /* 10 */ "mmmmmmaaammmmmm" + /* 11 */ "mmmmmmaaammmmmm" + + // Level 2 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aammmmmmmmmmmaa" + /* 2 */ "aammmmmmmmmmmaa" + /* 3 */ "aammmmmmmmmmmaa" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmmm" + /* 7 */ "mmmmmcbbbdmmmmm" + /* 8 */ "mmmmmcaaadmmmmm" + /* 9 */ "mmmmmcaaadmmmmm" + /* 10 */ "mmmmmcaaadmmmmm" + /* 11 */ "mmmmmcaaadmmmmm" + + // Level 3 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aammmmmmmmmmmaa" + /* 2 */ "aammmmmmmmmmmaa" + /* 3 */ "aammmmmmmmmmmaa" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmmm" + /* 7 */ "mmmmmaaaaammmmm" + /* 8 */ "mmmmmaaaaammmmm" + /* 9 */ "mmmmmaaaaammmmm" + /* 10 */ "mmmmmaaaaammmmm" + /* 11 */ "mmmmmaaaaammmmm" + + // Level 4 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aammmmmmmmmmmaa" + /* 2 */ "aammmmmmmmmmmaa" + /* 3 */ "aammmmmmmmmmmaa" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "mmmmcbbbbbdmmmm" + /* 7 */ "mmmmaaaaaaammmm" + /* 8 */ "mmmma.....ammmm" + /* 9 */ "mmmmaa...aammmm" + /* 10 */ "mmmmma...ammmmm" + /* 11 */ "mmmmma...ammmmm" + + // Level 5 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aadmmmmmmmmmcaa" + /* 2 */ "aadmmmmmmmmmcaa" + /* 3 */ "aadmmmmmmmmmcaa" + /* 4 */ "mmmmmmmmmmmmmmm" + /* 5 */ "mmmcbbbbbbbdmmm" + /* 6 */ "mmmaaaaaaaaaamm" + /* 7 */ "mmma.......ammm" + /* 8 */ "mmmaa.....aammm" + /* 9 */ "mmmmam...mammmm" + /* 10 */ "mmmmmm...mmmmmm" + /* 11 */ "mmmmmm...mmmmmm" + + // Level 6 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "aaademmmmmecaaa" + /* 2 */ "aaademmmmmecaaa" + /* 3 */ "aaademmmmmecaaa" + /* 4 */ "mmaaabbbbbaaaam" + /* 5 */ "mmaaaaaaaaaaaam" + /* 6 */ "mma.........amm" + /* 7 */ "mmaa.......aamm" + /* 8 */ "mmmam.....mammm" + /* 9 */ "mmmmmm...mmmmmm" + /* 10 */ "mmmmmm...mmmmmm" + /* 11 */ "mmmmmm...mmmmmm" + + // Level 7 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "bbbbbbbbbbbbbbb" + /* 1 */ "aaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaa" + /* 4 */ "faaaaaaaaaaaaaa" + /* 5 */ "ma...........am" + /* 6 */ "maa.........aam" + /* 7 */ "mmam.......mamm" + /* 8 */ "mmmmm.....mmmmm" + /* 9 */ "mmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmm" + + // Level 8 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaa" + /* 4 */ "a.............a" + /* 5 */ "aa...........aa" + /* 6 */ "mam.........mam" + /* 7 */ "mmmm.......mmmm" + /* 8 */ "mmmmmmmmmmmmmmm" + /* 9 */ "mmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmm" + + // Level 9 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "aaaaaaaaaaaaaaa" + /* 1 */ "..............." + /* 2 */ "..............." + /* 3 */ "..............." + /* 4 */ "a.............a" + /* 5 */ "am............a" + /* 6 */ "mmm.........mmm" + /* 7 */ "mmmmmmmmmmmmmmm" + /* 8 */ "mmmmmmmmmmmmmmm" + /* 9 */ "mmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmm" + + // Level 10 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "..............." + /* 2 */ "..............." + /* 3 */ "..............." + /* 4 */ "m.............m" + /* 5 */ "mm............m" + /* 6 */ "mmmmmmmmmmmmmmm" + /* 7 */ "mmmmmmmmmmmmmmm" + /* 8 */ "mmmmmmmmmmmmmmm" + /* 9 */ "mmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmm" + + // Level 11 + /* z\x* 11111 */ + /* * 012345678901234 */ + /* 0 */ "mmmmmmmmmmmmmmm" + /* 1 */ "..............." + /* 2 */ "..............." + /* 3 */ "..............." + /* 4 */ "m.............m" + /* 5 */ "mmmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmmm" + /* 7 */ "mmmmmmmmmmmmmmm" + /* 8 */ "mmmmmmmmmmmmmmm" + /* 9 */ "mmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmm", + + // Connectors: + "0: 7, 4, 11: 3\n" /* Type 0, direction Z+ */ + "0: 0, 9, 2: 4\n" /* Type 0, direction X- */ + "0: 14, 9, 2: 5\n" /* Type 0, direction X+ */, + + // AllowedRotations: + 7, /* 1, 2, 3 CCW rotation allowed */ + + // Merge strategy: + cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 5, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, + }, // BridgeFunnelDown + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // BridgeLevelCrossing: // The data has been exported from the gallery Nether, area index 45, ID 304, created by Aloe_vera @@ -1514,10 +1858,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "", // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // BridgeLevelCrossing @@ -1617,10 +1973,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "0: 14, 5, 2: 5\n" /* Type 0, direction X+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 500, + + // DepthWeight: + "", + + // AddWeightIfSame: + 1000, }, // BridgeSegment @@ -1761,10 +2129,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "0: 14, 5, 2: 5\n" /* Type 0, direction X+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 10, + + // DepthWeight: + "1:500", + + // AddWeightIfSame: + 0, }, // BridgeTee @@ -1844,10 +2224,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 0, 1, 2: 4\n" /* Type 1, direction X- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 200, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // Corridor11 @@ -1927,10 +2319,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 0, 1, 2: 4\n" /* Type 1, direction X- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 200, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // Corridor13 @@ -2048,10 +2452,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 10, 1, 2: 5\n" /* Type 1, direction X+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // CorridorCorner5 @@ -2170,10 +2586,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 2, 1, 10: 3\n" /* Type 1, direction Z+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // CorridorCornerChest5 @@ -2304,10 +2732,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 8, 8, 2: 5\n" /* Type 1, direction X+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // CorridorStairs @@ -2367,11 +2807,11 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Level 4 /* z\x* 1111 */ /* * 01234567890123 */ - /* 0 */ "aaaaaaaaaaaaaa" + /* 0 */ "aabaaaaaaaabaa" /* 1 */ ".............." /* 2 */ ".............." /* 3 */ ".............." - /* 4 */ "aaaaaaaaaaaaaa" + /* 4 */ "aabaaaaaaaabaa" // Level 5 /* z\x* 1111 */ @@ -2387,10 +2827,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 13, 1, 2: 5\n" /* Type 1, direction X+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // DarkCorridor @@ -2625,10 +3077,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 9, 1, 0: 2\n" /* Type 1, direction Z- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // LavaStaircase @@ -2938,10 +3402,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 0, 9, 7: 4\n" /* Type 1, direction X- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // LavaStaircaseBig @@ -3200,10 +3676,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "", // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // LavaStairsBridge @@ -3370,10 +3858,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 0, 1, 6: 4\n" /* Type 1, direction X- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // MidStaircase @@ -3497,10 +3997,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "0: 3, 1, 0: 2\n" /* Type 0, direction Z- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // StairsToOpen1 @@ -3624,10 +4136,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "0: 3, 1, 0: 2\n" /* Type 0, direction Z- */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // StairsToOpen2 @@ -3722,10 +4246,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 12, 1, 4: 5\n" /* Type 1, direction X+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // Tee2x4 @@ -3832,10 +4368,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "1: 12, 1, 6: 5\n" /* Type 1, direction X+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // Tee4x4 @@ -3921,10 +4469,22 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "0: 3, 1, 6: 3\n" /* Type 0, direction Z+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + -99, }, // Turret }; // g_NetherFortPrefabs @@ -4108,10 +4668,22 @@ const cPrefab::sDef g_NetherFortStartingPrefabs[] = "1: 6, 1, 12: 3\n" /* Type 1, direction Z+ */, // AllowedRotations: - 7, /* 1, 2, 3 CCW rotations */ + 7, /* 1, 2, 3 CCW rotation allowed */ // Merge strategy: cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, }, // CentralRoom }; From afb20132fe966efa1b90ee9497b6881a5b8df25c Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Thu, 17 Apr 2014 17:50:52 +0200 Subject: [PATCH 120/188] Added Prefab initializers to SELFTEST code. --- src/Generating/Prefab.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Generating/Prefab.cpp b/src/Generating/Prefab.cpp index b1964e2a0..69bea69e8 100644 --- a/src/Generating/Prefab.cpp +++ b/src/Generating/Prefab.cpp @@ -91,7 +91,19 @@ static const cPrefab::sDef g_TestPrefabDef = 7, /* 1, 2, 3 CCW rotations */ // Merge strategy: - cBlockArea::msImprint + cBlockArea::msImprint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 10, + + // DepthWeight: + "", + + // AddWeightIfSame: + 1000, }; static cPrefab g_TestPrefab(g_TestPrefabDef); From 0086fcfef18db58f3a4509853399c0a9b610e950 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Thu, 17 Apr 2014 19:31:43 +0200 Subject: [PATCH 121/188] Fixed some Errors (not all) --- src/ClientHandle.cpp | 17 ++++++++++------- src/Enchantments.h | 13 ++++++++----- src/Item.cpp | 9 ++------- src/Item.h | 2 +- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index a3d0501c3..eab306a0c 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2735,15 +2735,18 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) cItem Item = *Window->m_SlotArea->GetSlot(0, *m_Player); int BaseEnchantmentLevel = Window->GetPropertyValue(Enchantment); - if (Item.EnchantByXPLevels(BaseEnchantmentLevel, *m_Player, true, true)) + if (Item.EnchantByXPLevels(BaseEnchantmentLevel)) { - Window->m_SlotArea->SetSlot(0, *m_Player, Item); - Window->SendSlot(*m_Player, Window->m_SlotArea, 0); - Window->BroadcastWholeWindow(); + if (m_Player->IsGameModeCreative() | m_Player->DeltaExperience(-m_Player->XpForLevel(BaseEnchantmentLevel)) >= 0) + { + Window->m_SlotArea->SetSlot(0, *m_Player, Item); + Window->SendSlot(*m_Player, Window->m_SlotArea, 0); + Window->BroadcastWholeWindow(); - Window->SetProperty(0, 0, *m_Player); - Window->SetProperty(1, 0, *m_Player); - Window->SetProperty(2, 0, *m_Player); + Window->SetProperty(0, 0, *m_Player); + Window->SetProperty(1, 0, *m_Player); + Window->SetProperty(2, 0, *m_Player); + } } } diff --git a/src/Enchantments.h b/src/Enchantments.h index 1d226330a..fa07dc2d4 100644 --- a/src/Enchantments.h +++ b/src/Enchantments.h @@ -20,6 +20,11 @@ class cFastNBTWriter; class cParsedNBT; +// fwd: +struct cWeightedEnchantment; + +typedef std::vector cWeightedEnchantments; + @@ -111,7 +116,6 @@ public: /** Gets random enchantment from Vector and returns it */ static cEnchantments GetRandomEnchantmentFromVector(cWeightedEnchantments & a_Enchantments); - /// Returns true if a_Other doesn't contain exactly the same enchantments and levels bool operator !=(const cEnchantments & a_Other) const; @@ -131,15 +135,14 @@ protected: } ; // tolua_export -/** Things below for the Enchanting System */ + + +// Define the cWeightedEnchantment struct: struct cWeightedEnchantment { int m_Weight; cEnchantments m_Enchantments; }; -typedef std::vector cWeightedEnchantments; - - diff --git a/src/Item.cpp b/src/Item.cpp index 8bc25d242..540725492 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -267,7 +267,7 @@ int cItem::GetEnchantability() -bool cItem::EnchantByXPLevels(int a_NumXPLevels, cPlayer & a_Player, bool a_BlockConflictingEnchantments, bool a_DeleteLevelFromPlayer) +bool cItem::EnchantByXPLevels(int a_NumXPLevels) { if (!cItem::IsEnchantable(m_ItemType) && m_ItemType != E_ITEM_BOOK) { @@ -338,12 +338,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels, cPlayer & a_Player, bool a_Bloc } } - if (a_Player.DeltaExperience(-a_Player.XpForLevel(a_NumXPLevels)) >= 0 || a_Player.IsGameModeCreative()) - { - return true; - } - - return false; + return true; } diff --git a/src/Item.h b/src/Item.h index 987dea2a9..00316c188 100644 --- a/src/Item.h +++ b/src/Item.h @@ -180,7 +180,7 @@ public: /** Enchants the item using the specified number of XP levels. Returns true if item enchanted, false if not. */ - bool EnchantByXPLevels(int a_NumXPLevels, cPlayer & a_Player, bool a_BlockConflictingEnchantments, bool a_DeleteLevelFromPlayer); // tolua_export + bool EnchantByXPLevels(int a_NumXPLevels); // tolua_export // tolua_begin From bdea8706d8050ba3ea00b580bba795bc468cfdbd Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Thu, 17 Apr 2014 18:50:25 +0100 Subject: [PATCH 122/188] Added new AI rules + Added new AI rules handling cacti and large heights * Fixed cIniFile not recognising comments in cIniFile::ReadFile() * Fixed users.ini not being properly generated * Changed all instances of (int)floor(GetPosXXX()) to POSXXX_TOINT --- lib/inifile/iniFile.cpp | 5 +++-- src/Entities/Entity.cpp | 2 +- src/Entities/Entity.h | 3 ++- src/Entities/Minecart.cpp | 38 +++++++++++++++++++------------------- src/Entities/Player.cpp | 32 ++++++++++++++------------------ src/Mobs/Monster.cpp | 36 +++++++++++++++++++++++++----------- src/Mobs/Monster.h | 4 ++-- 7 files changed, 66 insertions(+), 54 deletions(-) diff --git a/lib/inifile/iniFile.cpp b/lib/inifile/iniFile.cpp index cf8b63987..19db9723a 100644 --- a/lib/inifile/iniFile.cpp +++ b/lib/inifile/iniFile.cpp @@ -154,7 +154,7 @@ bool cIniFile::ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect) case ';': case '#': { - if (names.size() == 0) + if (names.empty()) { AddHeaderComment(line.substr(pLeft + 1)); } @@ -168,8 +168,9 @@ bool cIniFile::ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect) } // while (getline()) f.close(); - if (names.size() == 0) + if (keys.empty() && names.empty() && comments.empty()) { + // File be empty or unreadable, equivalent to nonexistant return false; } diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 8ef45f1a5..7d9039479 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -806,7 +806,7 @@ void cEntity::TickBurning(cChunk & a_Chunk) int MaxRelX = (int)floor(GetPosX() + m_Width / 2) - a_Chunk.GetPosX() * cChunkDef::Width; int MinRelZ = (int)floor(GetPosZ() - m_Width / 2) - a_Chunk.GetPosZ() * cChunkDef::Width; int MaxRelZ = (int)floor(GetPosZ() + m_Width / 2) - a_Chunk.GetPosZ() * cChunkDef::Width; - int MinY = std::max(0, std::min(cChunkDef::Height - 1, (int)floor(GetPosY()))); + int MinY = std::max(0, std::min(cChunkDef::Height - 1, POSY_TOINT)); int MaxY = std::max(0, std::min(cChunkDef::Height - 1, (int)ceil (GetPosY() + m_Height))); bool HasWater = false; bool HasLava = false; diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h index 6e3f8292b..8fa5a2e42 100644 --- a/src/Entities/Entity.h +++ b/src/Entities/Entity.h @@ -118,7 +118,8 @@ public: BURN_TICKS = 200, ///< How long to keep an entity burning after it has stood in lava / fire MAX_AIR_LEVEL = 300, ///< Maximum air an entity can have DROWNING_TICKS = 20, ///< Number of ticks per heart of damage - VOID_BOUNDARY = -46 ///< At what position Y to begin applying void damage + VOID_BOUNDARY = -46, ///< At what position Y to begin applying void damage + FALL_DAMAGE_HEIGHT = 4 ///< At what position Y fall damage is applied } ; cEntity(eEntityType a_EntityType, double a_X, double a_Y, double a_Z, double a_Width, double a_Height); diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp index 7f38aa35a..6db13231d 100644 --- a/src/Entities/Minecart.cpp +++ b/src/Entities/Minecart.cpp @@ -132,7 +132,7 @@ void cMinecart::HandlePhysics(float a_Dt, cChunk & a_Chunk) return; } - int PosY = (int)floor(GetPosY()); + int PosY = POSY_TOINT; if ((PosY <= 0) || (PosY >= cChunkDef::Height)) { // Outside the world, just process normal falling physics @@ -141,8 +141,8 @@ void cMinecart::HandlePhysics(float a_Dt, cChunk & a_Chunk) return; } - int RelPosX = (int)floor(GetPosX()) - a_Chunk.GetPosX() * cChunkDef::Width; - int RelPosZ = (int)floor(GetPosZ()) - a_Chunk.GetPosZ() * cChunkDef::Width; + int RelPosX = POSX_TOINT - a_Chunk.GetPosX() * cChunkDef::Width; + int RelPosZ = POSZ_TOINT - a_Chunk.GetPosZ() * cChunkDef::Width; cChunk * Chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(RelPosX, RelPosZ); if (Chunk == NULL) { @@ -195,7 +195,7 @@ void cMinecart::HandlePhysics(float a_Dt, cChunk & a_Chunk) super::HandlePhysics(a_Dt, *Chunk); } - if (m_bIsOnDetectorRail && !Vector3i((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ())).Equals(m_DetectorRailPosition)) + if (m_bIsOnDetectorRail && !Vector3i(POSX_TOINT, POSY_TOINT, POSZ_TOINT).Equals(m_DetectorRailPosition)) { m_World->SetBlock(m_DetectorRailPosition.x, m_DetectorRailPosition.y, m_DetectorRailPosition.z, E_BLOCK_DETECTOR_RAIL, m_World->GetBlockMeta(m_DetectorRailPosition) & 0x07); m_bIsOnDetectorRail = false; @@ -203,7 +203,7 @@ void cMinecart::HandlePhysics(float a_Dt, cChunk & a_Chunk) else if (WasDetectorRail) { m_bIsOnDetectorRail = true; - m_DetectorRailPosition = Vector3i((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ())); + m_DetectorRailPosition = Vector3i(POSX_TOINT, POSY_TOINT, POSZ_TOINT); } // Broadcast positioning changes to client @@ -719,11 +719,11 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta) { if (GetSpeedZ() > 0) { - BLOCKTYPE Block = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)ceil(GetPosZ())); + BLOCKTYPE Block = m_World->GetBlock(POSX_TOINT, POSY_TOINT, (int)ceil(GetPosZ())); if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block)) { // We could try to detect a block in front based purely on coordinates, but xoft made a bounding box system - why not use? :P - cBoundingBox bbBlock(Vector3d((int)floor(GetPosX()), (int)floor(GetPosY()), (int)ceil(GetPosZ())), 0.5, 1); + cBoundingBox bbBlock(Vector3d(POSX_TOINT, POSY_TOINT, (int)ceil(GetPosZ())), 0.5, 1); cBoundingBox bbMinecart(Vector3d(GetPosX(), floor(GetPosY()), GetPosZ()), GetWidth() / 2, GetHeight()); if (bbBlock.DoesIntersect(bbMinecart)) @@ -736,10 +736,10 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta) } else if (GetSpeedZ() < 0) { - BLOCKTYPE Block = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) - 1); + BLOCKTYPE Block = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT - 1); if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block)) { - cBoundingBox bbBlock(Vector3d((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) - 1), 0.5, 1); + cBoundingBox bbBlock(Vector3d(POSX_TOINT, POSY_TOINT, POSZ_TOINT - 1), 0.5, 1); cBoundingBox bbMinecart(Vector3d(GetPosX(), floor(GetPosY()), GetPosZ() - 1), GetWidth() / 2, GetHeight()); if (bbBlock.DoesIntersect(bbMinecart)) @@ -756,10 +756,10 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta) { if (GetSpeedX() > 0) { - BLOCKTYPE Block = m_World->GetBlock((int)ceil(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ())); + BLOCKTYPE Block = m_World->GetBlock((int)ceil(GetPosX()), POSY_TOINT, POSZ_TOINT); if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block)) { - cBoundingBox bbBlock(Vector3d((int)ceil(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ())), 0.5, 1); + cBoundingBox bbBlock(Vector3d((int)ceil(GetPosX()), POSY_TOINT, POSZ_TOINT), 0.5, 1); cBoundingBox bbMinecart(Vector3d(GetPosX(), floor(GetPosY()), GetPosZ()), GetWidth() / 2, GetHeight()); if (bbBlock.DoesIntersect(bbMinecart)) @@ -772,10 +772,10 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta) } else if (GetSpeedX() < 0) { - BLOCKTYPE Block = m_World->GetBlock((int)floor(GetPosX()) - 1, (int)floor(GetPosY()), (int)floor(GetPosZ())); + BLOCKTYPE Block = m_World->GetBlock(POSX_TOINT - 1, POSY_TOINT, POSZ_TOINT); if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block)) { - cBoundingBox bbBlock(Vector3d((int)floor(GetPosX()) - 1, (int)floor(GetPosY()), (int)floor(GetPosZ())), 0.5, 1); + cBoundingBox bbBlock(Vector3d(POSX_TOINT - 1, POSY_TOINT, POSZ_TOINT), 0.5, 1); cBoundingBox bbMinecart(Vector3d(GetPosX() - 1, floor(GetPosY()), GetPosZ()), GetWidth() / 2, GetHeight()); if (bbBlock.DoesIntersect(bbMinecart)) @@ -793,10 +793,10 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta) case E_META_RAIL_CURVED_ZP_XM: case E_META_RAIL_CURVED_ZP_XP: { - BLOCKTYPE BlockXM = m_World->GetBlock((int)floor(GetPosX()) - 1, (int)floor(GetPosY()), (int)floor(GetPosZ())); - BLOCKTYPE BlockXP = m_World->GetBlock((int)floor(GetPosX()) + 1, (int)floor(GetPosY()), (int)floor(GetPosZ())); - BLOCKTYPE BlockZM = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) + 1); - BLOCKTYPE BlockZP = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) + 1); + BLOCKTYPE BlockXM = m_World->GetBlock(POSX_TOINT - 1, POSY_TOINT, POSZ_TOINT); + BLOCKTYPE BlockXP = m_World->GetBlock(POSX_TOINT + 1, POSY_TOINT, POSZ_TOINT); + BLOCKTYPE BlockZM = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT + 1); + BLOCKTYPE BlockZP = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT + 1); if ( (!IsBlockRail(BlockXM) && cBlockInfo::IsSolid(BlockXM)) || (!IsBlockRail(BlockXP) && cBlockInfo::IsSolid(BlockXP)) || @@ -805,7 +805,7 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta) ) { SetSpeed(0, 0, 0); - SetPosition((int)floor(GetPosX()) + 0.5, GetPosY(), (int)floor(GetPosZ()) + 0.5); + SetPosition(POSX_TOINT + 0.5, GetPosY(), POSZ_TOINT + 0.5); return true; } break; @@ -822,7 +822,7 @@ bool cMinecart::TestEntityCollision(NIBBLETYPE a_RailMeta) { cMinecartCollisionCallback MinecartCollisionCallback(GetPosition(), GetHeight(), GetWidth(), GetUniqueID(), ((m_Attachee == NULL) ? -1 : m_Attachee->GetUniqueID())); int ChunkX, ChunkZ; - cChunkDef::BlockToChunk((int)floor(GetPosX()), (int)floor(GetPosZ()), ChunkX, ChunkZ); + cChunkDef::BlockToChunk(POSX_TOINT, POSZ_TOINT, ChunkX, ChunkZ); m_World->ForEachEntityInChunk(ChunkX, ChunkZ, MinecartCollisionCallback); if (!MinecartCollisionCallback.FoundIntersection()) diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index 7f2e5b4c2..7cea46e03 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -437,7 +437,7 @@ void cPlayer::SetTouchGround(bool a_bTouchGround) cWorld * World = GetWorld(); if ((GetPosY() >= 0) && (GetPosY() < cChunkDef::Height)) { - BLOCKTYPE BlockType = World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ())); + BLOCKTYPE BlockType = World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT); if (BlockType != E_BLOCK_AIR) { m_bTouchGround = true; @@ -466,7 +466,7 @@ void cPlayer::SetTouchGround(bool a_bTouchGround) TakeDamage(dtFalling, NULL, Damage, Damage, 0); // Fall particles - GetWorld()->BroadcastSoundParticleEffect(2006, (int)floor(GetPosX()), (int)GetPosY() - 1, (int)floor(GetPosZ()), Damage /* Used as particle effect speed modifier */); + GetWorld()->BroadcastSoundParticleEffect(2006, POSX_TOINT, (int)GetPosY() - 1, POSZ_TOINT, Damage /* Used as particle effect speed modifier */); } m_LastGroundHeight = (float)GetPosY(); @@ -1519,22 +1519,16 @@ void cPlayer::LoadPermissionsFromDisk() cIniFile IniFile; if (IniFile.ReadFile("users.ini")) { - std::string Groups = IniFile.GetValue(m_PlayerName, "Groups", ""); - if (!Groups.empty()) + AString Groups = IniFile.GetValueSet(m_PlayerName, "Groups", "Default"); + AStringVector Split = StringSplitAndTrim(Groups, ","); + + for (AStringVector::const_iterator itr = Split.begin(), end = Split.end(); itr != end; ++itr) { - AStringVector Split = StringSplitAndTrim(Groups, ","); - for (AStringVector::const_iterator itr = Split.begin(), end = Split.end(); itr != end; ++itr) + if (!cRoot::Get()->GetGroupManager()->ExistsGroup(*itr)) { - if (!cRoot::Get()->GetGroupManager()->ExistsGroup(*itr)) - { - LOGWARNING("The group %s for player %s was not found!", itr->c_str(), m_PlayerName.c_str()); - } - AddToGroup(*itr); + LOGWARNING("The group %s for player %s was not found!", itr->c_str(), m_PlayerName.c_str()); } - } - else - { - AddToGroup("Default"); + AddToGroup(*itr); } AString Color = IniFile.GetValue(m_PlayerName, "Color", "-"); @@ -1546,8 +1540,10 @@ void cPlayer::LoadPermissionsFromDisk() else { cGroupManager::GenerateDefaultUsersIni(IniFile); + IniFile.AddValue("Groups", m_PlayerName, "Default"); AddToGroup("Default"); } + IniFile.WriteFile("users.ini"); ResolvePermissions(); } @@ -1899,9 +1895,9 @@ void cPlayer::ApplyFoodExhaustionFromMovement() void cPlayer::Detach() { super::Detach(); - int PosX = (int)floor(GetPosX()); - int PosY = (int)floor(GetPosY()); - int PosZ = (int)floor(GetPosZ()); + int PosX = POSX_TOINT; + int PosY = POSY_TOINT; + int PosZ = POSZ_TOINT; // Search for a position within an area to teleport player after detachment // Position must be solid land, and occupied by a nonsolid block diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index 171097aba..d63758b3d 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -111,9 +111,9 @@ void cMonster::SpawnOn(cClientHandle & a_Client) void cMonster::TickPathFinding() { - const int PosX = (int)floor(GetPosX()); - const int PosY = (int)floor(GetPosY()); - const int PosZ = (int)floor(GetPosZ()); + const int PosX = POSX_TOINT; + const int PosY = POSY_TOINT; + const int PosZ = POSZ_TOINT; m_FinalDestination.y = (double)FindFirstNonAirBlockPosition(m_FinalDestination.x, m_FinalDestination.z); @@ -148,13 +148,27 @@ void cMonster::TickPathFinding() BLOCKTYPE BlockAtY = m_World->GetBlock(gCrossCoords[i].x + PosX, PosY, gCrossCoords[i].z + PosZ); BLOCKTYPE BlockAtYP = m_World->GetBlock(gCrossCoords[i].x + PosX, PosY + 1, gCrossCoords[i].z + PosZ); BLOCKTYPE BlockAtYPP = m_World->GetBlock(gCrossCoords[i].x + PosX, PosY + 2, gCrossCoords[i].z + PosZ); - BLOCKTYPE BlockAtYM = m_World->GetBlock(gCrossCoords[i].x + PosX, PosY - 1, gCrossCoords[i].z + PosZ); + int LowestY = FindFirstNonAirBlockPosition(gCrossCoords[i].x + PosX, gCrossCoords[i].z + PosZ); + BLOCKTYPE BlockAtLowestY = m_World->GetBlock(gCrossCoords[i].x + PosX, LowestY, gCrossCoords[i].z + PosZ); - if ((!cBlockInfo::IsSolid(BlockAtY)) && (!cBlockInfo::IsSolid(BlockAtYP)) && (!IsBlockLava(BlockAtYM)) && (BlockAtY != E_BLOCK_FENCE) && (BlockAtY != E_BLOCK_FENCE_GATE)) + if ( + (!cBlockInfo::IsSolid(BlockAtY)) && + (!cBlockInfo::IsSolid(BlockAtYP)) && + (!IsBlockLava(BlockAtLowestY)) && + (BlockAtLowestY != E_BLOCK_CACTUS) && + (PosY - LowestY < FALL_DAMAGE_HEIGHT) + ) { m_PotentialCoordinates.push_back(Vector3d((gCrossCoords[i].x + PosX), PosY, gCrossCoords[i].z + PosZ)); } - else if ((cBlockInfo::IsSolid(BlockAtY)) && (!cBlockInfo::IsSolid(BlockAtYP)) && (!cBlockInfo::IsSolid(BlockAtYPP)) && (!IsBlockLava(BlockAtYM)) && (BlockAtY != E_BLOCK_FENCE) && (BlockAtY != E_BLOCK_FENCE_GATE)) + else if ( + (cBlockInfo::IsSolid(BlockAtY)) && + (BlockAtY != E_BLOCK_CACTUS) && + (!cBlockInfo::IsSolid(BlockAtYP)) && + (!cBlockInfo::IsSolid(BlockAtYPP)) && + (BlockAtY != E_BLOCK_FENCE) && + (BlockAtY != E_BLOCK_FENCE_GATE) + ) { m_PotentialCoordinates.push_back(Vector3d((gCrossCoords[i].x + PosX), PosY + 1, gCrossCoords[i].z + PosZ)); } @@ -402,7 +416,7 @@ void cMonster::HandleFalling() GetWorld()->BroadcastSoundParticleEffect(2006, POSX_TOINT, POSY_TOINT - 1, POSZ_TOINT, Damage /* Used as particle effect speed modifier */); } - m_LastGroundHeight = (int)floor(GetPosY()); + m_LastGroundHeight = POSY_TOINT; } } @@ -411,7 +425,7 @@ void cMonster::HandleFalling() int cMonster::FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ) { - int PosY = (int)floor(GetPosY()); + int PosY = POSY_TOINT; if (PosY < 0) PosY = 0; @@ -969,15 +983,15 @@ void cMonster::HandleDaylightBurning(cChunk & a_Chunk) return; } - int RelY = (int)floor(GetPosY()); + int RelY = POSY_TOINT; if ((RelY < 0) || (RelY >= cChunkDef::Height)) { // Outside the world return; } - int RelX = (int)floor(GetPosX()) - GetChunkX() * cChunkDef::Width; - int RelZ = (int)floor(GetPosZ()) - GetChunkZ() * cChunkDef::Width; + int RelX = POSX_TOINT - GetChunkX() * cChunkDef::Width; + int RelZ = POSZ_TOINT - GetChunkZ() * cChunkDef::Width; if (!a_Chunk.IsLightValid()) { diff --git a/src/Mobs/Monster.h b/src/Mobs/Monster.h index 776426a0d..70b3783fc 100644 --- a/src/Mobs/Monster.h +++ b/src/Mobs/Monster.h @@ -185,14 +185,14 @@ protected: inline bool IsNextYPosReachable(int a_PosY) { return ( - (a_PosY <= (int)floor(GetPosY())) || + (a_PosY <= POSY_TOINT) || DoesPosYRequireJump(a_PosY) ); } /** Returns if a monster can reach a given height by jumping */ inline bool DoesPosYRequireJump(int a_PosY) { - return ((a_PosY > (int)floor(GetPosY())) && (a_PosY == (int)floor(GetPosY()) + 1)); + return ((a_PosY > POSY_TOINT) && (a_PosY == POSY_TOINT + 1)); } /** A semi-temporary list to store the traversed coordinates during active pathfinding so we don't visit them again */ From 6779010242bbdda5582706f93baaef1f288d5742 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Thu, 17 Apr 2014 22:03:13 +0200 Subject: [PATCH 123/188] Added area flooring. Fixes #743. --- src/Generating/Prefab.cpp | 43 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/Generating/Prefab.cpp b/src/Generating/Prefab.cpp index 69bea69e8..7d1762036 100644 --- a/src/Generating/Prefab.cpp +++ b/src/Generating/Prefab.cpp @@ -158,12 +158,53 @@ cPrefab::cPrefab(const cPrefab::sDef & a_Def) : void cPrefab::Draw(cChunkDesc & a_Dest, const cPlacedPiece * a_Placement) const { + // Draw the basic image: Vector3i Placement = a_Placement->GetCoords(); int ChunkStartX = a_Dest.GetChunkX() * cChunkDef::Width; int ChunkStartZ = a_Dest.GetChunkZ() * cChunkDef::Width; Placement.Move(-ChunkStartX, 0, -ChunkStartZ); - a_Dest.WriteBlockArea(m_BlockArea[a_Placement->GetNumCCWRotations()], Placement.x, Placement.y, Placement.z, m_MergeStrategy); + const cBlockArea & Image = m_BlockArea[a_Placement->GetNumCCWRotations()]; + a_Dest.WriteBlockArea(Image, Placement.x, Placement.y, Placement.z, m_MergeStrategy); + // If requested, draw the floor (from the bottom of the prefab down to the nearest non-air) + int MaxX = Image.GetSizeX(); + int MaxZ = Image.GetSizeZ(); + for (int z = 0; z < MaxZ; z++) + { + int RelZ = Placement.z + z; + if ((RelZ < 0) || (RelZ >= cChunkDef::Width)) + { + // Z coord outside the chunk + continue; + } + for (int x = 0; x < MaxX; x++) + { + int RelX = Placement.x + x; + if ((RelX < 0) || (RelX >= cChunkDef::Width)) + { + // X coord outside the chunk + continue; + } + BLOCKTYPE BlockType; + NIBBLETYPE BlockMeta; + Image.GetRelBlockTypeMeta(x, 0, z, BlockType, BlockMeta); + if ((BlockType == E_BLOCK_AIR) || (BlockType == E_BLOCK_SPONGE)) + { + // Do not expand air nor sponge blocks + continue; + } + for (int y = Placement.y - 1; y >= 0; y--) + { + BLOCKTYPE ExistingBlock = a_Dest.GetBlockType(RelX, y, RelZ); + if (ExistingBlock != E_BLOCK_AIR) + { + // End the expansion for this column, reached the end + break; + } + a_Dest.SetBlockTypeMeta(RelX, y, RelZ, BlockType, BlockMeta); + } // for y + } // for x + } // for z } From 193dcca1e3a0de170366693ea25eb5a7d3671b91 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 18 Apr 2014 09:36:11 +0200 Subject: [PATCH 124/188] Removed unsupported C++11 features. --- .../IncrementalRedstoneSimulator.cpp | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/Simulator/IncrementalRedstoneSimulator.cpp b/src/Simulator/IncrementalRedstoneSimulator.cpp index 1bedf7e5e..d37d2eecf 100644 --- a/src/Simulator/IncrementalRedstoneSimulator.cpp +++ b/src/Simulator/IncrementalRedstoneSimulator.cpp @@ -1428,15 +1428,21 @@ bool cIncrementalRedstoneSimulator::IsWirePowered(int a_BlockX, int a_BlockY, in { a_PowerLevel = 0; - for (auto itr = m_PoweredBlocks->cbegin(); itr != m_PoweredBlocks->cend(); ++itr) // Check powered list + for (PoweredBlocksList::const_iterator itr = m_PoweredBlocks->begin(); itr != m_PoweredBlocks->end(); ++itr) // Check powered list { - if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; } + if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) + { + continue; + } a_PowerLevel = std::max(a_PowerLevel, itr->a_PowerLevel); } - for (auto itr = m_LinkedPoweredBlocks->cbegin(); itr != m_LinkedPoweredBlocks->cend(); ++itr) // Check linked powered list + for (LinkedBlocksList::const_iterator itr = m_LinkedPoweredBlocks->begin(); itr != m_LinkedPoweredBlocks->end(); ++itr) // Check linked powered list { - if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) { continue; } + if (!itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ))) + { + continue; + } a_PowerLevel = std::max(a_PowerLevel, itr->a_PowerLevel); } @@ -1592,13 +1598,13 @@ void cIncrementalRedstoneSimulator::SetBlockPowered(int a_BlockX, int a_BlockY, return; } - auto Powered = m_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ)->GetRedstoneSimulatorPoweredBlocksList(); - for (auto itr = Powered->begin(); itr != Powered->end(); ++itr) // Check powered list + PoweredBlocksList * Powered = m_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ)->GetRedstoneSimulatorPoweredBlocksList(); + for (PoweredBlocksList::iterator itr = Powered->begin(); itr != Powered->end(); ++itr) // Check powered list { if ( itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)) && itr->a_SourcePos.Equals(Vector3i(a_SourceX, a_SourceY, a_SourceZ)) - ) + ) { // Check for duplicates, update power level if everything else the same but either way, don't add a new listing if (itr->a_PowerLevel != a_PowerLevel) @@ -1609,13 +1615,13 @@ void cIncrementalRedstoneSimulator::SetBlockPowered(int a_BlockX, int a_BlockY, } } - auto OtherPowered = m_Chunk->GetNeighborChunk(a_SourceX, a_SourceZ)->GetRedstoneSimulatorPoweredBlocksList(); - for (auto itr = OtherPowered->cbegin(); itr != OtherPowered->cend(); ++itr) // Check powered list + PoweredBlocksList * OtherPowered = m_Chunk->GetNeighborChunk(a_SourceX, a_SourceZ)->GetRedstoneSimulatorPoweredBlocksList(); + for (PoweredBlocksList::const_iterator itr = OtherPowered->begin(); itr != OtherPowered->end(); ++itr) // Check powered list { if ( itr->a_BlockPos.Equals(Vector3i(a_SourceX, a_SourceY, a_SourceZ)) && itr->a_SourcePos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)) - ) + ) { // Powered wires try to power their source - don't let them! return; @@ -1651,14 +1657,14 @@ void cIncrementalRedstoneSimulator::SetBlockLinkedPowered( return; } - auto Linked = m_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ)->GetRedstoneSimulatorLinkedBlocksList(); - for (auto itr = Linked->begin(); itr != Linked->end(); ++itr) // Check linked powered list + LinkedBlocksList * Linked = m_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ)->GetRedstoneSimulatorLinkedBlocksList(); + for (LinkedBlocksList::iterator itr = Linked->begin(); itr != Linked->end(); ++itr) // Check linked powered list { if ( itr->a_BlockPos.Equals(Vector3i(a_BlockX, a_BlockY, a_BlockZ)) && itr->a_MiddlePos.Equals(Vector3i(a_MiddleX, a_MiddleY, a_MiddleZ)) && itr->a_SourcePos.Equals(Vector3i(a_SourceX, a_SourceY, a_SourceZ)) - ) + ) { // Check for duplicates, update power level if everything else the same but either way, don't add a new listing if (itr->a_PowerLevel != a_PowerLevel) From 200ea6254c28b73d419001ea1be7d2d4d1d1ee88 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 18 Apr 2014 12:54:17 +0100 Subject: [PATCH 125/188] Fixed #904 --- src/Mobs/Monster.cpp | 2 +- src/World.cpp | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index d63758b3d..27bd28045 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -540,7 +540,7 @@ void cMonster::KilledBy(cEntity * a_Killer) break; } } - if (a_Killer != NULL) + if ((a_Killer != NULL) && (!IsBaby()) { m_World->SpawnExperienceOrb(GetPosX(), GetPosY(), GetPosZ(), Reward); } diff --git a/src/World.cpp b/src/World.cpp index c23e255f8..800bdde0e 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -1691,6 +1691,11 @@ int cWorld::SpawnFallingBlock(int a_X, int a_Y, int a_Z, BLOCKTYPE BlockType, NI int cWorld::SpawnExperienceOrb(double a_X, double a_Y, double a_Z, int a_Reward) { + if (a_Reward < 1) + { + return -1; + } + cExpOrb * ExpOrb = new cExpOrb(a_X, a_Y, a_Z, a_Reward); ExpOrb->Initialize(this); return ExpOrb->GetUniqueID(); From 6cb63a768dd2356d0e41aef1ef086ae972449bdd Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 18 Apr 2014 12:59:14 +0100 Subject: [PATCH 126/188] Fixed #906 --- src/Entities/Entity.cpp | 10 ++++++++++ src/Mobs/Monster.cpp | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 86aee4c6f..56ef36ef8 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -771,6 +771,16 @@ void cEntity::TickBurning(cChunk & a_Chunk) { // Remember the current burning state: bool HasBeenBurning = (m_TicksLeftBurning > 0); + + if (GetWorld()->GetWeather() == eWeather_Rain) + { + if (HasBeenBurning) + { + m_TicksLeftBurning = 0; + OnFinishedBurning(); + } + return; + } // Do the burning damage: if (m_TicksLeftBurning > 0) diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index 27bd28045..9df5d5e3b 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -1003,7 +1003,8 @@ void cMonster::HandleDaylightBurning(cChunk & a_Chunk) (a_Chunk.GetSkyLight(RelX, RelY, RelZ) == 15) && // In the daylight (a_Chunk.GetBlock(RelX, RelY, RelZ) != E_BLOCK_SOULSAND) && // Not on soulsand (GetWorld()->GetTimeOfDay() < (12000 + 1000)) && // It is nighttime - !IsOnFire() // Not already burning + !IsOnFire() && // Not already burning + (GetWorld()->GetWeather() != eWeather_Rain) // Not raining ) { // Burn for 100 ticks, then decide again From 3efd232829aaa15193550a300d3385f59316b4a8 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Fri, 18 Apr 2014 14:10:31 +0200 Subject: [PATCH 127/188] Removed old include --- src/ClientHandle.cpp | 2 +- src/Enchantments.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index eab306a0c..bc1926976 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2737,7 +2737,7 @@ void cClientHandle::HandleEnchantItem(Byte & WindowID, Byte & Enchantment) if (Item.EnchantByXPLevels(BaseEnchantmentLevel)) { - if (m_Player->IsGameModeCreative() | m_Player->DeltaExperience(-m_Player->XpForLevel(BaseEnchantmentLevel)) >= 0) + if (m_Player->IsGameModeCreative() || m_Player->DeltaExperience(-m_Player->XpForLevel(BaseEnchantmentLevel)) >= 0) { Window->m_SlotArea->SetSlot(0, *m_Player, Item); Window->SendSlot(*m_Player, Window->m_SlotArea, 0); diff --git a/src/Enchantments.h b/src/Enchantments.h index fa07dc2d4..1b3561faf 100644 --- a/src/Enchantments.h +++ b/src/Enchantments.h @@ -10,7 +10,6 @@ #include "Defines.h" #include "WorldStorage/EnchantmentSerializer.h" -#include "Entities/Player.h" From 56613d2b22c82f301eb651d1f24a0c2155917d24 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Fri, 18 Apr 2014 14:34:29 +0200 Subject: [PATCH 128/188] Fixed Errors --- src/Enchantments.cpp | 20 +++++++++++++++++++- src/Enchantments.h | 1 + src/Item.cpp | 7 +++---- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/Enchantments.cpp b/src/Enchantments.cpp index 3caebdff5..ca72065ff 100644 --- a/src/Enchantments.cpp +++ b/src/Enchantments.cpp @@ -893,7 +893,23 @@ void cEnchantments::RemoveEnchantmentWeightFromVector(cWeightedEnchantments * a_ if (EnchantmentID == a_EnchantmentID) { - a_Enchantments->erase(std::remove(a_Enchantments->begin(), a_Enchantments->end(), *it), a_Enchantments->end()); + a_Enchantments->erase(it); + break; + } + } +} + + + + + +void cEnchantments::RemoveEnchantmentWeightFromVector(cWeightedEnchantments * a_Enchantments, cEnchantments a_Enchantment) +{ + for (cWeightedEnchantments::iterator it = a_Enchantments->begin(); it != a_Enchantments->end(); ++it) + { + if ((*it).m_Enchantments == a_Enchantment) + { + a_Enchantments->erase(it); break; } } @@ -980,6 +996,8 @@ cEnchantments cEnchantments::GetRandomEnchantmentFromVector(cWeightedEnchantment return (*it).m_Enchantments; } } + + return cEnchantments(); } diff --git a/src/Enchantments.h b/src/Enchantments.h index 1b3561faf..3cb979042 100644 --- a/src/Enchantments.h +++ b/src/Enchantments.h @@ -109,6 +109,7 @@ public: static void AddEnchantmentWeightToVector(cWeightedEnchantments * a_Enchantments, int a_Weight, cEnchantments a_Enchantment); /** Remove a enchantment weight from the vector */ static void RemoveEnchantmentWeightFromVector(cWeightedEnchantments * a_Enchantments, int a_EnchantmentID); + static void RemoveEnchantmentWeightFromVector(cWeightedEnchantments * a_Enchantments, cEnchantments a_Enchantment); /** Check enchantment conflicts from enchantments from the vector */ static void CheckEnchantmentConflictsFromVector(cWeightedEnchantments & a_Enchantments, cEnchantments a_FirstEnchantment); diff --git a/src/Item.cpp b/src/Item.cpp index 540725492..1941a6693 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -286,7 +286,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) cEnchantments Enchantment1 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); m_Enchantments.AddFromString(Enchantment1.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment1), enchantments.end()); + cEnchantments::RemoveEnchantmentWeightFromVector(&enchantments, Enchantment1); // Checking for conflicting enchantments cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment1); @@ -302,7 +302,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) { cEnchantments Enchantment2 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); m_Enchantments.AddFromString(Enchantment2.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment2), enchantments.end()); + cEnchantments::RemoveEnchantmentWeightFromVector(&enchantments, Enchantment2); // Checking for conflicting enchantments cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment2); @@ -318,7 +318,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) { cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); m_Enchantments.AddFromString(Enchantment3.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment3), enchantments.end()); + cEnchantments::RemoveEnchantmentWeightFromVector(&enchantments, Enchantment3); // Checking for conflicting enchantments cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment3); @@ -334,7 +334,6 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) { cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); m_Enchantments.AddFromString(Enchantment4.ToString()); - enchantments.erase(std::remove(enchantments.begin(), enchantments.end(), Enchantment4), enchantments.end()); } } From 6d3bde52216020c59c7f1851d090bae1d1954f39 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 18 Apr 2014 14:35:33 +0200 Subject: [PATCH 129/188] Added performance test of the nether fort generator. --- src/Generating/NetherFortGen.cpp | 34 ++++++++++++++++++++++++++++++++ src/Generating/NetherFortGen.h | 1 + 2 files changed, 35 insertions(+) diff --git a/src/Generating/NetherFortGen.cpp b/src/Generating/NetherFortGen.cpp index 7dc702e3a..d90fdeb0a 100644 --- a/src/Generating/NetherFortGen.cpp +++ b/src/Generating/NetherFortGen.cpp @@ -70,6 +70,40 @@ public: +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Performance test of the NetherFort generator: + +/* +#include "OSSupport/Timer.h" +static class cNetherFortPerfTest +{ +public: + cNetherFortPerfTest(void) + { + cTimer Timer; + long long StartTime = Timer.GetNowTime(); + + const int GridSize = 512; + const int MaxDepth = 12; + const int NumIterations = 100; + for (int i = 0; i < NumIterations; i++) + { + cNetherFortGen FortGen(i, GridSize, MaxDepth); + delete new cNetherFortGen::cNetherFort(FortGen, 0, 0, GridSize, MaxDepth, i); + } + + long long EndTime = Timer.GetNowTime(); + printf("%d forts took %lld msec (%f sec) to generate\n", NumIterations, EndTime - StartTime, ((double)(EndTime - StartTime)) / 1000); + exit(0); + } + +} g_PerfTest; +//*/ + + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cNetherFortGen: diff --git a/src/Generating/NetherFortGen.h b/src/Generating/NetherFortGen.h index b82b6adf3..d51596b9e 100644 --- a/src/Generating/NetherFortGen.h +++ b/src/Generating/NetherFortGen.h @@ -26,6 +26,7 @@ public: virtual ~cNetherFortGen(); protected: + friend class cNetherFortPerfTest; // fwd: NetherFortGen.cpp class cNetherFort; // fwd: NetherFortGen.cpp typedef std::list cNetherForts; From 013da806ec20b62a742aded9a9d2b8131193f30d Mon Sep 17 00:00:00 2001 From: jfhumann Date: Fri, 18 Apr 2014 21:09:44 +0200 Subject: [PATCH 130/188] Did some static analysis, fixed some bugs and optimized a lot of code --- src/Authenticator.cpp | 7 ++- src/BlockEntities/DispenserEntity.cpp | 3 +- src/BlockEntities/FurnaceEntity.cpp | 7 ++- src/BlockEntities/HopperEntity.cpp | 11 ++-- src/Blocks/BlockChest.h | 1 + src/Blocks/BlockRail.h | 2 +- src/BoundingBox.cpp | 2 +- src/Chunk.cpp | 4 +- src/Chunk.h | 2 +- src/ChunkMap.cpp | 40 ++++++------- src/ClientHandle.cpp | 18 +++--- src/CraftingRecipes.cpp | 10 ++-- src/Crypto.cpp | 2 +- src/DeadlockDetect.cpp | 13 ++-- src/Entities/Minecart.cpp | 2 +- src/Entities/Player.cpp | 9 +-- src/Entities/Player.h | 2 +- src/FurnaceRecipe.cpp | 1 - src/Generating/Caves.cpp | 36 +++++++----- src/Generating/MineShafts.cpp | 2 +- src/Generating/Ravines.cpp | 15 ++--- src/Group.cpp | 4 +- src/Group.h | 8 +-- src/Item.cpp | 3 - src/Items/ItemHandler.cpp | 1 - src/Items/ItemHandler.h | 2 +- src/MobProximityCounter.cpp | 4 +- src/MobSpawner.cpp | 4 +- src/Mobs/Sheep.cpp | 7 ++- src/Mobs/Wolf.h | 2 +- src/Noise.cpp | 22 ++++--- src/Protocol/Protocol125.cpp | 32 +++++----- src/Protocol/Protocol132.cpp | 18 +++--- src/Protocol/Protocol14x.cpp | 12 ++-- src/Protocol/Protocol16x.cpp | 17 +++--- src/Protocol/Protocol17x.cpp | 85 +++++++++++++++------------ src/Protocol/ProtocolRecognizer.cpp | 13 ++-- src/Server.cpp | 2 +- src/Simulator/FireSimulator.cpp | 2 +- src/Simulator/FluidSimulator.cpp | 2 +- src/StackWalker.cpp | 3 +- src/UI/SlotArea.cpp | 11 ++-- src/WebAdmin.cpp | 6 +- src/World.cpp | 10 ++-- src/World.h | 2 +- src/WorldStorage/FastNBT.cpp | 4 +- src/WorldStorage/WSSCompact.cpp | 2 +- src/WorldStorage/WSSCompact.h | 2 +- 48 files changed, 257 insertions(+), 212 deletions(-) diff --git a/src/Authenticator.cpp b/src/Authenticator.cpp index bd6db1c11..ff5ad9506 100644 --- a/src/Authenticator.cpp +++ b/src/Authenticator.cpp @@ -109,11 +109,12 @@ void cAuthenticator::Execute(void) } ASSERT(!m_Queue.empty()); - int ClientID = m_Queue.front().m_ClientID; - AString UserName = m_Queue.front().m_Name; + cAuthenticator::cUser & User = m_Queue.front(); + int ClientID = User.m_ClientID; + AString UserName = User.m_Name; AString ActualAddress = m_Address; ReplaceString(ActualAddress, "%USERNAME%", UserName); - ReplaceString(ActualAddress, "%SERVERID%", m_Queue.front().m_ServerID); + ReplaceString(ActualAddress, "%SERVERID%", User.m_ServerID); m_Queue.pop_front(); Lock.Unlock(); diff --git a/src/BlockEntities/DispenserEntity.cpp b/src/BlockEntities/DispenserEntity.cpp index e03bf776d..f5b9c8923 100644 --- a/src/BlockEntities/DispenserEntity.cpp +++ b/src/BlockEntities/DispenserEntity.cpp @@ -128,7 +128,8 @@ void cDispenserEntity::DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum) if (DispChunk->GetBlock(DispX, DispY, DispZ) == E_BLOCK_AIR) { DispChunk->SetBlock(DispX, DispY, DispZ, E_BLOCK_FIRE, 0); - m_Contents.SetSlot(a_SlotNum, m_Contents.GetSlot(a_SlotNum).m_ItemType, m_Contents.GetSlot(a_SlotNum).m_ItemCount, m_Contents.GetSlot(a_SlotNum).m_ItemDamage + 1); + const cItem& slot = m_Contents.GetSlot(a_SlotNum); + m_Contents.SetSlot(a_SlotNum, slot.m_ItemType, slot.m_ItemCount, slot.m_ItemDamage + 1); // If the durability has run out destroy the item. if (m_Contents.GetSlot(a_SlotNum).m_ItemDamage > 64) { diff --git a/src/BlockEntities/FurnaceEntity.cpp b/src/BlockEntities/FurnaceEntity.cpp index 7d6d1f89e..1b1741713 100644 --- a/src/BlockEntities/FurnaceEntity.cpp +++ b/src/BlockEntities/FurnaceEntity.cpp @@ -413,19 +413,20 @@ bool cFurnaceEntity::CanCookInputToOutput(void) const return false; } - if (m_Contents.GetSlot(fsOutput).IsEmpty()) + const cItem & Slot = m_Contents.GetSlot(fsOutput); + if (Slot.IsEmpty()) { // The output is empty, can cook return true; } - if (!m_Contents.GetSlot(fsOutput).IsEqual(*m_CurrentRecipe->Out)) + if (!Slot.IsEqual(*m_CurrentRecipe->Out)) { // The output slot is blocked with something that cannot be stacked with the recipe's output return false; } - if (m_Contents.GetSlot(fsOutput).IsFullStack()) + if (Slot.IsFullStack()) { // Cannot add any more items to the output slot return false; diff --git a/src/BlockEntities/HopperEntity.cpp b/src/BlockEntities/HopperEntity.cpp index 41fb9f811..7f001c739 100644 --- a/src/BlockEntities/HopperEntity.cpp +++ b/src/BlockEntities/HopperEntity.cpp @@ -234,24 +234,27 @@ bool cHopperEntity::MovePickupsIn(cChunk & a_Chunk, Int64 a_CurrentTick) bool TrySuckPickupIn(cPickup * a_Pickup) { + cItem & Item = a_Pickup->GetItem(); + for (int i = 0; i < ContentsWidth * ContentsHeight; i++) { if (m_Contents.IsSlotEmpty(i)) { m_bFoundPickupsAbove = true; - m_Contents.SetSlot(i, a_Pickup->GetItem()); + m_Contents.SetSlot(i, Item); a_Pickup->Destroy(); // Kill pickup return true; } - else if (m_Contents.GetSlot(i).IsEqual(a_Pickup->GetItem()) && !m_Contents.GetSlot(i).IsFullStack()) + else if (m_Contents.GetSlot(i).IsEqual(Item) && !m_Contents.GetSlot(i).IsFullStack()) { m_bFoundPickupsAbove = true; int PreviousCount = m_Contents.GetSlot(i).m_ItemCount; - a_Pickup->GetItem().m_ItemCount -= m_Contents.ChangeSlotCount(i, a_Pickup->GetItem().m_ItemCount) - PreviousCount; // Set count to however many items were added - if (a_Pickup->GetItem().IsEmpty()) + Item.m_ItemCount -= m_Contents.ChangeSlotCount(i, Item.m_ItemCount) - PreviousCount; // Set count to however many items were added + + if (Item.IsEmpty()) { a_Pickup->Destroy(); // Kill pickup if all items were added } diff --git a/src/Blocks/BlockChest.h b/src/Blocks/BlockChest.h index a1ded4c26..c9a769c75 100644 --- a/src/Blocks/BlockChest.h +++ b/src/Blocks/BlockChest.h @@ -56,6 +56,7 @@ public: (Area.GetRelBlockType(2, 0, 1) == E_BLOCK_CHEST) ) { + // FIXME: This is unreachable, as the condition is the same as the above one a_BlockMeta = (yaw < 0) ? 4 : 5; return true; } diff --git a/src/Blocks/BlockRail.h b/src/Blocks/BlockRail.h index ad78d290a..358b5ca11 100644 --- a/src/Blocks/BlockRail.h +++ b/src/Blocks/BlockRail.h @@ -141,7 +141,7 @@ public: NIBBLETYPE Meta = 0; char RailsCnt = 0; bool Neighbors[8]; // 0 - EAST, 1 - WEST, 2 - NORTH, 3 - SOUTH, 4 - EAST UP, 5 - WEST UP, 6 - NORTH UP, 7 - SOUTH UP - memset(Neighbors, false, sizeof(Neighbors)); + memset(Neighbors, 0, sizeof(Neighbors)); Neighbors[0] = (IsUnstable(a_ChunkInterface, a_BlockX + 1, a_BlockY, a_BlockZ) || !IsNotConnected(a_ChunkInterface, a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_EAST, E_PURE_DOWN)); Neighbors[1] = (IsUnstable(a_ChunkInterface, a_BlockX - 1, a_BlockY, a_BlockZ) || !IsNotConnected(a_ChunkInterface, a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_WEST, E_PURE_DOWN)); Neighbors[2] = (IsUnstable(a_ChunkInterface, a_BlockX, a_BlockY, a_BlockZ - 1) || !IsNotConnected(a_ChunkInterface, a_BlockX, a_BlockY, a_BlockZ, BLOCK_FACE_NORTH, E_PURE_DOWN)); diff --git a/src/BoundingBox.cpp b/src/BoundingBox.cpp index 482f9923f..ce831c200 100644 --- a/src/BoundingBox.cpp +++ b/src/BoundingBox.cpp @@ -288,7 +288,7 @@ bool cBoundingBox::CalcLineIntersection(const Vector3d & a_Min, const Vector3d & Coeff = c; } c = a_Line1.LineCoeffToXZPlane(a_Line2, a_Max.y); - if ((c >= 0) && (c >= 0) && (c < Coeff) && IsInside(a_Min, a_Max, a_Line1 + (a_Line2 - a_Line1) * c)) + if ((c >= 0) && (c < Coeff) && IsInside(a_Min, a_Max, a_Line1 + (a_Line2 - a_Line1) * c)) { Face = (a_Line1.y > a_Line2.y) ? BLOCK_FACE_YP : BLOCK_FACE_YM; Coeff = c; diff --git a/src/Chunk.cpp b/src/Chunk.cpp index fe9cd9b31..acefd98ed 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -452,7 +452,7 @@ void cChunk::CollectMobCensus(cMobCensus& toFill) { cMonster& Monster = (cMonster&)(**itr); currentPosition = Monster.GetPosition(); - for (std::list::const_iterator itr2 = playerPositions.begin(); itr2 != playerPositions.end(); itr2 ++) + for (std::list::const_iterator itr2 = playerPositions.begin(); itr2 != playerPositions.end(); ++itr2) { toFill.CollectMob(Monster,*this,(currentPosition-**itr2).SqrLength()); } @@ -600,7 +600,7 @@ void cChunk::Tick(float a_Dt) delete ToDelete; continue; } - itr++; + ++itr; } // for itr - m_Entitites[] // If any entity moved out of the chunk, move it to the neighbor: diff --git a/src/Chunk.h b/src/Chunk.h index b3fa563cc..774770028 100644 --- a/src/Chunk.h +++ b/src/Chunk.h @@ -382,10 +382,10 @@ private: struct sSetBlockQueueItem { + Int64 m_Tick; int m_RelX, m_RelY, m_RelZ; BLOCKTYPE m_BlockType; NIBBLETYPE m_BlockMeta; - Int64 m_Tick; BLOCKTYPE m_PreviousType; sSetBlockQueueItem(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Int64 a_Tick, BLOCKTYPE a_PreviousBlockType) : diff --git a/src/ChunkMap.cpp b/src/ChunkMap.cpp index 83eae2665..ed9103174 100644 --- a/src/ChunkMap.cpp +++ b/src/ChunkMap.cpp @@ -1656,7 +1656,7 @@ void cChunkMap::AddEntity(cEntity * a_Entity) { cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(a_Entity->GetChunkX(), ZERO_CHUNK_Y, a_Entity->GetChunkZ()); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { LOGWARNING("Entity at %p (%s, ID %d) spawning in a non-existent chunk, the entity is lost.", a_Entity, a_Entity->GetClass(), a_Entity->GetUniqueID() @@ -1691,7 +1691,7 @@ void cChunkMap::RemoveEntity(cEntity * a_Entity) { cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(a_Entity->GetChunkX(), ZERO_CHUNK_Y, a_Entity->GetChunkZ()); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return; } @@ -1723,7 +1723,7 @@ bool cChunkMap::ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback { cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -1973,7 +1973,7 @@ bool cChunkMap::ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEnti { cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -1988,7 +1988,7 @@ bool cChunkMap::ForEachChestInChunk(int a_ChunkX, int a_ChunkZ, cChestCallback & { cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2003,7 +2003,7 @@ bool cChunkMap::ForEachDispenserInChunk(int a_ChunkX, int a_ChunkZ, cDispenserCa { cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2018,7 +2018,7 @@ bool cChunkMap::ForEachDropperInChunk(int a_ChunkX, int a_ChunkZ, cDropperCallba { cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2033,7 +2033,7 @@ bool cChunkMap::ForEachDropSpenserInChunk(int a_ChunkX, int a_ChunkZ, cDropSpens { cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2048,7 +2048,7 @@ bool cChunkMap::ForEachFurnaceInChunk(int a_ChunkX, int a_ChunkZ, cFurnaceCallba { cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2066,7 +2066,7 @@ bool cChunkMap::DoWithBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cB cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2084,7 +2084,7 @@ bool cChunkMap::DoWithChestAt(int a_BlockX, int a_BlockY, int a_BlockZ, cChestCa cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2102,7 +2102,7 @@ bool cChunkMap::DoWithDispenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDis cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2120,7 +2120,7 @@ bool cChunkMap::DoWithDropperAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDropp cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2138,7 +2138,7 @@ bool cChunkMap::DoWithDropSpenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cD cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2156,7 +2156,7 @@ bool cChunkMap::DoWithFurnaceAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFurna cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2173,7 +2173,7 @@ bool cChunkMap::DoWithNoteBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cNot cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2190,7 +2190,7 @@ bool cChunkMap::DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, c cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2208,7 +2208,7 @@ bool cChunkMap::DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHe cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2226,7 +2226,7 @@ bool cChunkMap::DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlo cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } @@ -2244,7 +2244,7 @@ bool cChunkMap::GetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, AString & cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cCSLock Lock(m_CSLayers); cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ); - if ((Chunk == NULL) && !Chunk->IsValid()) + if ((Chunk == NULL) || !Chunk->IsValid()) { return false; } diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 5876e55c7..c0df49827 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -412,14 +412,16 @@ void cClientHandle::HandlePing(void) { // Somebody tries to retrieve information about the server AString Reply; + cServer * Server = cRoot::Get()->GetServer(); + Printf(Reply, "%s%s%i%s%i", - cRoot::Get()->GetServer()->GetDescription().c_str(), + Server->GetDescription().c_str(), cChatColor::Delimiter.c_str(), - cRoot::Get()->GetServer()->GetNumPlayers(), + Server->GetNumPlayers(), cChatColor::Delimiter.c_str(), - cRoot::Get()->GetServer()->GetMaxPlayers() + Server->GetMaxPlayers() ); - Kick(Reply.c_str()); + Kick(Reply); } @@ -1171,12 +1173,12 @@ void cClientHandle::HandleChat(const AString & a_Message) cCompositeChat Msg; AString Color = m_Player->GetColor(); if (Color.length() == 3) - { + { Color = AString("@") + Color[2]; } else - { - Color.empty(); + { + Color.clear(); } Msg.AddTextPart(AString("<") + m_Player->GetName() + "> ", Color); Msg.ParseText(a_Message); @@ -1678,7 +1680,7 @@ void cClientHandle::Tick(float a_Dt) // Send a ping packet: cTimer t1; - if ((m_LastPingTime + cClientHandle::PING_TIME_MS <= t1.GetNowTime())) + if (m_LastPingTime + cClientHandle::PING_TIME_MS <= t1.GetNowTime()) { m_PingID++; m_PingStartTime = t1.GetNowTime(); diff --git a/src/CraftingRecipes.cpp b/src/CraftingRecipes.cpp index 30e7a8733..fb32c9cf3 100644 --- a/src/CraftingRecipes.cpp +++ b/src/CraftingRecipes.cpp @@ -661,14 +661,16 @@ cCraftingRecipes::cRecipe * cCraftingRecipes::MatchRecipe(const cItem * a_Crafti ASSERT(itrS->x + a_OffsetX < a_GridWidth); ASSERT(itrS->y + a_OffsetY < a_GridHeight); int GridID = (itrS->x + a_OffsetX) + a_GridStride * (itrS->y + a_OffsetY); + + const cItem & Item = itrS->m_Item; if ( (itrS->x >= a_GridWidth) || (itrS->y >= a_GridHeight) || - (itrS->m_Item.m_ItemType != a_CraftingGrid[GridID].m_ItemType) || // same item type? - (itrS->m_Item.m_ItemCount > a_CraftingGrid[GridID].m_ItemCount) || // not enough items + (Item.m_ItemType != a_CraftingGrid[GridID].m_ItemType) || // same item type? + (Item.m_ItemCount > a_CraftingGrid[GridID].m_ItemCount) || // not enough items ( - (itrS->m_Item.m_ItemDamage > 0) && // should compare damage values? - (itrS->m_Item.m_ItemDamage != a_CraftingGrid[GridID].m_ItemDamage) + (Item.m_ItemDamage > 0) && // should compare damage values? + (Item.m_ItemDamage != a_CraftingGrid[GridID].m_ItemDamage) ) ) { diff --git a/src/Crypto.cpp b/src/Crypto.cpp index 26500f263..16be5ec35 100644 --- a/src/Crypto.cpp +++ b/src/Crypto.cpp @@ -206,7 +206,7 @@ int cRSAPrivateKey::Encrypt(const Byte * a_PlainData, size_t a_PlainLength, Byte ASSERT(!"Invalid a_DecryptedMaxLength!"); return -1; } - if (a_EncryptedMaxLength < m_Rsa.len) + if (a_PlainLength < m_Rsa.len) { LOGD("%s: Invalid a_PlainLength: got %u, exp at least %u", __FUNCTION__, (unsigned)a_PlainLength, (unsigned)(m_Rsa.len) diff --git a/src/DeadlockDetect.cpp b/src/DeadlockDetect.cpp index 322084dc4..38a3c369e 100644 --- a/src/DeadlockDetect.cpp +++ b/src/DeadlockDetect.cpp @@ -112,18 +112,21 @@ void cDeadlockDetect::CheckWorldAge(const AString & a_WorldName, Int64 a_Age) ASSERT(!"Unknown world in cDeadlockDetect"); return; } - if (itr->second.m_Age == a_Age) + + cDeadlockDetect::sWorldAge & WorldAge = itr->second; + + if (WorldAge.m_Age == a_Age) { - itr->second.m_NumCyclesSame += 1; - if (itr->second.m_NumCyclesSame > (1000 * m_IntervalSec) / CYCLE_MILLISECONDS) + WorldAge.m_NumCyclesSame += 1; + if (WorldAge.m_NumCyclesSame > (1000 * m_IntervalSec) / CYCLE_MILLISECONDS) { DeadlockDetected(); } } else { - itr->second.m_Age = a_Age; - itr->second.m_NumCyclesSame = 0; + WorldAge.m_Age = a_Age; + WorldAge.m_NumCyclesSame = 0; } } diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp index 7f38aa35a..2814ce33c 100644 --- a/src/Entities/Minecart.cpp +++ b/src/Entities/Minecart.cpp @@ -795,7 +795,7 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta) { BLOCKTYPE BlockXM = m_World->GetBlock((int)floor(GetPosX()) - 1, (int)floor(GetPosY()), (int)floor(GetPosZ())); BLOCKTYPE BlockXP = m_World->GetBlock((int)floor(GetPosX()) + 1, (int)floor(GetPosY()), (int)floor(GetPosZ())); - BLOCKTYPE BlockZM = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) + 1); + BLOCKTYPE BlockZM = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) - 1); BLOCKTYPE BlockZP = m_World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()) + 1); if ( (!IsBlockRail(BlockXM) && cBlockInfo::IsSolid(BlockXM)) || diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index 7f2e5b4c2..df656ffa1 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -85,9 +85,10 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName) if (!LoadFromDisk()) { m_Inventory.Clear(); - SetPosX(cRoot::Get()->GetDefaultWorld()->GetSpawnX()); - SetPosY(cRoot::Get()->GetDefaultWorld()->GetSpawnY()); - SetPosZ(cRoot::Get()->GetDefaultWorld()->GetSpawnZ()); + cWorld * DefaultWorld = cRoot::Get()->GetDefaultWorld(); + SetPosX(DefaultWorld->GetSpawnX()); + SetPosY(DefaultWorld->GetSpawnY()); + SetPosZ(DefaultWorld->GetSpawnZ()); LOGD("Player \"%s\" is connecting for the first time, spawning at default world spawn {%.2f, %.2f, %.2f}", a_PlayerName.c_str(), GetPosX(), GetPosY(), GetPosZ() @@ -1165,7 +1166,7 @@ Vector3d cPlayer::GetThrowSpeed(double a_SpeedCoeff) const -void cPlayer::ForceSetSpeed(Vector3d a_Direction) +void cPlayer::ForceSetSpeed(const Vector3d & a_Direction) { SetSpeed(a_Direction); m_ClientHandle->SendEntityVelocity(*this); diff --git a/src/Entities/Player.h b/src/Entities/Player.h index 05377a117..74da409cf 100644 --- a/src/Entities/Player.h +++ b/src/Entities/Player.h @@ -181,7 +181,7 @@ public: void LoginSetGameMode(eGameMode a_GameMode); /** Forces the player to move in the given direction. */ - void ForceSetSpeed(Vector3d a_Direction); // tolua_export + void ForceSetSpeed(const Vector3d & a_Direction); // tolua_export /** Tries to move to a new position, with attachment-related checks (y == -999) */ void MoveTo(const Vector3d & a_NewPos); // tolua_export diff --git a/src/FurnaceRecipe.cpp b/src/FurnaceRecipe.cpp index 1810d7c49..bd7fd8079 100644 --- a/src/FurnaceRecipe.cpp +++ b/src/FurnaceRecipe.cpp @@ -56,7 +56,6 @@ void cFurnaceRecipe::ReloadRecipes(void) std::ifstream f; char a_File[] = "furnace.txt"; f.open(a_File, std::ios::in); - std::string input; if (!f.good()) { diff --git a/src/Generating/Caves.cpp b/src/Generating/Caves.cpp index 98b7c8681..5cad11d2a 100644 --- a/src/Generating/Caves.cpp +++ b/src/Generating/Caves.cpp @@ -200,13 +200,14 @@ void cCaveTunnel::Randomize(cNoise & a_Noise) for (int i = 0; i < 4; i++) { // For each already present point, insert a point in between it and its predecessor, shifted randomly. - int PrevX = m_Points.front().m_BlockX; - int PrevY = m_Points.front().m_BlockY; - int PrevZ = m_Points.front().m_BlockZ; - int PrevR = m_Points.front().m_Radius; + cCaveDefPoint & Point = m_Points.front(); + int PrevX = Point.m_BlockX; + int PrevY = Point.m_BlockY; + int PrevZ = Point.m_BlockZ; + int PrevR = Point.m_Radius; cCaveDefPoints Pts; Pts.reserve(m_Points.size() * 2 + 1); - Pts.push_back(m_Points.front()); + Pts.push_back(Point); for (cCaveDefPoints::const_iterator itr = m_Points.begin() + 1, end = m_Points.end(); itr != end; ++itr) { int Random = a_Noise.IntNoise3DInt(PrevX, PrevY, PrevZ + i) / 11; @@ -244,11 +245,12 @@ bool cCaveTunnel::RefineDefPoints(const cCaveDefPoints & a_Src, cCaveDefPoints & a_Dst.clear(); a_Dst.reserve(Num * 2 + 2); cCaveDefPoints::const_iterator itr = a_Src.begin() + 1; - a_Dst.push_back(a_Src.front()); - int PrevX = a_Src.front().m_BlockX; - int PrevY = a_Src.front().m_BlockY; - int PrevZ = a_Src.front().m_BlockZ; - int PrevR = a_Src.front().m_Radius; + const cCaveDefPoint & Source = a_Src.front(); + a_Dst.push_back(Source); + int PrevX = Source.m_BlockX; + int PrevY = Source.m_BlockY; + int PrevZ = Source.m_BlockZ; + int PrevR = Source.m_Radius; for (int i = 0; i <= Num; ++i, ++itr) { int dx = itr->m_BlockX - PrevX; @@ -310,9 +312,10 @@ void cCaveTunnel::FinishLinear(void) std::swap(Pts, m_Points); m_Points.reserve(Pts.size() * 3); - int PrevX = Pts.front().m_BlockX; - int PrevY = Pts.front().m_BlockY; - int PrevZ = Pts.front().m_BlockZ; + cCaveDefPoint & PrevPoint = Pts.front(); + int PrevX = PrevPoint.m_BlockX; + int PrevY = PrevPoint.m_BlockY; + int PrevZ = PrevPoint.m_BlockZ; for (cCaveDefPoints::const_iterator itr = Pts.begin() + 1, end = Pts.end(); itr != end; ++itr) { int x1 = itr->m_BlockX; @@ -433,9 +436,10 @@ void cCaveTunnel::FinishLinear(void) void cCaveTunnel::CalcBoundingBox(void) { - m_MinBlockX = m_MaxBlockX = m_Points.front().m_BlockX; - m_MinBlockY = m_MaxBlockY = m_Points.front().m_BlockY; - m_MinBlockZ = m_MaxBlockZ = m_Points.front().m_BlockZ; + cCaveDefPoint & Point = m_Points.front(); + m_MinBlockX = m_MaxBlockX = Point.m_BlockX; + m_MinBlockY = m_MaxBlockY = Point.m_BlockY; + m_MinBlockZ = m_MaxBlockZ = Point.m_BlockZ; for (cCaveDefPoints::const_iterator itr = m_Points.begin() + 1, end = m_Points.end(); itr != end; ++itr) { m_MinBlockX = std::min(m_MinBlockX, itr->m_BlockX - itr->m_Radius); diff --git a/src/Generating/MineShafts.cpp b/src/Generating/MineShafts.cpp index 231295c3f..bbb022d85 100644 --- a/src/Generating/MineShafts.cpp +++ b/src/Generating/MineShafts.cpp @@ -684,7 +684,7 @@ void cMineShaftCorridor::ProcessChunk(cChunkDesc & a_ChunkDesc) } if ((z2 >= 0) && (z2 < cChunkDef::Width)) { - a_ChunkDesc.SetBlockTypeMeta(x, y1, z2, E_BLOCK_FENCE, 0); + a_ChunkDesc.SetBlockTypeMeta(x, y1, z2, E_BLOCK_FENCE, 0); //-V525 a_ChunkDesc.SetBlockTypeMeta(x, y2, z2, E_BLOCK_FENCE, 0); a_ChunkDesc.SetBlockTypeMeta(x, y3, z2, E_BLOCK_PLANKS, 0); } diff --git a/src/Generating/Ravines.cpp b/src/Generating/Ravines.cpp index e64f55214..267dcbbf9 100644 --- a/src/Generating/Ravines.cpp +++ b/src/Generating/Ravines.cpp @@ -269,7 +269,7 @@ void cStructGenRavines::cRavine::GenerateBaseDefPoints(int a_BlockX, int a_Block int CenterZ = a_BlockZ + OffsetZ; // Get the base angle in which the ravine "axis" goes: - float Angle = (float)(((float)((a_Noise.IntNoise3DInt(20 * a_BlockX, 70 * a_BlockZ, 6000) / 9) % 16384)) / 16384.0 * 3.141592653); + float Angle = (float)(((float)((a_Noise.IntNoise3DInt(20 * a_BlockX, 70 * a_BlockZ, 6000) / 9) % 16384)) / 16384.0 * M_PI); float xc = sin(Angle); float zc = cos(Angle); @@ -311,12 +311,13 @@ void cStructGenRavines::cRavine::RefineDefPoints(const cRavDefPoints & a_Src, cR a_Dst.clear(); a_Dst.reserve(Num * 2 + 2); cRavDefPoints::const_iterator itr = a_Src.begin() + 1; - a_Dst.push_back(a_Src.front()); - int PrevX = a_Src.front().m_BlockX; - int PrevZ = a_Src.front().m_BlockZ; - int PrevR = a_Src.front().m_Radius; - int PrevT = a_Src.front().m_Top; - int PrevB = a_Src.front().m_Bottom; + const cRavDefPoint & Source = a_Src.front(); + a_Dst.push_back(Source); + int PrevX = Source.m_BlockX; + int PrevZ = Source.m_BlockZ; + int PrevR = Source.m_Radius; + int PrevT = Source.m_Top; + int PrevB = Source.m_Bottom; for (int i = 0; i <= Num; ++i, ++itr) { int dx = itr->m_BlockX - PrevX; diff --git a/src/Group.cpp b/src/Group.cpp index 9c2467144..725740905 100644 --- a/src/Group.cpp +++ b/src/Group.cpp @@ -7,7 +7,7 @@ -void cGroup::AddCommand( AString a_Command ) +void cGroup::AddCommand( const AString & a_Command ) { m_Commands[ a_Command ] = true; } @@ -16,7 +16,7 @@ void cGroup::AddCommand( AString a_Command ) -void cGroup::AddPermission( AString a_Permission ) +void cGroup::AddPermission( const AString & a_Permission ) { m_Permissions[ a_Permission ] = true; } diff --git a/src/Group.h b/src/Group.h index 8bee6f7ed..47088d50d 100644 --- a/src/Group.h +++ b/src/Group.h @@ -11,11 +11,11 @@ public: // tolua_export cGroup() {} ~cGroup() {} - void SetName( AString a_Name ) { m_Name = a_Name; } // tolua_export + void SetName( const AString & a_Name ) { m_Name = a_Name; } // tolua_export const AString & GetName() const { return m_Name; } // tolua_export - void SetColor( AString a_Color ) { m_Color = a_Color; } // tolua_export - void AddCommand( AString a_Command ); // tolua_export - void AddPermission( AString a_Permission ); // tolua_export + void SetColor( const AString & a_Color ) { m_Color = a_Color; } // tolua_export + void AddCommand( const AString & a_Command ); // tolua_export + void AddPermission( const AString & a_Permission ); // tolua_export void InheritFrom( cGroup* a_Group ); // tolua_export typedef std::map< AString, bool > PermissionMap; diff --git a/src/Item.cpp b/src/Item.cpp index 856b68be6..9e41c246d 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -196,9 +196,6 @@ bool cItem::IsEnchantable(short item) return true; if ((item >= 298) && (item <= 317)) return true; - if ((item >= 290) && (item <= 294)) - return true; - if ((item == 346) || (item == 359) || (item == 261)) return true; diff --git a/src/Items/ItemHandler.cpp b/src/Items/ItemHandler.cpp index 1e77717e3..5151eac38 100644 --- a/src/Items/ItemHandler.cpp +++ b/src/Items/ItemHandler.cpp @@ -431,7 +431,6 @@ bool cItemHandler::IsTool() || (m_ItemType >= 267 && m_ItemType <= 279) || (m_ItemType >= 283 && m_ItemType <= 286) || (m_ItemType >= 290 && m_ItemType <= 294) - || (m_ItemType >= 256 && m_ItemType <= 259) || (m_ItemType == 325) || (m_ItemType == 346); } diff --git a/src/Items/ItemHandler.h b/src/Items/ItemHandler.h index 5b6c239cc..686f4b439 100644 --- a/src/Items/ItemHandler.h +++ b/src/Items/ItemHandler.h @@ -58,8 +58,8 @@ public: struct FoodInfo { - int FoodLevel; double Saturation; + int FoodLevel; int PoisonChance; // 0 - 100, in percent. 0 = no chance of poisoning, 100 = sure poisoning FoodInfo(int a_FoodLevel, double a_Saturation, int a_PoisonChance = 0) : diff --git a/src/MobProximityCounter.cpp b/src/MobProximityCounter.cpp index 6c44ea458..519757c2c 100644 --- a/src/MobProximityCounter.cpp +++ b/src/MobProximityCounter.cpp @@ -34,7 +34,7 @@ void cMobProximityCounter::CollectMob(cEntity& a_Monster, cChunk& a_Chunk, doubl void cMobProximityCounter::convertMaps() { - for(tMonsterToDistance::const_iterator itr = m_MonsterToDistance.begin(); itr != m_MonsterToDistance.end(); itr++) + for(tMonsterToDistance::const_iterator itr = m_MonsterToDistance.begin(); itr != m_MonsterToDistance.end(); ++itr) { m_DistanceToMonster.insert(tDistanceToMonster::value_type(itr->second.m_Distance,sMonsterAndChunk(*itr->first,itr->second.m_Chunk))); } @@ -55,7 +55,7 @@ cMobProximityCounter::sIterablePair cMobProximityCounter::getMobWithinThosesDist convertMaps(); } - for(tDistanceToMonster::const_iterator itr = m_DistanceToMonster.begin(); itr != m_DistanceToMonster.end(); itr++) + for(tDistanceToMonster::const_iterator itr = m_DistanceToMonster.begin(); itr != m_DistanceToMonster.end(); ++itr) { if (toReturn.m_Begin == m_DistanceToMonster.end()) { diff --git a/src/MobSpawner.cpp b/src/MobSpawner.cpp index 05da5d01c..ce8e06777 100644 --- a/src/MobSpawner.cpp +++ b/src/MobSpawner.cpp @@ -13,7 +13,7 @@ cMobSpawner::cMobSpawner(cMonster::eFamily a_MonsterFamily,const std::set::const_iterator itr = a_AllowedTypes.begin(); itr != a_AllowedTypes.end(); itr++) + for (std::set::const_iterator itr = a_AllowedTypes.begin(); itr != a_AllowedTypes.end(); ++itr) { if (cMonster::FamilyFromType(*itr) == a_MonsterFamily) { @@ -112,7 +112,7 @@ cMonster::eType cMobSpawner::ChooseMobType(EMCSBiome a_Biome) for(int i = 0; i < iRandom; i++) { - itr++; + ++itr; } return *itr; diff --git a/src/Mobs/Sheep.cpp b/src/Mobs/Sheep.cpp index c64360153..b3d4d93c1 100644 --- a/src/Mobs/Sheep.cpp +++ b/src/Mobs/Sheep.cpp @@ -36,7 +36,8 @@ void cSheep::GetDrops(cItems & a_Drops, cEntity * a_Killer) void cSheep::OnRightClicked(cPlayer & a_Player) { - if ((a_Player.GetEquippedItem().m_ItemType == E_ITEM_SHEARS) && (!m_IsSheared)) + const cItem & EquippedItem = a_Player.GetEquippedItem(); + if ((EquippedItem.m_ItemType == E_ITEM_SHEARS) && (!m_IsSheared)) { m_IsSheared = true; m_World->BroadcastEntityMetadata(*this); @@ -51,9 +52,9 @@ void cSheep::OnRightClicked(cPlayer & a_Player) Drops.push_back(cItem(E_BLOCK_WOOL, NumDrops, m_WoolColor)); m_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ(), 10); } - if ((a_Player.GetEquippedItem().m_ItemType == E_ITEM_DYE) && (m_WoolColor != 15 - a_Player.GetEquippedItem().m_ItemDamage)) + else if ((EquippedItem.m_ItemType == E_ITEM_DYE) && (m_WoolColor != 15 - EquippedItem.m_ItemDamage)) { - m_WoolColor = 15 - a_Player.GetEquippedItem().m_ItemDamage; + m_WoolColor = 15 - EquippedItem.m_ItemDamage; if (!a_Player.IsGameModeCreative()) { a_Player.GetInventory().RemoveOneEquippedItem(); diff --git a/src/Mobs/Wolf.h b/src/Mobs/Wolf.h index 9e5ad03c7..5925373e1 100644 --- a/src/Mobs/Wolf.h +++ b/src/Mobs/Wolf.h @@ -37,7 +37,7 @@ public: void SetIsTame (bool a_IsTame) { m_IsTame = a_IsTame; } void SetIsBegging (bool a_IsBegging) { m_IsBegging = a_IsBegging; } void SetIsAngry (bool a_IsAngry) { m_IsAngry = a_IsAngry; } - void SetOwner (AString a_NewOwner) { m_OwnerName = a_NewOwner; } + void SetOwner (const AString & a_NewOwner) { m_OwnerName = a_NewOwner; } void SetCollarColor(int a_CollarColor) { m_CollarColor = a_CollarColor; } protected: diff --git a/src/Noise.cpp b/src/Noise.cpp index 32922c8f3..efbb128c3 100644 --- a/src/Noise.cpp +++ b/src/Noise.cpp @@ -840,12 +840,14 @@ void cPerlinNoise::Generate2D( } // Generate the first octave directly into array: - m_Octaves.front().m_Noise.Generate2D( + const cOctave & FirstOctave = m_Octaves.front(); + + FirstOctave.m_Noise.Generate2D( a_Workspace, a_SizeX, a_SizeY, - a_StartX * m_Octaves.front().m_Frequency, a_EndX * m_Octaves.front().m_Frequency, - a_StartY * m_Octaves.front().m_Frequency, a_EndY * m_Octaves.front().m_Frequency + a_StartX * FirstOctave.m_Frequency, a_EndX * FirstOctave.m_Frequency, + a_StartY * FirstOctave.m_Frequency, a_EndY * FirstOctave.m_Frequency ); - NOISE_DATATYPE Amplitude = m_Octaves.front().m_Amplitude; + NOISE_DATATYPE Amplitude = FirstOctave.m_Amplitude; for (int i = 0; i < ArrayCount; i++) { a_Array[i] *= Amplitude; @@ -902,13 +904,15 @@ void cPerlinNoise::Generate3D( } // Generate the first octave directly into array: - m_Octaves.front().m_Noise.Generate3D( + const cOctave & FirstOctave = m_Octaves.front(); + + FirstOctave.m_Noise.Generate3D( a_Workspace, a_SizeX, a_SizeY, a_SizeZ, - a_StartX * m_Octaves.front().m_Frequency, a_EndX * m_Octaves.front().m_Frequency, - a_StartY * m_Octaves.front().m_Frequency, a_EndY * m_Octaves.front().m_Frequency, - a_StartZ * m_Octaves.front().m_Frequency, a_EndZ * m_Octaves.front().m_Frequency + a_StartX * FirstOctave.m_Frequency, a_EndX * FirstOctave.m_Frequency, + a_StartY * FirstOctave.m_Frequency, a_EndY * FirstOctave.m_Frequency, + a_StartZ * FirstOctave.m_Frequency, a_EndZ * FirstOctave.m_Frequency ); - NOISE_DATATYPE Amplitude = m_Octaves.front().m_Amplitude; + NOISE_DATATYPE Amplitude = FirstOctave.m_Amplitude; for (int i = 0; i < ArrayCount; i++) { a_Array[i] = a_Workspace[i] * Amplitude; diff --git a/src/Protocol/Protocol125.cpp b/src/Protocol/Protocol125.cpp index bf946ef19..7ae359e10 100644 --- a/src/Protocol/Protocol125.cpp +++ b/src/Protocol/Protocol125.cpp @@ -537,9 +537,10 @@ void cProtocol125::SendHealth(void) { cCSLock Lock(m_CSPacket); WriteByte (PACKET_UPDATE_HEALTH); - WriteShort((short)m_Client->GetPlayer()->GetHealth()); - WriteShort((short)m_Client->GetPlayer()->GetFoodLevel()); - WriteFloat((float)m_Client->GetPlayer()->GetFoodSaturationLevel()); + cPlayer * Player = m_Client->GetPlayer(); + WriteShort((short)Player->GetHealth()); + WriteShort((short)Player->GetFoodLevel()); + WriteFloat((float)Player->GetFoodSaturationLevel()); Flush(); } @@ -647,13 +648,14 @@ void cProtocol125::SendPickupSpawn(const cPickup & a_Pickup) cCSLock Lock(m_CSPacket); WriteByte (PACKET_PICKUP_SPAWN); WriteInt (a_Pickup.GetUniqueID()); - WriteShort (a_Pickup.GetItem().m_ItemType); - WriteChar (a_Pickup.GetItem().m_ItemCount); - WriteShort (a_Pickup.GetItem().m_ItemDamage); + const cItem & Item = a_Pickup.GetItem(); + WriteShort (Item.m_ItemType); + WriteChar (Item.m_ItemCount); + WriteShort (Item.m_ItemDamage); WriteVectorI((Vector3i)(a_Pickup.GetPosition() * 32)); - WriteByte ((char)(a_Pickup.GetSpeed().x * 8)); - WriteByte ((char)(a_Pickup.GetSpeed().y * 8)); - WriteByte ((char)(a_Pickup.GetSpeed().z * 8)); + WriteByte ((char)(a_Pickup.GetSpeedX() * 8)); + WriteByte ((char)(a_Pickup.GetSpeedY() * 8)); + WriteByte ((char)(a_Pickup.GetSpeedZ() * 8)); Flush(); } @@ -800,10 +802,11 @@ void cProtocol125::SendRemoveEntityEffect(const cEntity & a_Entity, int a_Effect void cProtocol125::SendRespawn(void) { cCSLock Lock(m_CSPacket); + cPlayer * Player = m_Client->GetPlayer(); WriteByte (PACKET_RESPAWN); - WriteInt ((int)(m_Client->GetPlayer()->GetWorld()->GetDimension())); + WriteInt ((int)(Player->GetWorld()->GetDimension())); WriteByte (2); // TODO: Difficulty; 2 = Normal - WriteChar ((char)m_Client->GetPlayer()->GetGameMode()); + WriteChar ((char)Player->GetGameMode()); WriteShort (256); // Current world height WriteString("default"); } @@ -815,10 +818,11 @@ void cProtocol125::SendRespawn(void) void cProtocol125::SendExperience(void) { cCSLock Lock(m_CSPacket); + cPlayer * Player = m_Client->GetPlayer(); WriteByte (PACKET_EXPERIENCE); - WriteFloat (m_Client->GetPlayer()->GetXpPercentage()); - WriteShort (m_Client->GetPlayer()->GetXpLevel()); - WriteShort (m_Client->GetPlayer()->GetCurrentXp()); + WriteFloat (Player->GetXpPercentage()); + WriteShort (Player->GetXpLevel()); + WriteShort (Player->GetCurrentXp()); Flush(); } diff --git a/src/Protocol/Protocol132.cpp b/src/Protocol/Protocol132.cpp index ce5942a5c..1ef92b8f0 100644 --- a/src/Protocol/Protocol132.cpp +++ b/src/Protocol/Protocol132.cpp @@ -408,7 +408,8 @@ void cProtocol132::SendWholeInventory(const cWindow & a_Window) super::SendWholeInventory(a_Window); // Send the player inventory and hotbar: - const cInventory & Inventory = m_Client->GetPlayer()->GetInventory(); + cPlayer * Player = m_Client->GetPlayer(); + const cInventory & Inventory = Player->GetInventory(); int BaseOffset = a_Window.GetNumSlots() - (cInventory::invNumSlots - cInventory::invInventoryOffset); // Number of non-inventory slots char WindowID = a_Window.GetWindowID(); for (short i = 0; i < cInventory::invInventoryCount; i++) @@ -422,7 +423,7 @@ void cProtocol132::SendWholeInventory(const cWindow & a_Window) } // for i - Hotbar[] // Send even the item being dragged: - SendInventorySlot(-1, -1, m_Client->GetPlayer()->GetDraggingItem()); + SendInventorySlot(-1, -1, Player->GetDraggingItem()); } @@ -800,10 +801,12 @@ void cProtocol132::SendCompass(const cWorld & a_World) void cProtocol132::SendEncryptionKeyRequest(void) { cCSLock Lock(m_CSPacket); + cServer * Server = cRoot::Get()->GetServer(); WriteByte(0xfd); - WriteString(cRoot::Get()->GetServer()->GetServerID()); - WriteShort((short)(cRoot::Get()->GetServer()->GetPublicKeyDER().size())); - SendData(cRoot::Get()->GetServer()->GetPublicKeyDER().data(), cRoot::Get()->GetServer()->GetPublicKeyDER().size()); + WriteString(Server->GetServerID()); + const AString & PublicKeyDER = Server->GetPublicKeyDER(); + WriteShort((short) (PublicKeyDER.size())); + SendData(PublicKeyDER.data(), PublicKeyDER.size()); WriteShort(4); WriteInt((int)(intptr_t)this); // Using 'this' as the cryptographic nonce, so that we don't have to generate one each time :) Flush(); @@ -874,10 +877,11 @@ void cProtocol132::StartEncryption(const Byte * a_Key) // Prepare the m_AuthServerID: cSHA1Checksum Checksum; - AString ServerID = cRoot::Get()->GetServer()->GetServerID(); + cServer * Server = cRoot::Get()->GetServer(); + AString ServerID = Server->GetServerID(); Checksum.Update((const Byte *)ServerID.c_str(), ServerID.length()); Checksum.Update(a_Key, 16); - Checksum.Update((const Byte *)cRoot::Get()->GetServer()->GetPublicKeyDER().data(), cRoot::Get()->GetServer()->GetPublicKeyDER().size()); + Checksum.Update((const Byte *) Server->GetPublicKeyDER().data(), Server->GetPublicKeyDER().size()); Byte Digest[20]; Checksum.Finalize(Digest); cSHA1Checksum::DigestToJava(Digest, m_AuthServerID); diff --git a/src/Protocol/Protocol14x.cpp b/src/Protocol/Protocol14x.cpp index f694af1eb..d6a103d35 100644 --- a/src/Protocol/Protocol14x.cpp +++ b/src/Protocol/Protocol14x.cpp @@ -103,9 +103,9 @@ void cProtocol142::SendPickupSpawn(const cPickup & a_Pickup) WriteInt (a_Pickup.GetUniqueID()); WriteItem (a_Pickup.GetItem()); WriteVectorI((Vector3i)(a_Pickup.GetPosition() * 32)); - WriteChar ((char)(a_Pickup.GetSpeed().x * 8)); - WriteChar ((char)(a_Pickup.GetSpeed().y * 8)); - WriteChar ((char)(a_Pickup.GetSpeed().z * 8)); + WriteChar((char) (a_Pickup.GetSpeedX() * 8)); + WriteChar((char) (a_Pickup.GetSpeedY() * 8)); + WriteChar((char) (a_Pickup.GetSpeedZ() * 8)); Flush(); } @@ -170,9 +170,9 @@ void cProtocol146::SendPickupSpawn(const cPickup & a_Pickup) WriteInt ((int)(a_Pickup.GetPosY() * 32)); WriteInt ((int)(a_Pickup.GetPosZ() * 32)); WriteInt (1); - WriteShort((short)(a_Pickup.GetSpeed().x * 32)); - WriteShort((short)(a_Pickup.GetSpeed().y * 32)); - WriteShort((short)(a_Pickup.GetSpeed().z * 32)); + WriteShort((short)(a_Pickup.GetSpeedX() * 32)); + WriteShort((short) (a_Pickup.GetSpeedY() * 32)); + WriteShort((short) (a_Pickup.GetSpeedZ() * 32)); WriteByte(0); WriteByte(0); diff --git a/src/Protocol/Protocol16x.cpp b/src/Protocol/Protocol16x.cpp index 3da23a1dc..35bc8665d 100644 --- a/src/Protocol/Protocol16x.cpp +++ b/src/Protocol/Protocol16x.cpp @@ -131,9 +131,10 @@ void cProtocol161::SendHealth(void) { cCSLock Lock(m_CSPacket); WriteByte (PACKET_UPDATE_HEALTH); - WriteFloat((float)m_Client->GetPlayer()->GetHealth()); - WriteShort((short)m_Client->GetPlayer()->GetFoodLevel()); - WriteFloat((float)m_Client->GetPlayer()->GetFoodSaturationLevel()); + cPlayer * Player = m_Client->GetPlayer(); + WriteFloat((float)Player->GetHealth()); + WriteShort((short)Player->GetFoodLevel()); + WriteFloat((float)Player->GetFoodSaturationLevel()); Flush(); } @@ -144,11 +145,12 @@ void cProtocol161::SendHealth(void) void cProtocol161::SendPlayerMaxSpeed(void) { cCSLock Lock(m_CSPacket); + cPlayer * Player = m_Client->GetPlayer(); WriteByte(PACKET_ENTITY_PROPERTIES); - WriteInt(m_Client->GetPlayer()->GetUniqueID()); + WriteInt(Player->GetUniqueID()); WriteInt(1); WriteString("generic.movementSpeed"); - WriteDouble(0.1 * m_Client->GetPlayer()->GetMaxSpeed()); + WriteDouble(0.1 * Player->GetMaxSpeed()); Flush(); } @@ -276,11 +278,12 @@ cProtocol162::cProtocol162(cClientHandle * a_Client) : void cProtocol162::SendPlayerMaxSpeed(void) { cCSLock Lock(m_CSPacket); + cPlayer * Player = m_Client->GetPlayer(); WriteByte(PACKET_ENTITY_PROPERTIES); - WriteInt(m_Client->GetPlayer()->GetUniqueID()); + WriteInt(Player->GetUniqueID()); WriteInt(1); WriteString("generic.movementSpeed"); - WriteDouble(0.1 * m_Client->GetPlayer()->GetMaxSpeed()); + WriteDouble(0.1 * Player->GetMaxSpeed()); WriteShort(0); Flush(); } diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp index a4319df37..135518b67 100644 --- a/src/Protocol/Protocol17x.cpp +++ b/src/Protocol/Protocol17x.cpp @@ -514,9 +514,10 @@ void cProtocol172::SendGameMode(eGameMode a_GameMode) void cProtocol172::SendHealth(void) { cPacketizer Pkt(*this, 0x06); // Update Health packet - Pkt.WriteFloat((float)m_Client->GetPlayer()->GetHealth()); - Pkt.WriteShort(m_Client->GetPlayer()->GetFoodLevel()); - Pkt.WriteFloat((float)m_Client->GetPlayer()->GetFoodSaturationLevel()); + cPlayer * Player = m_Client->GetPlayer(); + Pkt.WriteFloat((float)Player->GetHealth()); + Pkt.WriteShort(Player->GetFoodLevel()); + Pkt.WriteFloat((float)Player->GetFoodSaturationLevel()); } @@ -549,12 +550,13 @@ void cProtocol172::SendLogin(const cPlayer & a_Player, const cWorld & a_World) { // Send the Join Game packet: { + cServer * Server = cRoot::Get()->GetServer(); cPacketizer Pkt(*this, 0x01); // Join Game packet Pkt.WriteInt(a_Player.GetUniqueID()); - Pkt.WriteByte((Byte)a_Player.GetEffectiveGameMode() | (cRoot::Get()->GetServer()->IsHardcore() ? 0x08 : 0)); // Hardcore flag bit 4 + Pkt.WriteByte((Byte)a_Player.GetEffectiveGameMode() | (Server->IsHardcore() ? 0x08 : 0)); // Hardcore flag bit 4 Pkt.WriteChar((char)a_World.GetDimension()); Pkt.WriteByte(2); // TODO: Difficulty (set to Normal) - Pkt.WriteByte(std::min(cRoot::Get()->GetServer()->GetMaxPlayers(), 60)); + Pkt.WriteByte(std::min(Server->GetMaxPlayers(), 60)); Pkt.WriteString("default"); // Level type - wtf? } @@ -673,22 +675,23 @@ void cProtocol172::SendPlayerAbilities(void) { cPacketizer Pkt(*this, 0x39); // Player Abilities packet Byte Flags = 0; - if (m_Client->GetPlayer()->IsGameModeCreative()) + cPlayer * Player = m_Client->GetPlayer(); + if (Player->IsGameModeCreative()) { Flags |= 0x01; Flags |= 0x08; // Godmode, used for creative } - if (m_Client->GetPlayer()->IsFlying()) + if (Player->IsFlying()) { Flags |= 0x02; } - if (m_Client->GetPlayer()->CanFly()) + if (Player->CanFly()) { Flags |= 0x04; } Pkt.WriteByte(Flags); - Pkt.WriteFloat((float)(0.05 * m_Client->GetPlayer()->GetFlyingMaxSpeed())); - Pkt.WriteFloat((float)(0.1 * m_Client->GetPlayer()->GetMaxSpeed())); + Pkt.WriteFloat((float)(0.05 * Player->GetFlyingMaxSpeed())); + Pkt.WriteFloat((float)(0.1 * Player->GetMaxSpeed())); } @@ -739,17 +742,18 @@ void cProtocol172::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline) void cProtocol172::SendPlayerMaxSpeed(void) { cPacketizer Pkt(*this, 0x20); // Entity Properties - Pkt.WriteInt(m_Client->GetPlayer()->GetUniqueID()); + cPlayer * Player = m_Client->GetPlayer(); + Pkt.WriteInt(Player->GetUniqueID()); Pkt.WriteInt(1); // Count Pkt.WriteString("generic.movementSpeed"); // The default game speed is 0.1, multiply that value by the relative speed: - Pkt.WriteDouble(0.1 * m_Client->GetPlayer()->GetNormalMaxSpeed()); - if (m_Client->GetPlayer()->IsSprinting()) + Pkt.WriteDouble(0.1 * Player->GetNormalMaxSpeed()); + if (Player->IsSprinting()) { Pkt.WriteShort(1); // Modifier count Pkt.WriteInt64(0x662a6b8dda3e4c1c); Pkt.WriteInt64(0x881396ea6097278d); // UUID of the modifier - Pkt.WriteDouble(m_Client->GetPlayer()->GetSprintingMaxSpeed() - m_Client->GetPlayer()->GetNormalMaxSpeed()); + Pkt.WriteDouble(Player->GetSprintingMaxSpeed() - Player->GetNormalMaxSpeed()); Pkt.WriteByte(2); } else @@ -765,16 +769,17 @@ void cProtocol172::SendPlayerMaxSpeed(void) void cProtocol172::SendPlayerMoveLook(void) { cPacketizer Pkt(*this, 0x08); // Player Position And Look packet - Pkt.WriteDouble(m_Client->GetPlayer()->GetPosX()); + cPlayer * Player = m_Client->GetPlayer(); + Pkt.WriteDouble(Player->GetPosX()); // Protocol docs say this is PosY, but #323 says this is eye-pos // Moreover, the "+ 0.001" is there because otherwise the player falls through the block they were standing on. - Pkt.WriteDouble(m_Client->GetPlayer()->GetStance() + 0.001); + Pkt.WriteDouble(Player->GetStance() + 0.001); - Pkt.WriteDouble(m_Client->GetPlayer()->GetPosZ()); - Pkt.WriteFloat((float)m_Client->GetPlayer()->GetYaw()); - Pkt.WriteFloat((float)m_Client->GetPlayer()->GetPitch()); - Pkt.WriteBool(m_Client->GetPlayer()->IsOnGround()); + Pkt.WriteDouble(Player->GetPosZ()); + Pkt.WriteFloat((float)Player->GetYaw()); + Pkt.WriteFloat((float)Player->GetPitch()); + Pkt.WriteBool(Player->IsOnGround()); } @@ -840,9 +845,10 @@ void cProtocol172::SendRemoveEntityEffect(const cEntity & a_Entity, int a_Effect void cProtocol172::SendRespawn(void) { cPacketizer Pkt(*this, 0x07); // Respawn packet - Pkt.WriteInt(m_Client->GetPlayer()->GetWorld()->GetDimension()); + cPlayer * Player = m_Client->GetPlayer(); + Pkt.WriteInt(Player->GetWorld()->GetDimension()); Pkt.WriteByte(2); // TODO: Difficulty (set to Normal) - Pkt.WriteByte((Byte)m_Client->GetPlayer()->GetEffectiveGameMode()); + Pkt.WriteByte((Byte)Player->GetEffectiveGameMode()); Pkt.WriteString("default"); } @@ -853,9 +859,10 @@ void cProtocol172::SendRespawn(void) void cProtocol172::SendExperience (void) { cPacketizer Pkt(*this, 0x1F); //Experience Packet - Pkt.WriteFloat(m_Client->GetPlayer()->GetXpPercentage()); - Pkt.WriteShort(m_Client->GetPlayer()->GetXpLevel()); - Pkt.WriteShort(m_Client->GetPlayer()->GetCurrentXp()); + cPlayer * Player = m_Client->GetPlayer(); + Pkt.WriteFloat(Player->GetXpPercentage()); + Pkt.WriteShort(Player->GetXpLevel()); + Pkt.WriteShort(Player->GetCurrentXp()); } @@ -1485,15 +1492,16 @@ void cProtocol172::HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer) { // Send the response: AString Response = "{\"version\":{\"name\":\"1.7.2\",\"protocol\":4},\"players\":{"; + cServer * Server = cRoot::Get()->GetServer(); AppendPrintf(Response, "\"max\":%u,\"online\":%u,\"sample\":[]},", - cRoot::Get()->GetServer()->GetMaxPlayers(), - cRoot::Get()->GetServer()->GetNumPlayers() + Server->GetMaxPlayers(), + Server->GetNumPlayers() ); AppendPrintf(Response, "\"description\":{\"text\":\"%s\"},", - cRoot::Get()->GetServer()->GetDescription().c_str() + Server->GetDescription().c_str() ); AppendPrintf(Response, "\"favicon\":\"data:image/png;base64,%s\"", - cRoot::Get()->GetServer()->GetFaviconData().c_str() + Server->GetFaviconData().c_str() ); Response.append("}"); @@ -1582,12 +1590,13 @@ void cProtocol172::HandlePacketLoginStart(cByteBuffer & a_ByteBuffer) return; } + cServer * Server = cRoot::Get()->GetServer(); // If auth is required, then send the encryption request: - if (cRoot::Get()->GetServer()->ShouldAuthenticate()) + if (Server->ShouldAuthenticate()) { cPacketizer Pkt(*this, 0x01); - Pkt.WriteString(cRoot::Get()->GetServer()->GetServerID()); - const AString & PubKeyDer = cRoot::Get()->GetServer()->GetPublicKeyDER(); + Pkt.WriteString(Server->GetServerID()); + const AString & PubKeyDer = Server->GetPublicKeyDER(); Pkt.WriteShort(PubKeyDer.size()); Pkt.WriteBuf(PubKeyDer.data(), PubKeyDer.size()); Pkt.WriteShort(4); @@ -2136,10 +2145,11 @@ void cProtocol172::StartEncryption(const Byte * a_Key) // Prepare the m_AuthServerID: cSHA1Checksum Checksum; - const AString & ServerID = cRoot::Get()->GetServer()->GetServerID(); + cServer * Server = cRoot::Get()->GetServer(); + const AString & ServerID = Server->GetServerID(); Checksum.Update((const Byte *)ServerID.c_str(), ServerID.length()); Checksum.Update(a_Key, 16); - Checksum.Update((const Byte *)cRoot::Get()->GetServer()->GetPublicKeyDER().data(), cRoot::Get()->GetServer()->GetPublicKeyDER().size()); + Checksum.Update((const Byte *)Server->GetPublicKeyDER().data(), Server->GetPublicKeyDER().size()); Byte Digest[20]; Checksum.Finalize(Digest); cSHA1Checksum::DigestToJava(Digest, m_AuthServerID); @@ -2481,11 +2491,12 @@ void cProtocol172::cPacketizer::WriteEntityMetadata(const cEntity & a_Entity) if (((cMinecart &)a_Entity).GetPayload() == cMinecart::mpNone) { cRideableMinecart & RideableMinecart = ((cRideableMinecart &)a_Entity); - if (!RideableMinecart.GetContent().IsEmpty()) + const cItem & MinecartContent = RideableMinecart.GetContent(); + if (!MinecartContent.IsEmpty()) { WriteByte(0x54); - int Content = RideableMinecart.GetContent().m_ItemType; - Content |= RideableMinecart.GetContent().m_ItemDamage << 8; + int Content = MinecartContent.m_ItemType; + Content |= MinecartContent.m_ItemDamage << 8; WriteInt(Content); WriteByte(0x55); WriteInt(RideableMinecart.GetBlockHeight()); diff --git a/src/Protocol/ProtocolRecognizer.cpp b/src/Protocol/ProtocolRecognizer.cpp index 3f7d7b254..f9a7ba92b 100644 --- a/src/Protocol/ProtocolRecognizer.cpp +++ b/src/Protocol/ProtocolRecognizer.cpp @@ -980,6 +980,7 @@ bool cProtocolRecognizer::TryRecognizeLengthedProtocol(UInt32 a_PacketLengthRema void cProtocolRecognizer::SendLengthlessServerPing(void) { AString Reply; + cServer * Server = cRoot::Get()->GetServer(); switch (cRoot::Get()->GetPrimaryServerVersion()) { case PROTO_VERSION_1_2_5: @@ -987,11 +988,11 @@ void cProtocolRecognizer::SendLengthlessServerPing(void) { // http://wiki.vg/wiki/index.php?title=Protocol&oldid=3099#Server_List_Ping_.280xFE.29 Printf(Reply, "%s%s%i%s%i", - cRoot::Get()->GetServer()->GetDescription().c_str(), + Server->GetDescription().c_str(), cChatColor::Delimiter.c_str(), - cRoot::Get()->GetServer()->GetNumPlayers(), + Server->GetNumPlayers(), cChatColor::Delimiter.c_str(), - cRoot::Get()->GetServer()->GetMaxPlayers() + Server->GetMaxPlayers() ); break; } @@ -1021,9 +1022,9 @@ void cProtocolRecognizer::SendLengthlessServerPing(void) // http://wiki.vg/wiki/index.php?title=Server_List_Ping&oldid=3100 AString NumPlayers; - Printf(NumPlayers, "%d", cRoot::Get()->GetServer()->GetNumPlayers()); + Printf(NumPlayers, "%d", Server->GetNumPlayers()); AString MaxPlayers; - Printf(MaxPlayers, "%d", cRoot::Get()->GetServer()->GetMaxPlayers()); + Printf(MaxPlayers, "%d", Server->GetMaxPlayers()); AString ProtocolVersionNum; Printf(ProtocolVersionNum, "%d", cRoot::Get()->GetPrimaryServerVersion()); @@ -1037,7 +1038,7 @@ void cProtocolRecognizer::SendLengthlessServerPing(void) Reply.push_back(0); Reply.append(ProtocolVersionTxt); Reply.push_back(0); - Reply.append(cRoot::Get()->GetServer()->GetDescription()); + Reply.append(Server->GetDescription()); Reply.push_back(0); Reply.append(NumPlayers); Reply.push_back(0); diff --git a/src/Server.cpp b/src/Server.cpp index d1e53bfff..4c2cd6803 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -190,7 +190,7 @@ void cServer::PlayerDestroying(const cPlayer * a_Player) bool cServer::InitServer(cIniFile & a_SettingsIni) { - m_Description = a_SettingsIni.GetValueSet("Server", "Description", "MCServer - in C++!").c_str(); + m_Description = a_SettingsIni.GetValueSet("Server", "Description", "MCServer - in C++!"); m_MaxPlayers = a_SettingsIni.GetValueSetI("Server", "MaxPlayers", 100); m_bIsHardcore = a_SettingsIni.GetValueSetB("Server", "HardcoreEnabled", false); m_PlayerCount = 0; diff --git a/src/Simulator/FireSimulator.cpp b/src/Simulator/FireSimulator.cpp index 470dfc791..4fbfffd43 100644 --- a/src/Simulator/FireSimulator.cpp +++ b/src/Simulator/FireSimulator.cpp @@ -350,7 +350,7 @@ void cFireSimulator::RemoveFuelNeighbors(cChunk * a_Chunk, int a_RelX, int a_Rel { continue; } - BlockType = Neighbour->GetBlock(X, a_RelY + gCrossCoords[i].y, Z); + BlockType = Neighbour->GetBlock(X, a_RelY + gNeighborCoords[i].y, Z); if (!IsFuel(BlockType)) { diff --git a/src/Simulator/FluidSimulator.cpp b/src/Simulator/FluidSimulator.cpp index 7779573d7..4a84084d2 100644 --- a/src/Simulator/FluidSimulator.cpp +++ b/src/Simulator/FluidSimulator.cpp @@ -155,7 +155,7 @@ Direction cFluidSimulator::GetFlowingDirection(int a_X, int a_Y, int a_Z, bool a Points.push_back(new Vector3i(a_X, a_Y, a_Z + 1)); Points.push_back(new Vector3i(a_X, a_Y, a_Z - 1)); - for (std::vector::iterator it = Points.begin(); it < Points.end(); it++) + for (std::vector::iterator it = Points.begin(); it < Points.end(); ++it) { Vector3i *Pos = (*it); char BlockID = m_World.GetBlock(Pos->x, Pos->y, Pos->z); diff --git a/src/StackWalker.cpp b/src/StackWalker.cpp index b4f8ed8c7..b608d69e6 100644 --- a/src/StackWalker.cpp +++ b/src/StackWalker.cpp @@ -935,7 +935,8 @@ BOOL StackWalker::LoadModules() break; } } // for (search for path separator...) - if (strlen(szTemp) > 0) + + if (szTemp[0] != '\0') // If szTemp is not empty (Note: This is more efficient than using strlen) { strcat_s(szSymPath, nSymPathLen, szTemp); strcat_s(szSymPath, nSymPathLen, ";"); diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 88977e005..419d919bd 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -483,6 +483,7 @@ void cSlotAreaCrafting::ClickedResult(cPlayer & a_Player) // Get the current recipe: cCraftingRecipe & Recipe = GetRecipeForPlayer(a_Player); + const cItem & Result = Recipe.GetResult(); cItem * PlayerSlots = GetPlayerSlots(a_Player) + 1; cCraftingGrid Grid(PlayerSlots, m_GridSize, m_GridSize); @@ -490,16 +491,16 @@ void cSlotAreaCrafting::ClickedResult(cPlayer & a_Player) // If possible, craft: if (DraggingItem.IsEmpty()) { - DraggingItem = Recipe.GetResult(); + DraggingItem = Result; Recipe.ConsumeIngredients(Grid); Grid.CopyToItems(PlayerSlots); } - else if (DraggingItem.IsEqual(Recipe.GetResult())) + else if (DraggingItem.IsEqual(Result)) { - cItemHandler * Handler = ItemHandler(Recipe.GetResult().m_ItemType); - if (DraggingItem.m_ItemCount + Recipe.GetResult().m_ItemCount <= Handler->GetMaxStackSize()) + cItemHandler * Handler = ItemHandler(Result.m_ItemType); + if (DraggingItem.m_ItemCount + Result.m_ItemCount <= Handler->GetMaxStackSize()) { - DraggingItem.m_ItemCount += Recipe.GetResult().m_ItemCount; + DraggingItem.m_ItemCount += Result.m_ItemCount; Recipe.ConsumeIngredients(Grid); Grid.CopyToItems(PlayerSlots); } diff --git a/src/WebAdmin.cpp b/src/WebAdmin.cpp index cd141f7eb..a3b3cc5be 100644 --- a/src/WebAdmin.cpp +++ b/src/WebAdmin.cpp @@ -229,10 +229,11 @@ void cWebAdmin::HandleWebadminRequest(cHTTPConnection & a_Connection, cHTTPReque } // for itr - Data->m_Form[] // Parse the URL into individual params: - size_t idxQM = a_Request.GetURL().find('?'); + const AString & URL = a_Request.GetURL(); + size_t idxQM = URL.find('?'); if (idxQM != AString::npos) { - cHTTPFormParser URLParams(cHTTPFormParser::fpkURL, a_Request.GetURL().c_str() + idxQM + 1, a_Request.GetURL().length() - idxQM - 1, *Data); + cHTTPFormParser URLParams(cHTTPFormParser::fpkURL, URL.c_str() + idxQM + 1, URL.length() - idxQM - 1, *Data); URLParams.Finish(); for (cHTTPFormParser::const_iterator itr = URLParams.begin(), end = URLParams.end(); itr != end; ++itr) { @@ -388,7 +389,6 @@ AString cWebAdmin::GetDefaultPage(void) { continue; } - AString VersionNum; AppendPrintf(Content, "
  • %s V.%i
  • ", itr->second->GetName().c_str(), itr->second->GetVersion()); } Content += ""; diff --git a/src/World.cpp b/src/World.cpp index c188fd522..7762a115e 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -860,7 +860,7 @@ void cWorld::TickMobs(float a_Dt) { m_ChunkMap->SpawnMobs(Spawner); // do the spawn - for (cMobSpawner::tSpawnedContainer::const_iterator itr2 = Spawner.getSpawned().begin(); itr2 != Spawner.getSpawned().end(); itr2++) + for (cMobSpawner::tSpawnedContainer::const_iterator itr2 = Spawner.getSpawned().begin(); itr2 != Spawner.getSpawned().end(); ++itr2) { SpawnMobFinalize(*itr2); } @@ -870,14 +870,14 @@ void cWorld::TickMobs(float a_Dt) // move close mobs cMobProximityCounter::sIterablePair allCloseEnoughToMoveMobs = MobCensus.GetProximityCounter().getMobWithinThosesDistances(-1, 64 * 16);// MG TODO : deal with this magic number (the 16 is the size of a block) - for(cMobProximityCounter::tDistanceToMonster::const_iterator itr = allCloseEnoughToMoveMobs.m_Begin; itr != allCloseEnoughToMoveMobs.m_End; itr++) + for(cMobProximityCounter::tDistanceToMonster::const_iterator itr = allCloseEnoughToMoveMobs.m_Begin; itr != allCloseEnoughToMoveMobs.m_End; ++itr) { itr->second.m_Monster.Tick(a_Dt, itr->second.m_Chunk); } // remove too far mobs cMobProximityCounter::sIterablePair allTooFarMobs = MobCensus.GetProximityCounter().getMobWithinThosesDistances(128 * 16, -1);// MG TODO : deal with this magic number (the 16 is the size of a block) - for(cMobProximityCounter::tDistanceToMonster::const_iterator itr = allTooFarMobs.m_Begin; itr != allTooFarMobs.m_End; itr++) + for(cMobProximityCounter::tDistanceToMonster::const_iterator itr = allTooFarMobs.m_Begin; itr != allTooFarMobs.m_End; ++itr) { itr->second.m_Monster.Destroy(true); } @@ -2890,7 +2890,7 @@ void cWorld::TickQueuedBlocks(void) m_BlockTickQueueCopy.clear(); m_BlockTickQueue.swap(m_BlockTickQueueCopy); - for (std::vector::iterator itr = m_BlockTickQueueCopy.begin(); itr != m_BlockTickQueueCopy.end(); itr++) + for (std::vector::iterator itr = m_BlockTickQueueCopy.begin(); itr != m_BlockTickQueueCopy.end(); ++itr) { BlockTickQueueItem * Block = (*itr); Block->TicksToWait -= 1; @@ -2981,7 +2981,7 @@ int cWorld::SpawnMobFinalize(cMonster * a_Monster) -int cWorld::CreateProjectile(double a_PosX, double a_PosY, double a_PosZ, cProjectileEntity::eKind a_Kind, cEntity * a_Creator, const cItem a_Item, const Vector3d * a_Speed) +int cWorld::CreateProjectile(double a_PosX, double a_PosY, double a_PosZ, cProjectileEntity::eKind a_Kind, cEntity * a_Creator, const cItem & a_Item, const Vector3d * a_Speed) { cProjectileEntity * Projectile = cProjectileEntity::Create(a_Kind, a_Creator, a_PosX, a_PosY, a_PosZ, a_Item, a_Speed); if (Projectile == NULL) diff --git a/src/World.h b/src/World.h index e08ef7f53..e2be4cd35 100644 --- a/src/World.h +++ b/src/World.h @@ -711,7 +711,7 @@ public: int SpawnMobFinalize(cMonster* a_Monster); /** Creates a projectile of the specified type. Returns the projectile's EntityID if successful, <0 otherwise */ - int CreateProjectile(double a_PosX, double a_PosY, double a_PosZ, cProjectileEntity::eKind a_Kind, cEntity * a_Creator, const cItem a_Item, const Vector3d * a_Speed = NULL); // tolua_export + int CreateProjectile(double a_PosX, double a_PosY, double a_PosZ, cProjectileEntity::eKind a_Kind, cEntity * a_Creator, const cItem & a_Item, const Vector3d * a_Speed = NULL); // tolua_export /** Returns a random number from the m_TickRand in range [0 .. a_Range]. To be used only in the tick thread! */ int GetTickRandomNumber(unsigned a_Range) { return (int)(m_TickRand.randInt(a_Range)); } diff --git a/src/WorldStorage/FastNBT.cpp b/src/WorldStorage/FastNBT.cpp index be25fd1a4..ac9a21205 100644 --- a/src/WorldStorage/FastNBT.cpp +++ b/src/WorldStorage/FastNBT.cpp @@ -345,7 +345,7 @@ cFastNBTWriter::cFastNBTWriter(const AString & a_RootTagName) : void cFastNBTWriter::BeginCompound(const AString & a_Name) { - if (m_CurrentStack >= MAX_STACK) + if (m_CurrentStack >= MAX_STACK - 1) { ASSERT(!"Stack overflow"); return; @@ -376,7 +376,7 @@ void cFastNBTWriter::EndCompound(void) void cFastNBTWriter::BeginList(const AString & a_Name, eTagType a_ChildrenType) { - if (m_CurrentStack >= MAX_STACK) + if (m_CurrentStack >= MAX_STACK - 1) { ASSERT(!"Stack overflow"); return; diff --git a/src/WorldStorage/WSSCompact.cpp b/src/WorldStorage/WSSCompact.cpp index bb9d4b9e6..5435e6d5a 100644 --- a/src/WorldStorage/WSSCompact.cpp +++ b/src/WorldStorage/WSSCompact.cpp @@ -839,7 +839,7 @@ void cWSSCompact::cPAKFile::UpdateChunk2To3() -bool cWSSCompact::LoadChunkFromData(const cChunkCoords & a_Chunk, int & a_UncompressedSize, const AString & a_Data, cWorld * a_World) +bool cWSSCompact::LoadChunkFromData(const cChunkCoords & a_Chunk, int a_UncompressedSize, const AString & a_Data, cWorld * a_World) { // Crude data integrity check: if (a_UncompressedSize < cChunkDef::BlockDataSize) diff --git a/src/WorldStorage/WSSCompact.h b/src/WorldStorage/WSSCompact.h index 4df146ec3..97e3b82f9 100644 --- a/src/WorldStorage/WSSCompact.h +++ b/src/WorldStorage/WSSCompact.h @@ -135,7 +135,7 @@ protected: bool EraseChunkData(const cChunkCoords & a_Chunk); /// Loads the chunk from the data (no locking needed) - bool LoadChunkFromData(const cChunkCoords & a_Chunk, int & a_UncompressedSize, const AString & a_Data, cWorld * a_World); + bool LoadChunkFromData(const cChunkCoords & a_Chunk, int a_UncompressedSize, const AString & a_Data, cWorld * a_World); void LoadEntitiesFromJson(Json::Value & a_Value, cEntityList & a_Entities, cBlockEntityList & a_BlockEntities, cWorld * a_World); From 19358fc7d5cfde19d47a910adbf8a1d67dd48f5f Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 18 Apr 2014 20:20:00 +0100 Subject: [PATCH 131/188] Compilation fix --- src/Mobs/Monster.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index 9df5d5e3b..248e88f5d 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -540,7 +540,7 @@ void cMonster::KilledBy(cEntity * a_Killer) break; } } - if ((a_Killer != NULL) && (!IsBaby()) + if ((a_Killer != NULL) && (!IsBaby())) { m_World->SpawnExperienceOrb(GetPosX(), GetPosY(), GetPosZ(), Reward); } From fde1555352727387cefe90c3393ef352475ffa20 Mon Sep 17 00:00:00 2001 From: jfhumann Date: Fri, 18 Apr 2014 22:20:24 +0200 Subject: [PATCH 132/188] Small style changes --- src/ClientHandle.cpp | 2 +- src/Generating/MineShafts.cpp | 2 +- src/Protocol/Protocol132.cpp | 4 ++-- src/Protocol/Protocol14x.cpp | 10 +++++----- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index a61d26503..580e786c9 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1214,7 +1214,7 @@ void cClientHandle::HandleChat(const AString & a_Message) cCompositeChat Msg; AString Color = m_Player->GetColor(); if (Color.length() == 3) - { + { Color = AString("@") + Color[2]; } else diff --git a/src/Generating/MineShafts.cpp b/src/Generating/MineShafts.cpp index bbb022d85..231295c3f 100644 --- a/src/Generating/MineShafts.cpp +++ b/src/Generating/MineShafts.cpp @@ -684,7 +684,7 @@ void cMineShaftCorridor::ProcessChunk(cChunkDesc & a_ChunkDesc) } if ((z2 >= 0) && (z2 < cChunkDef::Width)) { - a_ChunkDesc.SetBlockTypeMeta(x, y1, z2, E_BLOCK_FENCE, 0); //-V525 + a_ChunkDesc.SetBlockTypeMeta(x, y1, z2, E_BLOCK_FENCE, 0); a_ChunkDesc.SetBlockTypeMeta(x, y2, z2, E_BLOCK_FENCE, 0); a_ChunkDesc.SetBlockTypeMeta(x, y3, z2, E_BLOCK_PLANKS, 0); } diff --git a/src/Protocol/Protocol132.cpp b/src/Protocol/Protocol132.cpp index 1ef92b8f0..53d8c1561 100644 --- a/src/Protocol/Protocol132.cpp +++ b/src/Protocol/Protocol132.cpp @@ -805,7 +805,7 @@ void cProtocol132::SendEncryptionKeyRequest(void) WriteByte(0xfd); WriteString(Server->GetServerID()); const AString & PublicKeyDER = Server->GetPublicKeyDER(); - WriteShort((short) (PublicKeyDER.size())); + WriteShort((short)(PublicKeyDER.size())); SendData(PublicKeyDER.data(), PublicKeyDER.size()); WriteShort(4); WriteInt((int)(intptr_t)this); // Using 'this' as the cryptographic nonce, so that we don't have to generate one each time :) @@ -881,7 +881,7 @@ void cProtocol132::StartEncryption(const Byte * a_Key) AString ServerID = Server->GetServerID(); Checksum.Update((const Byte *)ServerID.c_str(), ServerID.length()); Checksum.Update(a_Key, 16); - Checksum.Update((const Byte *) Server->GetPublicKeyDER().data(), Server->GetPublicKeyDER().size()); + Checksum.Update((const Byte *)Server->GetPublicKeyDER().data(), Server->GetPublicKeyDER().size()); Byte Digest[20]; Checksum.Finalize(Digest); cSHA1Checksum::DigestToJava(Digest, m_AuthServerID); diff --git a/src/Protocol/Protocol14x.cpp b/src/Protocol/Protocol14x.cpp index d6a103d35..f60e756fd 100644 --- a/src/Protocol/Protocol14x.cpp +++ b/src/Protocol/Protocol14x.cpp @@ -103,9 +103,9 @@ void cProtocol142::SendPickupSpawn(const cPickup & a_Pickup) WriteInt (a_Pickup.GetUniqueID()); WriteItem (a_Pickup.GetItem()); WriteVectorI((Vector3i)(a_Pickup.GetPosition() * 32)); - WriteChar((char) (a_Pickup.GetSpeedX() * 8)); - WriteChar((char) (a_Pickup.GetSpeedY() * 8)); - WriteChar((char) (a_Pickup.GetSpeedZ() * 8)); + WriteChar((char)(a_Pickup.GetSpeedX() * 8)); + WriteChar((char)(a_Pickup.GetSpeedY() * 8)); + WriteChar((char)(a_Pickup.GetSpeedZ() * 8)); Flush(); } @@ -171,8 +171,8 @@ void cProtocol146::SendPickupSpawn(const cPickup & a_Pickup) WriteInt ((int)(a_Pickup.GetPosZ() * 32)); WriteInt (1); WriteShort((short)(a_Pickup.GetSpeedX() * 32)); - WriteShort((short) (a_Pickup.GetSpeedY() * 32)); - WriteShort((short) (a_Pickup.GetSpeedZ() * 32)); + WriteShort((short)(a_Pickup.GetSpeedY() * 32)); + WriteShort((short)(a_Pickup.GetSpeedZ() * 32)); WriteByte(0); WriteByte(0); From 5bed1c09bc239f0b5c7b31945c4ee3e5b94cdf17 Mon Sep 17 00:00:00 2001 From: jfhumann Date: Fri, 18 Apr 2014 22:47:59 +0200 Subject: [PATCH 133/188] Fixed clang compilation errors. Apparently gcc and MSVC do not care about the order of initializer lists, but clang does. --- src/Chunk.h | 2 +- src/Items/ItemHandler.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Chunk.h b/src/Chunk.h index 774770028..f20134e66 100644 --- a/src/Chunk.h +++ b/src/Chunk.h @@ -389,7 +389,7 @@ private: BLOCKTYPE m_PreviousType; sSetBlockQueueItem(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Int64 a_Tick, BLOCKTYPE a_PreviousBlockType) : - m_RelX(a_RelX), m_RelY(a_RelY), m_RelZ(a_RelZ), m_BlockType(a_BlockType), m_BlockMeta(a_BlockMeta), m_Tick(a_Tick), m_PreviousType(a_PreviousBlockType) + m_Tick(a_Tick), m_RelX(a_RelX), m_RelY(a_RelY), m_RelZ(a_RelZ), m_BlockType(a_BlockType), m_BlockMeta(a_BlockMeta), m_PreviousType(a_PreviousBlockType) { } } ; diff --git a/src/Items/ItemHandler.h b/src/Items/ItemHandler.h index 686f4b439..f3d78335e 100644 --- a/src/Items/ItemHandler.h +++ b/src/Items/ItemHandler.h @@ -63,8 +63,8 @@ public: int PoisonChance; // 0 - 100, in percent. 0 = no chance of poisoning, 100 = sure poisoning FoodInfo(int a_FoodLevel, double a_Saturation, int a_PoisonChance = 0) : - FoodLevel(a_FoodLevel), Saturation(a_Saturation), + FoodLevel(a_FoodLevel), PoisonChance(a_PoisonChance) { } From 6eac5867945044eda62312f9657ff0c808ac2080 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 19 Apr 2014 13:05:58 +0200 Subject: [PATCH 134/188] Fixed formatting, made function static. --- src/BlockEntities/BeaconEntity.cpp | 17 +++++++++-------- src/BlockEntities/BeaconEntity.h | 14 +++++++++----- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/BlockEntities/BeaconEntity.cpp b/src/BlockEntities/BeaconEntity.cpp index dd340f24f..0914353eb 100644 --- a/src/BlockEntities/BeaconEntity.cpp +++ b/src/BlockEntities/BeaconEntity.cpp @@ -17,7 +17,7 @@ cBeaconEntity::cBeaconEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * -int cBeaconEntity::GetPyramidLevel() +int cBeaconEntity::GetPyramidLevel(void) { cBlockArea Area; int MinY = GetPosY() - 4; @@ -33,12 +33,9 @@ int cBeaconEntity::GetPyramidLevel() Area.Read( m_World, - GetPosX() - 4, - GetPosX() + 4, - MinY, - MaxY, - GetPosZ() - 4, - GetPosZ() + 4, + GetPosX() - 4, GetPosX() + 4, + MinY, MaxY, + GetPosZ() - 4, GetPosZ() + 4, cBlockArea::baTypes ); @@ -112,4 +109,8 @@ void cBeaconEntity::SendTo(cClientHandle & a_Client) void cBeaconEntity::UsedBy(cPlayer * a_Player) { -} \ No newline at end of file +} + + + + diff --git a/src/BlockEntities/BeaconEntity.h b/src/BlockEntities/BeaconEntity.h index 1dfd745b2..b1df68bc4 100644 --- a/src/BlockEntities/BeaconEntity.h +++ b/src/BlockEntities/BeaconEntity.h @@ -23,18 +23,22 @@ class cBeaconEntity : public: - // The initial constructor + /** The initial constructor */ cBeaconEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World); - // Returns the amount of layers the pyramid below the beacon has. + /** Returns the amount of layers the pyramid below the beacon has. */ int GetPyramidLevel(void); - // Returns true if the block is a diamond block, an golden block, an iron block or an emerald block. - bool IsMineralBlock(BLOCKTYPE a_BlockType); + /** Returns true if the block is a diamond block, a golden block, an iron block or an emerald block. */ + static bool IsMineralBlock(BLOCKTYPE a_BlockType); // cBlockEntity overrides: virtual void SaveToJson(Json::Value& a_Value ) override; virtual void SendTo(cClientHandle & a_Client) override; virtual void UsedBy(cPlayer * a_Player) override; virtual bool Tick(float a_Dt, cChunk & /* a_Chunk */) override; -} ; \ No newline at end of file +} ; + + + + From a6de7bf1cd80847abed22e3b962a5b8650b2911c Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sat, 19 Apr 2014 15:10:50 +0200 Subject: [PATCH 135/188] Fixed Code --- src/Enchantments.cpp | 642 +++++++++++++++++++++---------------------- src/Enchantments.h | 8 +- src/Item.cpp | 162 ++++++----- src/UI/SlotArea.cpp | 5 +- src/UI/Window.cpp | 8 +- 5 files changed, 416 insertions(+), 409 deletions(-) diff --git a/src/Enchantments.cpp b/src/Enchantments.cpp index ca72065ff..3a65b7284 100644 --- a/src/Enchantments.cpp +++ b/src/Enchantments.cpp @@ -219,270 +219,270 @@ bool cEnchantments::operator !=(const cEnchantments & a_Other) const -void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantments, short & a_ItemType, int a_EnchantmentLevel) +void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantments, short a_ItemType, int a_EnchantmentLevel) { if (ItemCategory::IsSword(a_ItemType)) { // Sharpness - if (a_EnchantmentLevel >= 34 && a_EnchantmentLevel <= 54) + if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 4); } - else if (a_EnchantmentLevel >= 23 && a_EnchantmentLevel <= 43) + else if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 3); } - else if (a_EnchantmentLevel >= 12 && a_EnchantmentLevel <= 32) + else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 2); } - else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 21) + else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 1); } // Smite - if (a_EnchantmentLevel >= 29 && a_EnchantmentLevel <= 49) + if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 4); } - else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 41) + else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 3); } - else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 33) + else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 2); } - else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 25) + else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 1); } // Bane of Arthropods - if (a_EnchantmentLevel >= 29 && a_EnchantmentLevel <= 49) + if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 4); } - else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 41) + else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 3); } - else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 33) + else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 2); } - else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 25) + else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 1); } // Knockback - if (a_EnchantmentLevel >= 25 && a_EnchantmentLevel <= 75) + if ((a_EnchantmentLevel >= 25) && (a_EnchantmentLevel <= 75)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Knockback=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchKnockback, 2); } - else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 55) + else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 55)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Knockback=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchKnockback, 1); } // Fire Aspect - if (a_EnchantmentLevel >= 30 && a_EnchantmentLevel <= 80) + if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("FireAspect=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFireAspect, 2); } - else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 60) + else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("FireAspect=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFireAspect, 1); } // Looting - if (a_EnchantmentLevel >= 33 && a_EnchantmentLevel <= 83) + if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Looting=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchLooting, 3); } - else if (a_EnchantmentLevel >= 24 && a_EnchantmentLevel <= 74) + else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Looting=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchLooting, 2); } - else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Looting=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchLooting, 1); } } else if (ItemCategory::IsTool(a_ItemType)) { // Efficiency - if (a_EnchantmentLevel >= 31 && a_EnchantmentLevel <= 81) + if ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 81)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 4); } - else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 71) + else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 71)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 3); } - else if (a_EnchantmentLevel >= 11 && a_EnchantmentLevel <= 61) + else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 61)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 2); } - else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 51) + else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 51)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 1); } // Silk Touch - if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("SilkTouch=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchSilkTouch, 1); } // Fortune - if (a_EnchantmentLevel >= 33 && a_EnchantmentLevel <= 83) + if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Fortune=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFortune, 3); } - else if (a_EnchantmentLevel >= 24 && a_EnchantmentLevel <= 74) + else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Fortune=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFortune, 2); } - else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Fortune=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFortune, 1); } } else if (ItemCategory::IsArmor(a_ItemType)) { // Protection - if (a_EnchantmentLevel >= 34 && a_EnchantmentLevel <= 54) + if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 4); } - else if (a_EnchantmentLevel >= 23 && a_EnchantmentLevel <= 43) + else if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 3); } - else if (a_EnchantmentLevel >= 12 && a_EnchantmentLevel <= 32) + else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 2); } - else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 21) + else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 1); } // Fire Protection - if (a_EnchantmentLevel >= 34 && a_EnchantmentLevel <= 46) + if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 46)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 4); } - else if (a_EnchantmentLevel >= 26 && a_EnchantmentLevel <= 38) + else if ((a_EnchantmentLevel >= 26) && (a_EnchantmentLevel <= 38)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 3); } - else if (a_EnchantmentLevel >= 18 && a_EnchantmentLevel <= 30) + else if ((a_EnchantmentLevel >= 18) && (a_EnchantmentLevel <= 30)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 2); } - else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 22) + else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 22)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 1); } // Blast Protection - if (a_EnchantmentLevel >= 29 && a_EnchantmentLevel <= 41) + if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 4); } - else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 33) + else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 3); } - else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 25) + else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 25)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 2); } - else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 17) + else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 17)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 1); } // Projectile Protection - if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 36) + if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 4); } - else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 30) + else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 30)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 3); } - else if (a_EnchantmentLevel >= 9 && a_EnchantmentLevel <= 24) + else if ((a_EnchantmentLevel >= 9) && (a_EnchantmentLevel <= 24)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 2); } - else if (a_EnchantmentLevel >= 3 && a_EnchantmentLevel <= 18) + else if ((a_EnchantmentLevel >= 3) && (a_EnchantmentLevel <= 18)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 1); } // Thorns - if (a_EnchantmentLevel >= 50 && a_EnchantmentLevel <= 100) + if ((a_EnchantmentLevel >= 50) && (a_EnchantmentLevel <= 100)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Thorns=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchThorns, 3); } - else if (a_EnchantmentLevel >= 30 && a_EnchantmentLevel <= 80) + else if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Thorns=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchThorns, 2); } - else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 60) + else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Thorns=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchThorns, 1); } if (ItemCategory::IsHelmet(a_ItemType)) { // Respiration - if (a_EnchantmentLevel >= 30 && a_EnchantmentLevel <= 60) + if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 60)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Respiration=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchRespiration, 3); } - else if (a_EnchantmentLevel >= 20 && a_EnchantmentLevel <= 50) + else if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Respiration=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchRespiration, 2); } - else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 40) + else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 40)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Respiration=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchRespiration, 1); } // Aqua Affinity - if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 41) + if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("AquaAffinity=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchAquaAffinity, 1); } } else if (ItemCategory::IsBoots(a_ItemType)) { // Feather Fall - if (a_EnchantmentLevel >= 23 && a_EnchantmentLevel <= 33) + if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 4); } - else if (a_EnchantmentLevel >= 17 && a_EnchantmentLevel <= 27) + else if ((a_EnchantmentLevel >= 17) && (a_EnchantmentLevel <= 27)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 3); } - else if (a_EnchantmentLevel >= 11 && a_EnchantmentLevel <= 21) + else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 21)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 2); } - else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 15) + else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 15)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 1); } } } @@ -490,382 +490,380 @@ void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantm else if (a_ItemType == E_ITEM_BOW) { // Power - if (a_EnchantmentLevel >= 31 && a_EnchantmentLevel <= 46) + if ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 46)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 4); } - else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 36) + else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 3); } - else if (a_EnchantmentLevel >= 11 && a_EnchantmentLevel <= 26) + else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 26)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 2); } - else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 16) + else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 16)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 1); } // Punch - if (a_EnchantmentLevel >= 32 && a_EnchantmentLevel <= 57) + if ((a_EnchantmentLevel >= 32) && (a_EnchantmentLevel <= 57)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Punch=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchPunch, 2); } - else if (a_EnchantmentLevel >= 12 && a_EnchantmentLevel <= 37) + else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 37)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Punch=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchPunch, 1); } // Flame and Infinity - if (a_EnchantmentLevel >= 20 && a_EnchantmentLevel <= 50) + if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Flame=1")); - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Infinity=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFlame, 1); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchInfinity, 1); } } else if (a_ItemType == E_ITEM_FISHING_ROD) { // Luck of the Sea and Lure - if (a_EnchantmentLevel >= 33 && a_EnchantmentLevel <= 83) + if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("LuckOfTheSea=3")); - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Lure=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLuckOfTheSea, 3); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLure, 3); } - else if (a_EnchantmentLevel >= 24 && a_EnchantmentLevel <= 74) + else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("LuckOfTheSea=2")); - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Lure=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLuckOfTheSea, 2); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLure, 2); } - else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("LuckOfTheSea=1")); - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Lure=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLuckOfTheSea, 1); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLure, 1); } } else if (a_ItemType == E_ITEM_BOOK) { - // All &a_Enchantments + // All Enchantments // Sharpness - if (a_EnchantmentLevel >= 34 && a_EnchantmentLevel <= 54) + if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 4); } - else if (a_EnchantmentLevel >= 23 && a_EnchantmentLevel <= 43) + else if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 3); } - else if (a_EnchantmentLevel >= 12 && a_EnchantmentLevel <= 32) + else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 2); } - else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 21) + else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Sharpness=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 1); } // Smite - if (a_EnchantmentLevel >= 29 && a_EnchantmentLevel <= 49) + if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 4); } - else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 41) + else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 3); } - else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 33) + else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 2); } - else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 25) + else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Smite=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 1); } // Bane of Arthropods - if (a_EnchantmentLevel >= 29 && a_EnchantmentLevel <= 49) + if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 4); } - else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 41) + else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 3); } - else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 33) + else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 2); } - else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 25) + else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("BaneOfArthropods=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 1); } // Knockback - if (a_EnchantmentLevel >= 25 && a_EnchantmentLevel <= 75) + if ((a_EnchantmentLevel >= 25) && (a_EnchantmentLevel <= 75)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Knockback=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchKnockback, 2); } - else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 55) + else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 55)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Knockback=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchKnockback, 1); } // Fire Aspect - if (a_EnchantmentLevel >= 30 && a_EnchantmentLevel <= 80) + if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("FireAspect=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFireAspect, 2); } - else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 60) + else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("FireAspect=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFireAspect, 1); } // Looting - if (a_EnchantmentLevel >= 33 && a_EnchantmentLevel <= 83) + if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Looting=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchLooting, 3); } - else if (a_EnchantmentLevel >= 24 && a_EnchantmentLevel <= 74) + else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Looting=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchLooting, 2); } - else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Looting=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchLooting, 1); } // Efficiency - if (a_EnchantmentLevel >= 31 && a_EnchantmentLevel <= 81) + if ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 81)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 4); } - else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 71) + else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 71)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 3); } - else if (a_EnchantmentLevel >= 11 && a_EnchantmentLevel <= 61) + else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 61)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 2); } - else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 51) + else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 51)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Efficiency=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 1); } // Silk Touch - if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("SilkTouch=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchSilkTouch, 1); } // Fortune - if (a_EnchantmentLevel >= 33 && a_EnchantmentLevel <= 83) + if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Fortune=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFortune, 3); } - else if (a_EnchantmentLevel >= 24 && a_EnchantmentLevel <= 74) + else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Fortune=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFortune, 2); } - else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Fortune=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFortune, 1); } // Protection - if (a_EnchantmentLevel >= 34 && a_EnchantmentLevel <= 54) + if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 4); } - else if (a_EnchantmentLevel >= 23 && a_EnchantmentLevel <= 43) + else if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 3); } - else if (a_EnchantmentLevel >= 12 && a_EnchantmentLevel <= 32) + else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 2); } - else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 21) + else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Protection=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 1); } // Fire Protection - if (a_EnchantmentLevel >= 34 && a_EnchantmentLevel <= 46) + if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 46)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 4); } - else if (a_EnchantmentLevel >= 26 && a_EnchantmentLevel <= 38) + else if ((a_EnchantmentLevel >= 26) && (a_EnchantmentLevel <= 38)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 3); } - else if (a_EnchantmentLevel >= 18 && a_EnchantmentLevel <= 30) + else if ((a_EnchantmentLevel >= 18) && (a_EnchantmentLevel <= 30)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 2); } - else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 22) + else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 22)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FireProtection=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 1); } // Blast Protection - if (a_EnchantmentLevel >= 29 && a_EnchantmentLevel <= 41) + if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 4); } - else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 33) + else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 3); } - else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 25) + else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 25)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 2); } - else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 17) + else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 17)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("BlastProtection=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 1); } // Projectile Protection - if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 36) + if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 4); } - else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 30) + else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 30)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 3); } - else if (a_EnchantmentLevel >= 9 && a_EnchantmentLevel <= 24) + else if ((a_EnchantmentLevel >= 9) && (a_EnchantmentLevel <= 24)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 2); } - else if (a_EnchantmentLevel >= 3 && a_EnchantmentLevel <= 18) + else if ((a_EnchantmentLevel >= 3) && (a_EnchantmentLevel <= 18)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("ProjectileProtection=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 1); } // Thorns - if (a_EnchantmentLevel >= 50 && a_EnchantmentLevel <= 100) + if ((a_EnchantmentLevel >= 50) && (a_EnchantmentLevel <= 100)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Thorns=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchThorns, 3); } - else if (a_EnchantmentLevel >= 30 && a_EnchantmentLevel <= 80) + else if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Thorns=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchThorns, 2); } - else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 60) + else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Thorns=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchThorns, 1); } // Respiration - if (a_EnchantmentLevel >= 30 && a_EnchantmentLevel <= 60) + if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 60)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Respiration=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchRespiration, 3); } - else if (a_EnchantmentLevel >= 20 && a_EnchantmentLevel <= 50) + else if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Respiration=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchRespiration, 2); } - else if (a_EnchantmentLevel >= 10 && a_EnchantmentLevel <= 40) + else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 40)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Respiration=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchRespiration, 1); } // Aqua Affinity - if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 41) + if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("AquaAffinity=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchAquaAffinity, 1); } // Feather Fall - if (a_EnchantmentLevel >= 23 && a_EnchantmentLevel <= 33) + if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 4); } - else if (a_EnchantmentLevel >= 17 && a_EnchantmentLevel <= 27) + else if ((a_EnchantmentLevel >= 17) && (a_EnchantmentLevel <= 27)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 3); } - else if (a_EnchantmentLevel >= 11 && a_EnchantmentLevel <= 21) + else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 21)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 2); } - else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 15) + else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 15)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("FeatherFalling=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 1); } // Power - if (a_EnchantmentLevel >= 31 && a_EnchantmentLevel <= 46) + if ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 46)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=4")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 4); } - else if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 36) + else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 3); } - else if (a_EnchantmentLevel >= 11 && a_EnchantmentLevel <= 26) + else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 26)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 2); } - else if (a_EnchantmentLevel >= 1 && a_EnchantmentLevel <= 16) + else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 16)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, cEnchantments("Power=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 1); } // Punch - if (a_EnchantmentLevel >= 32 && a_EnchantmentLevel <= 57) + if ((a_EnchantmentLevel >= 32) && (a_EnchantmentLevel <= 57)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Punch=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchPunch, 2); } - else if (a_EnchantmentLevel >= 12 && a_EnchantmentLevel <= 37) + else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 37)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Punch=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchPunch, 1); } // Flame and Infinity - if (a_EnchantmentLevel >= 20 && a_EnchantmentLevel <= 50) + if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, cEnchantments("Flame=1")); - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Infinity=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFlame, 1); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchInfinity, 1); } // Luck of the Sea and Lure - if (a_EnchantmentLevel >= 33 && a_EnchantmentLevel <= 83) + if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("LuckOfTheSea=3")); - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Lure=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLuckOfTheSea, 3); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLure, 3); } - else if (a_EnchantmentLevel >= 24 && a_EnchantmentLevel <= 74) + else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("LuckOfTheSea=2")); - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Lure=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLuckOfTheSea, 2); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLure, 2); } - else if (a_EnchantmentLevel >= 15 && a_EnchantmentLevel <= 65) + else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("LuckOfTheSea=1")); - AddEnchantmentWeightToVector(&a_Enchantments, 1, cEnchantments("Lure=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLuckOfTheSea, 1); + AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLure, 1); } - - a_ItemType = E_ITEM_ENCHANTED_BOOK; } // Unbreaking - if (a_EnchantmentLevel >= 21 && a_EnchantmentLevel <= 71) + if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 71)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Unbreaking=3")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchUnbreaking, 3); } - else if (a_EnchantmentLevel >= 13 && a_EnchantmentLevel <= 63) + else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 63)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Unbreaking=2")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchUnbreaking, 2); } - else if (a_EnchantmentLevel >= 5 && a_EnchantmentLevel <= 55) + else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 55)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, cEnchantments("Unbreaking=1")); + AddEnchantmentWeightToVector(&a_Enchantments, 5, enchUnbreaking, 1); } } @@ -873,27 +871,27 @@ void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantm -void cEnchantments::AddEnchantmentWeightToVector(cWeightedEnchantments * a_Enchantments, int a_Weight, cEnchantments a_Enchantment) +void cEnchantments::AddEnchantmentWeightToVector(cWeightedEnchantments * a_Enchantments, int a_Weight, int a_EnchantmentID, int a_EnchantmentLevel) { - cWeightedEnchantment enchantment; - enchantment.m_Weight = a_Weight; - enchantment.m_Enchantments = a_Enchantment; - a_Enchantments->push_back(enchantment); + cWeightedEnchantment weightedenchantment; + weightedenchantment.m_Weight = a_Weight; + cEnchantments enchantment; + enchantment.SetLevel(a_EnchantmentID, a_EnchantmentLevel); + weightedenchantment.m_Enchantments = enchantment; + a_Enchantments->push_back(weightedenchantment); } -void cEnchantments::RemoveEnchantmentWeightFromVector(cWeightedEnchantments * a_Enchantments, int a_EnchantmentID) +void cEnchantments::RemoveEnchantmentWeightFromVector(cWeightedEnchantments & a_Enchantments, int a_EnchantmentID) { - for (cWeightedEnchantments::iterator it = a_Enchantments->begin(); it != a_Enchantments->end(); ++it) + for (cWeightedEnchantments::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { - int EnchantmentID = atoi(StringSplit((*it).m_Enchantments.ToString(), "=")[0].c_str()); - - if (EnchantmentID == a_EnchantmentID) + if ((*it).m_Enchantments.GetLevel(a_EnchantmentID) > 0) { - a_Enchantments->erase(it); + a_Enchantments.erase(it); break; } } @@ -903,13 +901,13 @@ void cEnchantments::RemoveEnchantmentWeightFromVector(cWeightedEnchantments * a_ -void cEnchantments::RemoveEnchantmentWeightFromVector(cWeightedEnchantments * a_Enchantments, cEnchantments a_Enchantment) +void cEnchantments::RemoveEnchantmentWeightFromVector(cWeightedEnchantments & a_Enchantments, const cEnchantments & a_Enchantment) { - for (cWeightedEnchantments::iterator it = a_Enchantments->begin(); it != a_Enchantments->end(); ++it) + for (cWeightedEnchantments::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { if ((*it).m_Enchantments == a_Enchantment) { - a_Enchantments->erase(it); + a_Enchantments.erase(it); break; } } @@ -921,55 +919,53 @@ void cEnchantments::RemoveEnchantmentWeightFromVector(cWeightedEnchantments * a_ void cEnchantments::CheckEnchantmentConflictsFromVector(cWeightedEnchantments & a_Enchantments, cEnchantments a_FirstEnchantment) { - int FirstEnchantmentID = atoi(StringSplit(a_FirstEnchantment.ToString(), "=")[0].c_str()); - - if (FirstEnchantmentID == cEnchantments::enchProtection) + if (a_FirstEnchantment.GetLevel(cEnchantments::enchProtection) > 0) { - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchFireProtection); - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchBlastProtection); - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchProjectileProtection); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchBlastProtection); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); } - else if (FirstEnchantmentID == cEnchantments::enchFireProtection) + else if (a_FirstEnchantment.GetLevel(cEnchantments::enchFireProtection) > 0) { - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchProtection); - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchBlastProtection); - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchProjectileProtection); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchBlastProtection); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); } - else if (FirstEnchantmentID == cEnchantments::enchBlastProtection) + else if (a_FirstEnchantment.GetLevel(cEnchantments::enchBlastProtection) > 0) { - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchProtection); - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchFireProtection); - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchProjectileProtection); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchProjectileProtection); } - else if (FirstEnchantmentID == cEnchantments::enchProjectileProtection) + else if (a_FirstEnchantment.GetLevel(cEnchantments::enchProjectileProtection) > 0) { - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchProtection); - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchFireProtection); - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchBlastProtection); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchProtection); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchFireProtection); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchBlastProtection); } - else if (FirstEnchantmentID == cEnchantments::enchSharpness) + else if (a_FirstEnchantment.GetLevel(cEnchantments::enchSharpness) > 0) { - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchSmite); - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchBaneOfArthropods); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchSmite); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchBaneOfArthropods); } - else if (FirstEnchantmentID == cEnchantments::enchSmite) + else if (a_FirstEnchantment.GetLevel(cEnchantments::enchSmite) > 0) { - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchSharpness); - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchBaneOfArthropods); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchSharpness); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchBaneOfArthropods); } - else if (FirstEnchantmentID == cEnchantments::enchBaneOfArthropods) + else if (a_FirstEnchantment.GetLevel(cEnchantments::enchBaneOfArthropods) > 0) { - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchSharpness); - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchSmite); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchSharpness); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchSmite); } - else if (FirstEnchantmentID == cEnchantments::enchSilkTouch) + else if (a_FirstEnchantment.GetLevel(cEnchantments::enchSilkTouch) > 0) { - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchFortune); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchFortune); } - else if (FirstEnchantmentID == cEnchantments::enchFortune) + else if (a_FirstEnchantment.GetLevel(cEnchantments::enchFortune) > 0) { - RemoveEnchantmentWeightFromVector(&a_Enchantments, cEnchantments::enchSilkTouch); + RemoveEnchantmentWeightFromVector(a_Enchantments, cEnchantments::enchSilkTouch); } } @@ -987,7 +983,6 @@ cEnchantments cEnchantments::GetRandomEnchantmentFromVector(cWeightedEnchantment AllWeights += (*it).m_Weight; } int RandomNumber = Random.GenerateRandomInteger(0, AllWeights - 1); - cEnchantments enchantment; for (cWeightedEnchantments::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it) { RandomNumber -= (*it).m_Weight; @@ -1003,10 +998,3 @@ cEnchantments cEnchantments::GetRandomEnchantmentFromVector(cWeightedEnchantment - - - - - - - diff --git a/src/Enchantments.h b/src/Enchantments.h index 3cb979042..fc848ebec 100644 --- a/src/Enchantments.h +++ b/src/Enchantments.h @@ -103,13 +103,13 @@ public: // tolua_end /** Add enchantment weights from item to the vector */ - static void AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantments, short & a_ItemType, int a_EnchantmentLevel); + static void AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantments, short a_ItemType, int a_EnchantmentLevel); /** Add a enchantment weight to the vector */ - static void AddEnchantmentWeightToVector(cWeightedEnchantments * a_Enchantments, int a_Weight, cEnchantments a_Enchantment); + static void AddEnchantmentWeightToVector(cWeightedEnchantments * a_Enchantments, int a_Weight, int a_EnchantmentID, int a_EnchantmentLevel); /** Remove a enchantment weight from the vector */ - static void RemoveEnchantmentWeightFromVector(cWeightedEnchantments * a_Enchantments, int a_EnchantmentID); - static void RemoveEnchantmentWeightFromVector(cWeightedEnchantments * a_Enchantments, cEnchantments a_Enchantment); + static void RemoveEnchantmentWeightFromVector(cWeightedEnchantments & a_Enchantments, int a_EnchantmentID); + static void RemoveEnchantmentWeightFromVector(cWeightedEnchantments & a_Enchantments, const cEnchantments & a_Enchantment); /** Check enchantment conflicts from enchantments from the vector */ static void CheckEnchantmentConflictsFromVector(cWeightedEnchantments & a_Enchantments, cEnchantments a_FirstEnchantment); diff --git a/src/Item.cpp b/src/Item.cpp index 1941a6693..9899d7f32 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -215,49 +215,66 @@ int cItem::GetEnchantability() { int Enchantability = 0; - if (m_ItemType == E_ITEM_WOODEN_SWORD || m_ItemType == E_ITEM_WOODEN_PICKAXE || m_ItemType == E_ITEM_WOODEN_SHOVEL || m_ItemType == E_ITEM_WOODEN_AXE || m_ItemType == E_ITEM_WOODEN_HOE) + switch (m_ItemType) { - Enchantability = 15; - } - else if (m_ItemType == E_ITEM_LEATHER_CAP || m_ItemType == E_ITEM_LEATHER_TUNIC || m_ItemType == E_ITEM_LEATHER_PANTS || m_ItemType == E_ITEM_LEATHER_BOOTS) - { - Enchantability = 15; - } - else if (m_ItemType == E_ITEM_STONE_SWORD || m_ItemType == E_ITEM_STONE_PICKAXE || m_ItemType == E_ITEM_STONE_SHOVEL || m_ItemType == E_ITEM_STONE_AXE || m_ItemType == E_ITEM_STONE_HOE) - { - Enchantability = 5; - } - else if (m_ItemType == E_ITEM_IRON_HELMET || m_ItemType == E_ITEM_IRON_CHESTPLATE || m_ItemType == E_ITEM_IRON_LEGGINGS || m_ItemType == E_ITEM_IRON_BOOTS) - { - Enchantability = 9; - } - else if (m_ItemType == E_ITEM_IRON_SWORD || m_ItemType == E_ITEM_IRON_PICKAXE || m_ItemType == E_ITEM_IRON_SHOVEL || m_ItemType == E_ITEM_IRON_AXE || m_ItemType == E_ITEM_IRON_HOE) - { - Enchantability = 14; - } - else if (m_ItemType == E_ITEM_CHAIN_HELMET || m_ItemType == E_ITEM_CHAIN_CHESTPLATE || m_ItemType == E_ITEM_CHAIN_LEGGINGS || m_ItemType == E_ITEM_CHAIN_BOOTS) - { - Enchantability = 12; - } - else if (m_ItemType == E_ITEM_DIAMOND_HELMET || m_ItemType == E_ITEM_DIAMOND_CHESTPLATE || m_ItemType == E_ITEM_DIAMOND_LEGGINGS || m_ItemType == E_ITEM_DIAMOND_BOOTS) - { - Enchantability = 10; - } - else if (m_ItemType == E_ITEM_DIAMOND_SWORD || m_ItemType == E_ITEM_DIAMOND_PICKAXE || m_ItemType == E_ITEM_DIAMOND_SHOVEL || m_ItemType == E_ITEM_DIAMOND_AXE || m_ItemType == E_ITEM_DIAMOND_HOE) - { - Enchantability = 10; - } - else if (m_ItemType == E_ITEM_GOLD_HELMET || m_ItemType == E_ITEM_GOLD_CHESTPLATE || m_ItemType == E_ITEM_GOLD_LEGGINGS || m_ItemType == E_ITEM_GOLD_BOOTS) - { - Enchantability = 25; - } - else if (m_ItemType == E_ITEM_GOLD_SWORD || m_ItemType == E_ITEM_GOLD_PICKAXE || m_ItemType == E_ITEM_GOLD_SHOVEL || m_ItemType == E_ITEM_GOLD_AXE || m_ItemType == E_ITEM_GOLD_HOE) - { - Enchantability = 22; - } - else if (m_ItemType == E_ITEM_FISHING_ROD || m_ItemType == E_ITEM_BOW || m_ItemType == E_ITEM_BOOK) - { - Enchantability = 1; + case E_ITEM_WOODEN_SWORD: Enchantability = 15; + case E_ITEM_WOODEN_PICKAXE: Enchantability = 15; + case E_ITEM_WOODEN_SHOVEL: Enchantability = 15; + case E_ITEM_WOODEN_AXE: Enchantability = 15; + case E_ITEM_WOODEN_HOE: Enchantability = 15; + + case E_ITEM_LEATHER_CAP: Enchantability = 15; + case E_ITEM_LEATHER_TUNIC: Enchantability = 15; + case E_ITEM_LEATHER_PANTS: Enchantability = 15; + case E_ITEM_LEATHER_BOOTS: Enchantability = 15; + + case E_ITEM_STONE_SWORD: Enchantability = 5; + case E_ITEM_STONE_PICKAXE: Enchantability = 5; + case E_ITEM_STONE_SHOVEL: Enchantability = 5; + case E_ITEM_STONE_AXE: Enchantability = 5; + case E_ITEM_STONE_HOE: Enchantability = 5; + + case E_ITEM_IRON_HELMET: Enchantability = 9; + case E_ITEM_IRON_CHESTPLATE: Enchantability = 9; + case E_ITEM_IRON_LEGGINGS: Enchantability = 9; + case E_ITEM_IRON_BOOTS: Enchantability = 9; + + case E_ITEM_IRON_SWORD: Enchantability = 14; + case E_ITEM_IRON_PICKAXE: Enchantability = 14; + case E_ITEM_IRON_SHOVEL: Enchantability = 14; + case E_ITEM_IRON_AXE: Enchantability = 14; + case E_ITEM_IRON_HOE: Enchantability = 14; + + case E_ITEM_CHAIN_HELMET: Enchantability = 12; + case E_ITEM_CHAIN_CHESTPLATE: Enchantability = 12; + case E_ITEM_CHAIN_LEGGINGS: Enchantability = 12; + case E_ITEM_CHAIN_BOOTS: Enchantability = 12; + + case E_ITEM_DIAMOND_HELMET: Enchantability = 10; + case E_ITEM_DIAMOND_CHESTPLATE: Enchantability = 10; + case E_ITEM_DIAMOND_LEGGINGS: Enchantability = 10; + case E_ITEM_DIAMOND_BOOTS: Enchantability = 10; + + case E_ITEM_DIAMOND_SWORD: Enchantability = 10; + case E_ITEM_DIAMOND_PICKAXE: Enchantability = 10; + case E_ITEM_DIAMOND_SHOVEL: Enchantability = 10; + case E_ITEM_DIAMOND_AXE: Enchantability = 10; + case E_ITEM_DIAMOND_HOE: Enchantability = 10; + + case E_ITEM_GOLD_HELMET: Enchantability = 25; + case E_ITEM_GOLD_CHESTPLATE: Enchantability = 25; + case E_ITEM_GOLD_LEGGINGS: Enchantability = 25; + case E_ITEM_GOLD_BOOTS: Enchantability = 25; + + case E_ITEM_GOLD_SWORD: Enchantability = 22; + case E_ITEM_GOLD_PICKAXE: Enchantability = 22; + case E_ITEM_GOLD_SHOVEL: Enchantability = 22; + case E_ITEM_GOLD_AXE: Enchantability = 22; + case E_ITEM_GOLD_HOE: Enchantability = 22; + + case E_ITEM_FISHING_ROD: Enchantability = 1; + case E_ITEM_BOW: Enchantability = 1; + case E_ITEM_BOOK: Enchantability = 1; } return Enchantability; @@ -269,7 +286,7 @@ int cItem::GetEnchantability() bool cItem::EnchantByXPLevels(int a_NumXPLevels) { - if (!cItem::IsEnchantable(m_ItemType) && m_ItemType != E_ITEM_BOOK) + if ((!cItem::IsEnchantable(m_ItemType)) && (m_ItemType != E_ITEM_BOOK)) { return false; } @@ -284,9 +301,14 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) 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); m_Enchantments.AddFromString(Enchantment1.ToString()); - cEnchantments::RemoveEnchantmentWeightFromVector(&enchantments, Enchantment1); + cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment1); // Checking for conflicting enchantments cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment1); @@ -302,38 +324,38 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) { 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); - } - } - // Next Enchantment (Third) - NewEnchantmentLevel = NewEnchantmentLevel / 2; - float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (Random.NextFloat(100) <= ThirdEnchantmentChance) - { - if (enchantments.size() > 0) - { - cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); - m_Enchantments.AddFromString(Enchantment3.ToString()); - cEnchantments::RemoveEnchantmentWeightFromVector(&enchantments, Enchantment3); + // Next Enchantment (Third) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if (Random.NextFloat(100) <= ThirdEnchantmentChance) + { + if (enchantments.size() > 0) + { + cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + m_Enchantments.AddFromString(Enchantment3.ToString()); + cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment3); - // Checking for conflicting enchantments - cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment3); - } - } + // Checking for conflicting enchantments + cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment3); - // Next Enchantment (Fourth) - NewEnchantmentLevel = NewEnchantmentLevel / 2; - float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (Random.NextFloat(100) <= FourthEnchantmentChance) - { - if (enchantments.size() > 0) - { - cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); - m_Enchantments.AddFromString(Enchantment4.ToString()); + // Next Enchantment (Fourth) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if (Random.NextFloat(100) <= FourthEnchantmentChance) + { + if (enchantments.size() > 0) + { + cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + m_Enchantments.AddFromString(Enchantment4.ToString()); + } + } + } + } } } diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 26fdfe928..5f74b4fa3 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -783,7 +783,8 @@ void cSlotAreaEnchanting::OnPlayerRemoved(cPlayer & a_Player) { // Toss the item in the enchanting slot TossItems(a_Player, 0, 1); - // Player not found - that is acceptable + + super::OnPlayerRemoved(a_Player); } @@ -838,7 +839,7 @@ int cSlotAreaEnchanting::GetBookshelvesCount(cWorld * a_World) static const struct { int m_BookX, m_BookY, m_BookZ; // Coords to check for bookcases - int m_AirX, m_AirY, m_AirZ; // Coords to check for air; if not air, the bookcase won\'t be counted + int m_AirX, m_AirY, m_AirZ; // Coords to check for air; if not air, the bookcase won't be counted } CheckCoords[] = { { 0, 0, 0, 1, 0, 1 }, // Bookcase at {0, 0, 0}, air at {1, 0, 1} diff --git a/src/UI/Window.cpp b/src/UI/Window.cpp index fffe0e3fd..0a78578fc 100644 --- a/src/UI/Window.cpp +++ b/src/UI/Window.cpp @@ -826,11 +826,7 @@ void cEnchantingWindow::SetProperty(int a_Property, int a_Value) { m_PropertyValue[a_Property] = a_Value; - cCSLock Lock(m_CS); - for (cPlayerList::iterator itr = m_OpenedBy.begin(), end = m_OpenedBy.end(); itr != end; ++itr) - { - (*itr)->GetClientHandle()->SendWindowProperty(*this, a_Property, a_Value); - } // for itr - m_OpenedBy[] + super::SetProperty(a_Property, a_Value); } @@ -841,7 +837,7 @@ void cEnchantingWindow::SetProperty(int a_Property, int a_Value, cPlayer & a_Pla { m_PropertyValue[a_Property] = a_Value; - a_Player.GetClientHandle()->SendWindowProperty(*this, a_Property, a_Value); + super::SetProperty(a_Property, a_Value, a_Player); } From 11ff36c683975b69ed10bca31f01cdb2269bc4b6 Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sat, 19 Apr 2014 16:10:05 +0200 Subject: [PATCH 136/188] Fixed Code (2) --- src/Item.cpp | 170 +++++++++++++++++++++++++-------------------------- 1 file changed, 83 insertions(+), 87 deletions(-) diff --git a/src/Item.cpp b/src/Item.cpp index 9899d7f32..f92efcb39 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -217,64 +217,64 @@ int cItem::GetEnchantability() switch (m_ItemType) { - case E_ITEM_WOODEN_SWORD: Enchantability = 15; - case E_ITEM_WOODEN_PICKAXE: Enchantability = 15; - case E_ITEM_WOODEN_SHOVEL: Enchantability = 15; - case E_ITEM_WOODEN_AXE: Enchantability = 15; - case E_ITEM_WOODEN_HOE: Enchantability = 15; + case E_ITEM_WOODEN_SWORD: Enchantability = 15; break; + case E_ITEM_WOODEN_PICKAXE: Enchantability = 15; break; + case E_ITEM_WOODEN_SHOVEL: Enchantability = 15; break; + case E_ITEM_WOODEN_AXE: Enchantability = 15; break; + case E_ITEM_WOODEN_HOE: Enchantability = 15; break; - case E_ITEM_LEATHER_CAP: Enchantability = 15; - case E_ITEM_LEATHER_TUNIC: Enchantability = 15; - case E_ITEM_LEATHER_PANTS: Enchantability = 15; - case E_ITEM_LEATHER_BOOTS: Enchantability = 15; + case E_ITEM_LEATHER_CAP: Enchantability = 15; break; + case E_ITEM_LEATHER_TUNIC: Enchantability = 15; break; + case E_ITEM_LEATHER_PANTS: Enchantability = 15; break; + case E_ITEM_LEATHER_BOOTS: Enchantability = 15; break; - case E_ITEM_STONE_SWORD: Enchantability = 5; - case E_ITEM_STONE_PICKAXE: Enchantability = 5; - case E_ITEM_STONE_SHOVEL: Enchantability = 5; - case E_ITEM_STONE_AXE: Enchantability = 5; - case E_ITEM_STONE_HOE: Enchantability = 5; + case E_ITEM_STONE_SWORD: Enchantability = 5; break; + case E_ITEM_STONE_PICKAXE: Enchantability = 5; break; + case E_ITEM_STONE_SHOVEL: Enchantability = 5; break; + case E_ITEM_STONE_AXE: Enchantability = 5; break; + case E_ITEM_STONE_HOE: Enchantability = 5; break; - case E_ITEM_IRON_HELMET: Enchantability = 9; - case E_ITEM_IRON_CHESTPLATE: Enchantability = 9; - case E_ITEM_IRON_LEGGINGS: Enchantability = 9; - case E_ITEM_IRON_BOOTS: Enchantability = 9; + case E_ITEM_IRON_HELMET: Enchantability = 9; break; + case E_ITEM_IRON_CHESTPLATE: Enchantability = 9; break; + case E_ITEM_IRON_LEGGINGS: Enchantability = 9; break; + case E_ITEM_IRON_BOOTS: Enchantability = 9; break; - case E_ITEM_IRON_SWORD: Enchantability = 14; - case E_ITEM_IRON_PICKAXE: Enchantability = 14; - case E_ITEM_IRON_SHOVEL: Enchantability = 14; - case E_ITEM_IRON_AXE: Enchantability = 14; - case E_ITEM_IRON_HOE: Enchantability = 14; + case E_ITEM_IRON_SWORD: Enchantability = 14; break; + case E_ITEM_IRON_PICKAXE: Enchantability = 14; break; + case E_ITEM_IRON_SHOVEL: Enchantability = 14; break; + case E_ITEM_IRON_AXE: Enchantability = 14; break; + case E_ITEM_IRON_HOE: Enchantability = 14; break; - case E_ITEM_CHAIN_HELMET: Enchantability = 12; - case E_ITEM_CHAIN_CHESTPLATE: Enchantability = 12; - case E_ITEM_CHAIN_LEGGINGS: Enchantability = 12; - case E_ITEM_CHAIN_BOOTS: Enchantability = 12; + case E_ITEM_CHAIN_HELMET: Enchantability = 12; break; + case E_ITEM_CHAIN_CHESTPLATE: Enchantability = 12; break; + case E_ITEM_CHAIN_LEGGINGS: Enchantability = 12; break; + case E_ITEM_CHAIN_BOOTS: Enchantability = 12; break; - case E_ITEM_DIAMOND_HELMET: Enchantability = 10; - case E_ITEM_DIAMOND_CHESTPLATE: Enchantability = 10; - case E_ITEM_DIAMOND_LEGGINGS: Enchantability = 10; - case E_ITEM_DIAMOND_BOOTS: Enchantability = 10; + case E_ITEM_DIAMOND_HELMET: Enchantability = 10; break; + case E_ITEM_DIAMOND_CHESTPLATE: Enchantability = 10; break; + case E_ITEM_DIAMOND_LEGGINGS: Enchantability = 10; break; + case E_ITEM_DIAMOND_BOOTS: Enchantability = 10; break; - case E_ITEM_DIAMOND_SWORD: Enchantability = 10; - case E_ITEM_DIAMOND_PICKAXE: Enchantability = 10; - case E_ITEM_DIAMOND_SHOVEL: Enchantability = 10; - case E_ITEM_DIAMOND_AXE: Enchantability = 10; - case E_ITEM_DIAMOND_HOE: Enchantability = 10; + case E_ITEM_DIAMOND_SWORD: Enchantability = 10; break; + case E_ITEM_DIAMOND_PICKAXE: Enchantability = 10; break; + case E_ITEM_DIAMOND_SHOVEL: Enchantability = 10; break; + case E_ITEM_DIAMOND_AXE: Enchantability = 10; break; + case E_ITEM_DIAMOND_HOE: Enchantability = 10; break; - case E_ITEM_GOLD_HELMET: Enchantability = 25; - case E_ITEM_GOLD_CHESTPLATE: Enchantability = 25; - case E_ITEM_GOLD_LEGGINGS: Enchantability = 25; - case E_ITEM_GOLD_BOOTS: Enchantability = 25; + case E_ITEM_GOLD_HELMET: Enchantability = 25; break; + case E_ITEM_GOLD_CHESTPLATE: Enchantability = 25; break; + case E_ITEM_GOLD_LEGGINGS: Enchantability = 25; break; + case E_ITEM_GOLD_BOOTS: Enchantability = 25; break; - case E_ITEM_GOLD_SWORD: Enchantability = 22; - case E_ITEM_GOLD_PICKAXE: Enchantability = 22; - case E_ITEM_GOLD_SHOVEL: Enchantability = 22; - case E_ITEM_GOLD_AXE: Enchantability = 22; - case E_ITEM_GOLD_HOE: Enchantability = 22; + case E_ITEM_GOLD_SWORD: Enchantability = 22; break; + case E_ITEM_GOLD_PICKAXE: Enchantability = 22; break; + case E_ITEM_GOLD_SHOVEL: Enchantability = 22; break; + case E_ITEM_GOLD_AXE: Enchantability = 22; break; + case E_ITEM_GOLD_HOE: Enchantability = 22; break; - case E_ITEM_FISHING_ROD: Enchantability = 1; - case E_ITEM_BOW: Enchantability = 1; - case E_ITEM_BOOK: Enchantability = 1; + case E_ITEM_FISHING_ROD: Enchantability = 1; break; + case E_ITEM_BOW: Enchantability = 1; break; + case E_ITEM_BOOK: Enchantability = 1; break; } return Enchantability; @@ -286,7 +286,7 @@ int cItem::GetEnchantability() bool cItem::EnchantByXPLevels(int a_NumXPLevels) { - if ((!cItem::IsEnchantable(m_ItemType)) && (m_ItemType != E_ITEM_BOOK)) + if (!cItem::IsEnchantable(m_ItemType) && (m_ItemType != E_ITEM_BOOK)) { return false; } @@ -318,47 +318,43 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) // Next Enchantment (Second) NewEnchantmentLevel = NewEnchantmentLevel / 2; float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (Random.NextFloat(100) <= SecondEnchantmentChance) + if ((Random.NextFloat(100) > SecondEnchantmentChance) || (enchantments.size() == 0)) { - if (enchantments.size() > 0) - { - cEnchantments Enchantment2 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); - m_Enchantments.AddFromString(Enchantment2.ToString()); - cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment2); - - // Checking for conflicting enchantments - cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment2); - - // Next Enchantment (Third) - NewEnchantmentLevel = NewEnchantmentLevel / 2; - float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (Random.NextFloat(100) <= ThirdEnchantmentChance) - { - if (enchantments.size() > 0) - { - cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); - m_Enchantments.AddFromString(Enchantment3.ToString()); - cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment3); - - // Checking for conflicting enchantments - cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment3); - - // Next Enchantment (Fourth) - NewEnchantmentLevel = NewEnchantmentLevel / 2; - float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if (Random.NextFloat(100) <= FourthEnchantmentChance) - { - if (enchantments.size() > 0) - { - cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); - m_Enchantments.AddFromString(Enchantment4.ToString()); - } - } - } - } - } + return false; } + cEnchantments Enchantment2 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + m_Enchantments.AddFromString(Enchantment2.ToString()); + cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment2); + + // Checking for conflicting enchantments + cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment2); + + // Next Enchantment (Third) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if ((Random.NextFloat(100) > ThirdEnchantmentChance) || (enchantments.size() == 0)) + { + return false; + } + + cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + m_Enchantments.AddFromString(Enchantment3.ToString()); + cEnchantments::RemoveEnchantmentWeightFromVector(enchantments, Enchantment3); + + // Checking for conflicting enchantments + cEnchantments::CheckEnchantmentConflictsFromVector(enchantments, Enchantment3); + + // Next Enchantment (Fourth) + NewEnchantmentLevel = NewEnchantmentLevel / 2; + float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; + if ((Random.NextFloat(100) > FourthEnchantmentChance) || (enchantments.size() == 0)) + { + return false; + } + cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); + m_Enchantments.AddFromString(Enchantment4.ToString()); + return true; } From 62991d46fed9b5a7b181a2ef165935784d572b06 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 19 Apr 2014 16:15:57 +0200 Subject: [PATCH 137/188] APIDump: Added a ChunkStay article. Fixes #772. --- MCServer/Plugins/APIDump/APIDesc.lua | 7 +- MCServer/Plugins/APIDump/UsingChunkStays.html | 167 ++++++++++++++++++ MCServer/Plugins/APIDump/WebWorldThreads.html | 48 ++--- 3 files changed, 195 insertions(+), 27 deletions(-) create mode 100644 MCServer/Plugins/APIDump/UsingChunkStays.html diff --git a/MCServer/Plugins/APIDump/APIDesc.lua b/MCServer/Plugins/APIDump/APIDesc.lua index 233bdbc46..45e8d9677 100644 --- a/MCServer/Plugins/APIDump/APIDesc.lua +++ b/MCServer/Plugins/APIDump/APIDesc.lua @@ -2929,9 +2929,10 @@ end { -- No sorting is provided for these, they will be output in the same order as defined here { FileName = "Writing-a-MCServer-plugin.html", Title = "Writing a MCServer plugin" }, - { FileName = "SettingUpDecoda.html", Title = "Setting up the Decoda Lua IDE" }, - { FileName = "SettingUpZeroBrane.html", Title = "Setting up the ZeroBrane Studio Lua IDE" }, - { FileName = "WebWorldThreads.html", Title = "Webserver vs World threads" }, + { FileName = "SettingUpDecoda.html", Title = "Setting up the Decoda Lua IDE" }, + { FileName = "SettingUpZeroBrane.html", Title = "Setting up the ZeroBrane Studio Lua IDE" }, + { FileName = "UsingChunkStays.html", Title = "Using ChunkStays" }, + { FileName = "WebWorldThreads.html", Title = "Webserver vs World threads" }, } } ; diff --git a/MCServer/Plugins/APIDump/UsingChunkStays.html b/MCServer/Plugins/APIDump/UsingChunkStays.html new file mode 100644 index 000000000..d3ecc6674 --- /dev/null +++ b/MCServer/Plugins/APIDump/UsingChunkStays.html @@ -0,0 +1,167 @@ + + + + MCServer - Using ChunkStays + + + + + + + +
    +

    Using ChunkStays

    +

    + A plugin may need to manipulate data in arbitrary chunks, and it needs a way to make the server + guarantee that the chunks are available in memory.

    + +

    The problem

    +

    + Usually when plugins want to manipulate larger areas of world data, they need to make sure that the + server has the appropriate chunks loaded in the memory. When the data being manipulated can be further + away from the connected players, or the data is being manipulated from a console handler, there is a + real chance that the chunks are not loaded.

    +

    + This gets even more important when using the cBlockArea class for reading + and writing. Those functions will fail when any of the required chunks aren't valid. This means that + either the block area has incomplete data (Read() failed) or incomplete data has been written to the + world (Write() failed). Recovery from this is near impossible - you can't simply read or write again + later, because the world may have changed in the meantime.

    + +

    The solution

    +

    + The naive solution would be to monitor chunk loads and unloads, and postpone the operations until all + the chunks are available. This would be quite ineffective and also very soon it would become very + difficult to maintain, if there were multiple code paths requiring this handling.

    +

    + An alternate approach has been implemented, accessible through a single (somewhat hidden) function + call: cWorld:ChunkStay(). All that this call basically does is, it tells the + server "Load these chunks for me, and call this callback function once you have them all." And the + server does exactly that - it remembers the callback and asks the world loader / generator to provide + the chunks. Once the chunks become available, it calls the callback function for the plugin.

    +

    + There are a few gotcha-s, though. If the code that was requesting the read or write had access to some + of the volatile objects, such as cPlayer or + cEntity objects, those cannot be accessed by the callback anymore, because + they may have become invalid in the meantime - the player may have disconnected, the entity may have + despawned. So the callback must use the longer way to access such objects, such as calling + cWorld:DoWithEntityByID() or + cWorld:DoWithPlayer().

    + +

    The example

    +

    + As a simple example, consider a theoretical plugin that allows a player to save the immediate + surroundings of the spawn into a schematic file. The player issues a command to initiate the save, and + the plugin reads a 50 x 50 x 50 block area around the spawn into a cBlockArea and saves it on the disk + as "_spawn.schematic". When it's done with the saving, it wants to send a message to the + player to let them know the command has succeeded.

    +

    + The first attempt shows the naive approach. It simply reads the block area and saves it, then sends the + message. I'll repeat once more, this code is the wrong way to do it!

    +
    +function HandleCommandSaveSpawn(a_Split, a_Player)
    +	-- Get the coords for the spawn:
    +	local SpawnX = a_Player:GetWorld():GetSpawnX()
    +	local SpawnY = a_Player:GetWorld():GetSpawnY()
    +	local SpawnZ = a_Player:GetWorld():GetSpawnZ()
    +	local Bounds = cCuboid(SpawnX - 25, SpawnY - 25, SpawnZ - 25, SpawnX + 25, SpawnY + 25, SpawnZ + 25)
    +	Bounds:ClampY(0, 255)
    +	
    +	-- Read the area around spawn into a cBlockArea, save to file:
    +	local Area = cBlockArea()
    +	local FileName = a_Player:GetName() .. "_spawn.schematic"
    +	Area:Read(a_Player:GetWorld(), Bounds, cBlockArea.baTypes + cBlockArea.baMetas)
    +	Area:SaveToSchematicFile(FileName)
    +	
    +	-- Notify the player:
    +	a_Player:SendMessage(cCompositeChat("The spawn has been saved", mtInfo))
    +	return true
    +end
    +
    +

    + Now if the player goes exploring far and uses the command to save their spawn, the chunks aren't + loaded, so the BlockArea reading fails, the BlockArea contains bad data. Note that the plugin fails to + do any error checking and if the area isn't read from the world, it happily saves the incomplete data + and says "hey, everything's right", althought it has just trashed any previous backup of the spawn + schematic with nonsense data.

    +
    +

    + The following script uses the ChunkStay method to alleviate chunk-related problems. This is the + right way of doing it:

    +
    +function HandleCommandSaveSpawn(a_Split, a_Player)
    +	-- Get the coords for the spawn:
    +	local SpawnX = a_Player:GetWorld():GetSpawnX()
    +	local SpawnY = a_Player:GetWorld():GetSpawnY()
    +	local SpawnZ = a_Player:GetWorld():GetSpawnZ()
    +	local Bounds = cCuboid(SpawnX - 25, SpawnY - 25, SpawnZ - 25, SpawnX + 25, SpawnY + 25, SpawnZ + 25)
    +	Bounds:ClampY(0, 255)
    +	
    +	-- Get a list of chunks that we need loaded:
    +	local MinChunkX = math.floor((SpawnX - 25) / 16)
    +	local MaxChunkX = math.ceil ((SpawnX + 25) / 16)
    +	local MinChunkZ = math.floor((SpawnZ - 25) / 16)
    +	local MaxChunkZ = math.ceil ((SpawnZ + 25) / 16)
    +	local Chunks = {}
    +	for x = MinChunkX, MaxChunkX do
    +		for z = MinChunkZ, MaxChunkZ do
    +			table.insert(Chunks, {x, z})
    +		end
    +	end  -- for x
    +	
    +	-- Store the player's name and world to use in the callback, because the a_Player object may no longer be valid:
    +	local PlayerName = a_Player:GetName()
    +	local World = a_Player:GetWorld()
    +	
    +	-- This is the callback that is executed once all the chunks are loaded:
    +	local OnAllChunksAvailable = function()
    +		-- Read the area around spawn into a cBlockArea, save to file:
    +		local Area = cBlockArea()
    +		local FileName = PlayerName .. "_spawn.schematic"
    +		if (Area:Read(World, Bounds, cBlockArea.baTypes + cBlockArea.baMetas)) then
    +			Area:SaveToSchematicFile(FileName)
    +			Msg = cCompositeChat("The spawn has been saved", mtInfo)
    +		else
    +			Msg = cCompositeChat("Cannot save the spawn", mtFailure)
    +		end
    +		
    +		-- Notify the player:
    +		-- Note that we cannot use a_Player here, because it may no longer be valid (if the player disconnected before the command completes)
    +		World:DoWithPlayer(PlayerName,
    +			function (a_CBPlayer)
    +				a_CBPlayer:SendMessage(Msg)
    +			end
    +		)
    +	end
    +	
    +	-- Ask the server to load our chunks and notify us once it's done:
    +	World:ChunkStay(Chunks, nil, OnAllChunksAvailable)
    +	
    +	-- Note that code here may get executed before the callback is called!
    +	-- The ChunkStay says "once you have the chunks", not "wait until you have the chunks"
    +	-- So you can't notify the player here, because the saving needn't have occurred yet.
    +	
    +	return true
    +end
    +
    +

    + Note that this code does its error checking of the Area:Read() function, and it will not overwrite the + previous file unless it actually has the correct data. If you're wondering how the reading could fail + when we've got the chunks loaded, there's still the issue of free RAM - if the memory for the area + cannot be allocated, it cannot be read even with all the chunks present. So we still do need that + check.

    + +

    The conclusion

    +

    + Although it makes the code a little bit longer and is a bit more difficult to grasp at first, the + ChunkStay is a useful technique to add to your repertoire. It is to be used whenever you need access to + chunks that may potentially be inaccessible, and you really need the data.

    +

    Possibly the biggest hurdle in using the ChunkStay is the fact that it does its work in the + background, thus invalidating all cPlayer and cEntity objects your function may hold, so you need to + re-acquire them from their IDs and names. This is the penalty for using multi-threaded code.

    + +
    + + diff --git a/MCServer/Plugins/APIDump/WebWorldThreads.html b/MCServer/Plugins/APIDump/WebWorldThreads.html index fc80a6178..ee0b172e6 100644 --- a/MCServer/Plugins/APIDump/WebWorldThreads.html +++ b/MCServer/Plugins/APIDump/WebWorldThreads.html @@ -39,31 +39,31 @@

    Example

    The Core has the facility to kick players using the web interface. It used the following code for the kicking (inside the webadmin handler): -
    -			local KickPlayerName = Request.Params["players-kick"]
    -			local FoundPlayerCallback = function(Player)
    -			  if (Player:GetName() == KickPlayerName) then
    -				Player:GetClientHandle():Kick("You were kicked from the game!")
    -			  end
    +
    +local KickPlayerName = Request.Params["players-kick"]
    +local FoundPlayerCallback = function(Player)
    +	if (Player:GetName() == KickPlayerName) then
    +	Player:GetClientHandle():Kick("You were kicked from the game!")
    +	end
    +end
    +cRoot:Get():FindAndDoWithPlayer(KickPlayerName, FoundPlayerCallback)
    +
    +The cRoot:FindAndDoWithPlayer() is unsafe and could have caused a deadlock. The new solution is queue a task; but since we don't know in which world the player is, we need to queue the task to all worlds: +
    +cRoot:Get():ForEachWorld(    -- For each world...
    +	function(World)
    +	World:QueueTask(         -- ... queue a task...
    +		function(a_World)
    +		a_World:DoWithPlayer(KickPlayerName,  -- ... to walk the playerlist...
    +			function (a_Player)
    +			a_Player:GetClientHandle():Kick("You were kicked from the game!")  -- ... and kick the player
     			end
    -			cRoot:Get():FindAndDoWithPlayer(KickPlayerName, FoundPlayerCallback)
    -			
    - The cRoot:FindAndDoWithPlayer() is unsafe and could have caused a deadlock. The new solution is queue a task; but since we don't know in which world the player is, we need to queue the task to all worlds: -
    -			cRoot:Get():ForEachWorld(    -- For each world...
    -			  function(World)
    -				World:QueueTask(         -- ... queue a task...
    -				  function(a_World)
    -					a_World:DoWithPlayer(KickPlayerName,  -- ... to walk the playerlist...
    -					  function (a_Player)
    -						a_Player:GetClientHandle():Kick("You were kicked from the game!")  -- ... and kick the player
    -					  end
    -					)
    -				  end
    -				)
    -			  end
    -			)
    -			
    + ) + end + ) + end +) +
    From 4dd7610381c5a9cbd29b771e6c98b5d500774ac6 Mon Sep 17 00:00:00 2001 From: jfhumann Date: Sat, 19 Apr 2014 17:53:02 +0200 Subject: [PATCH 138/188] Declared one mutex as mutable in order to allow for const correct get accessors. --- src/ClientHandle.cpp | 8 ++++---- src/Server.cpp | 2 +- src/Server.h | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 580e786c9..7f80299f6 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -453,14 +453,14 @@ void cClientHandle::HandlePing(void) { // Somebody tries to retrieve information about the server AString Reply; - cServer * Server = cRoot::Get()->GetServer(); + const cServer & Server = *cRoot::Get()->GetServer(); Printf(Reply, "%s%s%i%s%i", - Server->GetDescription().c_str(), + Server.GetDescription().c_str(), cChatColor::Delimiter.c_str(), - Server->GetNumPlayers(), + Server.GetNumPlayers(), cChatColor::Delimiter.c_str(), - Server->GetMaxPlayers() + Server.GetMaxPlayers() ); Kick(Reply); } diff --git a/src/Server.cpp b/src/Server.cpp index fa4a1a133..bfb1b1cbb 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -275,7 +275,7 @@ bool cServer::InitServer(cIniFile & a_SettingsIni) -int cServer::GetNumPlayers(void) +int cServer::GetNumPlayers(void) const { cCSLock Lock(m_CSPlayerCount); return m_PlayerCount; diff --git a/src/Server.h b/src/Server.h index b5c384a44..51c450ebd 100644 --- a/src/Server.h +++ b/src/Server.h @@ -59,7 +59,7 @@ public: // tolua_export // Player counts: int GetMaxPlayers(void) const {return m_MaxPlayers; } - int GetNumPlayers(void); + int GetNumPlayers(void) const; void SetMaxPlayers(int a_MaxPlayers) { m_MaxPlayers = a_MaxPlayers; } // Hardcore mode or not: @@ -168,7 +168,7 @@ private: cClientHandleList m_Clients; ///< Clients that are connected to the server and not yet assigned to a cWorld cClientHandleList m_ClientsToRemove; ///< Clients that have just been moved into a world and are to be removed from m_Clients in the next Tick() - cCriticalSection m_CSPlayerCount; ///< Locks the m_PlayerCount + mutable cCriticalSection m_CSPlayerCount; ///< Locks the m_PlayerCount int m_PlayerCount; ///< Number of players currently playing in the server cCriticalSection m_CSPlayerCountDiff; ///< Locks the m_PlayerCountDiff int m_PlayerCountDiff; ///< Adjustment to m_PlayerCount to be applied in the Tick thread From f48d43f050683488b4cdbddcc92cfc7804112c11 Mon Sep 17 00:00:00 2001 From: jfhumann Date: Sat, 19 Apr 2014 20:51:52 +0200 Subject: [PATCH 139/188] Fixed Flint and Steel, reverted Minecart change, renamed a parameter name --- src/BlockEntities/DispenserEntity.cpp | 10 +++++----- src/Entities/Minecart.cpp | 3 ++- src/Entities/Player.cpp | 4 ++-- src/Entities/Player.h | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/BlockEntities/DispenserEntity.cpp b/src/BlockEntities/DispenserEntity.cpp index f5b9c8923..2a32f69d9 100644 --- a/src/BlockEntities/DispenserEntity.cpp +++ b/src/BlockEntities/DispenserEntity.cpp @@ -128,11 +128,11 @@ void cDispenserEntity::DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum) if (DispChunk->GetBlock(DispX, DispY, DispZ) == E_BLOCK_AIR) { DispChunk->SetBlock(DispX, DispY, DispZ, E_BLOCK_FIRE, 0); - const cItem& slot = m_Contents.GetSlot(a_SlotNum); - m_Contents.SetSlot(a_SlotNum, slot.m_ItemType, slot.m_ItemCount, slot.m_ItemDamage + 1); - // If the durability has run out destroy the item. - if (m_Contents.GetSlot(a_SlotNum).m_ItemDamage > 64) - { + + bool ItemBroke = m_Contents.DamageItem(a_SlotNum, 1); + + if (ItemBroke) + { m_Contents.ChangeSlotCount(a_SlotNum, -1); } } diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp index db55eb058..7fe0b3cb1 100644 --- a/src/Entities/Minecart.cpp +++ b/src/Entities/Minecart.cpp @@ -796,7 +796,8 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta) BLOCKTYPE BlockXM = m_World->GetBlock(POSX_TOINT - 1, POSY_TOINT, POSZ_TOINT); BLOCKTYPE BlockXP = m_World->GetBlock(POSX_TOINT + 1, POSY_TOINT, POSZ_TOINT); BLOCKTYPE BlockZM = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT - 1); - BLOCKTYPE BlockZP = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT + 1); + // FIXME: Should the next line be POSZ_TOINT + 1? Else add some documenttation why - 1 + BLOCKTYPE BlockZP = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT - 1); if ( (!IsBlockRail(BlockXM) && cBlockInfo::IsSolid(BlockXM)) || (!IsBlockRail(BlockXP) && cBlockInfo::IsSolid(BlockXP)) || diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index 46edb7199..fedb62527 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -1166,9 +1166,9 @@ Vector3d cPlayer::GetThrowSpeed(double a_SpeedCoeff) const -void cPlayer::ForceSetSpeed(const Vector3d & a_Direction) +void cPlayer::ForceSetSpeed(const Vector3d & a_Speed) { - SetSpeed(a_Direction); + SetSpeed(a_Speed); m_ClientHandle->SendEntityVelocity(*this); } diff --git a/src/Entities/Player.h b/src/Entities/Player.h index 74da409cf..78d661015 100644 --- a/src/Entities/Player.h +++ b/src/Entities/Player.h @@ -181,7 +181,7 @@ public: void LoginSetGameMode(eGameMode a_GameMode); /** Forces the player to move in the given direction. */ - void ForceSetSpeed(const Vector3d & a_Direction); // tolua_export + void ForceSetSpeed(const Vector3d & a_Speed); // tolua_export /** Tries to move to a new position, with attachment-related checks (y == -999) */ void MoveTo(const Vector3d & a_NewPos); // tolua_export From 098be1c7fc0d2e0309bc2a649d21090265535a3e Mon Sep 17 00:00:00 2001 From: daniel0916 Date: Sat, 19 Apr 2014 22:37:29 +0200 Subject: [PATCH 140/188] Fixed Code --- src/Enchantments.cpp | 282 +++++++++++++++++++++---------------------- src/Enchantments.h | 11 +- 2 files changed, 148 insertions(+), 145 deletions(-) diff --git a/src/Enchantments.cpp b/src/Enchantments.cpp index 3a65b7284..dad92dc91 100644 --- a/src/Enchantments.cpp +++ b/src/Enchantments.cpp @@ -226,89 +226,89 @@ void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantm // Sharpness if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 4); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 4); } else if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 3); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 3); } else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 2); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 2); } else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 1); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 1); } // Smite if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 4); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 4); } else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 3); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 3); } else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 2); } else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 1); } // Bane of Arthropods if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 4); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 4); } else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 3); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 3); } else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 2); } else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 1); } // Knockback if ((a_EnchantmentLevel >= 25) && (a_EnchantmentLevel <= 75)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchKnockback, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchKnockback, 2); } else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 55)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchKnockback, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchKnockback, 1); } // Fire Aspect if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFireAspect, 2); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchFireAspect, 2); } else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFireAspect, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchFireAspect, 1); } // Looting if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchLooting, 3); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchLooting, 3); } else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchLooting, 2); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchLooting, 2); } else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchLooting, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchLooting, 1); } } @@ -317,39 +317,39 @@ void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantm // Efficiency if ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 81)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 4); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 4); } else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 71)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 3); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 3); } else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 61)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 2); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 2); } else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 51)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 1); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 1); } // Silk Touch if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchSilkTouch, 1); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchSilkTouch, 1); } // Fortune if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFortune, 3); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchFortune, 3); } else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFortune, 2); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchFortune, 2); } else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFortune, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchFortune, 1); } } @@ -358,87 +358,87 @@ void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantm // Protection if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 4); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 4); } else if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 3); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 3); } else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 2); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 2); } else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 1); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 1); } // Fire Protection if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 46)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 4); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 4); } else if ((a_EnchantmentLevel >= 26) && (a_EnchantmentLevel <= 38)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 3); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 3); } else if ((a_EnchantmentLevel >= 18) && (a_EnchantmentLevel <= 30)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 2); } else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 22)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 1); } // Blast Protection if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 4); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 4); } else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 3); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 3); } else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 25)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 2); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 2); } else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 17)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 1); } // Projectile Protection if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 4); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 4); } else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 30)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 3); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 3); } else if ((a_EnchantmentLevel >= 9) && (a_EnchantmentLevel <= 24)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 2); } else if ((a_EnchantmentLevel >= 3) && (a_EnchantmentLevel <= 18)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 1); } // Thorns if ((a_EnchantmentLevel >= 50) && (a_EnchantmentLevel <= 100)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchThorns, 3); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchThorns, 3); } else if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchThorns, 2); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchThorns, 2); } else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchThorns, 1); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchThorns, 1); } @@ -447,21 +447,21 @@ void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantm // Respiration if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 60)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchRespiration, 3); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchRespiration, 3); } else if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchRespiration, 2); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchRespiration, 2); } else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 40)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchRespiration, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchRespiration, 1); } // Aqua Affinity if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchAquaAffinity, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchAquaAffinity, 1); } } @@ -470,19 +470,19 @@ void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantm // Feather Fall if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 4); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 4); } else if ((a_EnchantmentLevel >= 17) && (a_EnchantmentLevel <= 27)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 3); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 3); } else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 21)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 2); } else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 15)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 1); } } } @@ -492,36 +492,36 @@ void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantm // Power if ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 46)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 4); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 4); } else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 3); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 3); } else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 26)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 2); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 2); } else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 16)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 1); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 1); } // Punch if ((a_EnchantmentLevel >= 32) && (a_EnchantmentLevel <= 57)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchPunch, 2); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchPunch, 2); } else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 37)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchPunch, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchPunch, 1); } // Flame and Infinity if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFlame, 1); - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchInfinity, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchFlame, 1); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchInfinity, 1); } } @@ -530,18 +530,18 @@ void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantm // Luck of the Sea and Lure if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLuckOfTheSea, 3); - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLure, 3); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchLuckOfTheSea, 3); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchLure, 3); } else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLuckOfTheSea, 2); - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLure, 2); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchLuckOfTheSea, 2); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchLure, 2); } else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLuckOfTheSea, 1); - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLure, 1); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchLuckOfTheSea, 1); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchLure, 1); } } @@ -552,318 +552,318 @@ void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantm // Sharpness if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 4); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 4); } else if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 3); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 3); } else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 2); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 2); } else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchSharpness, 1); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchSharpness, 1); } // Smite if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 4); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 4); } else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 3); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 3); } else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 2); } else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchSmite, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchSmite, 1); } // Bane of Arthropods if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 4); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 4); } else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 3); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 3); } else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 2); } else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchBaneOfArthropods, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchBaneOfArthropods, 1); } // Knockback if ((a_EnchantmentLevel >= 25) && (a_EnchantmentLevel <= 75)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchKnockback, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchKnockback, 2); } else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 55)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchKnockback, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchKnockback, 1); } // Fire Aspect if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFireAspect, 2); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchFireAspect, 2); } else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFireAspect, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchFireAspect, 1); } // Looting if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchLooting, 3); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchLooting, 3); } else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchLooting, 2); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchLooting, 2); } else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchLooting, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchLooting, 1); } // Efficiency if ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 81)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 4); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 4); } else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 71)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 3); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 3); } else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 61)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 2); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 2); } else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 51)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchEfficiency, 1); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchEfficiency, 1); } // Silk Touch if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchSilkTouch, 1); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchSilkTouch, 1); } // Fortune if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFortune, 3); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchFortune, 3); } else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFortune, 2); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchFortune, 2); } else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFortune, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchFortune, 1); } // Protection if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 4); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 4); } else if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 3); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 3); } else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 2); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 2); } else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchProtection, 1); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchProtection, 1); } // Fire Protection if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 46)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 4); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 4); } else if ((a_EnchantmentLevel >= 26) && (a_EnchantmentLevel <= 38)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 3); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 3); } else if ((a_EnchantmentLevel >= 18) && (a_EnchantmentLevel <= 30)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 2); } else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 22)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFireProtection, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFireProtection, 1); } // Blast Protection if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 4); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 4); } else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 3); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 3); } else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 25)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 2); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 2); } else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 17)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchBlastProtection, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchBlastProtection, 1); } // Projectile Protection if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 4); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 4); } else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 30)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 3); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 3); } else if ((a_EnchantmentLevel >= 9) && (a_EnchantmentLevel <= 24)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 2); } else if ((a_EnchantmentLevel >= 3) && (a_EnchantmentLevel <= 18)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchProjectileProtection, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchProjectileProtection, 1); } // Thorns if ((a_EnchantmentLevel >= 50) && (a_EnchantmentLevel <= 100)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchThorns, 3); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchThorns, 3); } else if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchThorns, 2); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchThorns, 2); } else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchThorns, 1); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchThorns, 1); } // Respiration if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 60)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchRespiration, 3); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchRespiration, 3); } else if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchRespiration, 2); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchRespiration, 2); } else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 40)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchRespiration, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchRespiration, 1); } // Aqua Affinity if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 41)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchAquaAffinity, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchAquaAffinity, 1); } // Feather Fall if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 33)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 4); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 4); } else if ((a_EnchantmentLevel >= 17) && (a_EnchantmentLevel <= 27)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 3); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 3); } else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 21)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 2); } else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 15)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchFeatherFalling, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchFeatherFalling, 1); } // Power if ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 46)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 4); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 4); } else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 3); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 3); } else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 26)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 2); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 2); } else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 16)) { - AddEnchantmentWeightToVector(&a_Enchantments, 10, enchPower, 1); + AddEnchantmentWeightToVector(a_Enchantments, 10, enchPower, 1); } // Punch if ((a_EnchantmentLevel >= 32) && (a_EnchantmentLevel <= 57)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchPunch, 2); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchPunch, 2); } else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 37)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchPunch, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchPunch, 1); } // Flame and Infinity if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50)) { - AddEnchantmentWeightToVector(&a_Enchantments, 2, enchFlame, 1); - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchInfinity, 1); + AddEnchantmentWeightToVector(a_Enchantments, 2, enchFlame, 1); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchInfinity, 1); } // Luck of the Sea and Lure if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLuckOfTheSea, 3); - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLure, 3); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchLuckOfTheSea, 3); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchLure, 3); } else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLuckOfTheSea, 2); - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLure, 2); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchLuckOfTheSea, 2); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchLure, 2); } else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65)) { - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLuckOfTheSea, 1); - AddEnchantmentWeightToVector(&a_Enchantments, 1, enchLure, 1); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchLuckOfTheSea, 1); + AddEnchantmentWeightToVector(a_Enchantments, 1, enchLure, 1); } } // Unbreaking if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 71)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchUnbreaking, 3); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchUnbreaking, 3); } else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 63)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchUnbreaking, 2); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchUnbreaking, 2); } else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 55)) { - AddEnchantmentWeightToVector(&a_Enchantments, 5, enchUnbreaking, 1); + AddEnchantmentWeightToVector(a_Enchantments, 5, enchUnbreaking, 1); } } @@ -871,14 +871,14 @@ void cEnchantments::AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantm -void cEnchantments::AddEnchantmentWeightToVector(cWeightedEnchantments * a_Enchantments, int a_Weight, int a_EnchantmentID, int a_EnchantmentLevel) +void cEnchantments::AddEnchantmentWeightToVector(cWeightedEnchantments & a_Enchantments, int a_Weight, int a_EnchantmentID, int a_EnchantmentLevel) { cWeightedEnchantment weightedenchantment; weightedenchantment.m_Weight = a_Weight; cEnchantments enchantment; enchantment.SetLevel(a_EnchantmentID, a_EnchantmentLevel); weightedenchantment.m_Enchantments = enchantment; - a_Enchantments->push_back(weightedenchantment); + a_Enchantments.push_back(weightedenchantment); } diff --git a/src/Enchantments.h b/src/Enchantments.h index fc848ebec..a376d27cf 100644 --- a/src/Enchantments.h +++ b/src/Enchantments.h @@ -105,10 +105,13 @@ public: /** Add enchantment weights from item to the vector */ static void AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantments, short a_ItemType, int a_EnchantmentLevel); - /** Add a enchantment weight to the vector */ - static void AddEnchantmentWeightToVector(cWeightedEnchantments * a_Enchantments, int a_Weight, int a_EnchantmentID, int a_EnchantmentLevel); - /** Remove a enchantment weight from the vector */ + /** Add a enchantment with weight to the vector */ + static void AddEnchantmentWeightToVector(cWeightedEnchantments & a_Enchantments, int a_Weight, int a_EnchantmentID, int a_EnchantmentLevel); + + /** Remove the entire enchantment (with weight) from the vector */ static void RemoveEnchantmentWeightFromVector(cWeightedEnchantments & a_Enchantments, int a_EnchantmentID); + + /** Remove the entire enchantment (with weight) from the vector */ static void RemoveEnchantmentWeightFromVector(cWeightedEnchantments & a_Enchantments, const cEnchantments & a_Enchantment); /** Check enchantment conflicts from enchantments from the vector */ @@ -137,7 +140,7 @@ protected: -// Define the cWeightedEnchantment struct: +// Define the cWeightedEnchantment struct for the Enchanting System to store the EnchantmentWeights: struct cWeightedEnchantment { int m_Weight; From 7b246d9a8dae22937171a753072d72b4732986d7 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 20 Apr 2014 13:50:37 +0200 Subject: [PATCH 141/188] Fixed MSVC compilation. --- src/UI/SlotArea.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 5f74b4fa3..e062598c8 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -806,7 +806,7 @@ void cSlotAreaEnchanting::UpdateResult(cPlayer & a_Player) int Bookshelves = std::min(GetBookshelvesCount(a_Player.GetWorld()), 15); cFastRandom Random; - int base = (Random.GenerateRandomInteger(1, 8) + floor(Bookshelves / 2) + Random.GenerateRandomInteger(0, Bookshelves)); + 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); From d80c082deff1eea80845ca81db1d9e4a4e85116b Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 20 Apr 2014 14:14:16 +0200 Subject: [PATCH 142/188] Updated the nightbuild script. --- MakeLuaAPI.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MakeLuaAPI.cmd b/MakeLuaAPI.cmd index 7054977a0..90b8cf53e 100644 --- a/MakeLuaAPI.cmd +++ b/MakeLuaAPI.cmd @@ -30,7 +30,7 @@ if "a%ftpsite%" == "a" ( cd MCServer copy /Y settings_apidump.ini settings.ini -echo stop | MCServer +echo api | MCServer cd .. From d7f88396e0ed7c024fd367c4e225bbd9c05404b6 Mon Sep 17 00:00:00 2001 From: Mattes D Date: Mon, 21 Apr 2014 06:41:11 +0200 Subject: [PATCH 143/188] Fixed enchanting return values. Items are enchanted in those cases, so return true. Ref.: #914. --- src/Item.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Item.cpp b/src/Item.cpp index f92efcb39..6a5fefbe1 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -320,7 +320,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; if ((Random.NextFloat(100) > SecondEnchantmentChance) || (enchantments.size() == 0)) { - return false; + return true; } cEnchantments Enchantment2 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); @@ -335,7 +335,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; if ((Random.NextFloat(100) > ThirdEnchantmentChance) || (enchantments.size() == 0)) { - return false; + return true; } cEnchantments Enchantment3 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); @@ -350,7 +350,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; if ((Random.NextFloat(100) > FourthEnchantmentChance) || (enchantments.size() == 0)) { - return false; + return true; } cEnchantments Enchantment4 = cEnchantments::GetRandomEnchantmentFromVector(enchantments); m_Enchantments.AddFromString(Enchantment4.ToString()); From 9f58046b5b6f5a0814461ad68d7612343dc3c2f5 Mon Sep 17 00:00:00 2001 From: Mattes D Date: Mon, 21 Apr 2014 08:22:25 +0200 Subject: [PATCH 144/188] Allow 1.6.4 Forge clients to log in. Fixes #913. --- src/Protocol/Protocol16x.cpp | 19 +++++++++++++++++++ src/Protocol/Protocol16x.h | 1 + 2 files changed, 20 insertions(+) diff --git a/src/Protocol/Protocol16x.cpp b/src/Protocol/Protocol16x.cpp index 3da23a1dc..8d79213af 100644 --- a/src/Protocol/Protocol16x.cpp +++ b/src/Protocol/Protocol16x.cpp @@ -214,6 +214,25 @@ int cProtocol161::ParseEntityAction(void) +int cProtocol161::ParseLogin(void) +{ + // The login packet is sent by Forge clients only + // Only parse the packet, do no extra processing + // Note that the types and the names have been only guessed and are not verified at all! + HANDLE_PACKET_READ(ReadBEInt, int, Int1); + HANDLE_PACKET_READ(ReadBEUTF16String16, AString, String1); + HANDLE_PACKET_READ(ReadChar, char, Char1); + HANDLE_PACKET_READ(ReadChar, char, Char2); + HANDLE_PACKET_READ(ReadChar, char, Char3); + HANDLE_PACKET_READ(ReadByte, Byte, Byte1); + HANDLE_PACKET_READ(ReadByte, Byte, Byte2); + return PARSE_OK; +} + + + + + int cProtocol161::ParsePlayerAbilities(void) { HANDLE_PACKET_READ(ReadByte, Byte, Flags); diff --git a/src/Protocol/Protocol16x.h b/src/Protocol/Protocol16x.h index ae1388649..8eedce8d5 100644 --- a/src/Protocol/Protocol16x.h +++ b/src/Protocol/Protocol16x.h @@ -46,6 +46,7 @@ protected: virtual void SendWindowOpen (const cWindow & a_Window) override; virtual int ParseEntityAction (void) override; + virtual int ParseLogin (void) override; virtual int ParsePlayerAbilities(void) override; // New packets: From 4c7621ed16bfa9f0224eab52f8f7acbb0b61ec14 Mon Sep 17 00:00:00 2001 From: Mattes D Date: Mon, 21 Apr 2014 09:21:31 +0200 Subject: [PATCH 145/188] Fixed a warning in CraftingRecipes. --- src/CraftingRecipes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CraftingRecipes.cpp b/src/CraftingRecipes.cpp index 30e7a8733..c3d6de74d 100644 --- a/src/CraftingRecipes.cpp +++ b/src/CraftingRecipes.cpp @@ -824,7 +824,7 @@ void cCraftingRecipes::HandleFireworks(const cItem * a_CraftingGrid, cCraftingRe case E_ITEM_DYE: { int GridID = (itr->x + a_OffsetX) + a_GridStride * (itr->y + a_OffsetY); - DyeColours.push_back(cFireworkItem::GetVanillaColourCodeFromDye(a_CraftingGrid[GridID].m_ItemDamage)); + DyeColours.push_back(cFireworkItem::GetVanillaColourCodeFromDye((NIBBLETYPE)(a_CraftingGrid[GridID].m_ItemDamage & 0x0f))); break; } case E_ITEM_GUNPOWDER: break; From bdd8b43b3eb0f71fff383d9a844e910fe9db7925 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 20 Apr 2014 13:54:17 +0200 Subject: [PATCH 146/188] Replaced X.size() with X.empty(), where applicable. --- src/Item.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Item.cpp b/src/Item.cpp index 6a5fefbe1..d7424267a 100644 --- a/src/Item.cpp +++ b/src/Item.cpp @@ -318,7 +318,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) // Next Enchantment (Second) NewEnchantmentLevel = NewEnchantmentLevel / 2; float SecondEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if ((Random.NextFloat(100) > SecondEnchantmentChance) || (enchantments.size() == 0)) + if (enchantments.empty() || (Random.NextFloat(100) > SecondEnchantmentChance)) { return true; } @@ -333,7 +333,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) // Next Enchantment (Third) NewEnchantmentLevel = NewEnchantmentLevel / 2; float ThirdEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if ((Random.NextFloat(100) > ThirdEnchantmentChance) || (enchantments.size() == 0)) + if (enchantments.empty() || (Random.NextFloat(100) > ThirdEnchantmentChance)) { return true; } @@ -348,7 +348,7 @@ bool cItem::EnchantByXPLevels(int a_NumXPLevels) // Next Enchantment (Fourth) NewEnchantmentLevel = NewEnchantmentLevel / 2; float FourthEnchantmentChance = (NewEnchantmentLevel + 1) / 50 * 100; - if ((Random.NextFloat(100) > FourthEnchantmentChance) || (enchantments.size() == 0)) + if (enchantments.empty() || (Random.NextFloat(100) > FourthEnchantmentChance)) { return true; } From 7c6ef26be95c90ea6686840f1580953b2b8029a1 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 20 Apr 2014 14:16:26 +0200 Subject: [PATCH 147/188] Added enchantment combining into cEnchantments. --- src/Enchantments.cpp | 12 ++++++++++++ src/Enchantments.h | 37 +++++++++++++++++++++---------------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/Enchantments.cpp b/src/Enchantments.cpp index dad92dc91..64f89815b 100644 --- a/src/Enchantments.cpp +++ b/src/Enchantments.cpp @@ -29,6 +29,18 @@ cEnchantments::cEnchantments(const AString & a_StringSpec) +void cEnchantments::Add(const cEnchantments & a_Other) +{ + for (cEnchantments::cMap::const_iterator itr = a_Other.m_Enchantments.begin(), end = a_Other.m_Enchantments.end(); itr != end; ++itr) + { + SetLevel(itr->first, itr->second); + } // for itr - a_Other.m_Enchantments[] +} + + + + + void cEnchantments::AddFromString(const AString & a_StringSpec) { // Add enchantments in the stringspec; if a specified enchantment already exists, overwrites it diff --git a/src/Enchantments.h b/src/Enchantments.h index a376d27cf..dc5502702 100644 --- a/src/Enchantments.h +++ b/src/Enchantments.h @@ -40,7 +40,8 @@ Serialization will never put zero-level enchantments into the stringspec and wil class cEnchantments { public: - /// Individual enchantment IDs, corresponding to their NBT IDs ( http://www.minecraftwiki.net/wiki/Data_Values#Enchantment_IDs ) + /** Individual enchantment IDs, corresponding to their NBT IDs ( http://www.minecraftwiki.net/wiki/Data_Values#Enchantment_IDs ) + */ enum { @@ -70,34 +71,38 @@ public: enchLure = 62, } ; - /// Creates an empty enchantments container + /** Creates an empty enchantments container */ cEnchantments(void); - /// Creates an enchantments container filled with enchantments parsed from stringspec + /** Creates an enchantments container filled with enchantments parsed from stringspec */ cEnchantments(const AString & a_StringSpec); - /// Adds enchantments in the stringspec; if a specified enchantment already exists, overwrites it + /** Adds the enchantments contained in a_Other into this object. + Existing enchantments are preserved, unless a_Other specifies a different level, in which case the level is changed. */ + void Add(const cEnchantments & a_Other); + + /** Adds enchantments in the stringspec; if a specified enchantment already exists, overwrites it */ void AddFromString(const AString & a_StringSpec); - /// Serializes all the enchantments into a string + /** Serializes all the enchantments into a string */ AString ToString(void) const; - /// Returns the level for the specified enchantment; 0 if not stored + /** Returns the level for the specified enchantment; 0 if not stored */ int GetLevel(int a_EnchantmentID) const; - /// Sets the level for the specified enchantment, adding it if not stored before or removing it if level <= 0 + /** Sets the level for the specified enchantment, adding it if not stored before or removing it if level <= 0 */ void SetLevel(int a_EnchantmentID, int a_Level); - /// Removes all enchantments + /** Removes all enchantments */ void Clear(void); - /// Returns true if there are no enchantments + /** Returns true if there are no enchantments */ bool IsEmpty(void) const; - /// Converts enchantment name to the numeric representation; returns -1 if enchantment name not found; case insensitive + /** Converts enchantment name to the numeric representation; returns -1 if enchantment name not found; case insensitive */ static int StringToEnchantmentID(const AString & a_EnchantmentName); - /// Returns true if a_Other contains exactly the same enchantments and levels + /** Returns true if a_Other contains exactly the same enchantments and levels */ bool operator ==(const cEnchantments & a_Other) const; // tolua_end @@ -120,20 +125,20 @@ public: /** Gets random enchantment from Vector and returns it */ static cEnchantments GetRandomEnchantmentFromVector(cWeightedEnchantments & a_Enchantments); - /// Returns true if a_Other doesn't contain exactly the same enchantments and levels + /** Returns true if a_Other doesn't contain exactly the same enchantments and levels */ bool operator !=(const cEnchantments & a_Other) const; - /// Writes the enchantments into the specified NBT writer; begins with the LIST tag of the specified name ("ench" or "StoredEnchantments") + /** Writes the enchantments into the specified NBT writer; begins with the LIST tag of the specified name ("ench" or "StoredEnchantments") */ friend void EnchantmentSerializer::WriteToNBTCompound(cEnchantments const& a_Enchantments, cFastNBTWriter & a_Writer, const AString & a_ListTagName); - /// Reads the enchantments from the specified NBT list tag (ench or StoredEnchantments) + /** Reads the enchantments from the specified NBT list tag (ench or StoredEnchantments) */ friend void EnchantmentSerializer::ParseFromNBT(cEnchantments& a_Enchantments, const cParsedNBT & a_NBT, int a_EnchListTagIdx); protected: - /// Maps enchantment ID -> enchantment level + /** Maps enchantment ID -> enchantment level */ typedef std::map cMap; - /// Currently stored enchantments + /** Currently stored enchantments */ cMap m_Enchantments; } ; // tolua_export From e3ec857264a89b9d715c9fe3780f2bd29b701f42 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Mon, 21 Apr 2014 10:31:07 +0200 Subject: [PATCH 148/188] Added prefab hitboxes. The nether forts should quite limit their bridge-to-floor overlaps. Cannot eliminate, but at least severely diminish. --- src/Generating/Prefab.cpp | 9 +- src/Generating/Prefab.h | 6 +- src/Generating/Prefabs/NetherFortPrefabs.cpp | 134 +++++++++++++++++-- 3 files changed, 138 insertions(+), 11 deletions(-) diff --git a/src/Generating/Prefab.cpp b/src/Generating/Prefab.cpp index 7d1762036..c0c9e8a13 100644 --- a/src/Generating/Prefab.cpp +++ b/src/Generating/Prefab.cpp @@ -23,6 +23,10 @@ static const cPrefab::sDef g_TestPrefabDef = // Size: 7, 6, 7, // SizeX = 7, SizeY = 6, SizeZ = 7 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 6, 5, 6, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* 0 */ "a:112: 0\n" /* netherbrick */ @@ -115,7 +119,10 @@ static cPrefab g_TestPrefab(g_TestPrefabDef); cPrefab::cPrefab(const cPrefab::sDef & a_Def) : m_Size(a_Def.m_SizeX, a_Def.m_SizeY, a_Def.m_SizeZ), - m_HitBox(0, 0, 0, a_Def.m_SizeX - 1, a_Def.m_SizeY - 1, a_Def.m_SizeZ - 1), + m_HitBox( + a_Def.m_HitboxMinX, a_Def.m_HitboxMinY, a_Def.m_HitboxMinZ, + a_Def.m_HitboxMaxX, a_Def.m_HitboxMaxY, a_Def.m_HitboxMaxZ + ), m_AllowedRotations(a_Def.m_AllowedRotations), m_MergeStrategy(a_Def.m_MergeStrategy), m_ShouldExtendFloor(a_Def.m_ShouldExtendFloor), diff --git a/src/Generating/Prefab.h b/src/Generating/Prefab.h index dbf882e21..37db2ff16 100644 --- a/src/Generating/Prefab.h +++ b/src/Generating/Prefab.h @@ -38,6 +38,10 @@ public: int m_SizeY; int m_SizeZ; + /** The hitbox used for collision-checking between prefabs. Relative to the bounds. */ + int m_HitboxMinX, m_HitboxMinY, m_HitboxMinZ; + int m_HitboxMaxX, m_HitboxMaxY, m_HitboxMaxZ; + /** The mapping between characters in m_Image and the blocktype / blockmeta. Format: "Char: BlockType: BlockMeta \n Char: BlockType : BlockMeta \n ..." */ const char * m_CharMap; @@ -114,7 +118,7 @@ protected: /** The size of the prefab */ Vector3i m_Size; - /** The hitbox of the prefab. In first version is the same as the m_BlockArea dimensions */ + /** The hitbox used for collision-checking between prefabs. */ cCuboid m_HitBox; /** The connectors through which the piece connects to other pieces */ diff --git a/src/Generating/Prefabs/NetherFortPrefabs.cpp b/src/Generating/Prefabs/NetherFortPrefabs.cpp index 7a46df5d8..61b32378a 100644 --- a/src/Generating/Prefabs/NetherFortPrefabs.cpp +++ b/src/Generating/Prefabs/NetherFortPrefabs.cpp @@ -22,6 +22,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 13, 7, 9, // SizeX = 13, SizeY = 7, SizeZ = 9 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 12, 6, 8, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -160,6 +164,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 13, 7, 11, // SizeX = 13, SizeY = 7, SizeZ = 11 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 12, 6, 10, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -313,6 +321,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 10, 7, 7, // SizeX = 10, SizeY = 7, SizeZ = 7 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 9, 6, 6, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -414,7 +426,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = 100, // DepthWeight: - "", + "1:0|2:0|3:0|4:0|5:0", // AddWeightIfSame: 0, @@ -429,6 +441,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 14, 9, 7, // SizeX = 14, SizeY = 9, SizeZ = 7 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 13, 18, 6, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -558,7 +574,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = 100, // DepthWeight: - "", + "1:0|2:0|3:0|4:0|5:0", // AddWeightIfSame: 0, @@ -573,6 +589,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 15, 8, 15, // SizeX = 15, SizeY = 8, SizeZ = 15 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 14, 17, 14, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -769,6 +789,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 15, 8, 15, // SizeX = 15, SizeY = 8, SizeZ = 15 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 14, 17, 14, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -966,6 +990,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 9, 6, 5, // SizeX = 9, SizeY = 6, SizeZ = 5 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 8, 15, 4, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -1041,7 +1069,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = 100, // DepthWeight: - "1:0", + "1:0|2:0|3:0|4:0|5:0", // AddWeightIfSame: 0, @@ -1056,6 +1084,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 13, 6, 5, // SizeX = 13, SizeY = 6, SizeZ = 5 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 12, 15, 4, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -1137,7 +1169,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = 100, // DepthWeight: - "1:0", + "1:0|2:0|3:0|4:0|5:0", // AddWeightIfSame: 0, @@ -1152,6 +1184,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 5, 7, 16, // SizeX = 5, SizeY = 7, SizeZ = 16 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 4, 6, 15, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -1327,6 +1363,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 15, 12, 12, // SizeX = 15, SizeY = 12, SizeZ = 12 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 14, 11, 11, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -1563,6 +1603,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 15, 14, 16, // SizeX = 15, SizeY = 14, SizeZ = 16 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 14, 13, 15, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -1885,6 +1929,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 15, 8, 5, // SizeX = 15, SizeY = 8, SizeZ = 5 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 14, 17, 4, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -2000,6 +2048,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 15, 8, 10, // SizeX = 15, SizeY = 8, SizeZ = 10 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 14, 17, 9, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -2156,6 +2208,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 11, 6, 5, // SizeX = 11, SizeY = 6, SizeZ = 5 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 10, 5, 4, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -2251,6 +2307,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 13, 6, 5, // SizeX = 13, SizeY = 6, SizeZ = 5 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 12, 5, 4, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -2346,6 +2406,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 11, 6, 11, // SizeX = 11, SizeY = 6, SizeZ = 11 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 10, 5, 10, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -2479,6 +2543,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 11, 6, 11, // SizeX = 11, SizeY = 6, SizeZ = 11 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 10, 5, 10, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -2613,6 +2681,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 9, 13, 5, // SizeX = 9, SizeY = 13, SizeZ = 5 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 8, 12, 4, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -2759,6 +2831,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 14, 6, 5, // SizeX = 14, SizeY = 6, SizeZ = 5 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 13, 5, 4, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -2854,6 +2930,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 15, 11, 15, // SizeX = 15, SizeY = 11, SizeZ = 15 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 14, 10, 14, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -3086,7 +3166,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = false, // DefaultWeight: - 100, + 10, // DepthWeight: "", @@ -3104,6 +3184,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 12, 15, 15, // SizeX = 12, SizeY = 15, SizeZ = 15 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 11, 14, 14, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -3411,7 +3495,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = false, // DefaultWeight: - 100, + 10, // DepthWeight: "", @@ -3429,6 +3513,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 16, 12, 15, // SizeX = 16, SizeY = 12, SizeZ = 15 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 15, 11, 14, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -3685,7 +3773,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = false, // DefaultWeight: - 100, + 10, // DepthWeight: "", @@ -3703,6 +3791,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 13, 8, 13, // SizeX = 13, SizeY = 8, SizeZ = 13 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 12, 7, 12, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -3885,6 +3977,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 7, 10, 7, // SizeX = 7, SizeY = 10, SizeZ = 7 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 6, 9, 6, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -4009,7 +4105,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = 100, // DepthWeight: - "", + "1:0|3:0|5:0|7:0|9:0|11:0|13:0|15:0", // AddWeightIfSame: 0, @@ -4024,6 +4120,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 7, 10, 7, // SizeX = 7, SizeY = 10, SizeZ = 7 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 6, 9, 6, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -4148,7 +4248,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = 100, // DepthWeight: - "", + "1:0|3:0|5:0|7:0|9:0|11:0|13:0|15:0", // AddWeightIfSame: 0, @@ -4163,6 +4263,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 13, 6, 7, // SizeX = 13, SizeY = 6, SizeZ = 7 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 12, 5, 6, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -4273,6 +4377,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 13, 6, 9, // SizeX = 13, SizeY = 6, SizeZ = 9 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 12, 5, 8, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -4395,6 +4503,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Size: 7, 6, 7, // SizeX = 7, SizeY = 6, SizeZ = 7 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 6, 5, 6, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ @@ -4502,6 +4614,10 @@ const cPrefab::sDef g_NetherFortStartingPrefabs[] = // Size: 13, 9, 13, // SizeX = 13, SizeY = 9, SizeZ = 13 + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 12, 8, 12, // MaxX, MaxY, MaxZ + // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ From a967313839bab2a5f43befabe689801b949b274e Mon Sep 17 00:00:00 2001 From: "r.ramazanov" Date: Mon, 21 Apr 2014 13:13:25 +0400 Subject: [PATCH 149/188] Mobs shouldn't burn when it's Raining #906 --- src/Entities/Entity.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 56ef36ef8..c1926dafc 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -774,12 +774,19 @@ void cEntity::TickBurning(cChunk & a_Chunk) if (GetWorld()->GetWeather() == eWeather_Rain) { - if (HasBeenBurning) + + int PosX = POSX_TOINT - a_Chunk.GetPosX() * cChunkDef::Width, + PosY = POSY_TOINT, + PosZ = POSZ_TOINT - a_Chunk.GetPosZ() * cChunkDef::Width; + + if ((PosY > 0) || (PosY <= cChunkDef::Height)) { - m_TicksLeftBurning = 0; - OnFinishedBurning(); - } - return; + // Inside the world + if (a_Chunk.GetSkyLight(PosX, PosY, PosZ) == 15) + { + m_TicksLeftBurning = 0; + } + } } // Do the burning damage: From 865e8e22e54340606d8008e13172cb61d326d009 Mon Sep 17 00:00:00 2001 From: jfhumann Date: Mon, 21 Apr 2014 14:04:36 +0200 Subject: [PATCH 150/188] reverted the revert of the minecart collision detection fix. --- src/Entities/Minecart.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp index 7fe0b3cb1..db55eb058 100644 --- a/src/Entities/Minecart.cpp +++ b/src/Entities/Minecart.cpp @@ -796,8 +796,7 @@ bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta) BLOCKTYPE BlockXM = m_World->GetBlock(POSX_TOINT - 1, POSY_TOINT, POSZ_TOINT); BLOCKTYPE BlockXP = m_World->GetBlock(POSX_TOINT + 1, POSY_TOINT, POSZ_TOINT); BLOCKTYPE BlockZM = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT - 1); - // FIXME: Should the next line be POSZ_TOINT + 1? Else add some documenttation why - 1 - BLOCKTYPE BlockZP = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT - 1); + BLOCKTYPE BlockZP = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT + 1); if ( (!IsBlockRail(BlockXM) && cBlockInfo::IsSolid(BlockXM)) || (!IsBlockRail(BlockXP) && cBlockInfo::IsSolid(BlockXP)) || From bca7f2949032ab90ee03988f560bce157a25b683 Mon Sep 17 00:00:00 2001 From: archshift Date: Tue, 22 Apr 2014 01:59:34 -1000 Subject: [PATCH 151/188] Lay foundation for fireproof entities. Prevent any entities with the m_Fireproof flag from taking fire or lava damage. --- src/Entities/Entity.cpp | 15 ++++++++++++--- src/Entities/Entity.h | 3 +++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 56ef36ef8..345e0054b 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -788,7 +788,10 @@ void cEntity::TickBurning(cChunk & a_Chunk) m_TicksSinceLastBurnDamage++; if (m_TicksSinceLastBurnDamage >= BURN_TICKS_PER_DAMAGE) { - TakeDamage(dtOnFire, NULL, BURN_DAMAGE, 0); + if (!m_Fireproof) + { + TakeDamage(dtOnFire, NULL, BURN_DAMAGE, 0); + } m_TicksSinceLastBurnDamage = 0; } m_TicksLeftBurning--; @@ -856,7 +859,10 @@ void cEntity::TickBurning(cChunk & a_Chunk) m_TicksSinceLastLavaDamage++; if (m_TicksSinceLastLavaDamage >= LAVA_TICKS_PER_DAMAGE) { - TakeDamage(dtLavaContact, NULL, LAVA_DAMAGE, 0); + if (!m_Fireproof) + { + TakeDamage(dtLavaContact, NULL, LAVA_DAMAGE, 0); + } m_TicksSinceLastLavaDamage = 0; } } @@ -874,7 +880,10 @@ void cEntity::TickBurning(cChunk & a_Chunk) m_TicksSinceLastFireDamage++; if (m_TicksSinceLastFireDamage >= FIRE_TICKS_PER_DAMAGE) { - TakeDamage(dtFireContact, NULL, FIRE_DAMAGE, 0); + if (!m_Fireproof) + { + TakeDamage(dtFireContact, NULL, FIRE_DAMAGE, 0); + } m_TicksSinceLastFireDamage = 0; } } diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h index 8f3899e2f..ea85ac683 100644 --- a/src/Entities/Entity.h +++ b/src/Entities/Entity.h @@ -435,6 +435,9 @@ protected: cWorld * m_World; + /// Whether the entity is capable of taking fire or lava damage. + bool m_Fireproof; + /// Time, in ticks, since the last damage dealt by being on fire. Valid only if on fire (IsOnFire()) int m_TicksSinceLastBurnDamage; From 10cba6cf58d772a63da9d9fc1c3c3a7a33904b88 Mon Sep 17 00:00:00 2001 From: worktycho Date: Tue, 22 Apr 2014 13:05:23 +0100 Subject: [PATCH 152/188] Revert moving gcc to g++11 in 18c3b1 --- SetFlags.cmake | 8 -------- 1 file changed, 8 deletions(-) diff --git a/SetFlags.cmake b/SetFlags.cmake index 6c974ea94..c5a3a0697 100644 --- a/SetFlags.cmake +++ b/SetFlags.cmake @@ -46,10 +46,6 @@ macro(set_flags) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++0x") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++0x") - add_flags_cxx("-pthread") endif() @@ -60,10 +56,6 @@ macro(set_flags) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11") - else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++0x") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++0x") endif() # We use a signed char (fixes #640 on RasPi) From 1cf396c814e2f4586f55b13130a9f7a039caed4c Mon Sep 17 00:00:00 2001 From: archshift Date: Tue, 22 Apr 2014 02:18:41 -1000 Subject: [PATCH 153/188] Fixed capitalization issues Wasn't parsing correctly before, as some items were not capitalized correctly. --- MCServer/monsters.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MCServer/monsters.ini b/MCServer/monsters.ini index 8cd956157..cd5d92b66 100644 --- a/MCServer/monsters.ini +++ b/MCServer/monsters.ini @@ -47,7 +47,7 @@ AttackDamage=4.0 SightDistance=25.0 MaxHealth=40 -[Zombiepigman] +[ZombiePigman] AttackRange=2.0 AttackRate=1 AttackDamage=7.0 @@ -145,7 +145,7 @@ AttackDamage=0.0 SightDistance=25.0 MaxHealth=10 -[Magmacube] +[MagmaCube] AttackRange=2.0 AttackRate=1 AttackDamage=6.0 From 06f41699afe27a6be1de357466f9185403baa550 Mon Sep 17 00:00:00 2001 From: archshift Date: Tue, 22 Apr 2014 02:36:39 -1000 Subject: [PATCH 154/188] Fixed indentation and changed m_Fireproof to m_IsFireproof. --- src/Entities/Entity.cpp | 24 ++++++++++++------------ src/Entities/Entity.h | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 345e0054b..9a80d3e80 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -788,10 +788,10 @@ void cEntity::TickBurning(cChunk & a_Chunk) m_TicksSinceLastBurnDamage++; if (m_TicksSinceLastBurnDamage >= BURN_TICKS_PER_DAMAGE) { - if (!m_Fireproof) - { - TakeDamage(dtOnFire, NULL, BURN_DAMAGE, 0); - } + if (!m_IsFireproof) + { + TakeDamage(dtOnFire, NULL, BURN_DAMAGE, 0); + } m_TicksSinceLastBurnDamage = 0; } m_TicksLeftBurning--; @@ -859,10 +859,10 @@ void cEntity::TickBurning(cChunk & a_Chunk) m_TicksSinceLastLavaDamage++; if (m_TicksSinceLastLavaDamage >= LAVA_TICKS_PER_DAMAGE) { - if (!m_Fireproof) - { - TakeDamage(dtLavaContact, NULL, LAVA_DAMAGE, 0); - } + if (!m_IsFireproof) + { + TakeDamage(dtLavaContact, NULL, LAVA_DAMAGE, 0); + } m_TicksSinceLastLavaDamage = 0; } } @@ -880,10 +880,10 @@ void cEntity::TickBurning(cChunk & a_Chunk) m_TicksSinceLastFireDamage++; if (m_TicksSinceLastFireDamage >= FIRE_TICKS_PER_DAMAGE) { - if (!m_Fireproof) - { - TakeDamage(dtFireContact, NULL, FIRE_DAMAGE, 0); - } + if (!m_IsFireproof) + { + TakeDamage(dtFireContact, NULL, FIRE_DAMAGE, 0); + } m_TicksSinceLastFireDamage = 0; } } diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h index ea85ac683..84a2003d4 100644 --- a/src/Entities/Entity.h +++ b/src/Entities/Entity.h @@ -435,8 +435,8 @@ protected: cWorld * m_World; - /// Whether the entity is capable of taking fire or lava damage. - bool m_Fireproof; + /// Whether the entity is capable of taking fire or lava damage. + bool m_IsFireproof; /// Time, in ticks, since the last damage dealt by being on fire. Valid only if on fire (IsOnFire()) int m_TicksSinceLastBurnDamage; From 2533842ca45b03fb45f5240e9624879e67c52982 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Tue, 22 Apr 2014 22:25:39 +0200 Subject: [PATCH 155/188] Updated NetherFort prefabs from the Gallery server. --- src/Generating/Prefabs/NetherFortPrefabs.cpp | 1059 +++++++++++++----- 1 file changed, 785 insertions(+), 274 deletions(-) diff --git a/src/Generating/Prefabs/NetherFortPrefabs.cpp b/src/Generating/Prefabs/NetherFortPrefabs.cpp index 61b32378a..20cee576c 100644 --- a/src/Generating/Prefabs/NetherFortPrefabs.cpp +++ b/src/Generating/Prefabs/NetherFortPrefabs.cpp @@ -777,7 +777,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "", // AddWeightIfSame: - 0, + -1000, }, // BridgeCircleCrossing @@ -1365,7 +1365,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Hitbox (relative to bounding box): 0, 0, 0, // MinX, MinY, MinZ - 14, 11, 11, // MaxX, MaxY, MaxZ + 14, 21, 11, // MaxX, MaxY, MaxZ // Block definitions: ".: 0: 0\n" /* air */ @@ -1598,308 +1598,311 @@ const cPrefab::sDef g_NetherFortPrefabs[] = /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // BridgeLevelCrossing: - // The data has been exported from the gallery Nether, area index 45, ID 304, created by Aloe_vera + // The data has been exported from the gallery Nether, area index 61, ID 321, created by Aloe_vera { // Size: - 15, 14, 16, // SizeX = 15, SizeY = 14, SizeZ = 16 + 16, 14, 16, // SizeX = 16, SizeY = 14, SizeZ = 16 // Hitbox (relative to bounding box): 0, 0, 0, // MinX, MinY, MinZ - 14, 13, 15, // MaxX, MaxY, MaxZ + 15, 23, 15, // MaxX, MaxY, MaxZ // Block definitions: ".: 0: 0\n" /* air */ "a:112: 0\n" /* netherbrick */ - "b:114: 6\n" /* netherbrickstairs */ + "b:114: 5\n" /* netherbrickstairs */ "c:114: 4\n" /* netherbrickstairs */ - "d:114: 5\n" /* netherbrickstairs */ - "e: 44:14\n" /* step */ + "d: 44:14\n" /* step */ + "e:114: 6\n" /* netherbrickstairs */ "f:114: 7\n" /* netherbrickstairs */ "m: 19: 0\n" /* sponge */, // Block data: // Level 0 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "...........aaa." - /* 1 */ "aa.........aaaa" - /* 2 */ "aa...........aa" - /* 3 */ "aa...........aa" - /* 4 */ "..............." - /* 5 */ "..............." - /* 6 */ "..............." - /* 7 */ "..............." - /* 8 */ "..............." - /* 9 */ "..............." - /* 10 */ "..............." - /* 11 */ "..............." - /* 12 */ "..............." - /* 13 */ "..............." - /* 14 */ "...........aaa." - /* 15 */ "...........aaa." + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "mmmmmmmmmmmmmmmm" + /* 1 */ "aammmmmmmmmmmmaa" + /* 2 */ "aammmmmmmmmmmmaa" + /* 3 */ "aammmmmmmmmmmmaa" + /* 4 */ "mmmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmmmm" + /* 7 */ "mmmmmmmmmmmmmmmm" + /* 8 */ "mmmmmmmmmmmmmmmm" + /* 9 */ "mmmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmmm" + /* 12 */ "maaammmmmmmmmmmm" + /* 13 */ "maaammmmmmmmmmmm" + /* 14 */ "maaammmmmmmmaaam" + /* 15 */ "mmmmmmmmmmmmaaam" // Level 1 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "...........aaa." - /* 1 */ "aa.........aaaa" - /* 2 */ "aa...........aa" - /* 3 */ "aa...........aa" - /* 4 */ "..............." - /* 5 */ "..............." - /* 6 */ "..............." - /* 7 */ "..............." - /* 8 */ "..............." - /* 9 */ "..............." - /* 10 */ "..............." - /* 11 */ "..............." - /* 12 */ "..............." - /* 13 */ "..............." - /* 14 */ "...........aaa." - /* 15 */ "...........aaa." + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "mmmmmmmmmmmmmmmm" + /* 1 */ "aabmmmmmmmmmmcaa" + /* 2 */ "aabmmmmmmmmmmcaa" + /* 3 */ "aabmmmmmmmmmmcaa" + /* 4 */ "mmmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmmmm" + /* 7 */ "mmmmmmmmmmmmmmmm" + /* 8 */ "mmmmmmmmmmmmmmmm" + /* 9 */ "mmmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmmm" + /* 12 */ "maaammmmmmmmmmmm" + /* 13 */ "maaammmmmmmmmmmm" + /* 14 */ "maaammmmmmmmaaam" + /* 15 */ "mmmmmmmmmmmmaaam" // Level 2 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "...........aaa." - /* 1 */ "aa.........aaaa" - /* 2 */ "aa...........aa" - /* 3 */ "aa...........aa" - /* 4 */ "..............." - /* 5 */ "..............." - /* 6 */ "..............." - /* 7 */ "..............." - /* 8 */ "..............." - /* 9 */ "..............." - /* 10 */ "..............." - /* 11 */ "..............." - /* 12 */ "..............." - /* 13 */ "...........bbb." - /* 14 */ "...........aaa." - /* 15 */ "...........aaa." + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "mmmmmmmmmmmmmmmm" + /* 1 */ "aaabdmmmmmmdcaaa" + /* 2 */ "aaabdmmmmmmdcaaa" + /* 3 */ "aaabdmmmmmmdcaaa" + /* 4 */ "mmmmmmmmmmmmmmmm" + /* 5 */ "mmmmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmmmm" + /* 7 */ "mmmmmmmmmmmmmmmm" + /* 8 */ "mmmmmmmmmmmmmmmm" + /* 9 */ "mmmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmmm" + /* 12 */ "maaammmmmmmmmmmm" + /* 13 */ "maaammmmmmmmmmmm" + /* 14 */ "maaammmmmmmmaaam" + /* 15 */ "mmmmmmmmmmmmaaam" // Level 3 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "..........caaad" - /* 1 */ "aa........caaaa" - /* 2 */ "aa........caaaa" - /* 3 */ "aa........caaaa" - /* 4 */ "...........aaad" - /* 5 */ "...........aaad" - /* 6 */ "...........aaad" - /* 7 */ "...........aaad" - /* 8 */ "...........aaad" - /* 9 */ "..........caaad" - /* 10 */ "..........caaad" - /* 11 */ "..........caaad" - /* 12 */ "..........caaad" - /* 13 */ "..........caaad" - /* 14 */ "..........caaad" - /* 15 */ "..........caaad" + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "eeeeeeeeeeeeeeee" + /* 1 */ "aaaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaaa" + /* 4 */ "ffffffffffffffff" + /* 5 */ "mmmmmmmmmmmmmmmm" + /* 6 */ "mmmmmmmmmmmmmmmm" + /* 7 */ "mmmmmmmmmmmmmmmm" + /* 8 */ "mmmmmmmmmmmmmmmm" + /* 9 */ "mmmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmmm" + /* 12 */ "maaammmmmmmmmmmm" + /* 13 */ "maaammmmmmmmmmmm" + /* 14 */ "maaammmmmmmmaaam" + /* 15 */ "mmmmmmmmmmmmaaam" // Level 4 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "..........aaaaa" - /* 1 */ "aa........aaaaa" - /* 2 */ "aa........aaaaa" - /* 3 */ "aa........aaaaa" - /* 4 */ "..........aaaaa" - /* 5 */ "..........aaaaa" - /* 6 */ "..........aaaaa" - /* 7 */ "..........aaaaa" - /* 8 */ "..........aaaaa" - /* 9 */ "..........aaaaa" - /* 10 */ "..........aaaaa" - /* 11 */ "..........aaaaa" - /* 12 */ "..........aaaaa" - /* 13 */ "..........aaaaa" - /* 14 */ "..........aaaaa" - /* 15 */ "..........aaaaa" + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaaaaaaaaaa" + /* 1 */ "aaaaaaaaaaaaaaaa" + /* 2 */ "aaaaaaaaaaaaaaaa" + /* 3 */ "aaaaaaaaaaaaaaaa" + /* 4 */ "aaaaaaaaaaaaaaaa" + /* 5 */ "faaabmmmmmmmmmmm" + /* 6 */ "caaabmmmmmmmmmmm" + /* 7 */ "caaabmmmmmmmmmmm" + /* 8 */ "mmmmmmmmmmmmmmmm" + /* 9 */ "mmmmmmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmmm" + /* 12 */ "maaammmmmmmmmmmm" + /* 13 */ "maaammmmmmmmmmmm" + /* 14 */ "maaammmmmmmmaaam" + /* 15 */ "mmmmmmmmmmmmaaam" // Level 5 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "..........a...a" - /* 1 */ "aa........a...a" - /* 2 */ "aa........a...a" - /* 3 */ "aa........a...a" - /* 4 */ "..........a...a" - /* 5 */ "..........a...a" - /* 6 */ "........aaa...a" - /* 7 */ "........aa....a" - /* 8 */ "........aa....a" - /* 9 */ "........aa....a" - /* 10 */ "........aaa...a" - /* 11 */ "..........a...a" - /* 12 */ "..........a...a" - /* 13 */ "..........a...a" - /* 14 */ "..........a...a" - /* 15 */ "..........a...a" + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "aaaaaaaaaaaaaaaa" + /* 1 */ "................" + /* 2 */ "................" + /* 3 */ "................" + /* 4 */ "a...aaaaaaaaaaaa" + /* 5 */ "a...ammmmmmmmmmm" + /* 6 */ "aaaaammmmmmmmmmm" + /* 7 */ "aaaaammmmmmmmmmm" + /* 8 */ "caaabmmmmmmmmmmm" + /* 9 */ "caaabmmmmmmmmmmm" + /* 10 */ "mmmmmmmmmmmmmmmm" + /* 11 */ "mmmmmmmmmmmmmmmm" + /* 12 */ "maaammmmmmmmmmmm" + /* 13 */ "maaammmmmmmmmmmm" + /* 14 */ "maaammmmmmmmaaam" + /* 15 */ "mmmmmmmmmmmmaaam" // Level 6 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "..............." - /* 1 */ "aa........a...a" - /* 2 */ "aa........a...a" - /* 3 */ "aa........a...a" - /* 4 */ "..............." - /* 5 */ "..............." - /* 6 */ "........aaa...." - /* 7 */ "....aaaaa......" - /* 8 */ "....aaaaa......" - /* 9 */ "....aaaaa......" - /* 10 */ "....aaaaaaa...." - /* 11 */ "..............." - /* 12 */ "..............." - /* 13 */ "..............." - /* 14 */ "..............." - /* 15 */ "..............." + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "mmmmmmmmmmmmaaam" + /* 1 */ "................" + /* 2 */ "................" + /* 3 */ "................" + /* 4 */ "m...mmmmmmmmaaam" + /* 5 */ "a...ammmmmmmmmmm" + /* 6 */ "a...ammmmmmmmmmm" + /* 7 */ "a...ammmmmmmmmmm" + /* 8 */ "aaaaammmmmmmmmmm" + /* 9 */ "aaaaammmmmmmmmmm" + /* 10 */ "caaabmmmmmmmmmmm" + /* 11 */ "caaabmmmmmmmmmmm" + /* 12 */ "maaabmmmmmmmmmmm" + /* 13 */ "maaabmmmmmmmmmmm" + /* 14 */ "maaafmmmmmmmaaam" + /* 15 */ "mmmmmmmmmmmmaaam" // Level 7 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "..............." - /* 1 */ "aad.......a...a" - /* 2 */ "aad.......a...a" - /* 3 */ "aad.......a...a" - /* 4 */ "..............." - /* 5 */ "..............." - /* 6 */ "....aaaaaa....." - /* 7 */ "....aaaa......." - /* 8 */ "....aaaa......." - /* 9 */ "....aaaa......." - /* 10 */ "....aaaaaa....." - /* 11 */ "..............." - /* 12 */ "..............." - /* 13 */ "..............." - /* 14 */ "..............." - /* 15 */ "..............." + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "mmmmmmmmmmmmaaam" + /* 1 */ "................" + /* 2 */ "................" + /* 3 */ "................" + /* 4 */ "m...mmmmmmmmaaam" + /* 5 */ "m...mmmmmmmmmmmm" + /* 6 */ "m...mmmmmmmmmmmm" + /* 7 */ "a...ammmmmmmmmmm" + /* 8 */ "a...ammmmmmmmmmm" + /* 9 */ "a...ammmmmmmmmmm" + /* 10 */ "aaaaammmmmmmmmmm" + /* 11 */ "aaaaaeemmmmmmmmm" + /* 12 */ "caaaaaammmmmmmmm" + /* 13 */ "caaaaaammmmmmmmm" + /* 14 */ "caaaaaammmmmaaam" + /* 15 */ "fffffffmmmmmaaam" // Level 8 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "..............." - /* 1 */ "aaade.....a...a" - /* 2 */ "aaade.....a...a" - /* 3 */ "aaade.....a...a" - /* 4 */ "..............." - /* 5 */ "..............." - /* 6 */ "....aaaaa......" - /* 7 */ "....a.........." - /* 8 */ "....a.........." - /* 9 */ "....a.........." - /* 10 */ "....aaaa......." - /* 11 */ "..............." - /* 12 */ "..............." - /* 13 */ "..............." - /* 14 */ "..............." - /* 15 */ "..............." + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "mmmmmmmmmmmmaaam" + /* 1 */ "mmmmmmmmmmmmmmmm" + /* 2 */ "mmmmmmmmmmmmmmmm" + /* 3 */ "mmmmmmmmmmmmmmmm" + /* 4 */ "m...mmmmmmmmaaam" + /* 5 */ "m...mmmmmmmmmmmm" + /* 6 */ "m...mmmmmmmmmmmm" + /* 7 */ "m...mmmmmmmmmmmm" + /* 8 */ "m...mmmmmmmmmmmm" + /* 9 */ "a...ammmmmmmmmmm" + /* 10 */ "a...ammmmmmmmmmm" + /* 11 */ "a...aaaeemmmmmmm" + /* 12 */ "a.....aaammmmmmm" + /* 13 */ "a.....aaammmmmmm" + /* 14 */ "a.....aaammmaaam" + /* 15 */ "aaaaaaaffmmmaaam" // Level 9 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "bbbbbbbbbbbbbbb" - /* 1 */ "aaaaaaaaaaaaaaa" - /* 2 */ "aaaaaaaaaaaaaaa" - /* 3 */ "aaaaaaaaaaaaaaa" - /* 4 */ "ffffffaaaffffff" - /* 5 */ "....aaaaa......" - /* 6 */ "....a...a......" - /* 7 */ "....a.........." - /* 8 */ "..............." - /* 9 */ "..............." - /* 10 */ "..............." - /* 11 */ "..............." - /* 12 */ "..............." - /* 13 */ "..............." - /* 14 */ "..............." - /* 15 */ "..............." + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "mmmmmmmmmmmcaaab" + /* 1 */ "mmmmmmmmmmmcaaab" + /* 2 */ "mmmmmmmmmmmcaaab" + /* 3 */ "mmmmmmmmmmmcaaab" + /* 4 */ "mmmmmmmmmmmcaaab" + /* 5 */ "mmmmmmmmmmmcaaab" + /* 6 */ "m...mmmmmmmcaaab" + /* 7 */ "m...mmmmmmmcaaab" + /* 8 */ "m...mmmmmmmcaaab" + /* 9 */ "m...mmmmmmmcaaab" + /* 10 */ "m...mmmmmmmcaaab" + /* 11 */ "m...maaaaeecaaab" + /* 12 */ "m.......aaaaaaab" + /* 13 */ "m.......aaaaaaab" + /* 14 */ "m.......aaaaaaab" + /* 15 */ "mmmmmaaaafffaaab" // Level 10 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "aaaaaaaaaaaaaaa" - /* 1 */ "aaaaaaaaaaaaaaa" - /* 2 */ "aaaaaaaaaaaaaaa" - /* 3 */ "aaaaaaaaaaaaaaa" - /* 4 */ "aaaaaaaaaaaaaaa" - /* 5 */ "....a...a......" - /* 6 */ "....a...a......" - /* 7 */ "..............." - /* 8 */ "..............." - /* 9 */ "..............." - /* 10 */ "..............." - /* 11 */ "..............." - /* 12 */ "..............." - /* 13 */ "..............." - /* 14 */ "..............." - /* 15 */ "..............." + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "mmmmmmmmmmmaaaaa" + /* 1 */ "mmmmmmmmmmmaaaaa" + /* 2 */ "mmmmmmmmmmmaaaaa" + /* 3 */ "mmmmmmmmmmmaaaaa" + /* 4 */ "mmmmmmmmmmmaaaaa" + /* 5 */ "mmmmmmmmmmmaaaaa" + /* 6 */ "mmmmmmmmmmmaaaaa" + /* 7 */ "mmmmmmmmmmmaaaaa" + /* 8 */ "m...mmmmmmmaaaaa" + /* 9 */ "m...mmmmmmmaaaaa" + /* 10 */ "m...mmmmmmmaaaaa" + /* 11 */ "m...mmmaaaaaaaaa" + /* 12 */ "m.........aaaaaa" + /* 13 */ "m.........aaaaaa" + /* 14 */ "m.........aaaaaa" + /* 15 */ "mmmmmmmaaaaaaaaa" // Level 11 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "aaaaaaaaaaaaaaa" - /* 1 */ "..............." - /* 2 */ "..............." - /* 3 */ "..............." - /* 4 */ "aaaaa...aaaaaaa" - /* 5 */ "....a...a......" - /* 6 */ "..............." - /* 7 */ "..............." - /* 8 */ "..............." - /* 9 */ "..............." - /* 10 */ "..............." - /* 11 */ "..............." - /* 12 */ "..............." - /* 13 */ "..............." - /* 14 */ "..............." - /* 15 */ "..............." + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "mmmmmmmmmmma...a" + /* 1 */ "mmmmmmmmmmma...a" + /* 2 */ "mmmmmmmmmmma...a" + /* 3 */ "mmmmmmmmmmma...a" + /* 4 */ "mmmmmmmmmmma...a" + /* 5 */ "mmmmmmmmmmma...a" + /* 6 */ "mmmmmmmmmmma...a" + /* 7 */ "mmmmmmmmmmma...a" + /* 8 */ "mmmmmmmmmmma...a" + /* 9 */ "mmmmmmmmmmma...a" + /* 10 */ "mmmmmmmmmmma...a" + /* 11 */ "mmmmmmmmmaaa...a" + /* 12 */ "mmmm...........a" + /* 13 */ "mmmm...........a" + /* 14 */ "mmmm...........a" + /* 15 */ "mmmmmmmmmaaa...a" // Level 12 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "..............." - /* 1 */ "..............." - /* 2 */ "..............." - /* 3 */ "..............." - /* 4 */ "..............." - /* 5 */ "..............." - /* 6 */ "..............." - /* 7 */ "..............." - /* 8 */ "..............." - /* 9 */ "..............." - /* 10 */ "..............." - /* 11 */ "..............." - /* 12 */ "..............." - /* 13 */ "..............." - /* 14 */ "..............." - /* 15 */ "..............." + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "mmmmmmmmmmmm...m" + /* 1 */ "mmmmmmmmmmmm...m" + /* 2 */ "mmmmmmmmmmmm...m" + /* 3 */ "mmmmmmmmmmmm...m" + /* 4 */ "mmmmmmmmmmmm...m" + /* 5 */ "mmmmmmmmmmmm...m" + /* 6 */ "mmmmmmmmmmmm...m" + /* 7 */ "mmmmmmmmmmmm...m" + /* 8 */ "mmmmmmmmmmmm...m" + /* 9 */ "mmmmmmmmmmmm...m" + /* 10 */ "mmmmmmmmmmmm...m" + /* 11 */ "mmmmmmmmmmmm...m" + /* 12 */ "mmmmmm.........m" + /* 13 */ "mmmmmm.........m" + /* 14 */ "mmmmmm.........m" + /* 15 */ "mmmmmmmmmmmm...m" // Level 13 - /* z\x* 11111 */ - /* * 012345678901234 */ - /* 0 */ "..............." - /* 1 */ "..............." - /* 2 */ "..............." - /* 3 */ "..............." - /* 4 */ "..............." - /* 5 */ "..............." - /* 6 */ "..............." - /* 7 */ "..............." - /* 8 */ "..............." - /* 9 */ "..............." - /* 10 */ "..............." - /* 11 */ "..............." - /* 12 */ "..............." - /* 13 */ "..............." - /* 14 */ "..............." - /* 15 */ "...............", + /* z\x* 111111 */ + /* * 0123456789012345 */ + /* 0 */ "mmmmmmmmmmmm...m" + /* 1 */ "mmmmmmmmmmmm...m" + /* 2 */ "mmmmmmmmmmmm...m" + /* 3 */ "mmmmmmmmmmmm...m" + /* 4 */ "mmmmmmmmmmmm...m" + /* 5 */ "mmmmmmmmmmmm...m" + /* 6 */ "mmmmmmmmmmmm...m" + /* 7 */ "mmmmmmmmmmmm...m" + /* 8 */ "mmmmmmmmmmmm...m" + /* 9 */ "mmmmmmmmmmmm...m" + /* 10 */ "mmmmmmmmmmmm...m" + /* 11 */ "mmmmmmmmmmmm...m" + /* 12 */ "mmmmmmmm.......m" + /* 13 */ "mmmmmmmm.......m" + /* 14 */ "mmmmmmmm.......m" + /* 15 */ "mmmmmmmmmmmm...m", // Connectors: - "", + "0: 0, 5, 2: 4\n" /* Type 0, direction X- */ + "0: 15, 5, 2: 5\n" /* Type 0, direction X+ */ + "0: 13, 11, 0: 2\n" /* Type 0, direction Z- */ + "0: 13, 11, 15: 3\n" /* Type 0, direction Z+ */, // AllowedRotations: 7, /* 1, 2, 3 CCW rotation allowed */ @@ -1911,7 +1914,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = false, // DefaultWeight: - 100, + 20, // DepthWeight: "", @@ -2033,7 +2036,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = 500, // DepthWeight: - "", + "4:-3000|8:-3000|12:-3000|16:-3000|20:-3000", // AddWeightIfSame: 1000, @@ -2289,7 +2292,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = false, // DefaultWeight: - 200, + 300, // DepthWeight: "", @@ -2388,7 +2391,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = false, // DefaultWeight: - 200, + 300, // DepthWeight: "", @@ -2399,6 +2402,99 @@ const cPrefab::sDef g_NetherFortPrefabs[] = + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Corridor5: + // The data has been exported from the gallery Nether, area index 65, ID 330, created by xoft + { + // Size: + 5, 6, 5, // SizeX = 5, SizeY = 6, SizeZ = 5 + + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 4, 5, 4, // MaxX, MaxY, MaxZ + + // Block definitions: + ".: 0: 0\n" /* air */ + "a:112: 0\n" /* netherbrick */ + "b:113: 0\n" /* netherbrickfence */ + "c:114: 2\n" /* netherbrickstairs */ + "d:114: 3\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, + + // Block data: + // Level 0 + /* z\x* 01234 */ + /* 0 */ "aaaaa" + /* 1 */ "aaaaa" + /* 2 */ "aaaaa" + /* 3 */ "aaaaa" + /* 4 */ "aaaaa" + + // Level 1 + /* z\x* 01234 */ + /* 0 */ "aaaaa" + /* 1 */ "....." + /* 2 */ "....." + /* 3 */ "....." + /* 4 */ "aaaaa" + + // Level 2 + /* z\x* 01234 */ + /* 0 */ "ababa" + /* 1 */ "....." + /* 2 */ "....." + /* 3 */ "....." + /* 4 */ "ababa" + + // Level 3 + /* z\x* 01234 */ + /* 0 */ "ababa" + /* 1 */ "....." + /* 2 */ "....." + /* 3 */ "....." + /* 4 */ "ababa" + + // Level 4 + /* z\x* 01234 */ + /* 0 */ "ababa" + /* 1 */ "....." + /* 2 */ "....." + /* 3 */ "....." + /* 4 */ "ababa" + + // Level 5 + /* z\x* 01234 */ + /* 0 */ "ccccc" + /* 1 */ "aaaaa" + /* 2 */ "aaaaa" + /* 3 */ "aaaaa" + /* 4 */ "ddddd", + + // Connectors: + "1: 4, 1, 2: 5\n" /* Type 1, direction X+ */ + "1: 0, 1, 2: 4\n" /* Type 1, direction X- */, + + // AllowedRotations: + 7, /* 1, 2, 3 CCW rotation allowed */ + + // Merge strategy: + cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 500, + + // DepthWeight: + "6:0|12:0|18:0", + + // AddWeightIfSame: + 500, + }, // Corridor5 + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CorridorCorner5: // The data has been exported from the gallery Nether, area index 10, ID 40, created by xoft @@ -2674,6 +2770,127 @@ const cPrefab::sDef g_NetherFortPrefabs[] = + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // CorridorCrossing: + // The data has been exported from the gallery Nether, area index 63, ID 328, created by xoft + { + // Size: + 9, 6, 9, // SizeX = 9, SizeY = 6, SizeZ = 9 + + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 8, 5, 8, // MaxX, MaxY, MaxZ + + // Block definitions: + ".: 0: 0\n" /* air */ + "a:112: 0\n" /* netherbrick */ + "b:113: 0\n" /* netherbrickfence */ + "c:114: 0\n" /* netherbrickstairs */ + "d:114: 1\n" /* netherbrickstairs */ + "e:114: 2\n" /* netherbrickstairs */ + "f:114: 3\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, + + // Block data: + // Level 0 + /* z\x* 012345678 */ + /* 0 */ "mmaaaaamm" + /* 1 */ "mmaaaaamm" + /* 2 */ "aaaaaaaaa" + /* 3 */ "aaaaaaaaa" + /* 4 */ "aaaaaaaaa" + /* 5 */ "aaaaaaaaa" + /* 6 */ "aaaaaaaaa" + /* 7 */ "mmaaaaamm" + /* 8 */ "mmaaaaamm" + + // Level 1 + /* z\x* 012345678 */ + /* 0 */ "mma...amm" + /* 1 */ "mma...amm" + /* 2 */ "aaa...aaa" + /* 3 */ "........." + /* 4 */ "........." + /* 5 */ "........." + /* 6 */ "aaa...aaa" + /* 7 */ "mma...amm" + /* 8 */ "mma...amm" + + // Level 2 + /* z\x* 012345678 */ + /* 0 */ "mma...amm" + /* 1 */ "mmb...bmm" + /* 2 */ "aba...aba" + /* 3 */ "........." + /* 4 */ "........." + /* 5 */ "........." + /* 6 */ "aba...aba" + /* 7 */ "mmb...bmm" + /* 8 */ "mma...amm" + + // Level 3 + /* z\x* 012345678 */ + /* 0 */ "mma...amm" + /* 1 */ "mmb...bmm" + /* 2 */ "aba...aba" + /* 3 */ "........." + /* 4 */ "........." + /* 5 */ "........." + /* 6 */ "aba...aba" + /* 7 */ "mmb...bmm" + /* 8 */ "mma...amm" + + // Level 4 + /* z\x* 012345678 */ + /* 0 */ "mma...amm" + /* 1 */ "mmb...bmm" + /* 2 */ "aba...aba" + /* 3 */ "........." + /* 4 */ "........." + /* 5 */ "........." + /* 6 */ "aba...aba" + /* 7 */ "mmb...bmm" + /* 8 */ "mma...amm" + + // Level 5 + /* z\x* 012345678 */ + /* 0 */ "mmcaaadmm" + /* 1 */ "mmcaaadmm" + /* 2 */ "eeeaaaeee" + /* 3 */ "aaaaaaaaa" + /* 4 */ "aaaaaaaaa" + /* 5 */ "aaaaaaaaa" + /* 6 */ "ffcaaadff" + /* 7 */ "mmcaaadmm" + /* 8 */ "mmcaaadmm", + + // Connectors: + "1: 8, 1, 4: 5\n" /* Type 1, direction X+ */ + "1: 4, 1, 0: 2\n" /* Type 1, direction Z- */ + "1: 4, 1, 8: 3\n" /* Type 1, direction Z+ */ + "1: 0, 1, 4: 4\n" /* Type 1, direction X- */, + + // AllowedRotations: + 7, /* 1, 2, 3 CCW rotation allowed */ + + // Merge strategy: + cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + -50, + }, // CorridorCrossing + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CorridorStairs: // The data has been exported from the gallery Nether, area index 12, ID 42, created by xoft @@ -2813,10 +3030,10 @@ const cPrefab::sDef g_NetherFortPrefabs[] = false, // DefaultWeight: - 100, + 250, // DepthWeight: - "", + "0:0|2:0|4:0|6:0|8:0|10:0|12:0|14:0|16:0|18:0", // AddWeightIfSame: 0, @@ -3501,7 +3718,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "", // AddWeightIfSame: - 0, + -1000, }, // LavaStaircaseBig @@ -3965,7 +4182,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = "", // AddWeightIfSame: - 0, + -1000, }, // MidStaircase @@ -3979,7 +4196,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Hitbox (relative to bounding box): 0, 0, 0, // MinX, MinY, MinZ - 6, 9, 6, // MaxX, MaxY, MaxZ + 6, 19, 6, // MaxX, MaxY, MaxZ // Block definitions: ".: 0: 0\n" /* air */ @@ -4122,7 +4339,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // Hitbox (relative to bounding box): 0, 0, 0, // MinX, MinY, MinZ - 6, 9, 6, // MaxX, MaxY, MaxZ + 6, 19, 6, // MaxX, MaxY, MaxZ // Block definitions: ".: 0: 0\n" /* air */ @@ -4496,16 +4713,300 @@ const cPrefab::sDef g_NetherFortPrefabs[] = + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // TinyCorridorCorner: + // The data has been exported from the gallery Nether, area index 66, ID 331, created by xoft + { + // Size: + 5, 6, 5, // SizeX = 5, SizeY = 6, SizeZ = 5 + + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 4, 5, 4, // MaxX, MaxY, MaxZ + + // Block definitions: + ".: 0: 0\n" /* air */ + "a:112: 0\n" /* netherbrick */ + "b:113: 0\n" /* netherbrickfence */ + "c:114: 2\n" /* netherbrickstairs */ + "d:114: 1\n" /* netherbrickstairs */ + "e:114: 0\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, + + // Block data: + // Level 0 + /* z\x* 01234 */ + /* 0 */ "aaaaa" + /* 1 */ "aaaaa" + /* 2 */ "aaaaa" + /* 3 */ "aaaaa" + /* 4 */ "aaaaa" + + // Level 1 + /* z\x* 01234 */ + /* 0 */ "aaaaa" + /* 1 */ "....a" + /* 2 */ "....a" + /* 3 */ "....a" + /* 4 */ "a...a" + + // Level 2 + /* z\x* 01234 */ + /* 0 */ "ababa" + /* 1 */ "....b" + /* 2 */ "....a" + /* 3 */ "....b" + /* 4 */ "a...a" + + // Level 3 + /* z\x* 01234 */ + /* 0 */ "ababa" + /* 1 */ "....b" + /* 2 */ "....a" + /* 3 */ "....b" + /* 4 */ "a...a" + + // Level 4 + /* z\x* 01234 */ + /* 0 */ "ababa" + /* 1 */ "....b" + /* 2 */ "....a" + /* 3 */ "....b" + /* 4 */ "a...a" + + // Level 5 + /* z\x* 01234 */ + /* 0 */ "ccccc" + /* 1 */ "aaaad" + /* 2 */ "aaaad" + /* 3 */ "aaaad" + /* 4 */ "eaaad", + + // Connectors: + "1: 2, 1, 4: 3\n" /* Type 1, direction Z+ */ + "1: 0, 1, 2: 4\n" /* Type 1, direction X- */, + + // AllowedRotations: + 7, /* 1, 2, 3 CCW rotation allowed */ + + // Merge strategy: + cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + -50, + }, // TinyCorridorCorner + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // TinyCorridorCornerChest: + // The data has been exported from the gallery Nether, area index 67, ID 332, created by Aloe_vera + { + // Size: + 5, 6, 5, // SizeX = 5, SizeY = 6, SizeZ = 5 + + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 4, 5, 4, // MaxX, MaxY, MaxZ + + // Block definitions: + ".: 0: 0\n" /* air */ + "a:112: 0\n" /* netherbrick */ + "b: 54: 4\n" /* chest */ + "c:113: 0\n" /* netherbrickfence */ + "d:114: 2\n" /* netherbrickstairs */ + "e:114: 1\n" /* netherbrickstairs */ + "f:114: 0\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, + + // Block data: + // Level 0 + /* z\x* 01234 */ + /* 0 */ "aaaaa" + /* 1 */ "aaaaa" + /* 2 */ "aaaaa" + /* 3 */ "aaaaa" + /* 4 */ "aaaaa" + + // Level 1 + /* z\x* 01234 */ + /* 0 */ "aaaaa" + /* 1 */ "....a" + /* 2 */ "...ba" + /* 3 */ "....a" + /* 4 */ "a...a" + + // Level 2 + /* z\x* 01234 */ + /* 0 */ "acaca" + /* 1 */ "....c" + /* 2 */ "....a" + /* 3 */ "....c" + /* 4 */ "a...a" + + // Level 3 + /* z\x* 01234 */ + /* 0 */ "acaca" + /* 1 */ "....c" + /* 2 */ "....a" + /* 3 */ "....c" + /* 4 */ "a...a" + + // Level 4 + /* z\x* 01234 */ + /* 0 */ "acaca" + /* 1 */ "....c" + /* 2 */ "....a" + /* 3 */ "....c" + /* 4 */ "a...a" + + // Level 5 + /* z\x* 01234 */ + /* 0 */ "ddddd" + /* 1 */ "aaaae" + /* 2 */ "aaaae" + /* 3 */ "aaaae" + /* 4 */ "faaae", + + // Connectors: + "1: 2, 1, 4: 3\n" /* Type 1, direction Z+ */ + "1: 0, 1, 2: 4\n" /* Type 1, direction X- */, + + // AllowedRotations: + 7, /* 1, 2, 3 CCW rotation allowed */ + + // Merge strategy: + cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "", + + // AddWeightIfSame: + 0, + }, // TinyCorridorCornerChest + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // TinyCorridorCrossing: + // The data has been exported from the gallery Nether, area index 64, ID 329, created by xoft + { + // Size: + 5, 6, 5, // SizeX = 5, SizeY = 6, SizeZ = 5 + + // Hitbox (relative to bounding box): + 0, 0, 0, // MinX, MinY, MinZ + 4, 5, 4, // MaxX, MaxY, MaxZ + + // Block definitions: + ".: 0: 0\n" /* air */ + "a:112: 0\n" /* netherbrick */ + "b:114: 2\n" /* netherbrickstairs */ + "c:114: 0\n" /* netherbrickstairs */ + "d:114: 1\n" /* netherbrickstairs */ + "m: 19: 0\n" /* sponge */, + + // Block data: + // Level 0 + /* z\x* 01234 */ + /* 0 */ "aaaaa" + /* 1 */ "aaaaa" + /* 2 */ "aaaaa" + /* 3 */ "aaaaa" + /* 4 */ "aaaaa" + + // Level 1 + /* z\x* 01234 */ + /* 0 */ "a...a" + /* 1 */ "....." + /* 2 */ "....." + /* 3 */ "....." + /* 4 */ "a...a" + + // Level 2 + /* z\x* 01234 */ + /* 0 */ "a...a" + /* 1 */ "....." + /* 2 */ "....." + /* 3 */ "....." + /* 4 */ "a...a" + + // Level 3 + /* z\x* 01234 */ + /* 0 */ "a...a" + /* 1 */ "....." + /* 2 */ "....." + /* 3 */ "....." + /* 4 */ "a...a" + + // Level 4 + /* z\x* 01234 */ + /* 0 */ "a...a" + /* 1 */ "....." + /* 2 */ "....." + /* 3 */ "....." + /* 4 */ "a...a" + + // Level 5 + /* z\x* 01234 */ + /* 0 */ "baaab" + /* 1 */ "aaaaa" + /* 2 */ "aaaaa" + /* 3 */ "aaaaa" + /* 4 */ "caaad", + + // Connectors: + "1: 4, 1, 2: 5\n" /* Type 1, direction X+ */ + "1: 2, 1, 4: 3\n" /* Type 1, direction Z+ */ + "1: 0, 1, 2: 4\n" /* Type 1, direction X- */ + "1: 2, 1, 0: 2\n" /* Type 1, direction Z- */, + + // AllowedRotations: + 7, /* 1, 2, 3 CCW rotation allowed */ + + // Merge strategy: + cBlockArea::msSpongePrint, + + // ShouldExtendFloor: + false, + + // DefaultWeight: + 100, + + // DepthWeight: + "1:200|2:400|3:0|4:500", + + // AddWeightIfSame: + -50, + }, // TinyCorridorCrossing + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Turret: // The data has been exported from the gallery Nether, area index 7, ID 34, created by xoft { // Size: - 7, 6, 7, // SizeX = 7, SizeY = 6, SizeZ = 7 + 7, 7, 7, // SizeX = 7, SizeY = 7, SizeZ = 7 // Hitbox (relative to bounding box): 0, 0, 0, // MinX, MinY, MinZ - 6, 5, 6, // MaxX, MaxY, MaxZ + 6, 16, 6, // MaxX, MaxY, MaxZ // Block definitions: ".: 0: 0\n" /* air */ @@ -4572,7 +5073,17 @@ const cPrefab::sDef g_NetherFortPrefabs[] = /* 3 */ "a.....a" /* 4 */ "a.....a" /* 5 */ "a.....a" - /* 6 */ "aaaaaaa", + /* 6 */ "aaaaaaa" + + // Level 6 + /* z\x* 0123456 */ + /* 0 */ "......." + /* 1 */ "......." + /* 2 */ "......." + /* 3 */ "......." + /* 4 */ "......." + /* 5 */ "......." + /* 6 */ ".......", // Connectors: "0: 0, 1, 3: 4\n" /* Type 0, direction X- */ From a37b36adab85206e025d4ca97f6e64dc7a6974b8 Mon Sep 17 00:00:00 2001 From: archshift Date: Tue, 22 Apr 2014 12:59:31 -1000 Subject: [PATCH 156/188] Fireproof status getter and setter. --- src/Entities/Entity.cpp | 11 +++++++++++ src/Entities/Entity.h | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 9a80d3e80..82900ff91 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -45,6 +45,7 @@ cEntity::cEntity(eEntityType a_EntityType, double a_X, double a_Y, double a_Z, d , m_IsInitialized(false) , m_EntityType(a_EntityType) , m_World(NULL) + , m_IsFireproof(false) , m_TicksSinceLastBurnDamage(0) , m_TicksSinceLastLavaDamage(0) , m_TicksSinceLastFireDamage(0) @@ -1042,6 +1043,16 @@ void cEntity::SetMaxHealth(int a_MaxHealth) +/// Sets whether the entity is fireproof +void cEntity::SetFireproofStatus(bool a_IsFireproof) +{ + m_IsFireproof = a_IsFireproof; +} + + + + + /// Puts the entity on fire for the specified amount of ticks void cEntity::StartBurning(int a_TicksLeftBurning) { diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h index 84a2003d4..4267ed0f6 100644 --- a/src/Entities/Entity.h +++ b/src/Entities/Entity.h @@ -329,6 +329,11 @@ public: int GetMaxHealth(void) const { return m_MaxHealth; } + /// Sets whether the entity is fireproof + void SetFireproofStatus(bool a_IsFireproof); + + bool GetFireproofStatus(void) const { return m_IsFireproof; } + /// Puts the entity on fire for the specified amount of ticks void StartBurning(int a_TicksLeftBurning); From e1476ebb26a3ce0b8405feb5a530cb442abd1329 Mon Sep 17 00:00:00 2001 From: archshift Date: Tue, 22 Apr 2014 13:17:42 -1000 Subject: [PATCH 157/188] Added IsFireproof hook for monsters.ini --- MCServer/monsters.ini | 26 ++++++++++++++++++++++++++ src/MonsterConfig.cpp | 3 +++ 2 files changed, 29 insertions(+) diff --git a/MCServer/monsters.ini b/MCServer/monsters.ini index cd5d92b66..8da3d6d24 100644 --- a/MCServer/monsters.ini +++ b/MCServer/monsters.ini @@ -4,6 +4,7 @@ AttackRate=1 AttackDamage=2.0 SightDistance=25.0 MaxHealth=16 +IsFireproof=0 [Chicken] AttackRange=2.0 @@ -11,6 +12,7 @@ AttackRate=1 AttackDamage=1.0 SightDistance=25.0 MaxHealth=4 +IsFireproof=0 [Cow] AttackRange=2.0 @@ -18,6 +20,7 @@ AttackRate=1 AttackDamage=1.0 SightDistance=25.0 MaxHealth=10 +IsFireproof=0 [Pig] AttackRange=2.0 @@ -25,6 +28,7 @@ AttackRate=1 AttackDamage=1.0 SightDistance=25.0 MaxHealth=10 +IsFireproof=0 [Sheep] AttackRange=2.0 @@ -32,6 +36,7 @@ AttackRate=1 AttackDamage=1.0 SightDistance=25.0 MaxHealth=8 +IsFireproof=0 [Squid] AttackRange=2.0 @@ -39,6 +44,7 @@ AttackRate=1 AttackDamage=1.0 SightDistance=25.0 MaxHealth=10 +IsFireproof=0 [Enderman] AttackRange=2.0 @@ -46,6 +52,7 @@ AttackRate=1 AttackDamage=4.0 SightDistance=25.0 MaxHealth=40 +IsFireproof=0 [ZombiePigman] AttackRange=2.0 @@ -53,6 +60,7 @@ AttackRate=1 AttackDamage=7.0 SightDistance=25.0 MaxHealth=20 +IsFireproof=1 [Cavespider] AttackRange=2.0 @@ -60,6 +68,7 @@ AttackRate=1 AttackDamage=2.0 SightDistance=25.0 MaxHealth=12 +IsFireproof=0 [Creeper] AttackRange=3.0 @@ -67,6 +76,7 @@ AttackRate=1 AttackDamage=0.0 SightDistance=25.0 MaxHealth=20 +IsFireproof=0 [Ghast] AttackRange=50.0 @@ -74,6 +84,7 @@ AttackRate=1 AttackDamage=0.0 SightDistance=50.0 MaxHealth=10 +IsFireproof=1 [Silverfish] AttackRange=2.0 @@ -81,12 +92,14 @@ AttackRate=1 AttackDamage=1.0 SightDistance=25.0 MaxHealth=8 +IsFireproof=0 [Skeleton] AttackRange=15.0 AttackRate=1 SightDistance=40.0 MaxHealth=20 +IsFireproof=0 [Slime] AttackRange=2.0 @@ -94,6 +107,7 @@ AttackRate=1 AttackDamage=4.0 SightDistance=25.0 MaxHealth=16 +IsFireproof=0 [Zombie] AttackRange=2.0 @@ -101,6 +115,7 @@ AttackRate=1 AttackDamage=4.0 SightDistance=25.0 MaxHealth=20 +IsFireproof=0 [Wolf] AttackRange=2.0 @@ -108,6 +123,7 @@ AttackRate=1 AttackDamage=4.0 SightDistance=25.0 MaxHealth=20 +IsFireproof=0 [Blaze] AttackRange=15.0 @@ -115,6 +131,7 @@ AttackRate=1 AttackDamage=6.0 SightDistance=25.0 MaxHealth=20 +IsFireproof=1 [Villager] AttackRange=2.0 @@ -122,6 +139,7 @@ AttackRate=1 AttackDamage=0.0 SightDistance=25.0 MaxHealth=20 +IsFireproof=0 [Witch] AttackRange=2.0 @@ -129,6 +147,7 @@ AttackRate=1 AttackDamage=0.0 SightDistance=25.0 MaxHealth=26 +IsFireproof=0 [Ocelot] @@ -137,6 +156,7 @@ AttackRate=1 AttackDamage=0.0 SightDistance=25.0 MaxHealth=10 +IsFireproof=0 [Mooshroom] AttackRange=2.0 @@ -144,6 +164,7 @@ AttackRate=1 AttackDamage=0.0 SightDistance=25.0 MaxHealth=10 +IsFireproof=0 [MagmaCube] AttackRange=2.0 @@ -151,6 +172,7 @@ AttackRate=1 AttackDamage=6.0 SightDistance=25.0 MaxHealth=16 +IsFireproof=1 [Horse] AttackRange=2.0 @@ -158,6 +180,7 @@ AttackRate=1 AttackDamage=6.0 SightDistance=25.0 MaxHealth=30 +IsFireproof=0 [EnderDragon] AttackRange=2.0 @@ -165,6 +188,7 @@ AttackRate=1 AttackDamage=6.0 SightDistance=25.0 MaxHealth=200 +IsFireproof=0 [Giant] AttackRange=2.0 @@ -172,6 +196,7 @@ AttackRate=1 AttackDamage=6.0 SightDistance=25.0 MaxHealth=100 +IsFireproof=0 [IronGolem] AttackRange=2.0 @@ -179,5 +204,6 @@ AttackRate=1 AttackDamage=6.0 SightDistance=25.0 MaxHealth=100 +IsFireproof=0 diff --git a/src/MonsterConfig.cpp b/src/MonsterConfig.cpp index c06bd6b6f..4b0e4bce1 100644 --- a/src/MonsterConfig.cpp +++ b/src/MonsterConfig.cpp @@ -17,6 +17,7 @@ struct cMonsterConfig::sAttributesStruct int m_AttackRange; double m_AttackRate; int m_MaxHealth; + bool m_IsFireproof; }; @@ -72,6 +73,7 @@ void cMonsterConfig::Initialize() Attributes.m_SightDistance = MonstersIniFile.GetValueI(Name, "SightDistance", 0); Attributes.m_AttackRate = MonstersIniFile.GetValueF(Name, "AttackRate", 0); Attributes.m_MaxHealth = MonstersIniFile.GetValueI(Name, "MaxHealth", 1); + Attributes.m_IsFireproof = MonstersIniFile.GetValueB(Name, "IsFireproof", false); m_pState->AttributesList.push_front(Attributes); } // for i - SplitList[] } @@ -92,6 +94,7 @@ void cMonsterConfig::AssignAttributes(cMonster * a_Monster, const AString & a_Na a_Monster->SetSightDistance(itr->m_SightDistance); a_Monster->SetAttackRate ((float)itr->m_AttackRate); a_Monster->SetMaxHealth (itr->m_MaxHealth); + a_Monster->SetFireproofStatus(itr->m_IsFireproof); return; } } // for itr - m_pState->AttributesList[] From fe08a903fcf47fc7e3748d24ac6beb592908553a Mon Sep 17 00:00:00 2001 From: archshift Date: Tue, 22 Apr 2014 15:45:52 -1000 Subject: [PATCH 158/188] Declaration that a mob is not fireproof is implicit. Removed explicitly declaring mobs as not fireproof. --- MCServer/monsters.ini | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/MCServer/monsters.ini b/MCServer/monsters.ini index 8da3d6d24..fa376bfff 100644 --- a/MCServer/monsters.ini +++ b/MCServer/monsters.ini @@ -4,7 +4,6 @@ AttackRate=1 AttackDamage=2.0 SightDistance=25.0 MaxHealth=16 -IsFireproof=0 [Chicken] AttackRange=2.0 @@ -12,7 +11,6 @@ AttackRate=1 AttackDamage=1.0 SightDistance=25.0 MaxHealth=4 -IsFireproof=0 [Cow] AttackRange=2.0 @@ -20,7 +18,6 @@ AttackRate=1 AttackDamage=1.0 SightDistance=25.0 MaxHealth=10 -IsFireproof=0 [Pig] AttackRange=2.0 @@ -28,7 +25,6 @@ AttackRate=1 AttackDamage=1.0 SightDistance=25.0 MaxHealth=10 -IsFireproof=0 [Sheep] AttackRange=2.0 @@ -36,7 +32,6 @@ AttackRate=1 AttackDamage=1.0 SightDistance=25.0 MaxHealth=8 -IsFireproof=0 [Squid] AttackRange=2.0 @@ -44,7 +39,6 @@ AttackRate=1 AttackDamage=1.0 SightDistance=25.0 MaxHealth=10 -IsFireproof=0 [Enderman] AttackRange=2.0 @@ -52,7 +46,6 @@ AttackRate=1 AttackDamage=4.0 SightDistance=25.0 MaxHealth=40 -IsFireproof=0 [ZombiePigman] AttackRange=2.0 @@ -68,7 +61,6 @@ AttackRate=1 AttackDamage=2.0 SightDistance=25.0 MaxHealth=12 -IsFireproof=0 [Creeper] AttackRange=3.0 @@ -76,7 +68,6 @@ AttackRate=1 AttackDamage=0.0 SightDistance=25.0 MaxHealth=20 -IsFireproof=0 [Ghast] AttackRange=50.0 @@ -92,14 +83,12 @@ AttackRate=1 AttackDamage=1.0 SightDistance=25.0 MaxHealth=8 -IsFireproof=0 [Skeleton] AttackRange=15.0 AttackRate=1 SightDistance=40.0 MaxHealth=20 -IsFireproof=0 [Slime] AttackRange=2.0 @@ -107,7 +96,6 @@ AttackRate=1 AttackDamage=4.0 SightDistance=25.0 MaxHealth=16 -IsFireproof=0 [Zombie] AttackRange=2.0 @@ -115,7 +103,6 @@ AttackRate=1 AttackDamage=4.0 SightDistance=25.0 MaxHealth=20 -IsFireproof=0 [Wolf] AttackRange=2.0 @@ -123,7 +110,6 @@ AttackRate=1 AttackDamage=4.0 SightDistance=25.0 MaxHealth=20 -IsFireproof=0 [Blaze] AttackRange=15.0 @@ -147,7 +133,6 @@ AttackRate=1 AttackDamage=0.0 SightDistance=25.0 MaxHealth=26 -IsFireproof=0 [Ocelot] @@ -156,7 +141,6 @@ AttackRate=1 AttackDamage=0.0 SightDistance=25.0 MaxHealth=10 -IsFireproof=0 [Mooshroom] AttackRange=2.0 @@ -164,7 +148,6 @@ AttackRate=1 AttackDamage=0.0 SightDistance=25.0 MaxHealth=10 -IsFireproof=0 [MagmaCube] AttackRange=2.0 @@ -180,7 +163,6 @@ AttackRate=1 AttackDamage=6.0 SightDistance=25.0 MaxHealth=30 -IsFireproof=0 [EnderDragon] AttackRange=2.0 @@ -188,7 +170,6 @@ AttackRate=1 AttackDamage=6.0 SightDistance=25.0 MaxHealth=200 -IsFireproof=0 [Giant] AttackRange=2.0 @@ -196,7 +177,6 @@ AttackRate=1 AttackDamage=6.0 SightDistance=25.0 MaxHealth=100 -IsFireproof=0 [IronGolem] AttackRange=2.0 @@ -204,6 +184,5 @@ AttackRate=1 AttackDamage=6.0 SightDistance=25.0 MaxHealth=100 -IsFireproof=0 From 876866942807f823d5d7553538f562a6b081093b Mon Sep 17 00:00:00 2001 From: archshift Date: Wed, 23 Apr 2014 00:12:37 -0700 Subject: [PATCH 159/188] Renamed getter and setter for IsFireproof. --- src/Entities/Entity.cpp | 2 +- src/Entities/Entity.h | 4 ++-- src/MonsterConfig.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 82900ff91..6da6da54e 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -1044,7 +1044,7 @@ void cEntity::SetMaxHealth(int a_MaxHealth) /// Sets whether the entity is fireproof -void cEntity::SetFireproofStatus(bool a_IsFireproof) +void cEntity::SetIsFireproof(bool a_IsFireproof) { m_IsFireproof = a_IsFireproof; } diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h index 4267ed0f6..86efc5a98 100644 --- a/src/Entities/Entity.h +++ b/src/Entities/Entity.h @@ -330,9 +330,9 @@ public: int GetMaxHealth(void) const { return m_MaxHealth; } /// Sets whether the entity is fireproof - void SetFireproofStatus(bool a_IsFireproof); + void SetIsFireproof(bool a_IsFireproof); - bool GetFireproofStatus(void) const { return m_IsFireproof; } + bool IsFireproof(void) const { return m_IsFireproof; } /// Puts the entity on fire for the specified amount of ticks void StartBurning(int a_TicksLeftBurning); diff --git a/src/MonsterConfig.cpp b/src/MonsterConfig.cpp index 4b0e4bce1..72a3a3245 100644 --- a/src/MonsterConfig.cpp +++ b/src/MonsterConfig.cpp @@ -94,7 +94,7 @@ void cMonsterConfig::AssignAttributes(cMonster * a_Monster, const AString & a_Na a_Monster->SetSightDistance(itr->m_SightDistance); a_Monster->SetAttackRate ((float)itr->m_AttackRate); a_Monster->SetMaxHealth (itr->m_MaxHealth); - a_Monster->SetFireproofStatus(itr->m_IsFireproof); + a_Monster->SetIsFireproof (itr->m_IsFireproof); return; } } // for itr - m_pState->AttributesList[] From 5deb35c5cfc97fc07601fb64ce9631c794237680 Mon Sep 17 00:00:00 2001 From: "r.ramazanov" Date: Wed, 23 Apr 2014 18:15:04 +0400 Subject: [PATCH 160/188] Mobs shouldn't burn when it's Raining #906 Mob Knockback is far too much #776 --- src/Entities/Entity.cpp | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index c1926dafc..46bb499b4 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -325,9 +325,32 @@ void cEntity::DoTakeDamage(TakeDamageInfo & a_TDI) m_Health = 0; } - if (IsMob() || IsPlayer()) // Knockback for only players and mobs + if ((IsMob() || IsPlayer()) && (a_TDI.Attacker != NULL)) // Knockback for only players and mobs { - AddSpeed(a_TDI.Knockback * 2); + int KnockbackLevel = 0; + if (a_TDI.Attacker->GetEquippedWeapon().m_ItemType == E_ITEM_BOW) + { + KnockbackLevel = a_TDI.Attacker->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchPunch); + } + else + { + KnockbackLevel = a_TDI.Attacker->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchKnockback); + } + + Vector3d additionalSpeed(0, 0, 0); + switch (KnockbackLevel) + { + case 1: + additionalSpeed.Set(5, .2, 5); + break; + case 2: + additionalSpeed.Set(8, .2, 8); + break; + default: + additionalSpeed.Set(2, .2, 2); + break; + } + AddSpeed(a_TDI.Knockback * additionalSpeed); } m_World->BroadcastEntityStatus(*this, esGenericHurt); @@ -772,16 +795,14 @@ void cEntity::TickBurning(cChunk & a_Chunk) // Remember the current burning state: bool HasBeenBurning = (m_TicksLeftBurning > 0); - if (GetWorld()->GetWeather() == eWeather_Rain) + if (m_World->IsWeatherWet()) { + int PosX = POSX_TOINT - a_Chunk.GetPosX() * cChunkDef::Width; + int PosY = POSY_TOINT; + int PosZ = POSZ_TOINT - a_Chunk.GetPosZ() * cChunkDef::Width; - int PosX = POSX_TOINT - a_Chunk.GetPosX() * cChunkDef::Width, - PosY = POSY_TOINT, - PosZ = POSZ_TOINT - a_Chunk.GetPosZ() * cChunkDef::Width; - - if ((PosY > 0) || (PosY <= cChunkDef::Height)) + if((POSY_TOINT - 1) == m_World->GetHeight(POSX_TOINT, POSZ_TOINT)) { - // Inside the world if (a_Chunk.GetSkyLight(PosX, PosY, PosZ) == 15) { m_TicksLeftBurning = 0; From 9660c4816f75db569f14f5e40786f246dcde2386 Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Wed, 23 Apr 2014 16:57:32 +0200 Subject: [PATCH 161/188] The new leaves don't decay anymore. Fixes #792 --- src/Blocks/BlockLeaves.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Blocks/BlockLeaves.h b/src/Blocks/BlockLeaves.h index 8af14686e..d21227b07 100644 --- a/src/Blocks/BlockLeaves.h +++ b/src/Blocks/BlockLeaves.h @@ -16,6 +16,7 @@ { \ case E_BLOCK_LEAVES: a_Area.SetBlockType(x, y, z, (BLOCKTYPE)(E_BLOCK_SPONGE + i + 1)); break; \ case E_BLOCK_LOG: return true; \ + case E_BLOCK_NEW_LEAVES: a_Area.SetBlockType(x, y, z, (BLOCKTYPE)(E_BLOCK_SPONGE + i + 1)); break; \ case E_BLOCK_NEW_LOG: return true; \ } From 6d7da6b15d3c9abf503f7f89e46151a09ddb92fe Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Wed, 23 Apr 2014 23:03:09 +0200 Subject: [PATCH 162/188] Updated NetherFort prefabs to latest Gallery content. --- src/Generating/Prefabs/NetherFortPrefabs.cpp | 36 ++++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/Generating/Prefabs/NetherFortPrefabs.cpp b/src/Generating/Prefabs/NetherFortPrefabs.cpp index 20cee576c..d2ef5663d 100644 --- a/src/Generating/Prefabs/NetherFortPrefabs.cpp +++ b/src/Generating/Prefabs/NetherFortPrefabs.cpp @@ -439,11 +439,11 @@ const cPrefab::sDef g_NetherFortPrefabs[] = // The data has been exported from the gallery Nether, area index 20, ID 162, created by STR_Warrior { // Size: - 14, 9, 7, // SizeX = 14, SizeY = 9, SizeZ = 7 + 14, 11, 7, // SizeX = 14, SizeY = 11, SizeZ = 7 // Hitbox (relative to bounding box): 0, 0, 0, // MinX, MinY, MinZ - 13, 18, 6, // MaxX, MaxY, MaxZ + 13, 20, 6, // MaxX, MaxY, MaxZ // Block definitions: ".: 0: 0\n" /* air */ @@ -552,11 +552,33 @@ const cPrefab::sDef g_NetherFortPrefabs[] = /* * 01234567890123 */ /* 0 */ "mmmmmmmmhhhhhm" /* 1 */ "mmmmmmhhh...hh" - /* 2 */ ".............h" - /* 3 */ ".............h" - /* 4 */ ".............h" + /* 2 */ "mm...........h" + /* 3 */ "mm...........h" + /* 4 */ "mm...........h" /* 5 */ "mmmmmmhhh...hh" - /* 6 */ "mmmmmmmmhhhhhm", + /* 6 */ "mmmmmmmmhhhhhm" + + // Level 9 + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "mmmmmmmm.....m" + /* 1 */ "mmmmmm........" + /* 2 */ "mmmm.........." + /* 3 */ "mmmm.........." + /* 4 */ "mmmm.........." + /* 5 */ "mmmmmm........" + /* 6 */ "mmmmmmmm.....m" + + // Level 10 + /* z\x* 1111 */ + /* * 01234567890123 */ + /* 0 */ "mmmmmmmm.....m" + /* 1 */ "mmmmmm........" + /* 2 */ "mmmmmm........" + /* 3 */ "mmmmmm........" + /* 4 */ "mmmmmm........" + /* 5 */ "mmmmmm........" + /* 6 */ "mmmmmmmm.....m", // Connectors: "0: 0, 5, 3: 4\n" /* Type 0, direction X- */, @@ -3030,7 +3052,7 @@ const cPrefab::sDef g_NetherFortPrefabs[] = false, // DefaultWeight: - 250, + 1000, // DepthWeight: "0:0|2:0|4:0|6:0|8:0|10:0|12:0|14:0|16:0|18:0", From 695baed22641aa420787d99cedae5aeb6d2938e7 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Wed, 23 Apr 2014 23:06:29 +0200 Subject: [PATCH 163/188] Updated docs for StringToEnchantmentID. Ref.: mc-server/Core#67 --- MCServer/Plugins/APIDump/APIDesc.lua | 2 +- src/Enchantments.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MCServer/Plugins/APIDump/APIDesc.lua b/MCServer/Plugins/APIDump/APIDesc.lua index 45e8d9677..1423d64bc 100644 --- a/MCServer/Plugins/APIDump/APIDesc.lua +++ b/MCServer/Plugins/APIDump/APIDesc.lua @@ -699,7 +699,7 @@ end GetLevel = { Params = "EnchantmentNumID", Return = "number", Notes = "Returns the level of the specified enchantment stored in this object; 0 if not stored" }, IsEmpty = { Params = "", Return = "bool", Notes = "Returns true if the object stores no enchantments" }, SetLevel = { Params = "EnchantmentNumID, Level", Return = "", Notes = "Sets the level for the specified enchantment, adding it if not stored before or removing it if level < = 0" }, - StringToEnchantmentID = { Params = "EnchantmentTextID", Return = "number", Notes = "(static) Returns the enchantment numerical ID, -1 if not understood. Case insensitive" }, + StringToEnchantmentID = { Params = "EnchantmentTextID", Return = "number", Notes = "(static) Returns the enchantment numerical ID, -1 if not understood. Case insensitive. Also understands plain numbers." }, ToString = { Params = "", Return = "string", Notes = "Returns the string description of all the enchantments stored in this object, in numerical-ID form" }, }, Constants = diff --git a/src/Enchantments.h b/src/Enchantments.h index dc5502702..ec42257c8 100644 --- a/src/Enchantments.h +++ b/src/Enchantments.h @@ -99,7 +99,7 @@ public: /** Returns true if there are no enchantments */ bool IsEmpty(void) const; - /** Converts enchantment name to the numeric representation; returns -1 if enchantment name not found; case insensitive */ + /** Converts enchantment name or ID (number in string) to the numeric representation; returns -1 if enchantment name not found; case insensitive */ static int StringToEnchantmentID(const AString & a_EnchantmentName); /** Returns true if a_Other contains exactly the same enchantments and levels */ From c2f2ef7cb4e4232cae18aaddcc6c86253e6c859b Mon Sep 17 00:00:00 2001 From: archshift Date: Wed, 23 Apr 2014 14:56:39 -0700 Subject: [PATCH 164/188] Rename mob source files to fit CamelCase. Rename Cavespider.cpp to CaveSpider.cpp Rename Cavespider.h to CaveSpider.h Rename Magmacube.cpp to MagmaCube.cpp Rename Magmacube.h to MagmaCube.h Rename Zombiepigman.cpp to ZombiePigman.cpp Rename Zombiepigman.h to ZombiePigman.h --- src/Mobs/{Cavespider.cpp => CaveSpider.cpp} | 1 - src/Mobs/{Cavespider.h => CaveSpider.h} | 1 - src/Mobs/{Magmacube.cpp => MagmaCube.cpp} | 1 - src/Mobs/{Magmacube.h => MagmaCube.h} | 1 - src/Mobs/{Zombiepigman.cpp => ZombiePigman.cpp} | 1 - src/Mobs/{Zombiepigman.h => ZombiePigman.h} | 1 - 6 files changed, 6 deletions(-) rename src/Mobs/{Cavespider.cpp => CaveSpider.cpp} (99%) rename src/Mobs/{Cavespider.h => CaveSpider.h} (99%) rename src/Mobs/{Magmacube.cpp => MagmaCube.cpp} (99%) rename src/Mobs/{Magmacube.h => MagmaCube.h} (99%) rename src/Mobs/{Zombiepigman.cpp => ZombiePigman.cpp} (99%) rename src/Mobs/{Zombiepigman.h => ZombiePigman.h} (99%) diff --git a/src/Mobs/Cavespider.cpp b/src/Mobs/CaveSpider.cpp similarity index 99% rename from src/Mobs/Cavespider.cpp rename to src/Mobs/CaveSpider.cpp index 94e93283d..4660ae44d 100644 --- a/src/Mobs/Cavespider.cpp +++ b/src/Mobs/CaveSpider.cpp @@ -1,4 +1,3 @@ - #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "Cavespider.h" diff --git a/src/Mobs/Cavespider.h b/src/Mobs/CaveSpider.h similarity index 99% rename from src/Mobs/Cavespider.h rename to src/Mobs/CaveSpider.h index 10ea03f7b..c2aacd2c7 100644 --- a/src/Mobs/Cavespider.h +++ b/src/Mobs/CaveSpider.h @@ -1,4 +1,3 @@ - #pragma once #include "AggressiveMonster.h" diff --git a/src/Mobs/Magmacube.cpp b/src/Mobs/MagmaCube.cpp similarity index 99% rename from src/Mobs/Magmacube.cpp rename to src/Mobs/MagmaCube.cpp index 05405f082..064152072 100644 --- a/src/Mobs/Magmacube.cpp +++ b/src/Mobs/MagmaCube.cpp @@ -1,4 +1,3 @@ - #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "Magmacube.h" diff --git a/src/Mobs/Magmacube.h b/src/Mobs/MagmaCube.h similarity index 99% rename from src/Mobs/Magmacube.h rename to src/Mobs/MagmaCube.h index 130952970..43065cae5 100644 --- a/src/Mobs/Magmacube.h +++ b/src/Mobs/MagmaCube.h @@ -1,4 +1,3 @@ - #pragma once #include "AggressiveMonster.h" diff --git a/src/Mobs/Zombiepigman.cpp b/src/Mobs/ZombiePigman.cpp similarity index 99% rename from src/Mobs/Zombiepigman.cpp rename to src/Mobs/ZombiePigman.cpp index a0142b566..b6f95a3e1 100644 --- a/src/Mobs/Zombiepigman.cpp +++ b/src/Mobs/ZombiePigman.cpp @@ -1,4 +1,3 @@ - #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "Zombiepigman.h" diff --git a/src/Mobs/Zombiepigman.h b/src/Mobs/ZombiePigman.h similarity index 99% rename from src/Mobs/Zombiepigman.h rename to src/Mobs/ZombiePigman.h index 67991d56a..ab3cebf6d 100644 --- a/src/Mobs/Zombiepigman.h +++ b/src/Mobs/ZombiePigman.h @@ -1,4 +1,3 @@ - #pragma once #include "PassiveAggressiveMonster.h" From 06819595b0a5366711bb4aa156a2198650e5c0ff Mon Sep 17 00:00:00 2001 From: archshift Date: Wed, 23 Apr 2014 15:25:10 -0700 Subject: [PATCH 165/188] Fixed references to renamed files. --- MCServer/monsters.ini | 2 +- src/Mobs/CaveSpider.cpp | 4 ++-- src/Mobs/IncludeAllMonsters.h | 6 +++--- src/Mobs/MagmaCube.cpp | 2 +- src/Mobs/ZombiePigman.cpp | 2 +- src/WorldStorage/NBTChunkSerializer.cpp | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/MCServer/monsters.ini b/MCServer/monsters.ini index fa376bfff..b631fc1a9 100644 --- a/MCServer/monsters.ini +++ b/MCServer/monsters.ini @@ -55,7 +55,7 @@ SightDistance=25.0 MaxHealth=20 IsFireproof=1 -[Cavespider] +[CaveSpider] AttackRange=2.0 AttackRate=1 AttackDamage=2.0 diff --git a/src/Mobs/CaveSpider.cpp b/src/Mobs/CaveSpider.cpp index 4660ae44d..8e35102a4 100644 --- a/src/Mobs/CaveSpider.cpp +++ b/src/Mobs/CaveSpider.cpp @@ -1,6 +1,6 @@ #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules -#include "Cavespider.h" +#include "CaveSpider.h" #include "../World.h" @@ -8,7 +8,7 @@ cCavespider::cCavespider(void) : - super("Cavespider", mtCaveSpider, "mob.spider.say", "mob.spider.death", 0.7, 0.5) + super("CaveSpider", mtCaveSpider, "mob.spider.say", "mob.spider.death", 0.7, 0.5) { } diff --git a/src/Mobs/IncludeAllMonsters.h b/src/Mobs/IncludeAllMonsters.h index 1b436a11f..3460db993 100644 --- a/src/Mobs/IncludeAllMonsters.h +++ b/src/Mobs/IncludeAllMonsters.h @@ -1,6 +1,6 @@ #include "Bat.h" #include "Blaze.h" -#include "Cavespider.h" +#include "CaveSpider.h" #include "Chicken.h" #include "Cow.h" #include "Creeper.h" @@ -10,7 +10,7 @@ #include "Giant.h" #include "Horse.h" #include "IronGolem.h" -#include "Magmacube.h" +#include "MagmaCube.h" #include "Mooshroom.h" #include "Ocelot.h" #include "Pig.h" @@ -26,4 +26,4 @@ #include "Wither.h" #include "Wolf.h" #include "Zombie.h" -#include "Zombiepigman.h" +#include "ZombiePigman.h" diff --git a/src/Mobs/MagmaCube.cpp b/src/Mobs/MagmaCube.cpp index 064152072..3e9abc108 100644 --- a/src/Mobs/MagmaCube.cpp +++ b/src/Mobs/MagmaCube.cpp @@ -1,6 +1,6 @@ #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules -#include "Magmacube.h" +#include "MagmaCube.h" diff --git a/src/Mobs/ZombiePigman.cpp b/src/Mobs/ZombiePigman.cpp index b6f95a3e1..c9d94face 100644 --- a/src/Mobs/ZombiePigman.cpp +++ b/src/Mobs/ZombiePigman.cpp @@ -1,6 +1,6 @@ #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules -#include "Zombiepigman.h" +#include "ZombiePigman.h" #include "../World.h" diff --git a/src/WorldStorage/NBTChunkSerializer.cpp b/src/WorldStorage/NBTChunkSerializer.cpp index 415693ae2..b6c14db9c 100644 --- a/src/WorldStorage/NBTChunkSerializer.cpp +++ b/src/WorldStorage/NBTChunkSerializer.cpp @@ -39,7 +39,7 @@ #include "../Mobs/Creeper.h" #include "../Mobs/Enderman.h" #include "../Mobs/Horse.h" -#include "../Mobs/Magmacube.h" +#include "../Mobs/MagmaCube.h" #include "../Mobs/Sheep.h" #include "../Mobs/Slime.h" #include "../Mobs/Skeleton.h" From 9cbb3a339f98f1737ea78af7f40e1ae7d25027e8 Mon Sep 17 00:00:00 2001 From: Howaner Date: Thu, 24 Apr 2014 20:41:25 +0200 Subject: [PATCH 166/188] Fix armor in survival mode. --- src/ClientHandle.cpp | 2 +- src/Items/ItemArmor.h | 54 ++++++++++++++++++++++++++++ src/Items/ItemHandler.cpp | 7 ++++ src/Items/ItemHandler.h | 30 ++++++++-------- src/UI/SlotArea.cpp | 74 +++++++++++++++++++++++++++++++++++++++ src/UI/SlotArea.h | 7 +++- 6 files changed, 157 insertions(+), 17 deletions(-) create mode 100644 src/Items/ItemArmor.h diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 0f26d41e7..63ae98be4 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1037,7 +1037,7 @@ void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, e { HandlePlaceBlock(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, *ItemHandler); } - else if (ItemHandler->IsFood()) + else if (ItemHandler->IsFood() && !m_Player->IsGameModeCreative()) { if (m_Player->IsSatiated()) { diff --git a/src/Items/ItemArmor.h b/src/Items/ItemArmor.h new file mode 100644 index 000000000..0f40ac443 --- /dev/null +++ b/src/Items/ItemArmor.h @@ -0,0 +1,54 @@ + +#pragma once + +#include "ItemHandler.h" +#include "../World.h" + + + + + +class cItemArmorHandler : + public cItemHandler +{ +public: + cItemArmorHandler(int a_ItemType) : + cItemHandler(a_ItemType) + { + } + + virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override + { + int SlotNum = -1; + if (ItemCategory::IsHelmet(a_Item.m_ItemType)) + { + SlotNum = 0; + } + else if (ItemCategory::IsChestPlate(a_Item.m_ItemType)) + { + SlotNum = 1; + } + else if (ItemCategory::IsLeggings(a_Item.m_ItemType)) + { + SlotNum = 2; + } + else if (ItemCategory::IsBoots(a_Item.m_ItemType)) + { + SlotNum = 3; + } + + if (!a_Player->GetInventory().GetArmorSlot(SlotNum).IsEmpty()) + { + return false; + } + + a_Player->GetInventory().SetArmorSlot(SlotNum, a_Item.CopyOne()); + a_Player->GetInventory().SetHotbarSlot(a_Player->GetInventory().GetEquippedSlotNum(), cItem()); + return true; + } + +} ; + + + + diff --git a/src/Items/ItemHandler.cpp b/src/Items/ItemHandler.cpp index 5151eac38..2cb1471aa 100644 --- a/src/Items/ItemHandler.cpp +++ b/src/Items/ItemHandler.cpp @@ -8,6 +8,7 @@ #include "../BlockInServerPluginInterface.h" // Handlers: +#include "ItemArmor.h" #include "ItemBed.h" #include "ItemBoat.h" #include "ItemBow.h" @@ -90,6 +91,12 @@ cItemHandler * cItemHandler::GetItemHandler(int a_ItemType) cItemHandler *cItemHandler::CreateItemHandler(int a_ItemType) { + // Armor + if (ItemCategory::IsArmor(a_ItemType)) + { + return new cItemArmorHandler(a_ItemType); + } + switch(a_ItemType) { default: return new cItemHandler(a_ItemType); diff --git a/src/Items/ItemHandler.h b/src/Items/ItemHandler.h index f3d78335e..4993eac85 100644 --- a/src/Items/ItemHandler.h +++ b/src/Items/ItemHandler.h @@ -21,13 +21,13 @@ class cItemHandler public: cItemHandler(int a_ItemType); - // Force virtual destructor + /** Force virtual destructor */ virtual ~cItemHandler() {} - /// Called when the player tries to use the item (right mouse button). Return false to make the item unusable. DEFAULT: False + /** Called when the player tries to use the item (right mouse button). Return false to make the item unusable. DEFAULT: False */ virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir); - /// Called when the client sends the SHOOT status in the lclk packet + /** Called when the client sends the SHOOT status in the lclk packet */ virtual void OnItemShoot(cPlayer *, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) { UNUSED(a_BlockX); @@ -36,7 +36,7 @@ public: UNUSED(a_BlockFace); } - /// Called every tick while the item is on the player's inventory (Used by maps) - For now, called only for equipped items + /** Called every tick while the item is on the player's inventory (Used by maps) - For now, called only for equipped items */ virtual void OnUpdate(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item) { UNUSED(a_World); @@ -44,16 +44,16 @@ public: UNUSED(a_Item); } - /// Called while the player diggs a block using this item + /** Called while the player diggs a block using this item */ virtual bool OnDiggingBlock(cWorld * a_World, cPlayer * a_Player, const cItem & a_HeldItem, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace); - /// Called when the player destroys a block using this item. This also calls the drop function for the destroyed block + /** Called when the player destroys a block using this item. This also calls the drop function for the destroyed block */ virtual void OnBlockDestroyed(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_X, int a_Y, int a_Z); - /// Called after the player has eaten this item. + /** Called after the player has eaten this item. */ virtual void OnFoodEaten(cWorld *a_World, cPlayer *a_Player, cItem *a_Item); - /// Returns the maximum stack size for a given item + /** Returns the maximum stack size for a given item */ virtual char GetMaxStackSize(void); struct FoodInfo @@ -70,22 +70,22 @@ public: } } ; - /// Returns the FoodInfo for this item. (FoodRecovery, Saturation and PoisionChance) + /** Returns the FoodInfo for this item. (FoodRecovery, Saturation and PoisionChance) */ virtual FoodInfo GetFoodInfo(); - /// Lets the player eat a selected item. Returns true if the player ate the item + /** Lets the player eat a selected item. Returns true if the player ate the item */ virtual bool EatItem(cPlayer *a_Player, cItem *a_Item); - /// Indicates if this item is a tool + /** Indicates if this item is a tool */ virtual bool IsTool(void); - /// Indicates if this item is food + /** Indicates if this item is food */ virtual bool IsFood(void); - /// Blocks simply get placed + /** Blocks simply get placed */ virtual bool IsPlaceable(void); - /** Called before a block is placed into a world. + /** Called before a block is placed into a world. The handler should return true to allow placement, false to refuse. Also, the handler should set a_BlockType and a_BlockMeta to correct values for the newly placed block. */ @@ -96,7 +96,7 @@ public: BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta ); - /// Returns whether this tool/item can harvest a specific block (e.g. wooden pickaxe can harvest stone, but wood can´t) DEFAULT: False + /** Returns whether this tool/item can harvest a specific block (e.g. wooden pickaxe can harvest stone, but wood can�t) DEFAULT: False */ virtual bool CanHarvestBlock(BLOCKTYPE a_BlockType); static cItemHandler * GetItemHandler(int a_ItemType); diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index 2d58388b1..ef4cf17cd 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -1091,6 +1091,80 @@ void cSlotAreaArmor::DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bo +void cSlotAreaArmor::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) +{ + ASSERT((a_SlotNum >= 0) && (a_SlotNum < GetNumSlots())); + + bool bAsync = false; + if (GetSlot(a_SlotNum, a_Player) == NULL) + { + LOGWARNING("GetSlot(%d) returned NULL! Ignoring click", a_SlotNum); + return; + } + + if ((a_ClickAction == caShiftLeftClick) || (a_ClickAction == caShiftRightClick)) + { + ShiftClicked(a_Player, a_SlotNum, a_ClickedItem); + return; + } + + //Armors haven't a dbl click + if (a_ClickAction == caDblClick) + { + return; + } + + cItem Slot(*GetSlot(a_SlotNum, a_Player)); + if (!Slot.IsSameType(a_ClickedItem)) + { + LOGWARNING("*** Window lost sync at item %d in SlotArea with %d items ***", a_SlotNum, m_NumSlots); + LOGWARNING("My item: %s", ItemToFullString(Slot).c_str()); + LOGWARNING("Their item: %s", ItemToFullString(a_ClickedItem).c_str()); + bAsync = true; + } + cItem & DraggingItem = a_Player.GetDraggingItem(); + if ((a_ClickAction != caRightClick) && (a_ClickAction != caLeftClick)) + { + LOGWARNING("SlotArea: Unhandled click action: %d (%s)", a_ClickAction, ClickActionToString(a_ClickAction)); + m_ParentWindow.BroadcastWholeWindow(); + return; + } + + if (DraggingItem.IsEmpty() || CanPlaceInSlot(a_SlotNum, DraggingItem)) + { + // Swap contents + cItem tmp(DraggingItem); + DraggingItem = Slot; + Slot = tmp; + } + + SetSlot(a_SlotNum, a_Player, Slot); + if (bAsync) + { + m_ParentWindow.BroadcastWholeWindow(); + } +} + + + + + +bool cSlotAreaArmor::CanPlaceInSlot(int a_SlotNum, const cItem & a_Item) +{ + switch (a_SlotNum) + { + case 0: return ItemCategory::IsHelmet (a_Item.m_ItemType); + case 1: return ItemCategory::IsChestPlate(a_Item.m_ItemType); + case 2: return ItemCategory::IsLeggings (a_Item.m_ItemType); + case 3: return ItemCategory::IsBoots (a_Item.m_ItemType); + } + return false; +} + + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cSlotAreaItemGrid: diff --git a/src/UI/SlotArea.h b/src/UI/SlotArea.h index bab1098bb..254722822 100644 --- a/src/UI/SlotArea.h +++ b/src/UI/SlotArea.h @@ -145,8 +145,13 @@ public: { } - // Distributing the stack is allowed only for compatible items (helmets into helmet slot etc.) + /** Distributing the stack is allowed only for compatible items (helmets into helmet slot etc.) */ virtual void DistributeStack(cItem & a_ItemStack, cPlayer & a_Player, bool a_ShouldApply, bool a_KeepEmptySlots) override; + + /** Called when a player clicks in the window. Parameters taken from the click packet. */ + virtual void Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_ClickAction, const cItem & a_ClickedItem) override; + + bool CanPlaceInSlot(int a_SlotNum, const cItem & a_Item); } ; From 8fc45c57307203a86352bdd7a788fb20cff797ff Mon Sep 17 00:00:00 2001 From: archshift Date: Thu, 24 Apr 2014 12:00:27 -0700 Subject: [PATCH 167/188] Fixed class capitalization for the cave spider. --- src/Mobs/CaveSpider.cpp | 6 +++--- src/Mobs/CaveSpider.h | 4 ++-- src/Mobs/Monster.cpp | 2 +- src/WorldStorage/WSSAnvil.cpp | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Mobs/CaveSpider.cpp b/src/Mobs/CaveSpider.cpp index 8e35102a4..56ecd2d28 100644 --- a/src/Mobs/CaveSpider.cpp +++ b/src/Mobs/CaveSpider.cpp @@ -7,7 +7,7 @@ -cCavespider::cCavespider(void) : +cCaveSpider::cCaveSpider(void) : super("CaveSpider", mtCaveSpider, "mob.spider.say", "mob.spider.death", 0.7, 0.5) { } @@ -16,7 +16,7 @@ cCavespider::cCavespider(void) : -void cCavespider::Tick(float a_Dt, cChunk & a_Chunk) +void cCaveSpider::Tick(float a_Dt, cChunk & a_Chunk) { super::Tick(a_Dt, a_Chunk); @@ -28,7 +28,7 @@ void cCavespider::Tick(float a_Dt, cChunk & a_Chunk) -void cCavespider::GetDrops(cItems & a_Drops, cEntity * a_Killer) +void cCaveSpider::GetDrops(cItems & a_Drops, cEntity * a_Killer) { int LootingLevel = 0; if (a_Killer != NULL) diff --git a/src/Mobs/CaveSpider.h b/src/Mobs/CaveSpider.h index c2aacd2c7..be9f174f9 100644 --- a/src/Mobs/CaveSpider.h +++ b/src/Mobs/CaveSpider.h @@ -6,13 +6,13 @@ -class cCavespider : +class cCaveSpider : public cAggressiveMonster { typedef cAggressiveMonster super; public: - cCavespider(void); + cCaveSpider(void); CLASS_PROTODEF(cCaveSpider); diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index 248e88f5d..eb8480268 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -859,7 +859,7 @@ cMonster * cMonster::NewMonsterFromType(cMonster::eType a_MobType) case mtBat: toReturn = new cBat(); break; case mtBlaze: toReturn = new cBlaze(); break; - case mtCaveSpider: toReturn = new cCavespider(); break; + case mtCaveSpider: toReturn = new cCaveSpider(); break; case mtChicken: toReturn = new cChicken(); break; case mtCow: toReturn = new cCow(); break; case mtCreeper: toReturn = new cCreeper(); break; diff --git a/src/WorldStorage/WSSAnvil.cpp b/src/WorldStorage/WSSAnvil.cpp index 48934d074..66144dbd5 100644 --- a/src/WorldStorage/WSSAnvil.cpp +++ b/src/WorldStorage/WSSAnvil.cpp @@ -1757,7 +1757,7 @@ void cWSSAnvil::LoadBlazeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_ void cWSSAnvil::LoadCaveSpiderFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx) { - std::auto_ptr Monster(new cCavespider()); + std::auto_ptr Monster(new cCaveSpider()); if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx)) { return; From 449cf77420900e44d3b947a95efabdd78d0c3691 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Thu, 24 Apr 2014 21:29:59 +0200 Subject: [PATCH 168/188] Changed cByteBuffer constructor to take a size_t instead of int. --- src/ByteBuffer.cpp | 2 +- src/ByteBuffer.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ByteBuffer.cpp b/src/ByteBuffer.cpp index 1893d89a8..c634dc308 100644 --- a/src/ByteBuffer.cpp +++ b/src/ByteBuffer.cpp @@ -143,7 +143,7 @@ protected: /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cByteBuffer: -cByteBuffer::cByteBuffer(int a_BufferSize) : +cByteBuffer::cByteBuffer(size_t a_BufferSize) : m_Buffer(new char[a_BufferSize + 1]), m_BufferSize(a_BufferSize + 1), #ifdef _DEBUG diff --git a/src/ByteBuffer.h b/src/ByteBuffer.h index 1915467f3..44f43e17f 100644 --- a/src/ByteBuffer.h +++ b/src/ByteBuffer.h @@ -27,7 +27,7 @@ their own synchronization. class cByteBuffer { public: - cByteBuffer(int a_BufferSize); + cByteBuffer(size_t a_BufferSize); ~cByteBuffer(); /// Writes the bytes specified to the ringbuffer. Returns true if successful, false if not From ffce8d6907b8b93a2764a67766a40901bcad0835 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Thu, 24 Apr 2014 21:49:56 +0100 Subject: [PATCH 169/188] Implemented suggestions --- src/Chunk.cpp | 28 +++----------- src/ChunkDef.h | 99 +++++++++++--------------------------------------- 2 files changed, 27 insertions(+), 100 deletions(-) diff --git a/src/Chunk.cpp b/src/Chunk.cpp index ee1531b5c..6c35f7f47 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -378,16 +378,14 @@ void cChunk::SetLight( // TODO: We might get cases of wrong lighting when a chunk changes in the middle of a lighting calculation. // Postponing until we see how bad it is :) + int IdxWhereNonEmptyStarts = 0; { // Compress blocklight - bool FoundNonEmpty = false; - int IdxWhereNonEmptyStarts = 0; m_BlockLight.clear(); for (int Idx = (NumBlocks / 2) - 1; Idx >= 0; Idx--) { if (a_BlockLight[Idx] != 0) { - FoundNonEmpty = true; IdxWhereNonEmptyStarts = Idx; break; } @@ -396,19 +394,7 @@ void cChunk::SetLight( } { // Compress skylight - bool FoundNonEmpty = false; - int IdxWhereNonEmptyStarts = 0; m_BlockSkyLight.clear(); - - for (int Idx = (NumBlocks / 2) - 1; Idx >= 0; Idx--) - { - if (a_SkyLight[Idx] != 0xff) - { - FoundNonEmpty = true; - IdxWhereNonEmptyStarts = Idx; - break; - } - } m_BlockSkyLight.insert(m_BlockSkyLight.end(), &a_SkyLight[0], &a_SkyLight[IdxWhereNonEmptyStarts + 1]); } @@ -421,10 +407,8 @@ void cChunk::SetLight( void cChunk::GetBlockTypes(BLOCKTYPE * a_BlockTypes) { - std::vector Blocks = m_BlockTypes; - Blocks.resize(NumBlocks); - - memcpy(a_BlockTypes, &Blocks[0], NumBlocks); + std::copy(m_BlockTypes.begin(), m_BlockTypes.end(), a_BlockTypes); + std::fill_n(&a_BlockTypes[m_BlockTypes.size()], NumBlocks - m_BlockTypes.size(), E_BLOCK_AIR); } @@ -832,7 +816,7 @@ void cChunk::BroadcastPendingBlockChanges(void) void cChunk::CheckBlocks() { - if (m_ToTickBlocks.size() == 0) + if (m_ToTickBlocks.empty()) { return; } @@ -1605,7 +1589,7 @@ void cChunk::FastSetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockT MarkDirty(); - if (m_BlockTypes.empty() || ((size_t)index > m_BlockTypes.size() - 1) /* Vector starts from zero, .size() starts from 1 */) + if (m_BlockTypes.empty() || ((size_t)index >= m_BlockTypes.size())) { m_BlockTypes.resize(index + 1); } @@ -2550,7 +2534,7 @@ BLOCKTYPE cChunk::GetBlock(int a_BlockIdx) const return 0; } - if (m_BlockTypes.empty() || ((size_t)a_BlockIdx > m_BlockTypes.size() - 1) /* Vector starts from zero, .size() starts from 1 */) + if (m_BlockTypes.empty() || ((size_t)a_BlockIdx >= m_BlockTypes.size())) { return E_BLOCK_AIR; } diff --git a/src/ChunkDef.h b/src/ChunkDef.h index bb9f14bbe..1b3dd3ee0 100644 --- a/src/ChunkDef.h +++ b/src/ChunkDef.h @@ -219,24 +219,13 @@ public: ASSERT((a_Z >= 0) && (a_Z <= Width)); a_BiomeMap[a_X + Width * a_Z] = a_Biome; } - - - static NIBBLETYPE GetNibble(const NIBBLETYPE * a_Buffer, int a_BlockIdx) - { - if ((a_BlockIdx > -1) && (a_BlockIdx < NumBlocks)) - { - return (a_Buffer[a_BlockIdx / 2] >> ((a_BlockIdx & 1) * 4)) & 0x0f; - } - ASSERT(!"cChunkDef::GetNibble(): index out of chunk range!"); - return 0; - } static NIBBLETYPE GetNibble(const std::vector & a_Buffer, int a_BlockIdx, bool a_IsSkyLightNibble = false) { if ((a_BlockIdx > -1) && (a_BlockIdx < NumBlocks)) { - if (a_Buffer.empty() || ((size_t)(a_BlockIdx / 2) > a_Buffer.size() - 1)) + if (a_Buffer.empty() || ((size_t)(a_BlockIdx / 2) >= a_Buffer.size())) { return (a_IsSkyLightNibble ? 0xff : 0); } @@ -245,8 +234,24 @@ public: ASSERT(!"cChunkDef::GetNibble(): index out of chunk range!"); return 0; } - - + + + static NIBBLETYPE GetNibble(const std::vector & a_Buffer, int x, int y, int z, bool a_IsSkyLightNibble = false) + { + if ((x < Width) && (x > -1) && (y < Height) && (y > -1) && (z < Width) && (z > -1)) + { + int Index = MakeIndexNoCheck(x, y, z); + if (a_Buffer.empty() || ((size_t)(Index / 2) >= a_Buffer.size())) + { + return (a_IsSkyLightNibble ? 0xff : 0); + } + return (a_Buffer[(size_t)(Index / 2)] >> ((Index & 1) * 4)) & 0x0f; + } + ASSERT(!"cChunkDef::GetNibble(): coords out of chunk range!"); + return 0; + } + + static NIBBLETYPE GetNibble(const NIBBLETYPE * a_Buffer, int x, int y, int z) { if ((x < Width) && (x > -1) && (y < Height) && (y > -1) && (z < Width) && (z > -1)) @@ -259,36 +264,6 @@ public: } - static NIBBLETYPE GetNibble(const std::vector & a_Buffer, int x, int y, int z, bool a_IsSkyLightNibble = false) - { - if ((x < Width) && (x > -1) && (y < Height) && (y > -1) && (z < Width) && (z > -1)) - { - int Index = MakeIndexNoCheck(x, y, z); - if (a_Buffer.empty() || ((size_t)(Index / 2) > a_Buffer.size() - 1)) - { - return (a_IsSkyLightNibble ? 0xff : 0); - } - return (a_Buffer[(size_t)(Index / 2)] >> ((Index & 1) * 4)) & 0x0f; - } - ASSERT(!"cChunkDef::GetNibble(): coords out of chunk range!"); - return 0; - } - - - static void SetNibble(NIBBLETYPE * a_Buffer, int a_BlockIdx, NIBBLETYPE a_Nibble) - { - if ((a_BlockIdx < 0) || (a_BlockIdx >= NumBlocks)) - { - ASSERT(!"cChunkDef::SetNibble(): index out of range!"); - return; - } - a_Buffer[a_BlockIdx / 2] = static_cast( - (a_Buffer[a_BlockIdx / 2] & (0xf0 >> ((a_BlockIdx & 1) * 4))) | // The untouched nibble - ((a_Nibble & 0x0f) << ((a_BlockIdx & 1) * 4)) // The nibble being set - ); - } - - static void SetNibble(std::vector & a_Buffer, int a_BlockIdx, NIBBLETYPE a_Nibble) { if ((a_BlockIdx < 0) || (a_BlockIdx >= NumBlocks)) @@ -296,7 +271,7 @@ public: ASSERT(!"cChunkDef::SetNibble(): index out of range!"); return; } - if (a_Buffer.empty() || ((size_t)(a_BlockIdx / 2) > a_Buffer.size() - 1)) + if (a_Buffer.empty() || ((size_t)(a_BlockIdx / 2) >= a_Buffer.size())) { a_Buffer.resize((size_t)((a_BlockIdx / 2) + 1)); } @@ -305,26 +280,6 @@ public: ((a_Nibble & 0x0f) << ((a_BlockIdx & 1) * 4)) // The nibble being set ); } - - - static void SetNibble(NIBBLETYPE * a_Buffer, int x, int y, int z, NIBBLETYPE a_Nibble) - { - if ( - (x >= Width) || (x < 0) || - (y >= Height) || (y < 0) || - (z >= Width) || (z < 0) - ) - { - ASSERT(!"cChunkDef::SetNibble(): index out of range!"); - return; - } - - int Index = MakeIndexNoCheck(x, y, z); - a_Buffer[Index / 2] = static_cast( - (a_Buffer[Index / 2] & (0xf0 >> ((Index & 1) * 4))) | // The untouched nibble - ((a_Nibble & 0x0f) << ((Index & 1) * 4)) // The nibble being set - ); - } static void SetNibble(std::vector & a_Buffer, int x, int y, int z, NIBBLETYPE a_Nibble) @@ -340,7 +295,7 @@ public: } int Index = MakeIndexNoCheck(x, y, z); - if (a_Buffer.empty() || ((size_t)(Index / 2) > a_Buffer.size() - 1)) + if (a_Buffer.empty() || ((size_t)(Index / 2) >= a_Buffer.size())) { a_Buffer.resize((size_t)((Index / 2) + 1)); } @@ -350,18 +305,6 @@ public: ); } - - inline static NIBBLETYPE GetNibble(const NIBBLETYPE * a_Buffer, const Vector3i & a_BlockPos) - { - return GetNibble(a_Buffer, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z ); - } - - - inline static void SetNibble(NIBBLETYPE * a_Buffer, const Vector3i & a_BlockPos, NIBBLETYPE a_Value) - { - SetNibble( a_Buffer, a_BlockPos.x, a_BlockPos.y, a_BlockPos.z, a_Value ); - } - } ; From acbd4e6503a8da6645c97dbe010eed7f37386194 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Thu, 24 Apr 2014 21:52:01 +0100 Subject: [PATCH 170/188] Another small speed improvement? --- src/Chunk.cpp | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/Chunk.cpp b/src/Chunk.cpp index 6c35f7f47..7af1820d2 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -378,24 +378,14 @@ void cChunk::SetLight( // TODO: We might get cases of wrong lighting when a chunk changes in the middle of a lighting calculation. // Postponing until we see how bad it is :) - int IdxWhereNonEmptyStarts = 0; { // Compress blocklight m_BlockLight.clear(); - - for (int Idx = (NumBlocks / 2) - 1; Idx >= 0; Idx--) - { - if (a_BlockLight[Idx] != 0) - { - IdxWhereNonEmptyStarts = Idx; - break; - } - } - m_BlockLight.insert(m_BlockLight.end(), &a_BlockLight[0], &a_BlockLight[IdxWhereNonEmptyStarts + 1]); + m_BlockLight.insert(m_BlockLight.end(), &a_BlockLight[0], &a_BlockLight[m_BlockTypes.size()]); } { // Compress skylight m_BlockSkyLight.clear(); - m_BlockSkyLight.insert(m_BlockSkyLight.end(), &a_SkyLight[0], &a_SkyLight[IdxWhereNonEmptyStarts + 1]); + m_BlockSkyLight.insert(m_BlockSkyLight.end(), &a_SkyLight[0], &a_SkyLight[m_BlockTypes.size()]); } m_IsLightValid = true; From 376dc880b37e1b104c86efebef0f294c34ca3c42 Mon Sep 17 00:00:00 2001 From: Howaner Date: Thu, 24 Apr 2014 23:03:04 +0200 Subject: [PATCH 171/188] Add armor to switch() in ItemHandler.cpp --- src/Items/ItemHandler.cpp | 31 +++++++++++++++++++++++++------ src/UI/SlotArea.cpp | 2 +- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/Items/ItemHandler.cpp b/src/Items/ItemHandler.cpp index 2cb1471aa..ce9593a70 100644 --- a/src/Items/ItemHandler.cpp +++ b/src/Items/ItemHandler.cpp @@ -91,12 +91,6 @@ cItemHandler * cItemHandler::GetItemHandler(int a_ItemType) cItemHandler *cItemHandler::CreateItemHandler(int a_ItemType) { - // Armor - if (ItemCategory::IsArmor(a_ItemType)) - { - return new cItemArmorHandler(a_ItemType); - } - switch(a_ItemType) { default: return new cItemHandler(a_ItemType); @@ -229,6 +223,31 @@ cItemHandler *cItemHandler::CreateItemHandler(int a_ItemType) { return new cItemFoodHandler(a_ItemType); } + + // Armor: + case E_ITEM_LEATHER_CAP: + case E_ITEM_GOLD_HELMET: + case E_ITEM_CHAIN_HELMET: + case E_ITEM_IRON_HELMET: + case E_ITEM_DIAMOND_HELMET: + case E_ITEM_LEATHER_TUNIC: + case E_ITEM_GOLD_CHESTPLATE: + case E_ITEM_CHAIN_CHESTPLATE: + case E_ITEM_IRON_CHESTPLATE: + case E_ITEM_DIAMOND_CHESTPLATE: + case E_ITEM_LEATHER_PANTS: + case E_ITEM_GOLD_LEGGINGS: + case E_ITEM_CHAIN_LEGGINGS: + case E_ITEM_IRON_LEGGINGS: + case E_ITEM_DIAMOND_LEGGINGS: + case E_ITEM_LEATHER_BOOTS: + case E_ITEM_GOLD_BOOTS: + case E_ITEM_CHAIN_BOOTS: + case E_ITEM_IRON_BOOTS: + case E_ITEM_DIAMOND_BOOTS: + { + return new cItemArmorHandler(a_ItemType); + } } } diff --git a/src/UI/SlotArea.cpp b/src/UI/SlotArea.cpp index ef4cf17cd..87b4032e0 100644 --- a/src/UI/SlotArea.cpp +++ b/src/UI/SlotArea.cpp @@ -1108,7 +1108,7 @@ void cSlotAreaArmor::Clicked(cPlayer & a_Player, int a_SlotNum, eClickAction a_C return; } - //Armors haven't a dbl click + // Armors haven't a dbl click if (a_ClickAction == caDblClick) { return; From 3397f9faec43ac288fa9e7f1f555a1309a4e47a5 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Thu, 24 Apr 2014 22:07:20 +0100 Subject: [PATCH 172/188] Fixed indent --- src/Chunk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Chunk.cpp b/src/Chunk.cpp index 7af1820d2..97a8ba88b 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -282,7 +282,7 @@ void cChunk::SetAllData( const HeightMap * a_HeightMap, const BiomeMap & a_BiomeMap, cBlockEntityList & a_BlockEntities - ) +) { memcpy(m_BiomeMap, a_BiomeMap, sizeof(m_BiomeMap)); From cee70390fae9c240337186e50445e50518ccdba8 Mon Sep 17 00:00:00 2001 From: Howaner Date: Fri, 25 Apr 2014 00:09:22 +0200 Subject: [PATCH 173/188] Add unkown armor warning and fix armor stacks. --- src/Items/ItemArmor.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Items/ItemArmor.h b/src/Items/ItemArmor.h index 0f40ac443..a786990fc 100644 --- a/src/Items/ItemArmor.h +++ b/src/Items/ItemArmor.h @@ -19,7 +19,7 @@ public: virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override { - int SlotNum = -1; + int SlotNum; if (ItemCategory::IsHelmet(a_Item.m_ItemType)) { SlotNum = 0; @@ -36,6 +36,11 @@ public: { SlotNum = 3; } + else + { + LOGWARNING("Used unknown armor: %i", a_Item.m_ItemType); + return false; + } if (!a_Player->GetInventory().GetArmorSlot(SlotNum).IsEmpty()) { @@ -43,7 +48,14 @@ public: } a_Player->GetInventory().SetArmorSlot(SlotNum, a_Item.CopyOne()); - a_Player->GetInventory().SetHotbarSlot(a_Player->GetInventory().GetEquippedSlotNum(), cItem()); + + cItem Item(a_Item); + Item.m_ItemCount--; + if (Item.m_ItemCount <= 0) + { + Item.Empty(); + } + a_Player->GetInventory().SetHotbarSlot(a_Player->GetInventory().GetEquippedSlotNum(), Item); return true; } From ccd9023202e2a9f97780fd96438c024a83618052 Mon Sep 17 00:00:00 2001 From: Howaner Date: Fri, 25 Apr 2014 00:10:52 +0200 Subject: [PATCH 174/188] Add commit what the code is doing. --- src/Items/ItemArmor.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Items/ItemArmor.h b/src/Items/ItemArmor.h index a786990fc..08cddb1ad 100644 --- a/src/Items/ItemArmor.h +++ b/src/Items/ItemArmor.h @@ -17,6 +17,7 @@ public: { } + /** Move the armor to the armor slot of the player's inventory */ virtual bool OnItemUse(cWorld * a_World, cPlayer * a_Player, const cItem & a_Item, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_Dir) override { int SlotNum; From ec9787bae21f92251a38338ae5823aa851c5efea Mon Sep 17 00:00:00 2001 From: archshift Date: Thu, 24 Apr 2014 19:16:16 -0700 Subject: [PATCH 175/188] Chicken eggs and ender pearls can hit entities. Fixed warning by adding dedicated m_HasTeleported for fired arrows. --- src/Entities/ProjectileEntity.cpp | 62 ++++++++++++++++++++++++++++--- src/Entities/ProjectileEntity.h | 11 +++++- 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/Entities/ProjectileEntity.cpp b/src/Entities/ProjectileEntity.cpp index 96db17ffd..2725822f3 100644 --- a/src/Entities/ProjectileEntity.cpp +++ b/src/Entities/ProjectileEntity.cpp @@ -562,12 +562,12 @@ void cArrowEntity::Tick(float a_Dt, cChunk & a_Chunk) // We can afford to do this because xoft's algorithm for trajectory is near perfect, so things are pretty close anyway without sync // Besides, this seems to be what the vanilla server does, note how arrows teleport half a second after they hit to the server position - if (m_HitGroundTimer != -1) // Sent a teleport already, don't do again + if (!m_HasTeleported) // Sent a teleport already, don't do again { if (m_HitGroundTimer > 1000.f) // Send after a second, could be less, but just in case { m_World->BroadcastTeleportEntity(*this); - m_HitGroundTimer = -1; + m_HasTeleported = true; } else { @@ -610,6 +610,32 @@ cThrownEggEntity::cThrownEggEntity(cEntity * a_Creator, double a_X, double a_Y, void cThrownEggEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) +{ + TryForChicken(a_HitPos); + + Destroy(); +} + + + + + +void cThrownEggEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos) +{ + int TotalDamage = 0; + // TODO: If entity is Ender Crystal, destroy it + + TryForChicken(a_HitPos); + a_EntityHit.TakeDamage(dtRangedAttack, this, TotalDamage, 1); + + Destroy(true); +} + + + + + +void cThrownEggEntity::TryForChicken(const Vector3d & a_HitPos) { if (m_World->GetTickRandomNumber(7) == 1) { @@ -622,7 +648,6 @@ void cThrownEggEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_H m_World->SpawnMob(a_HitPos.x, a_HitPos.y, a_HitPos.z, cMonster::mtChicken); m_World->SpawnMob(a_HitPos.x, a_HitPos.y, a_HitPos.z, cMonster::mtChicken); } - Destroy(); } @@ -643,16 +668,40 @@ cThrownEnderPearlEntity::cThrownEnderPearlEntity(cEntity * a_Creator, double a_X void cThrownEnderPearlEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) +{ + // TODO: Tweak a_HitPos based on block face. + TeleportUser(a_HitPos); + + Destroy(); +} + + + + + +void cThrownEnderPearlEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos) +{ + int TotalDamage = 0; + // TODO: If entity is Ender Crystal, destroy it + + TeleportUser(a_HitPos); + a_EntityHit.TakeDamage(dtRangedAttack, this, TotalDamage, 1); + + Destroy(true); +} + + + + + +void cThrownEnderPearlEntity::TeleportUser(const Vector3d & a_HitPos) { // Teleport the creator here, make them take 5 damage: if (m_Creator != NULL) { - // TODO: The coords might need some tweaking based on the block face m_Creator->TeleportToCoords(a_HitPos.x + 0.5, a_HitPos.y + 1.7, a_HitPos.z + 0.5); m_Creator->TakeDamage(dtEnderPearl, this, 5, 0); } - - Destroy(); } @@ -696,6 +745,7 @@ void cThrownSnowballEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & TotalDamage = 1; } } + // TODO: If entity is Ender Crystal, destroy it a_EntityHit.TakeDamage(dtRangedAttack, this, TotalDamage, 1); Destroy(true); diff --git a/src/Entities/ProjectileEntity.h b/src/Entities/ProjectileEntity.h index efb7ae783..002aa09a1 100644 --- a/src/Entities/ProjectileEntity.h +++ b/src/Entities/ProjectileEntity.h @@ -166,6 +166,9 @@ protected: /// Timer for client arrow position confirmation via TeleportEntity float m_HitGroundTimer; + + // Whether the arrow has already been teleported into the proper position in the ground. + bool m_HasTeleported; /// If true, the arrow is in the process of being collected - don't go to anyone else bool m_bIsCollected; @@ -205,7 +208,10 @@ protected: // cProjectileEntity overrides: virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override; - + virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override; + + void TryForChicken(const Vector3d & a_HitPos); + // tolua_begin } ; @@ -233,6 +239,9 @@ protected: // cProjectileEntity overrides: virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override; + virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override; + + void TeleportUser(const Vector3d & a_HitPos); // tolua_begin From a72744f5c33ec11f33637839e4d6206c4aa2fa2a Mon Sep 17 00:00:00 2001 From: "r.ramazanov" Date: Fri, 25 Apr 2014 10:08:36 +0400 Subject: [PATCH 176/188] Mobs shouldn't burn when it's Raining & Mob Knockback is far too much --- src/Entities/Entity.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index c09317298..89275a418 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -342,13 +342,13 @@ void cEntity::DoTakeDamage(TakeDamageInfo & a_TDI) switch (KnockbackLevel) { case 1: - additionalSpeed.Set(5, .2, 5); + additionalSpeed.Set(5, .3, 5); break; case 2: - additionalSpeed.Set(8, .2, 8); + additionalSpeed.Set(8, .3, 8); break; default: - additionalSpeed.Set(2, .2, 2); + additionalSpeed.Set(2, .3, 2); break; } AddSpeed(a_TDI.Knockback * additionalSpeed); @@ -802,12 +802,9 @@ void cEntity::TickBurning(cChunk & a_Chunk) int PosY = POSY_TOINT; int PosZ = POSZ_TOINT - a_Chunk.GetPosZ() * cChunkDef::Width; - if((POSY_TOINT - 1) == m_World->GetHeight(POSX_TOINT, POSZ_TOINT)) + if (PosY > m_World->GetHeight(POSX_TOINT, POSZ_TOINT)) { - if (a_Chunk.GetSkyLight(PosX, PosY, PosZ) == 15) - { - m_TicksLeftBurning = 0; - } + m_TicksLeftBurning = 0; } } From 827c3760db5da766a99c42312aa95b43dded9436 Mon Sep 17 00:00:00 2001 From: "r.ramazanov" Date: Fri, 25 Apr 2014 10:58:48 +0400 Subject: [PATCH 177/188] Fix for clang --- src/Entities/Entity.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 89275a418..402f94d08 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -798,11 +798,7 @@ void cEntity::TickBurning(cChunk & a_Chunk) if (m_World->IsWeatherWet()) { - int PosX = POSX_TOINT - a_Chunk.GetPosX() * cChunkDef::Width; - int PosY = POSY_TOINT; - int PosZ = POSZ_TOINT - a_Chunk.GetPosZ() * cChunkDef::Width; - - if (PosY > m_World->GetHeight(POSX_TOINT, POSZ_TOINT)) + if (POSY_TOINT > m_World->GetHeight(POSX_TOINT, POSZ_TOINT)) { m_TicksLeftBurning = 0; } From 4cd2d57c643ec2c7dab7a664248dbf65254c1b1d Mon Sep 17 00:00:00 2001 From: "r.ramazanov" Date: Fri, 25 Apr 2014 12:06:22 +0400 Subject: [PATCH 178/188] Fix formatting --- src/Entities/Entity.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 402f94d08..d0dd6fb50 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -341,15 +341,21 @@ void cEntity::DoTakeDamage(TakeDamageInfo & a_TDI) Vector3d additionalSpeed(0, 0, 0); switch (KnockbackLevel) { - case 1: - additionalSpeed.Set(5, .3, 5); - break; - case 2: - additionalSpeed.Set(8, .3, 8); - break; - default: - additionalSpeed.Set(2, .3, 2); - break; + case 1: + { + additionalSpeed.Set(5, .3, 5); + break; + } + case 2: + { + additionalSpeed.Set(8, .3, 8); + break; + } + default: + { + additionalSpeed.Set(2, .3, 2); + break; + } } AddSpeed(a_TDI.Knockback * additionalSpeed); } From cb7f1ee4bbf726b5b57fe8d1960bb7d03dc1e87a Mon Sep 17 00:00:00 2001 From: archshift Date: Fri, 25 Apr 2014 05:39:35 -0700 Subject: [PATCH 179/188] Rename spawn chicken method, Initialize m_HasTeleported. --- src/Entities/ProjectileEntity.cpp | 7 ++++--- src/Entities/ProjectileEntity.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Entities/ProjectileEntity.cpp b/src/Entities/ProjectileEntity.cpp index 2725822f3..89b833abf 100644 --- a/src/Entities/ProjectileEntity.cpp +++ b/src/Entities/ProjectileEntity.cpp @@ -440,6 +440,7 @@ cArrowEntity::cArrowEntity(cPlayer & a_Player, double a_Force) : m_IsCritical((a_Force >= 1)), m_Timer(0), m_HitGroundTimer(0), + m_HasTeleported(false), m_bIsCollected(false), m_HitBlockPos(0, 0, 0) { @@ -611,7 +612,7 @@ cThrownEggEntity::cThrownEggEntity(cEntity * a_Creator, double a_X, double a_Y, void cThrownEggEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) { - TryForChicken(a_HitPos); + TrySpawnChicken(a_HitPos); Destroy(); } @@ -625,7 +626,7 @@ void cThrownEggEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_Hit int TotalDamage = 0; // TODO: If entity is Ender Crystal, destroy it - TryForChicken(a_HitPos); + TrySpawnChicken(a_HitPos); a_EntityHit.TakeDamage(dtRangedAttack, this, TotalDamage, 1); Destroy(true); @@ -635,7 +636,7 @@ void cThrownEggEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_Hit -void cThrownEggEntity::TryForChicken(const Vector3d & a_HitPos) +void cThrownEggEntity::TrySpawnChicken(const Vector3d & a_HitPos) { if (m_World->GetTickRandomNumber(7) == 1) { diff --git a/src/Entities/ProjectileEntity.h b/src/Entities/ProjectileEntity.h index 002aa09a1..90d44ed91 100644 --- a/src/Entities/ProjectileEntity.h +++ b/src/Entities/ProjectileEntity.h @@ -210,7 +210,7 @@ protected: virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override; virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override; - void TryForChicken(const Vector3d & a_HitPos); + void TrySpawnChicken(const Vector3d & a_HitPos); // tolua_begin From 256691461bd9c4719e94d17942372ef8302a3607 Mon Sep 17 00:00:00 2001 From: archshift Date: Fri, 25 Apr 2014 05:49:18 -0700 Subject: [PATCH 180/188] Comments for TrySpawnChicken() and TeleportUser(). --- src/Entities/ProjectileEntity.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Entities/ProjectileEntity.h b/src/Entities/ProjectileEntity.h index 90d44ed91..5aa489ff8 100644 --- a/src/Entities/ProjectileEntity.h +++ b/src/Entities/ProjectileEntity.h @@ -210,6 +210,7 @@ protected: virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override; virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override; + // Randomly decides whether to spawn a chicken where the egg lands. void TrySpawnChicken(const Vector3d & a_HitPos); // tolua_begin @@ -241,6 +242,7 @@ protected: virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override; virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override; + // Teleports the user where the ender pearl lands. void TeleportUser(const Vector3d & a_HitPos); // tolua_begin From 8aa82d048d4506c963846d5c02650e1037e92992 Mon Sep 17 00:00:00 2001 From: archshift Date: Fri, 25 Apr 2014 06:26:08 -0700 Subject: [PATCH 181/188] Creator not user. --- src/Entities/ProjectileEntity.cpp | 6 +++--- src/Entities/ProjectileEntity.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Entities/ProjectileEntity.cpp b/src/Entities/ProjectileEntity.cpp index 89b833abf..fd3e80e5f 100644 --- a/src/Entities/ProjectileEntity.cpp +++ b/src/Entities/ProjectileEntity.cpp @@ -671,7 +671,7 @@ cThrownEnderPearlEntity::cThrownEnderPearlEntity(cEntity * a_Creator, double a_X void cThrownEnderPearlEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) { // TODO: Tweak a_HitPos based on block face. - TeleportUser(a_HitPos); + TeleportCreator(a_HitPos); Destroy(); } @@ -685,7 +685,7 @@ void cThrownEnderPearlEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d int TotalDamage = 0; // TODO: If entity is Ender Crystal, destroy it - TeleportUser(a_HitPos); + TeleportCreator(a_HitPos); a_EntityHit.TakeDamage(dtRangedAttack, this, TotalDamage, 1); Destroy(true); @@ -695,7 +695,7 @@ void cThrownEnderPearlEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d -void cThrownEnderPearlEntity::TeleportUser(const Vector3d & a_HitPos) +void cThrownEnderPearlEntity::TeleportCreator(const Vector3d & a_HitPos) { // Teleport the creator here, make them take 5 damage: if (m_Creator != NULL) diff --git a/src/Entities/ProjectileEntity.h b/src/Entities/ProjectileEntity.h index 5aa489ff8..731dd060e 100644 --- a/src/Entities/ProjectileEntity.h +++ b/src/Entities/ProjectileEntity.h @@ -242,8 +242,8 @@ protected: virtual void OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_HitFace) override; virtual void OnHitEntity (cEntity & a_EntityHit, const Vector3d & a_HitPos) override; - // Teleports the user where the ender pearl lands. - void TeleportUser(const Vector3d & a_HitPos); + // Teleports the creator where the ender pearl lands. + void TeleportCreator(const Vector3d & a_HitPos); // tolua_begin From ce505f6814fbed638bd638c46165cd8a09fb9872 Mon Sep 17 00:00:00 2001 From: archshift Date: Fri, 25 Apr 2014 07:58:59 -0700 Subject: [PATCH 182/188] Use libc++ on OSX Fixes issues with https://github.com/mc-server/MCServer/commit/f3dfc0349d7008efa50855c739d86918bdbf4a88 in XCode. Tested on Mac (Makefile and XCode) and Linux. --- SetFlags.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SetFlags.cmake b/SetFlags.cmake index c5a3a0697..da69293f7 100644 --- a/SetFlags.cmake +++ b/SetFlags.cmake @@ -188,6 +188,9 @@ macro(set_exe_flags) add_flags_cxx("-ffast-math") if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + if (APPLE) + add_flags_cxx("-stdlib=libc++") + endif() # clang does not provide the __extern_always_inline macro and a part of libm depends on this when using fast-math add_flags_cxx("-D__extern_always_inline=inline") add_flags_cxx("-Werror -Weverything -Wno-c++98-compat-pedantic -Wno-string-conversion") From e47dab84f3f6606d6d6e95774b16d7d4e8d7daa6 Mon Sep 17 00:00:00 2001 From: archshift Date: Fri, 25 Apr 2014 09:56:15 -0700 Subject: [PATCH 183/188] Cmake generated projects for IDEs include headers in project files. --- src/BlockEntities/CMakeLists.txt | 1 + src/CMakeLists.txt | 1 + src/Entities/CMakeLists.txt | 1 + src/Generating/CMakeLists.txt | 1 + src/Generating/Prefabs/CMakeLists.txt | 1 + src/HTTPServer/CMakeLists.txt | 1 + src/Mobs/CMakeLists.txt | 1 + src/OSSupport/CMakeLists.txt | 1 + src/Protocol/CMakeLists.txt | 1 + src/Simulator/CMakeLists.txt | 1 + src/UI/CMakeLists.txt | 1 + src/WorldStorage/CMakeLists.txt | 1 + 12 files changed, 12 insertions(+) diff --git a/src/BlockEntities/CMakeLists.txt b/src/BlockEntities/CMakeLists.txt index 920767f5c..3e3d17f86 100644 --- a/src/BlockEntities/CMakeLists.txt +++ b/src/BlockEntities/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(BlockEntities ${SOURCE}) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 30e9dbfd4..9cc5fcb1e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -123,6 +123,7 @@ if (NOT MSVC) file(GLOB SOURCE "*.cpp" + "*.h" ) list(REMOVE_ITEM SOURCE "${PROJECT_SOURCE_DIR}/StackWalker.cpp" "${PROJECT_SOURCE_DIR}/LeakFinder.cpp") diff --git a/src/Entities/CMakeLists.txt b/src/Entities/CMakeLists.txt index 85cc45494..c9ca44d38 100644 --- a/src/Entities/CMakeLists.txt +++ b/src/Entities/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(Entities ${SOURCE}) diff --git a/src/Generating/CMakeLists.txt b/src/Generating/CMakeLists.txt index 1147744c0..3dacb5066 100644 --- a/src/Generating/CMakeLists.txt +++ b/src/Generating/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(Generating ${SOURCE}) diff --git a/src/Generating/Prefabs/CMakeLists.txt b/src/Generating/Prefabs/CMakeLists.txt index 1e60447e7..a1f09112d 100644 --- a/src/Generating/Prefabs/CMakeLists.txt +++ b/src/Generating/Prefabs/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../../") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(Generating_Prefabs ${SOURCE}) diff --git a/src/HTTPServer/CMakeLists.txt b/src/HTTPServer/CMakeLists.txt index 3badc669f..dc894368d 100644 --- a/src/HTTPServer/CMakeLists.txt +++ b/src/HTTPServer/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(HTTPServer ${SOURCE}) diff --git a/src/Mobs/CMakeLists.txt b/src/Mobs/CMakeLists.txt index 87fbfd2fc..53c265803 100644 --- a/src/Mobs/CMakeLists.txt +++ b/src/Mobs/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(Mobs ${SOURCE}) diff --git a/src/OSSupport/CMakeLists.txt b/src/OSSupport/CMakeLists.txt index 497cd0ba3..dee60b450 100644 --- a/src/OSSupport/CMakeLists.txt +++ b/src/OSSupport/CMakeLists.txt @@ -5,6 +5,7 @@ project (MCServer) include_directories ("${PROJECT_SOURCE_DIR}/../") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(OSSupport ${SOURCE}) diff --git a/src/Protocol/CMakeLists.txt b/src/Protocol/CMakeLists.txt index 107b79627..849ec27ca 100644 --- a/src/Protocol/CMakeLists.txt +++ b/src/Protocol/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(Protocol ${SOURCE}) diff --git a/src/Simulator/CMakeLists.txt b/src/Simulator/CMakeLists.txt index 4f3f1ad0e..b2a29d45c 100644 --- a/src/Simulator/CMakeLists.txt +++ b/src/Simulator/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(Simulator ${SOURCE}) diff --git a/src/UI/CMakeLists.txt b/src/UI/CMakeLists.txt index cef2a9f35..5b5b8cc18 100644 --- a/src/UI/CMakeLists.txt +++ b/src/UI/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(UI ${SOURCE}) diff --git a/src/WorldStorage/CMakeLists.txt b/src/WorldStorage/CMakeLists.txt index 2c83c4662..2844f7fe5 100644 --- a/src/WorldStorage/CMakeLists.txt +++ b/src/WorldStorage/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(WorldStorage ${SOURCE}) From 0f9e399351ed4d83d397ef71ea575c1fdf77e981 Mon Sep 17 00:00:00 2001 From: archshift Date: Fri, 25 Apr 2014 10:32:39 -0700 Subject: [PATCH 184/188] Move to line 47. --- SetFlags.cmake | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/SetFlags.cmake b/SetFlags.cmake index da69293f7..7b2b6379e 100644 --- a/SetFlags.cmake +++ b/SetFlags.cmake @@ -45,6 +45,7 @@ macro(set_flags) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11") + add_flags_cxx("-stdlib=libc++") else() add_flags_cxx("-pthread") endif() @@ -188,9 +189,6 @@ macro(set_exe_flags) add_flags_cxx("-ffast-math") if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - if (APPLE) - add_flags_cxx("-stdlib=libc++") - endif() # clang does not provide the __extern_always_inline macro and a part of libm depends on this when using fast-math add_flags_cxx("-D__extern_always_inline=inline") add_flags_cxx("-Werror -Weverything -Wno-c++98-compat-pedantic -Wno-string-conversion") From 0e0c9d82483e01840faf7027fc01a998d5cf2f18 Mon Sep 17 00:00:00 2001 From: archshift Date: Fri, 25 Apr 2014 12:24:09 -0700 Subject: [PATCH 185/188] Missed these CMakeLists. --- lib/expat/CMakeLists.txt | 1 + lib/inifile/CMakeLists.txt | 8 ++++++-- lib/luaexpat/CMakeLists.txt | 1 + lib/md5/CMakeLists.txt | 1 + lib/zlib/CMakeLists.txt | 1 + src/Blocks/CMakeLists.txt | 1 + src/Items/CMakeLists.txt | 7 ++++++- 7 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/expat/CMakeLists.txt b/lib/expat/CMakeLists.txt index 667804b9a..540266377 100644 --- a/lib/expat/CMakeLists.txt +++ b/lib/expat/CMakeLists.txt @@ -4,6 +4,7 @@ project (expat) file(GLOB SOURCE "*.c" + "*.h" ) # add headers to MSVC project files: diff --git a/lib/inifile/CMakeLists.txt b/lib/inifile/CMakeLists.txt index efbd09796..321d501d7 100644 --- a/lib/inifile/CMakeLists.txt +++ b/lib/inifile/CMakeLists.txt @@ -1,7 +1,11 @@ - cmake_minimum_required (VERSION 2.6) project (iniFile) include_directories ("${PROJECT_SOURCE_DIR}/../../src/") -add_library(iniFile iniFile) +file(GLOB SOURCE + "*.h" + "*.cpp" +) + +add_library(iniFile ${SOURCE}) diff --git a/lib/luaexpat/CMakeLists.txt b/lib/luaexpat/CMakeLists.txt index 7eef5c8ce..f6b21c1d7 100644 --- a/lib/luaexpat/CMakeLists.txt +++ b/lib/luaexpat/CMakeLists.txt @@ -7,6 +7,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../") file(GLOB SOURCE "*.c" + "*.h" ) add_library(luaexpat ${SOURCE}) diff --git a/lib/md5/CMakeLists.txt b/lib/md5/CMakeLists.txt index 8ba09a0dd..cd9fe6320 100644 --- a/lib/md5/CMakeLists.txt +++ b/lib/md5/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../../src/") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(md5 ${SOURCE}) diff --git a/lib/zlib/CMakeLists.txt b/lib/zlib/CMakeLists.txt index 6c52578ee..74cf94f8b 100644 --- a/lib/zlib/CMakeLists.txt +++ b/lib/zlib/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../../src/") file(GLOB SOURCE "*.c" + "*.h" ) if(NOT TARGET zlib) diff --git a/src/Blocks/CMakeLists.txt b/src/Blocks/CMakeLists.txt index 082ff41ac..4b8c745ad 100644 --- a/src/Blocks/CMakeLists.txt +++ b/src/Blocks/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories ("${PROJECT_SOURCE_DIR}/../") file(GLOB SOURCE "*.cpp" + "*.h" ) add_library(Blocks ${SOURCE}) diff --git a/src/Items/CMakeLists.txt b/src/Items/CMakeLists.txt index 44a9f594f..a6fe6ea70 100644 --- a/src/Items/CMakeLists.txt +++ b/src/Items/CMakeLists.txt @@ -4,4 +4,9 @@ project (MCServer) include_directories ("${PROJECT_SOURCE_DIR}/../") -add_library(Items ItemHandler) +file(GLOB SOURCE + "*.cpp" + "*.h" +) + +add_library(Items ${SOURCE}) From 05f52192c9389f0c28cc6d772f3625c9588273a1 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 25 Apr 2014 21:22:43 +0100 Subject: [PATCH 186/188] Implemented comments --- src/Chunk.cpp | 12 +++++----- src/Chunk.h | 8 +++---- src/ChunkDef.h | 65 ++++++++++++++++++++++++++++++++------------------ 3 files changed, 52 insertions(+), 33 deletions(-) diff --git a/src/Chunk.cpp b/src/Chunk.cpp index 97a8ba88b..652f56905 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -241,21 +241,21 @@ void cChunk::GetAllData(cChunkDataCallback & a_Callback) a_Callback.HeightMap (&m_HeightMap); a_Callback.BiomeData (&m_BiomeMap); - std::vector Blocks = m_BlockTypes; + COMPRESSED_BLOCKTYPE Blocks = m_BlockTypes; Blocks.resize(NumBlocks); a_Callback.BlockTypes (&Blocks[0]); - std::vector Metas = m_BlockMeta; + COMPRESSED_NIBBLETYPE Metas = m_BlockMeta; Metas.resize(NumBlocks / 2); a_Callback.BlockMeta (&Metas[0]); a_Callback.LightIsValid (m_IsLightValid); - std::vector BlockLights = m_BlockLight; + COMPRESSED_NIBBLETYPE BlockLights = m_BlockLight; BlockLights.resize(NumBlocks / 2); a_Callback.BlockLight (&BlockLights[0]); - std::vector BlockSkyLights = m_BlockSkyLight; + COMPRESSED_NIBBLETYPE BlockSkyLights = m_BlockSkyLight; BlockSkyLights.resize(NumBlocks / 2, 0xff); a_Callback.BlockSkyLight(&BlockSkyLights[0]); @@ -1579,7 +1579,7 @@ void cChunk::FastSetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockT MarkDirty(); - if (m_BlockTypes.empty() || ((size_t)index >= m_BlockTypes.size())) + if ((size_t)index >= m_BlockTypes.size()) { m_BlockTypes.resize(index + 1); } @@ -2524,7 +2524,7 @@ BLOCKTYPE cChunk::GetBlock(int a_BlockIdx) const return 0; } - if (m_BlockTypes.empty() || ((size_t)a_BlockIdx >= m_BlockTypes.size())) + if ((size_t)a_BlockIdx >= m_BlockTypes.size()) { return E_BLOCK_AIR; } diff --git a/src/Chunk.h b/src/Chunk.h index 9100eec58..a9c9be861 100644 --- a/src/Chunk.h +++ b/src/Chunk.h @@ -421,10 +421,10 @@ private: cChunkMap * m_ChunkMap; // TODO: Make these pointers and don't allocate what isn't needed - std::vector m_BlockTypes; - std::vector m_BlockMeta; - std::vector m_BlockLight; - std::vector m_BlockSkyLight; + COMPRESSED_BLOCKTYPE m_BlockTypes; + COMPRESSED_NIBBLETYPE m_BlockMeta; + COMPRESSED_NIBBLETYPE m_BlockLight; + COMPRESSED_NIBBLETYPE m_BlockSkyLight; cChunkDef::HeightMap m_HeightMap; cChunkDef::BiomeMap m_BiomeMap; diff --git a/src/ChunkDef.h b/src/ChunkDef.h index 1b3dd3ee0..054168bdd 100644 --- a/src/ChunkDef.h +++ b/src/ChunkDef.h @@ -77,13 +77,19 @@ public: idx = x + Width * z // Need to verify this with the protocol spec, currently unknown! */ typedef EMCSBiome BiomeMap[Width * Width]; - + /// The type used for block type operations and storage, AXIS_ORDER ordering typedef BLOCKTYPE BlockTypes[NumBlocks]; - + /// The type used for block data in nibble format, AXIS_ORDER ordering typedef NIBBLETYPE BlockNibbles[NumBlocks / 2]; + /** The storage wrapper used for compressed blockdata residing in RAMz */ + typedef std::vector COMPRESSED_BLOCKTYPE; + + /** The storage wrapper used for compressed nibbledata residing in RAMz */ + typedef std::vector COMPRESSED_NIBBLETYPE; + /// Converts absolute block coords into relative (chunk + block) coords: inline static void AbsoluteToRelative(/* in-out */ int & a_X, int & a_Y, int & a_Z, /* out */ int & a_ChunkX, int & a_ChunkZ ) @@ -221,11 +227,11 @@ public: } - static NIBBLETYPE GetNibble(const std::vector & a_Buffer, int a_BlockIdx, bool a_IsSkyLightNibble = false) + static NIBBLETYPE GetNibble(const COMPRESSED_NIBBLETYPE & a_Buffer, int a_BlockIdx, bool a_IsSkyLightNibble = false) { if ((a_BlockIdx > -1) && (a_BlockIdx < NumBlocks)) { - if (a_Buffer.empty() || ((size_t)(a_BlockIdx / 2) >= a_Buffer.size())) + if ((size_t)(a_BlockIdx / 2) >= a_Buffer.size()) { return (a_IsSkyLightNibble ? 0xff : 0); } @@ -236,16 +242,16 @@ public: } - static NIBBLETYPE GetNibble(const std::vector & a_Buffer, int x, int y, int z, bool a_IsSkyLightNibble = false) + static NIBBLETYPE GetNibble(const COMPRESSED_NIBBLETYPE & a_Buffer, int x, int y, int z, bool a_IsSkyLightNibble = false) { if ((x < Width) && (x > -1) && (y < Height) && (y > -1) && (z < Width) && (z > -1)) { int Index = MakeIndexNoCheck(x, y, z); - if (a_Buffer.empty() || ((size_t)(Index / 2) >= a_Buffer.size())) + if ((size_t)(Index / 2) >= a_Buffer.size()) { return (a_IsSkyLightNibble ? 0xff : 0); } - return (a_Buffer[(size_t)(Index / 2)] >> ((Index & 1) * 4)) & 0x0f; + return ExpandNibble(a_Buffer, Index); } ASSERT(!"cChunkDef::GetNibble(): coords out of chunk range!"); return 0; @@ -257,54 +263,67 @@ public: if ((x < Width) && (x > -1) && (y < Height) && (y > -1) && (z < Width) && (z > -1)) { int Index = MakeIndexNoCheck(x, y, z); - return (a_Buffer[Index / 2] >> ((Index & 1) * 4)) & 0x0f; + return (a_Buffer[(size_t)(Index / 2)] >> ((Index & 1) * 4)) & 0x0f; } ASSERT(!"cChunkDef::GetNibble(): coords out of chunk range!"); return 0; } - static void SetNibble(std::vector & a_Buffer, int a_BlockIdx, NIBBLETYPE a_Nibble) + static void SetNibble(COMPRESSED_NIBBLETYPE & a_Buffer, int a_BlockIdx, NIBBLETYPE a_Nibble) { if ((a_BlockIdx < 0) || (a_BlockIdx >= NumBlocks)) { ASSERT(!"cChunkDef::SetNibble(): index out of range!"); return; } - if (a_Buffer.empty() || ((size_t)(a_BlockIdx / 2) >= a_Buffer.size())) + if ((size_t)(a_BlockIdx / 2) >= a_Buffer.size()) { a_Buffer.resize((size_t)((a_BlockIdx / 2) + 1)); } - a_Buffer[(size_t)(a_BlockIdx / 2)] = static_cast( - (a_Buffer[a_BlockIdx / 2] & (0xf0 >> ((a_BlockIdx & 1) * 4))) | // The untouched nibble - ((a_Nibble & 0x0f) << ((a_BlockIdx & 1) * 4)) // The nibble being set - ); + a_Buffer[(size_t)(a_BlockIdx / 2)] = PackNibble(a_Buffer, a_BlockIdx, a_Nibble); } - static void SetNibble(std::vector & a_Buffer, int x, int y, int z, NIBBLETYPE a_Nibble) + static void SetNibble(COMPRESSED_NIBBLETYPE & a_Buffer, int x, int y, int z, NIBBLETYPE a_Nibble) { if ( - (x >= Width) || (x < 0) || + (x >= Width) || (x < 0) || (y >= Height) || (y < 0) || - (z >= Width) || (z < 0) - ) + (z >= Width) || (z < 0) + ) { ASSERT(!"cChunkDef::SetNibble(): index out of range!"); return; } int Index = MakeIndexNoCheck(x, y, z); - if (a_Buffer.empty() || ((size_t)(Index / 2) >= a_Buffer.size())) + if ((size_t)(Index / 2) >= a_Buffer.size()) { a_Buffer.resize((size_t)((Index / 2) + 1)); } - a_Buffer[(size_t)(Index / 2)] = static_cast( - (a_Buffer[Index / 2] & (0xf0 >> ((Index & 1) * 4))) | // The untouched nibble - ((a_Nibble & 0x0f) << ((Index & 1) * 4)) // The nibble being set - ); + a_Buffer[(size_t)(Index / 2)] = PackNibble(a_Buffer, Index, a_Nibble); } + +private: + + + inline static NIBBLETYPE PackNibble(const COMPRESSED_NIBBLETYPE & a_Buffer, int a_Index, NIBBLETYPE a_Nibble) + { + return static_cast( + (a_Buffer[a_Index / 2] & (0xf0 >> ((a_Index & 1) * 4))) | // The untouched nibble + ((a_Nibble & 0x0f) << ((a_Index & 1) * 4)) // The nibble being set + ); + } + + + inline static NIBBLETYPE ExpandNibble(const COMPRESSED_NIBBLETYPE & a_Buffer, int a_Index) + { + return (a_Buffer[a_Index / 2] >> ((a_Index & 1) * 4)) & 0x0f; + } + + } ; From 087210302f1a8e804d45cdac71135b4c60f3b406 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 25 Apr 2014 23:45:16 +0200 Subject: [PATCH 187/188] Updated MSVC side of CMake files after recent changes. --- lib/expat/CMakeLists.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/expat/CMakeLists.txt b/lib/expat/CMakeLists.txt index 540266377..a23f16609 100644 --- a/lib/expat/CMakeLists.txt +++ b/lib/expat/CMakeLists.txt @@ -7,10 +7,8 @@ file(GLOB SOURCE "*.h" ) -# add headers to MSVC project files: -if (WIN32) - file(GLOB HEADERS "*.h") - set(SOURCE ${SOURCE} ${HEADERS}) +# Set files to go to a "Sources" folder in MSVC project files: +if (MSVC) source_group("Sources" FILES ${SOURCE}) endif() From d094beb45ab3ed6ba6ac086093926747df1f98a8 Mon Sep 17 00:00:00 2001 From: archshift Date: Fri, 25 Apr 2014 16:40:57 -0700 Subject: [PATCH 188/188] Needs the -stdlib linker flag too. --- SetFlags.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/SetFlags.cmake b/SetFlags.cmake index 7b2b6379e..4eed529bd 100644 --- a/SetFlags.cmake +++ b/SetFlags.cmake @@ -46,6 +46,7 @@ macro(set_flags) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11") add_flags_cxx("-stdlib=libc++") + add_flags_lnk("-stdlib=libc++") else() add_flags_cxx("-pthread") endif()