1
0
Fork 0

Limit fortune level, style fixes

This commit is contained in:
Tiger Wang 2020-09-22 11:08:12 +01:00
parent a0dd311d02
commit 71b96ab921
8 changed files with 45 additions and 40 deletions

View File

@ -66,7 +66,7 @@ public:
virtual bool OnHandshake (cClientHandle & a_Client, const AString & a_Username) = 0; virtual bool OnHandshake (cClientHandle & a_Client, const AString & a_Username) = 0;
virtual bool OnHopperPullingItem (cWorld & a_World, cHopperEntity & a_Hopper, int a_DstSlotNum, cBlockEntityWithItems & a_SrcEntity, int a_SrcSlotNum) = 0; virtual bool OnHopperPullingItem (cWorld & a_World, cHopperEntity & a_Hopper, int a_DstSlotNum, cBlockEntityWithItems & a_SrcEntity, int a_SrcSlotNum) = 0;
virtual bool OnHopperPushingItem (cWorld & a_World, cHopperEntity & a_Hopper, int a_SrcSlotNum, cBlockEntityWithItems & a_DstEntity, int a_DstSlotNum) = 0; virtual bool OnHopperPushingItem (cWorld & a_World, cHopperEntity & a_Hopper, int a_SrcSlotNum, cBlockEntityWithItems & a_DstEntity, int a_DstSlotNum) = 0;
virtual bool OnDropSpense (cWorld & a_World, cDropSpenserEntity & a_DropSpenser, int a_SlotNum) = 0; virtual bool OnDropSpense (cWorld & a_World, cDropSpenserEntity & a_DropSpenser, int a_SlotNum) = 0;
virtual bool OnKilled (cEntity & a_Victim, TakeDamageInfo & a_TDI, AString & a_DeathMessage) = 0; virtual bool OnKilled (cEntity & a_Victim, TakeDamageInfo & a_TDI, AString & a_DeathMessage) = 0;
virtual bool OnKilling (cEntity & a_Victim, cEntity * a_Killer, TakeDamageInfo & a_TDI) = 0; virtual bool OnKilling (cEntity & a_Victim, cEntity * a_Killer, TakeDamageInfo & a_TDI) = 0;
virtual bool OnLogin (cClientHandle & a_Client, UInt32 a_ProtocolVersion, const AString & a_Username) = 0; virtual bool OnLogin (cClientHandle & a_Client, UInt32 a_ProtocolVersion, const AString & a_Username) = 0;

View File

@ -87,7 +87,7 @@ public:
virtual bool OnHandshake (cClientHandle & a_Client, const AString & a_Username) override; virtual bool OnHandshake (cClientHandle & a_Client, const AString & a_Username) override;
virtual bool OnHopperPullingItem (cWorld & a_World, cHopperEntity & a_Hopper, int a_DstSlotNum, cBlockEntityWithItems & a_SrcEntity, int a_SrcSlotNum) override; virtual bool OnHopperPullingItem (cWorld & a_World, cHopperEntity & a_Hopper, int a_DstSlotNum, cBlockEntityWithItems & a_SrcEntity, int a_SrcSlotNum) override;
virtual bool OnHopperPushingItem (cWorld & a_World, cHopperEntity & a_Hopper, int a_SrcSlotNum, cBlockEntityWithItems & a_DstEntity, int a_DstSlotNum) override; virtual bool OnHopperPushingItem (cWorld & a_World, cHopperEntity & a_Hopper, int a_SrcSlotNum, cBlockEntityWithItems & a_DstEntity, int a_DstSlotNum) override;
virtual bool OnDropSpense (cWorld & a_World, cDropSpenserEntity & a_DropSpenser, int a_SlotNum) override; virtual bool OnDropSpense (cWorld & a_World, cDropSpenserEntity & a_DropSpenser, int a_SlotNum) override;
virtual bool OnKilled (cEntity & a_Victim, TakeDamageInfo & a_TDI, AString & a_DeathMessage) override; virtual bool OnKilled (cEntity & a_Victim, TakeDamageInfo & a_TDI, AString & a_DeathMessage) override;
virtual bool OnKilling (cEntity & a_Victim, cEntity * a_Killer, TakeDamageInfo & a_TDI) override; virtual bool OnKilling (cEntity & a_Victim, cEntity * a_Killer, TakeDamageInfo & a_TDI) override;
virtual bool OnLogin (cClientHandle & a_Client, UInt32 a_ProtocolVersion, const AString & a_Username) override; virtual bool OnLogin (cClientHandle & a_Client, UInt32 a_ProtocolVersion, const AString & a_Username) override;

View File

@ -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))
{ {

View File

@ -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);
} }

View File

@ -649,16 +649,16 @@ 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
{
return 0;
} }
// Not a tool:
return 0;
} }

View File

@ -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);

View File

@ -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:
{ {

View File

@ -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);
} }
} ; } ;