From ea778c70278aa4032565c1c7a450f345a38c1105 Mon Sep 17 00:00:00 2001 From: Daniel O'Brien Date: Fri, 15 Nov 2013 01:46:41 +1100 Subject: fixed XpGetPercentage --- source/Entities/Player.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source/Entities') diff --git a/source/Entities/Player.cpp b/source/Entities/Player.cpp index 098417dc5..f5c28b326 100644 --- a/source/Entities/Player.cpp +++ b/source/Entities/Player.cpp @@ -318,8 +318,10 @@ int cPlayer::XpGetLevel() float cPlayer::XpGetPercentage() { int currentLevel = CalcLevelFromXp(m_XpTotal); + int currentLevel_XpBase = XpForLevel(currentLevel); - return (float)m_XpTotal / (float)XpForLevel(1+currentLevel); + return (float)(m_XpTotal - currentLevel_XpBase) / + (float)(XpForLevel(1+currentLevel) - currentLevel_XpBase); } -- cgit v1.2.3 From 1b2e6e74736f975386879aa5eb064df5b2f88dac Mon Sep 17 00:00:00 2001 From: Daniel O'Brien Date: Fri, 15 Nov 2013 22:42:09 +1100 Subject: added cProtocol function to pass xp to client --- source/Entities/Player.cpp | 32 +++++++++++++++++++------------- source/Entities/Player.h | 14 +++++++------- 2 files changed, 26 insertions(+), 20 deletions(-) (limited to 'source/Entities') diff --git a/source/Entities/Player.cpp b/source/Entities/Player.cpp index f5c28b326..00c2ea76c 100644 --- a/source/Entities/Player.cpp +++ b/source/Entities/Player.cpp @@ -262,7 +262,7 @@ void cPlayer::Tick(float a_Dt, cChunk & a_Chunk) -int cPlayer::CalcLevelFromXp(int a_XpTotal) +short cPlayer::CalcLevelFromXp(short a_XpTotal) { //level 0 to 15 if(a_XpTotal <= XP_TO_LEVEL15) @@ -273,18 +273,18 @@ int cPlayer::CalcLevelFromXp(int a_XpTotal) //level 30+ if(a_XpTotal > XP_TO_LEVEL30) { - return (int) (151.5 + sqrt( 22952.25 - (14 * (2220 - a_XpTotal)))) / 7; + return (short) (151.5 + sqrt( 22952.25 - (14 * (2220 - a_XpTotal)))) / 7; } //level 16 to 30 - return (int) ( 29.5 + sqrt( 870.25 - (6 * ( 360 - a_XpTotal )))) / 3; + return (short) ( 29.5 + sqrt( 870.25 - (6 * ( 360 - a_XpTotal )))) / 3; } -int cPlayer::XpForLevel(int a_Level) +short cPlayer::XpForLevel(short a_Level) { //level 0 to 15 if(a_Level <= 15) @@ -295,18 +295,18 @@ int cPlayer::XpForLevel(int a_Level) //level 30+ if(a_Level >= 31) { - return (int) ( (3.5 * a_Level * a_Level) - (151.5 * a_Level) + 2220 ); + return (short) ( (3.5 * a_Level * a_Level) - (151.5 * a_Level) + 2220 ); } //level 16 to 30 - return (int) ( (1.5 * a_Level * a_Level) - (29.5 * a_Level) + 360 ); + return (short) ( (1.5 * a_Level * a_Level) - (29.5 * a_Level) + 360 ); } -int cPlayer::XpGetLevel() +short cPlayer::XpGetLevel() { return CalcLevelFromXp(m_XpTotal); } @@ -317,8 +317,8 @@ int cPlayer::XpGetLevel() float cPlayer::XpGetPercentage() { - int currentLevel = CalcLevelFromXp(m_XpTotal); - int currentLevel_XpBase = XpForLevel(currentLevel); + short int currentLevel = CalcLevelFromXp(m_XpTotal); + short int currentLevel_XpBase = XpForLevel(currentLevel); return (float)(m_XpTotal - currentLevel_XpBase) / (float)(XpForLevel(1+currentLevel) - currentLevel_XpBase); @@ -328,9 +328,9 @@ float cPlayer::XpGetPercentage() -bool cPlayer::SetExperience(int a_XpTotal) +bool cPlayer::SetExperience(short int a_XpTotal) { - if(!(a_XpTotal >= 0) || (a_XpTotal > (INT_MAX - m_XpTotal))) + if(!(a_XpTotal >= 0) || (a_XpTotal > (SHRT_MAX - m_XpTotal))) { LOGWARNING("Tried to update experiece with an invalid Xp value: %d", a_XpTotal); return false; //oops, they gave us a dodgey number @@ -338,6 +338,9 @@ bool cPlayer::SetExperience(int a_XpTotal) m_XpTotal = a_XpTotal; + //send details to client + m_ClientHandle->SendSetExperience(); + return true; } @@ -345,7 +348,7 @@ bool cPlayer::SetExperience(int a_XpTotal) -int cPlayer::AddExperience(int a_Xp_delta) +short cPlayer::AddExperience(short a_Xp_delta) { if(a_Xp_delta < 0) { @@ -359,6 +362,9 @@ int cPlayer::AddExperience(int a_Xp_delta) m_XpTotal += a_Xp_delta; + //send details to client + m_ClientHandle->SendSetExperience(); + return m_XpTotal; } @@ -1420,7 +1426,7 @@ bool cPlayer::LoadFromDisk() m_FoodTickTimer = root.get("foodTickTimer", 0).asInt(); m_FoodExhaustionLevel = root.get("foodExhaustion", 0).asDouble(); - SetExperience(root.get("experience", 0).asInt()); + //SetExperience(root.get("experience", 0).asInt()); m_GameMode = (eGameMode) root.get("gamemode", eGameMode_NotSet).asInt(); diff --git a/source/Entities/Player.h b/source/Entities/Player.h index ab2f94d4c..1e43dd954 100644 --- a/source/Entities/Player.h +++ b/source/Entities/Player.h @@ -71,18 +71,18 @@ public: Returns true on success "should" really only be called at init or player death, plugins excepted */ - bool SetExperience(int a_XpTotal); + bool SetExperience(short a_XpTotal); /* Adds Xp, "should" not inc more than MAX_EXPERIENCE_ORB_SIZE unless you're a plugin being funny, *cough* cheating Returns the new total experience, -1 on error */ - int AddExperience(int a_Xp_delta); + short AddExperience(short a_Xp_delta); /// Gets the experience total - XpTotal - inline int XpGetTotal(void) { return m_XpTotal; } + inline short XpGetTotal(void) { return m_XpTotal; } /// Gets the current level - XpLevel - int XpGetLevel(void); + short XpGetLevel(void); /// Gets the experience bar percentage - XpP float XpGetPercentage(void); @@ -413,13 +413,13 @@ protected: Int64 m_EatingFinishTick; /// Player Xp level - int m_XpTotal; + short int m_XpTotal; /// Caculates the Xp needed for a given level, ref: http://minecraft.gamepedia.com/XP - static int XpForLevel(int a_Level); + static short XpForLevel(short int a_Level); /// inverse of XpAtLevel, ref: http://minecraft.gamepedia.com/XP values are as per this with pre-calculations - static int CalcLevelFromXp(int a_XpTotal); + static short CalcLevelFromXp(short int a_XpTotal); bool m_IsChargingBow; int m_BowCharge; -- cgit v1.2.3 From 04dff4882a3d75f3a0d432fb3377cc3f59fdf251 Mon Sep 17 00:00:00 2001 From: Daniel O'Brien Date: Sat, 16 Nov 2013 02:23:50 +1100 Subject: finished #143 I believe --- source/Entities/Player.cpp | 19 ++++++++++++++++--- source/Entities/Player.h | 2 ++ 2 files changed, 18 insertions(+), 3 deletions(-) (limited to 'source/Entities') diff --git a/source/Entities/Player.cpp b/source/Entities/Player.cpp index 00c2ea76c..651a0b2a6 100644 --- a/source/Entities/Player.cpp +++ b/source/Entities/Player.cpp @@ -339,7 +339,7 @@ bool cPlayer::SetExperience(short int a_XpTotal) m_XpTotal = a_XpTotal; //send details to client - m_ClientHandle->SendSetExperience(); + SendExperience(); return true; } @@ -363,7 +363,7 @@ short cPlayer::AddExperience(short a_Xp_delta) m_XpTotal += a_Xp_delta; //send details to client - m_ClientHandle->SendSetExperience(); + SendExperience(); return m_XpTotal; } @@ -615,6 +615,18 @@ void cPlayer::SendHealth(void) +void cPlayer::SendExperience(void) +{ + if (m_ClientHandle != NULL) + { + m_ClientHandle->SendExperience(); + } +} + + + + + void cPlayer::ClearInventoryPaintSlots(void) { // Clear the list of slots that are being inventory-painted. Used by cWindow only @@ -1419,12 +1431,13 @@ bool cPlayer::LoadFromDisk() SetRoll ((float)JSON_PlayerRotation[(unsigned int)2].asDouble()); } - m_Health = root.get("health", 0).asInt(); + m_Health = root.get("health", 0).asInt(); m_AirLevel = root.get("air", MAX_AIR_LEVEL).asInt(); m_FoodLevel = root.get("food", MAX_FOOD_LEVEL).asInt(); m_FoodSaturationLevel = root.get("foodSaturation", MAX_FOOD_LEVEL).asDouble(); m_FoodTickTimer = root.get("foodTickTimer", 0).asInt(); m_FoodExhaustionLevel = root.get("foodExhaustion", 0).asDouble(); + m_XpTotal = root.get("experience", 0).asInt(); //SetExperience(root.get("experience", 0).asInt()); diff --git a/source/Entities/Player.h b/source/Entities/Player.h index 1e43dd954..aeec9f361 100644 --- a/source/Entities/Player.h +++ b/source/Entities/Player.h @@ -269,6 +269,8 @@ public: void UseEquippedItem(void); void SendHealth(void); + + void SendExperience(void); // In UI windows, the item that the player is dragging: bool IsDraggingItem(void) const { return !m_DraggingItem.IsEmpty(); } -- cgit v1.2.3 From a94a6d48a0d6121c6951f01a81474e718f045430 Mon Sep 17 00:00:00 2001 From: Daniel O'Brien Date: Sat, 16 Nov 2013 02:32:04 +1100 Subject: alignment fixes :) --- source/Entities/Player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/Entities') diff --git a/source/Entities/Player.cpp b/source/Entities/Player.cpp index 651a0b2a6..f25483375 100644 --- a/source/Entities/Player.cpp +++ b/source/Entities/Player.cpp @@ -1437,7 +1437,7 @@ bool cPlayer::LoadFromDisk() m_FoodSaturationLevel = root.get("foodSaturation", MAX_FOOD_LEVEL).asDouble(); m_FoodTickTimer = root.get("foodTickTimer", 0).asInt(); m_FoodExhaustionLevel = root.get("foodExhaustion", 0).asDouble(); - m_XpTotal = root.get("experience", 0).asInt(); + m_XpTotal = (short) root.get("experience", 0).asInt(); //SetExperience(root.get("experience", 0).asInt()); -- cgit v1.2.3 From c0c8fe1bcd68c35435eafdfd3dbb9793fba970cd Mon Sep 17 00:00:00 2001 From: Daniel O'Brien Date: Sat, 16 Nov 2013 20:29:57 +1100 Subject: fix possible threadlock issue, changed function names to be closer to standard --- source/Entities/Player.cpp | 48 +++++++++++++++++++++++++++++----------------- source/Entities/Player.h | 23 ++++++++++++++-------- 2 files changed, 45 insertions(+), 26 deletions(-) (limited to 'source/Entities') diff --git a/source/Entities/Player.cpp b/source/Entities/Player.cpp index f25483375..891506802 100644 --- a/source/Entities/Player.cpp +++ b/source/Entities/Player.cpp @@ -67,6 +67,7 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName) , m_IsChargingBow(false) , m_BowCharge(0) , m_XpTotal(0) + , m_IsExperienceDirty(false) { LOGD("Created a player object for \"%s\" @ \"%s\" at %p, ID %d", a_PlayerName.c_str(), a_Client->GetIPString().c_str(), @@ -222,6 +223,12 @@ void cPlayer::Tick(float a_Dt, cChunk & a_Chunk) { m_BowCharge += 1; } + + //handle updating experience + if (m_bDirtyExperience) + { + SendExperience(); + } if (m_bDirtyPosition) { @@ -306,21 +313,21 @@ short cPlayer::XpForLevel(short a_Level) -short cPlayer::XpGetLevel() +short cPlayer::GetXpLevel() { - return CalcLevelFromXp(m_XpTotal); + return CalcLevelFromXp(m_CurrentXp); } -float cPlayer::XpGetPercentage() +float cPlayer::GetXpPercentage() { - short int currentLevel = CalcLevelFromXp(m_XpTotal); + short int currentLevel = CalcLevelFromXp(m_CurrentXp); short int currentLevel_XpBase = XpForLevel(currentLevel); - return (float)(m_XpTotal - currentLevel_XpBase) / + return (float)(m_CurrentXp - currentLevel_XpBase) / (float)(XpForLevel(1+currentLevel) - currentLevel_XpBase); } @@ -328,18 +335,18 @@ float cPlayer::XpGetPercentage() -bool cPlayer::SetExperience(short int a_XpTotal) +bool cPlayer::SetCurrentExperience(short int a_XpTotal) { - if(!(a_XpTotal >= 0) || (a_XpTotal > (SHRT_MAX - m_XpTotal))) + if(!(a_XpTotal >= 0) || (a_XpTotal > (SHRT_MAX - m_CurrentXp))) { LOGWARNING("Tried to update experiece with an invalid Xp value: %d", a_XpTotal); return false; //oops, they gave us a dodgey number } - m_XpTotal = a_XpTotal; + m_CurrentXp = a_XpTotal; - //send details to client - SendExperience(); + // Set experience to be updated + m_bDirtyExperience = true; return true; } @@ -352,20 +359,24 @@ short cPlayer::AddExperience(short a_Xp_delta) { if(a_Xp_delta < 0) { - //value was negative, abort and report + // Value was negative, abort and report LOGWARNING("Attempt was made to increment Xp by %d, must be positive", a_Xp_delta); - return -1; //should we instead just return the current Xp? + return -1; // Should we instead just return the current Xp? } - - LOGD("Player \"%s\" earnt %d experience", m_PlayerName.c_str(), a_Xp_delta); - m_XpTotal += a_Xp_delta; + m_CurrentXp += a_Xp_delta; + + // Update total for score calculation + m_LifetimeTotalXp += a_Xp_delta; + + LOGD("Player \"%s\" earnt %d experience, total is now: %d", + m_PlayerName.c_str(), a_Xp_delta, m_XpTotal); - //send details to client - SendExperience(); + // Set experience to be updated + m_bDirtyExperience = true; - return m_XpTotal; + return m_CurrentXp; } @@ -620,6 +631,7 @@ void cPlayer::SendExperience(void) if (m_ClientHandle != NULL) { m_ClientHandle->SendExperience(); + m_bDirtyExperience = false; } } diff --git a/source/Entities/Player.h b/source/Entities/Player.h index aeec9f361..2fc0d5ac9 100644 --- a/source/Entities/Player.h +++ b/source/Entities/Player.h @@ -71,21 +71,24 @@ public: Returns true on success "should" really only be called at init or player death, plugins excepted */ - bool SetExperience(short a_XpTotal); + bool SetCurrentExperience(short a_XpTotal); /* Adds Xp, "should" not inc more than MAX_EXPERIENCE_ORB_SIZE unless you're a plugin being funny, *cough* cheating - Returns the new total experience, -1 on error + Returns the new current experience, -1 on error */ short AddExperience(short a_Xp_delta); - /// Gets the experience total - XpTotal - inline short XpGetTotal(void) { return m_XpTotal; } + /// Gets the experience total - XpTotal for score on death + inline short GetXpLifetimeTotal(void) { return m_LifetimeTotalXp; } + + /// Gets the currrent experience + inline short GetCurrentXp(void) { return m_CurrentXp; } /// Gets the current level - XpLevel - short XpGetLevel(void); + short GetXpLevel(void); /// Gets the experience bar percentage - XpP - float XpGetPercentage(void); + float GetXpPercentage(void); // tolua_end @@ -415,13 +418,17 @@ protected: Int64 m_EatingFinishTick; /// Player Xp level - short int m_XpTotal; + short int m_LifetimeTotalXp; + short int m_CurrentXp; + + // flag saying we need to send a xp update to client + bool m_bDirtyExperience; /// Caculates the Xp needed for a given level, ref: http://minecraft.gamepedia.com/XP static short XpForLevel(short int a_Level); /// inverse of XpAtLevel, ref: http://minecraft.gamepedia.com/XP values are as per this with pre-calculations - static short CalcLevelFromXp(short int a_XpTotal); + static short CalcLevelFromXp(short int a_XpCurrent); bool m_IsChargingBow; int m_BowCharge; -- cgit v1.2.3 From 359539293782713d47e51775b65ee91fc89994e4 Mon Sep 17 00:00:00 2001 From: Daniel O'Brien Date: Sat, 16 Nov 2013 21:38:57 +1100 Subject: fixed bug and added SpendExperience() --- source/Entities/Player.cpp | 41 +++++++++++++++++++++++++++++++++++++---- source/Entities/Player.h | 4 ++++ 2 files changed, 41 insertions(+), 4 deletions(-) (limited to 'source/Entities') diff --git a/source/Entities/Player.cpp b/source/Entities/Player.cpp index 891506802..e8fc795d7 100644 --- a/source/Entities/Player.cpp +++ b/source/Entities/Player.cpp @@ -66,8 +66,9 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName) , m_EatingFinishTick(-1) , m_IsChargingBow(false) , m_BowCharge(0) - , m_XpTotal(0) - , m_IsExperienceDirty(false) + , m_CurrentXp(0) + , m_LifetimeTotalXp(0) + , m_bDirtyExperience(false) { LOGD("Created a player object for \"%s\" @ \"%s\" at %p, ID %d", a_PlayerName.c_str(), a_Client->GetIPString().c_str(), @@ -383,6 +384,31 @@ short cPlayer::AddExperience(short a_Xp_delta) +short cPlayer::SpendExperience(short a_Xp_delta) +{ + if(a_Xp_delta < 0) + { + // Value was negative, abort and report + LOGWARNING("Attempt was made to decrement Xp by %d, must be positive", + a_Xp_delta); + return -1; // Should we instead just return the current Xp? + } + + m_CurrentXp -= a_Xp_delta; + + LOGD("Player \"%s\" spent %d experience, total is now: %d", + m_PlayerName.c_str(), a_Xp_delta, m_XpTotal); + + // Set experience to be updated + m_bDirtyExperience = true; + + return m_CurrentXp; +} + + + + + void cPlayer::StartChargingBow(void) { LOGD("Player \"%s\" started charging their bow", m_PlayerName.c_str()); @@ -791,6 +817,11 @@ void cPlayer::Respawn(void) m_FoodLevel = MAX_FOOD_LEVEL; m_FoodSaturationLevel = 5; + // Reset Experience + m_CurrentXp = MIN_EXPERIENCE; + m_LifetimeTotalXp = MIN_EXPERIENCE; + // ToDo: send score to client? How? + m_ClientHandle->SendRespawn(); // Extinguish the fire: @@ -1449,7 +1480,8 @@ bool cPlayer::LoadFromDisk() m_FoodSaturationLevel = root.get("foodSaturation", MAX_FOOD_LEVEL).asDouble(); m_FoodTickTimer = root.get("foodTickTimer", 0).asInt(); m_FoodExhaustionLevel = root.get("foodExhaustion", 0).asDouble(); - m_XpTotal = (short) root.get("experience", 0).asInt(); + m_LifetimeTotalXp = (short) root.get("xpTotal", 0).asInt(); + m_CurrentXp = (short) root.get("xpCurrent", 0).asInt(); //SetExperience(root.get("experience", 0).asInt()); @@ -1493,7 +1525,8 @@ bool cPlayer::SaveToDisk() root["rotation"] = JSON_PlayerRotation; root["inventory"] = JSON_Inventory; root["health"] = m_Health; - root["experience"] = m_XpTotal; + root["xpTotal"] = m_LifetimeTotalXp; + root["xpCurrent"] = m_CurrentXp; root["air"] = m_AirLevel; root["food"] = m_FoodLevel; root["foodSaturation"] = m_FoodSaturationLevel; diff --git a/source/Entities/Player.h b/source/Entities/Player.h index 2fc0d5ac9..01a864149 100644 --- a/source/Entities/Player.h +++ b/source/Entities/Player.h @@ -32,6 +32,7 @@ public: EATING_TICKS = 30, ///< Number of ticks it takes to eat an item MAX_AIR_LEVEL = 300, DROWNING_TICKS = 10, //number of ticks per heart of damage + MIN_EXPERIENCE = 0, } ; // tolua_end @@ -78,6 +79,9 @@ public: */ short AddExperience(short a_Xp_delta); + /// "Spend" some experience - ie on enchanting, returns new currentXp + short SpendExperience(short a_Xp_delta); + /// Gets the experience total - XpTotal for score on death inline short GetXpLifetimeTotal(void) { return m_LifetimeTotalXp; } -- cgit v1.2.3 From b72ced31649f8a851ffe60778e8a603bda941dc9 Mon Sep 17 00:00:00 2001 From: Daniel O'Brien Date: Sat, 16 Nov 2013 22:00:45 +1100 Subject: removed SpendExperience and changed AddExperience to handle removing Xp --- source/Entities/Player.cpp | 37 ++++++++----------------------------- source/Entities/Player.h | 7 ++----- 2 files changed, 10 insertions(+), 34 deletions(-) (limited to 'source/Entities') diff --git a/source/Entities/Player.cpp b/source/Entities/Player.cpp index e8fc795d7..bdcf0aae9 100644 --- a/source/Entities/Player.cpp +++ b/source/Entities/Player.cpp @@ -338,7 +338,7 @@ float cPlayer::GetXpPercentage() bool cPlayer::SetCurrentExperience(short int a_XpTotal) { - if(!(a_XpTotal >= 0) || (a_XpTotal > (SHRT_MAX - m_CurrentXp))) + if(!(a_XpTotal >= 0) || (a_XpTotal > (SHRT_MAX - m_LifetimeTotalXp))) { LOGWARNING("Tried to update experiece with an invalid Xp value: %d", a_XpTotal); return false; //oops, they gave us a dodgey number @@ -356,12 +356,13 @@ bool cPlayer::SetCurrentExperience(short int a_XpTotal) -short cPlayer::AddExperience(short a_Xp_delta) +short cPlayer::DeltaExperience(short a_Xp_delta) { - if(a_Xp_delta < 0) + //ToDo: figure out a better name?... + if(a_Xp_delta > (SHRT_MAX - m_LifetimeTotalXp) || (m_CurrentXp + a_Xp_delta) < MIN_EXPERIENCE) { // Value was negative, abort and report - LOGWARNING("Attempt was made to increment Xp by %d, must be positive", + LOGWARNING("Attempt was made to increment Xp by %d, which was invalid", a_Xp_delta); return -1; // Should we instead just return the current Xp? } @@ -369,34 +370,12 @@ short cPlayer::AddExperience(short a_Xp_delta) m_CurrentXp += a_Xp_delta; // Update total for score calculation - m_LifetimeTotalXp += a_Xp_delta; - - LOGD("Player \"%s\" earnt %d experience, total is now: %d", - m_PlayerName.c_str(), a_Xp_delta, m_XpTotal); - - // Set experience to be updated - m_bDirtyExperience = true; - - return m_CurrentXp; -} - - - - - -short cPlayer::SpendExperience(short a_Xp_delta) -{ - if(a_Xp_delta < 0) + if(a_Xp_delta > 0) { - // Value was negative, abort and report - LOGWARNING("Attempt was made to decrement Xp by %d, must be positive", - a_Xp_delta); - return -1; // Should we instead just return the current Xp? + m_LifetimeTotalXp += a_Xp_delta; } - m_CurrentXp -= a_Xp_delta; - - LOGD("Player \"%s\" spent %d experience, total is now: %d", + LOGD("Player \"%s\" earnt %d experience, total is now: %d", m_PlayerName.c_str(), a_Xp_delta, m_XpTotal); // Set experience to be updated diff --git a/source/Entities/Player.h b/source/Entities/Player.h index 01a864149..463a6d8dc 100644 --- a/source/Entities/Player.h +++ b/source/Entities/Player.h @@ -74,13 +74,10 @@ public: */ bool SetCurrentExperience(short a_XpTotal); - /* Adds Xp, "should" not inc more than MAX_EXPERIENCE_ORB_SIZE unless you're a plugin being funny, *cough* cheating + /* changes Xp by Xp_delta, you "shouldn't" not inc more than MAX_EXPERIENCE_ORB_SIZE Returns the new current experience, -1 on error */ - short AddExperience(short a_Xp_delta); - - /// "Spend" some experience - ie on enchanting, returns new currentXp - short SpendExperience(short a_Xp_delta); + short DeltaExperience(short a_Xp_delta); /// Gets the experience total - XpTotal for score on death inline short GetXpLifetimeTotal(void) { return m_LifetimeTotalXp; } -- cgit v1.2.3 From b3bb34974fddfae6cea9ca59d71f95e32621793d Mon Sep 17 00:00:00 2001 From: Daniel O'Brien Date: Sat, 16 Nov 2013 22:17:46 +1100 Subject: updated plugin again... --- source/Entities/Player.cpp | 8 ++++---- source/Entities/Player.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'source/Entities') diff --git a/source/Entities/Player.cpp b/source/Entities/Player.cpp index bdcf0aae9..38b41fb19 100644 --- a/source/Entities/Player.cpp +++ b/source/Entities/Player.cpp @@ -336,15 +336,15 @@ float cPlayer::GetXpPercentage() -bool cPlayer::SetCurrentExperience(short int a_XpTotal) +bool cPlayer::SetCurrentExperience(short int a_CurrentXp) { - if(!(a_XpTotal >= 0) || (a_XpTotal > (SHRT_MAX - m_LifetimeTotalXp))) + if(!(a_CurrentXp >= 0) || (a_CurrentXp > (SHRT_MAX - m_LifetimeTotalXp))) { - LOGWARNING("Tried to update experiece with an invalid Xp value: %d", a_XpTotal); + LOGWARNING("Tried to update experiece with an invalid Xp value: %d", a_CurrentXp); return false; //oops, they gave us a dodgey number } - m_CurrentXp = a_XpTotal; + m_CurrentXp = a_CurrentXp; // Set experience to be updated m_bDirtyExperience = true; diff --git a/source/Entities/Player.h b/source/Entities/Player.h index 463a6d8dc..5abca9899 100644 --- a/source/Entities/Player.h +++ b/source/Entities/Player.h @@ -429,7 +429,7 @@ protected: static short XpForLevel(short int a_Level); /// inverse of XpAtLevel, ref: http://minecraft.gamepedia.com/XP values are as per this with pre-calculations - static short CalcLevelFromXp(short int a_XpCurrent); + static short CalcLevelFromXp(short int a_CurrentXp); bool m_IsChargingBow; int m_BowCharge; -- cgit v1.2.3 From d2d8b1d0736c2af002dc3b91f5281fa4d866470f Mon Sep 17 00:00:00 2001 From: Daniel O'Brien Date: Sat, 16 Nov 2013 22:43:42 +1100 Subject: edited comment and changed error behavior of DeltaXp --- source/Entities/Player.cpp | 12 +++++++++--- source/Entities/Player.h | 3 ++- 2 files changed, 11 insertions(+), 4 deletions(-) (limited to 'source/Entities') diff --git a/source/Entities/Player.cpp b/source/Entities/Player.cpp index 38b41fb19..129d7df56 100644 --- a/source/Entities/Player.cpp +++ b/source/Entities/Player.cpp @@ -359,16 +359,22 @@ bool cPlayer::SetCurrentExperience(short int a_CurrentXp) short cPlayer::DeltaExperience(short a_Xp_delta) { //ToDo: figure out a better name?... - if(a_Xp_delta > (SHRT_MAX - m_LifetimeTotalXp) || (m_CurrentXp + a_Xp_delta) < MIN_EXPERIENCE) + if(a_Xp_delta > (SHRT_MAX - m_LifetimeTotalXp)) { - // Value was negative, abort and report - LOGWARNING("Attempt was made to increment Xp by %d, which was invalid", + // Value was bad, abort and report + LOGWARNING("Attempt was made to increment Xp by %d, which was bad", a_Xp_delta); return -1; // Should we instead just return the current Xp? } m_CurrentXp += a_Xp_delta; + // Make sure they didn't subtract too much + if(m_CurrentXp < 0) + { + m_CurrentXp = 0; + } + // Update total for score calculation if(a_Xp_delta > 0) { diff --git a/source/Entities/Player.h b/source/Entities/Player.h index 5abca9899..bda25715d 100644 --- a/source/Entities/Player.h +++ b/source/Entities/Player.h @@ -74,7 +74,8 @@ public: */ bool SetCurrentExperience(short a_XpTotal); - /* changes Xp by Xp_delta, you "shouldn't" not inc more than MAX_EXPERIENCE_ORB_SIZE + /* changes Xp by Xp_delta, you "shouldn't" inc more than MAX_EXPERIENCE_ORB_SIZE + Wont't allow xp to go negative Returns the new current experience, -1 on error */ short DeltaExperience(short a_Xp_delta); -- cgit v1.2.3 From c7f38761ed1cc524e98db754cadb2c6af1578b88 Mon Sep 17 00:00:00 2001 From: Daniel O'Brien Date: Sat, 16 Nov 2013 22:46:27 +1100 Subject: removed magic number --- source/Entities/Player.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source/Entities') diff --git a/source/Entities/Player.cpp b/source/Entities/Player.cpp index 129d7df56..ccc7b89f1 100644 --- a/source/Entities/Player.cpp +++ b/source/Entities/Player.cpp @@ -370,9 +370,9 @@ short cPlayer::DeltaExperience(short a_Xp_delta) m_CurrentXp += a_Xp_delta; // Make sure they didn't subtract too much - if(m_CurrentXp < 0) + if(m_CurrentXp < MIN_EXPERIENCE) { - m_CurrentXp = 0; + m_CurrentXp = MIN_EXPERIENCE; } // Update total for score calculation -- cgit v1.2.3 From cd1c4058940c12a88419c1d417ff2534050a0565 Mon Sep 17 00:00:00 2001 From: Daniel O'Brien Date: Sun, 17 Nov 2013 00:13:53 +1100 Subject: minor change in LOGD call --- source/Entities/Player.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source/Entities') diff --git a/source/Entities/Player.cpp b/source/Entities/Player.cpp index ccc7b89f1..436ae0cfc 100644 --- a/source/Entities/Player.cpp +++ b/source/Entities/Player.cpp @@ -381,8 +381,8 @@ short cPlayer::DeltaExperience(short a_Xp_delta) m_LifetimeTotalXp += a_Xp_delta; } - LOGD("Player \"%s\" earnt %d experience, total is now: %d", - m_PlayerName.c_str(), a_Xp_delta, m_XpTotal); + LOGD("Player \"%s\" gained/lost %d experience, total is now: %d", + m_PlayerName.c_str(), a_Xp_delta, m_CurrentXp); // Set experience to be updated m_bDirtyExperience = true; -- cgit v1.2.3