From a0896c63d7a02d1b90572d591a16a79b4274feac Mon Sep 17 00:00:00 2001 From: Alex Sweet Date: Tue, 10 Apr 2018 23:46:11 -0700 Subject: Smelting Gives Experience (#4094) * Smelting Exp Smelting now gives experience * Furnace.txt update Exp rewards are entered in furnace.txt, Reward calculation is now done is the furnaceentity class * furnace.txt update Changed alignment tabs to spaces Included documentation of exp in recipe * Updated StringToFloat changed strtod to strtof * Explicit Float to Int * Reworked Smelting Rewards * No C casts -Adds new function to the api -Sets reward counter to 0 in furnace constructor * Style and exp lock removed -Fixed style mistakes accoring to PR notes -XP isn't locked to a single player anymore * No Smelter API -Removed SetLastSmelter and GetLastSmelter -Fixed comments -Fixed log reward amounts --- src/BlockEntities/FurnaceEntity.cpp | 19 +++++++++++++++++++ src/BlockEntities/FurnaceEntity.h | 6 ++++++ 2 files changed, 25 insertions(+) (limited to 'src/BlockEntities') diff --git a/src/BlockEntities/FurnaceEntity.cpp b/src/BlockEntities/FurnaceEntity.cpp index 1f7f6e023..96a17782a 100644 --- a/src/BlockEntities/FurnaceEntity.cpp +++ b/src/BlockEntities/FurnaceEntity.cpp @@ -32,6 +32,7 @@ cFurnaceEntity::cFurnaceEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, in m_TimeCooked(0), m_FuelBurnTime(0), m_TimeBurned(0), + m_RewardCounter(0), m_IsLoading(false) { m_Contents.AddListener(*this); @@ -173,6 +174,23 @@ bool cFurnaceEntity::ContinueCooking(void) +int cFurnaceEntity::GetAndResetReward(void) +{ + int Reward = FloorC(m_RewardCounter); + float Remainder = m_RewardCounter - static_cast(Reward); + // Remainder is used as the percent chance of getting an extra xp point + if (GetRandomProvider().RandBool(Remainder)) + { + Reward++; + } + m_RewardCounter = 0.0; + return Reward; +} + + + + + void cFurnaceEntity::BroadcastProgress(short a_ProgressbarID, short a_Value) { cWindow * Window = GetWindow(); @@ -189,6 +207,7 @@ void cFurnaceEntity::BroadcastProgress(short a_ProgressbarID, short a_Value) void cFurnaceEntity::FinishOne() { m_TimeCooked = 0; + m_RewardCounter += m_CurrentRecipe->Reward; if (m_Contents.GetSlot(fsOutput).IsEmpty()) { diff --git a/src/BlockEntities/FurnaceEntity.h b/src/BlockEntities/FurnaceEntity.h index 7b189be85..b1166c3bf 100644 --- a/src/BlockEntities/FurnaceEntity.h +++ b/src/BlockEntities/FurnaceEntity.h @@ -84,6 +84,9 @@ public: /** Returns true if there's time left before the current fuel is depleted */ bool HasFuelTimeLeft(void) const { return (GetFuelBurnTimeLeft() > 0); } + /** Calculates, resets, and returns the experience reward in this furnace */ + int GetAndResetReward(void); + // tolua_end void SetBurnTimes(int a_FuelBurnTime, int a_TimeBurned) @@ -130,6 +133,9 @@ protected: /** Amount of ticks that the current fuel has been burning */ int m_TimeBurned; + /** Running total of experience that can be picked up */ + float m_RewardCounter; + /** Is the block currently being loaded into the world? */ bool m_IsLoading; -- cgit v1.2.3