Limit fortune level, style fixes
This commit is contained in:
parent
a0dd311d02
commit
71b96ab921
|
@ -79,9 +79,8 @@ void cDropSpenserEntity::DropSpense(cChunk & a_Chunk)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int RandomSlot = m_World->GetTickRandomNumber(SlotsCnt - 1);
|
const int RandomSlot = m_World->GetTickRandomNumber(SlotsCnt - 1);
|
||||||
|
const int SpenseSlot = OccupiedSlots[RandomSlot];
|
||||||
int SpenseSlot = OccupiedSlots[RandomSlot];
|
|
||||||
|
|
||||||
if (cPluginManager::Get()->CallHookDropSpense(*m_World, *this, SpenseSlot))
|
if (cPluginManager::Get()->CallHookDropSpense(*m_World, *this, SpenseSlot))
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class cBlockGlowstoneHandler :
|
class cBlockGlowstoneHandler :
|
||||||
public cBlockHandler
|
public cBlockHandler
|
||||||
{
|
{
|
||||||
|
@ -22,13 +23,14 @@ private:
|
||||||
{
|
{
|
||||||
return cItem(E_BLOCK_GLOWSTONE, 1, 0);
|
return cItem(E_BLOCK_GLOWSTONE, 1, 0);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
// Number of dust to drop, capped at the max amount of 4.
|
||||||
unsigned int DropNum = GetRandomProvider().RandInt<char>(2, 4 + ToolFortuneLevel(a_Tool));
|
const auto Drops = std::min(
|
||||||
// cap the dropnum to the max amount of 4
|
static_cast<char>(4),
|
||||||
DropNum = std::min<unsigned int>(DropNum, 4);
|
GetRandomProvider().RandInt<char>(2, 4 + ToolFortuneLevel(a_Tool))
|
||||||
return cItem(E_ITEM_GLOWSTONE_DUST, DropNum, 0);
|
);
|
||||||
}
|
|
||||||
|
return cItem(E_ITEM_GLOWSTONE_DUST, Drops);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -649,17 +649,17 @@ bool cBlockHandler::ToolHasSilkTouch(const cItem * a_Tool)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
unsigned int cBlockHandler::ToolFortuneLevel(const cItem * a_Tool)
|
unsigned char cBlockHandler::ToolFortuneLevel(const cItem * a_Tool)
|
||||||
{
|
{
|
||||||
if (a_Tool != nullptr)
|
if ((a_Tool != nullptr) && ItemCategory::IsTool(a_Tool->m_ItemType))
|
||||||
{
|
{
|
||||||
return a_Tool->m_Enchantments.GetLevel(cEnchantments::enchFortune);
|
// Return enchantment level, limited to avoid spawning excessive pickups (crashing the server) when modified items are used:
|
||||||
|
return std::min(8U, a_Tool->m_Enchantments.GetLevel(cEnchantments::enchFortune));
|
||||||
}
|
}
|
||||||
else // Not a tool
|
|
||||||
{
|
// Not a tool:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -232,7 +232,7 @@ public:
|
||||||
|
|
||||||
/** Returns the fortune level of a tool, if it is a valid tool.
|
/** Returns the fortune level of a tool, if it is a valid tool.
|
||||||
Can be used in ConvertToPickups() implementations. */
|
Can be used in ConvertToPickups() implementations. */
|
||||||
static unsigned int ToolFortuneLevel(const cItem * a_Tool);
|
static unsigned char ToolFortuneLevel(const cItem * a_Tool);
|
||||||
|
|
||||||
// Gets the blockhandler for the given block type.
|
// Gets the blockhandler for the given block type.
|
||||||
static const cBlockHandler & For(BLOCKTYPE a_BlockType);
|
static const cBlockHandler & For(BLOCKTYPE a_BlockType);
|
||||||
|
|
|
@ -3,6 +3,10 @@
|
||||||
|
|
||||||
#include "BlockHandler.h"
|
#include "BlockHandler.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class cBlockOreHandler:
|
class cBlockOreHandler:
|
||||||
public cBlockHandler
|
public cBlockHandler
|
||||||
{
|
{
|
||||||
|
@ -21,26 +25,25 @@ private:
|
||||||
{
|
{
|
||||||
switch (m_BlockType)
|
switch (m_BlockType)
|
||||||
{
|
{
|
||||||
// If it was a glowing redstone ore, drop a normal redstone ore
|
// If it was a glowing redstone ore, drop a normal redstone ore:
|
||||||
case E_BLOCK_REDSTONE_ORE_GLOWING: return cItem(E_BLOCK_REDSTONE_ORE);
|
case E_BLOCK_REDSTONE_ORE_GLOWING: return cItem(E_BLOCK_REDSTONE_ORE);
|
||||||
default: return cItem(m_BlockType);
|
default: return cItem(m_BlockType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto & random = GetRandomProvider();
|
auto & Random = GetRandomProvider();
|
||||||
const unsigned int FortuneLevel = ToolFortuneLevel(a_Tool);
|
const auto FortuneLevel = ToolFortuneLevel(a_Tool);
|
||||||
// Clamp to 10 to prevent server crash if thing are mined with extremely high level fortune pick
|
const auto Drops = std::max(static_cast<char>(1), FloorC<char>(Random.RandReal(FortuneLevel + 2.0)));
|
||||||
const unsigned int DropMult = std::clamp<unsigned int>(FloorC(random.RandReal(FortuneLevel + 2.0)), 1, 10);
|
|
||||||
|
|
||||||
switch (m_BlockType)
|
switch (m_BlockType)
|
||||||
{
|
{
|
||||||
case E_BLOCK_LAPIS_ORE: return cItem(E_ITEM_DYE, DropMult * random.RandInt<char>(4, 9), 4);
|
case E_BLOCK_LAPIS_ORE: return cItem(E_ITEM_DYE, Drops * Random.RandInt<char>(4, 9), 4);
|
||||||
case E_BLOCK_REDSTONE_ORE: // handled by next case (glowing redstone), no dropMult
|
case E_BLOCK_REDSTONE_ORE: // Handled by next case (glowing redstone)
|
||||||
case E_BLOCK_REDSTONE_ORE_GLOWING: return cItem(E_ITEM_REDSTONE_DUST, random.RandInt<char>(4, 5 + FortuneLevel), 0);
|
case E_BLOCK_REDSTONE_ORE_GLOWING: return cItem(E_ITEM_REDSTONE_DUST, Random.RandInt<char>(4, 5 + FortuneLevel));
|
||||||
case E_BLOCK_DIAMOND_ORE: return cItem(E_ITEM_DIAMOND, DropMult);
|
case E_BLOCK_DIAMOND_ORE: return cItem(E_ITEM_DIAMOND, Drops);
|
||||||
case E_BLOCK_EMERALD_ORE: return cItem(E_ITEM_EMERALD, DropMult);
|
case E_BLOCK_EMERALD_ORE: return cItem(E_ITEM_EMERALD, Drops);
|
||||||
case E_BLOCK_COAL_ORE: return cItem(E_ITEM_COAL, DropMult);
|
case E_BLOCK_COAL_ORE: return cItem(E_ITEM_COAL, Drops);
|
||||||
case E_BLOCK_NETHER_QUARTZ_ORE: return cItem(E_ITEM_NETHER_QUARTZ, DropMult);
|
case E_BLOCK_NETHER_QUARTZ_ORE: return cItem(E_ITEM_NETHER_QUARTZ, Drops);
|
||||||
case E_BLOCK_CLAY: return cItem(E_ITEM_CLAY, 4);
|
case E_BLOCK_CLAY: return cItem(E_ITEM_CLAY, 4);
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class cBlockSeaLanternHandler :
|
class cBlockSeaLanternHandler :
|
||||||
public cBlockHandler
|
public cBlockHandler
|
||||||
{
|
{
|
||||||
|
@ -24,13 +25,13 @@ private:
|
||||||
{
|
{
|
||||||
return cItem(E_BLOCK_SEA_LANTERN, 1, 0);
|
return cItem(E_BLOCK_SEA_LANTERN, 1, 0);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
// Number of crystals to drop, capped at the max amount of 5.
|
||||||
unsigned int DropNum = GetRandomProvider().RandInt<char>(2, 3 + ToolFortuneLevel(a_Tool));
|
const auto Drops = std::min(
|
||||||
// cap the dropnum to the max amount of 5
|
static_cast<char>(5),
|
||||||
DropNum = std::min<unsigned int>(DropNum, 5);
|
GetRandomProvider().RandInt<char>(2, 3 + ToolFortuneLevel(a_Tool))
|
||||||
// Reset meta to 0
|
);
|
||||||
return cItem(E_ITEM_PRISMARINE_CRYSTALS, DropNum, 0);
|
|
||||||
}
|
return cItem(E_ITEM_PRISMARINE_CRYSTALS, Drops);
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user