From 1b2e6e74736f975386879aa5eb064df5b2f88dac Mon Sep 17 00:00:00 2001 From: Daniel O'Brien Date: Fri, 15 Nov 2013 22:42:09 +1100 Subject: [PATCH] added cProtocol function to pass xp to client --- MCServer/Plugins/Debuggers/Debuggers.lua | 2 +- source/Bindings.cpp | 12 ++++----- source/Bindings.h | 2 +- source/ClientHandle.cpp | 9 +++++++ source/ClientHandle.h | 1 + source/Entities/Player.cpp | 32 ++++++++++++++---------- source/Entities/Player.h | 14 +++++------ 7 files changed, 44 insertions(+), 28 deletions(-) diff --git a/MCServer/Plugins/Debuggers/Debuggers.lua b/MCServer/Plugins/Debuggers/Debuggers.lua index 119e1525e..cd7da359b 100644 --- a/MCServer/Plugins/Debuggers/Debuggers.lua +++ b/MCServer/Plugins/Debuggers/Debuggers.lua @@ -841,7 +841,7 @@ end function HandleAddExperience(a_Split, a_Player) - a_Player->AddExperience(200); + a_Player:AddExperience(200); return true; end \ No newline at end of file diff --git a/source/Bindings.cpp b/source/Bindings.cpp index c7f6ada19..cc892a70f 100644 --- a/source/Bindings.cpp +++ b/source/Bindings.cpp @@ -1,6 +1,6 @@ /* ** Lua binding: AllToLua -** Generated automatically by tolua++-1.0.92 on 11/14/13 17:13:46. +** Generated automatically by tolua++-1.0.92 on 11/15/13 18:43:44. */ #ifndef __cplusplus @@ -7708,7 +7708,7 @@ static int tolua_AllToLua_cPlayer_SetExperience00(lua_State* tolua_S) #endif { cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); - int a_XpTotal = ((int) tolua_tonumber(tolua_S,2,0)); + short a_XpTotal = ((short) tolua_tonumber(tolua_S,2,0)); #ifndef TOLUA_RELEASE if (!self) tolua_error(tolua_S,"invalid 'self' in function 'SetExperience'", NULL); #endif @@ -7742,12 +7742,12 @@ static int tolua_AllToLua_cPlayer_AddExperience00(lua_State* tolua_S) #endif { cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); - int a_Xp_delta = ((int) tolua_tonumber(tolua_S,2,0)); + short a_Xp_delta = ((short) tolua_tonumber(tolua_S,2,0)); #ifndef TOLUA_RELEASE if (!self) tolua_error(tolua_S,"invalid 'self' in function 'AddExperience'", NULL); #endif { - int tolua_ret = (int) self->AddExperience(a_Xp_delta); + short tolua_ret = (short) self->AddExperience(a_Xp_delta); tolua_pushnumber(tolua_S,(lua_Number)tolua_ret); } } @@ -7779,7 +7779,7 @@ static int tolua_AllToLua_cPlayer_XpGetTotal00(lua_State* tolua_S) if (!self) tolua_error(tolua_S,"invalid 'self' in function 'XpGetTotal'", NULL); #endif { - int tolua_ret = (int) self->XpGetTotal(); + short tolua_ret = (short) self->XpGetTotal(); tolua_pushnumber(tolua_S,(lua_Number)tolua_ret); } } @@ -7811,7 +7811,7 @@ static int tolua_AllToLua_cPlayer_XpGetLevel00(lua_State* tolua_S) if (!self) tolua_error(tolua_S,"invalid 'self' in function 'XpGetLevel'", NULL); #endif { - int tolua_ret = (int) self->XpGetLevel(); + short tolua_ret = (short) self->XpGetLevel(); tolua_pushnumber(tolua_S,(lua_Number)tolua_ret); } } diff --git a/source/Bindings.h b/source/Bindings.h index eb6c566a7..b17fd02ae 100644 --- a/source/Bindings.h +++ b/source/Bindings.h @@ -1,6 +1,6 @@ /* ** Lua binding: AllToLua -** Generated automatically by tolua++-1.0.92 on 11/14/13 17:13:47. +** Generated automatically by tolua++-1.0.92 on 11/15/13 18:43:45. */ /* Exported function */ diff --git a/source/ClientHandle.cpp b/source/ClientHandle.cpp index f8fd4a8b7..73852b886 100644 --- a/source/ClientHandle.cpp +++ b/source/ClientHandle.cpp @@ -1873,6 +1873,15 @@ void cClientHandle::SendRespawn(void) +void cClientHandle::SendSetExperience(void) +{ + m_Protocol->SendSetExperience(); +} + + + + + void cClientHandle::SendSoundEffect(const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch) { m_Protocol->SendSoundEffect(a_SoundName, a_SrcX, a_SrcY, a_SrcZ, a_Volume, a_Pitch); diff --git a/source/ClientHandle.h b/source/ClientHandle.h index 3844937ad..4b37d39b5 100644 --- a/source/ClientHandle.h +++ b/source/ClientHandle.h @@ -120,6 +120,7 @@ public: void SendPlayerPosition (void); void SendPlayerSpawn (const cPlayer & a_Player); void SendRespawn (void); + void SendSetExperience (void); void 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 void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data); void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock); 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;