Merge pull request #50 from ravenscroftj/feature/drowning
Made player drowning implementationmaster
commit
dc777018b5
|
@ -40,6 +40,8 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName)
|
||||||
, m_IP("")
|
, m_IP("")
|
||||||
, m_LastBlockActionTime( 0 )
|
, m_LastBlockActionTime( 0 )
|
||||||
, m_LastBlockActionCnt( 0 )
|
, m_LastBlockActionCnt( 0 )
|
||||||
|
, m_AirLevel( MAX_AIR_LEVEL )
|
||||||
|
, m_AirTickTimer( DROWNING_TICKS )
|
||||||
, m_bVisible( true )
|
, m_bVisible( true )
|
||||||
, m_LastGroundHeight( 0 )
|
, m_LastGroundHeight( 0 )
|
||||||
, m_bTouchGround( false )
|
, m_bTouchGround( false )
|
||||||
|
@ -178,6 +180,10 @@ void cPlayer::Tick(float a_Dt, cChunk & a_Chunk)
|
||||||
}
|
}
|
||||||
|
|
||||||
super::Tick(a_Dt, a_Chunk);
|
super::Tick(a_Dt, a_Chunk);
|
||||||
|
|
||||||
|
//handle air drowning stuff
|
||||||
|
HandleAir(a_Chunk);
|
||||||
|
|
||||||
if (m_bDirtyPosition)
|
if (m_bDirtyPosition)
|
||||||
{
|
{
|
||||||
// Apply food exhaustion from movement:
|
// Apply food exhaustion from movement:
|
||||||
|
@ -1200,7 +1206,7 @@ bool cPlayer::LoadFromDisk()
|
||||||
}
|
}
|
||||||
|
|
||||||
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_FoodLevel = root.get("food", MAX_FOOD_LEVEL).asInt();
|
||||||
m_FoodSaturationLevel = root.get("foodSaturation", MAX_FOOD_LEVEL).asDouble();
|
m_FoodSaturationLevel = root.get("foodSaturation", MAX_FOOD_LEVEL).asDouble();
|
||||||
m_FoodTickTimer = root.get("foodTickTimer", 0).asInt();
|
m_FoodTickTimer = root.get("foodTickTimer", 0).asInt();
|
||||||
|
@ -1246,6 +1252,7 @@ bool cPlayer::SaveToDisk()
|
||||||
root["rotation"] = JSON_PlayerRotation;
|
root["rotation"] = JSON_PlayerRotation;
|
||||||
root["inventory"] = JSON_Inventory;
|
root["inventory"] = JSON_Inventory;
|
||||||
root["health"] = m_Health;
|
root["health"] = m_Health;
|
||||||
|
root["air"] = m_AirLevel;
|
||||||
root["food"] = m_FoodLevel;
|
root["food"] = m_FoodLevel;
|
||||||
root["foodSaturation"] = m_FoodSaturationLevel;
|
root["foodSaturation"] = m_FoodSaturationLevel;
|
||||||
root["foodTickTimer"] = m_FoodTickTimer;
|
root["foodTickTimer"] = m_FoodTickTimer;
|
||||||
|
@ -1313,7 +1320,42 @@ void cPlayer::UseEquippedItem()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void cPlayer::HandleAir(cChunk & a_Chunk)
|
||||||
|
{
|
||||||
|
// Ref.: http://www.minecraftwiki.net/wiki/Chunk_format
|
||||||
|
// see if the player is /submerged/ water (block above is water)
|
||||||
|
// Get the type of block the player's standing in:
|
||||||
|
BLOCKTYPE BlockIn;
|
||||||
|
int RelX = (int)floor(m_LastPosX) - a_Chunk.GetPosX() * cChunkDef::Width;
|
||||||
|
int RelY = (int)floor(m_LastPosY + 1.1);
|
||||||
|
int RelZ = (int)floor(m_LastPosZ) - a_Chunk.GetPosZ() * cChunkDef::Width;
|
||||||
|
// Use Unbounded, because we're being called *after* processing super::Tick(), which could have changed our chunk
|
||||||
|
VERIFY(a_Chunk.UnboundedRelGetBlockType(RelX, RelY, RelZ, BlockIn));
|
||||||
|
|
||||||
|
if (IsBlockWater(BlockIn))
|
||||||
|
{
|
||||||
|
// either reduce air level or damage player
|
||||||
|
if(m_AirLevel < 1)
|
||||||
|
{
|
||||||
|
if(m_AirTickTimer < 1)
|
||||||
|
{
|
||||||
|
// damage player
|
||||||
|
TakeDamage(dtDrowning, NULL, 1, 1, 0);
|
||||||
|
// reset timer
|
||||||
|
m_AirTickTimer = DROWNING_TICKS;
|
||||||
|
}else{
|
||||||
|
m_AirTickTimer -= 1;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
// reduce air supply
|
||||||
|
m_AirLevel -= 1;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
// set the air back to maximum
|
||||||
|
m_AirLevel = MAX_AIR_LEVEL;
|
||||||
|
m_AirTickTimer = DROWNING_TICKS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void cPlayer::HandleFood(void)
|
void cPlayer::HandleFood(void)
|
||||||
|
|
|
@ -29,6 +29,8 @@ public:
|
||||||
MAX_HEALTH = 20,
|
MAX_HEALTH = 20,
|
||||||
MAX_FOOD_LEVEL = 20,
|
MAX_FOOD_LEVEL = 20,
|
||||||
EATING_TICKS = 30, ///< Number of ticks it takes to eat an item
|
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
|
||||||
} ;
|
} ;
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
|
@ -161,6 +163,8 @@ public:
|
||||||
double GetFoodExhaustionLevel (void) const { return m_FoodExhaustionLevel; }
|
double GetFoodExhaustionLevel (void) const { return m_FoodExhaustionLevel; }
|
||||||
int GetFoodPoisonedTicksRemaining(void) const { return m_FoodPoisonedTicksRemaining; }
|
int GetFoodPoisonedTicksRemaining(void) const { return m_FoodPoisonedTicksRemaining; }
|
||||||
|
|
||||||
|
int GetAirLevel (void) const { return m_AirLevel; }
|
||||||
|
|
||||||
/// Returns true if the player is satiated, i. e. their foodlevel is at the max and they cannot eat anymore
|
/// Returns true if the player is satiated, i. e. their foodlevel is at the max and they cannot eat anymore
|
||||||
bool IsSatiated(void) const { return (m_FoodLevel >= MAX_FOOD_LEVEL); }
|
bool IsSatiated(void) const { return (m_FoodLevel >= MAX_FOOD_LEVEL); }
|
||||||
|
|
||||||
|
@ -267,6 +271,11 @@ protected:
|
||||||
std::string m_PlayerName;
|
std::string m_PlayerName;
|
||||||
std::string m_LoadedWorldName;
|
std::string m_LoadedWorldName;
|
||||||
|
|
||||||
|
/// Player's air level (for swimming)
|
||||||
|
int m_AirLevel;
|
||||||
|
/// used to time ticks between damage taken via drowning/suffocation
|
||||||
|
int m_AirTickTimer;
|
||||||
|
|
||||||
bool m_bVisible;
|
bool m_bVisible;
|
||||||
|
|
||||||
// Food-related variables:
|
// Food-related variables:
|
||||||
|
@ -329,7 +338,6 @@ protected:
|
||||||
/// The world tick in which eating will be finished. -1 if not eating
|
/// The world tick in which eating will be finished. -1 if not eating
|
||||||
Int64 m_EatingFinishTick;
|
Int64 m_EatingFinishTick;
|
||||||
|
|
||||||
|
|
||||||
virtual void Destroyed(void);
|
virtual void Destroyed(void);
|
||||||
|
|
||||||
/// Filters out damage for creative mode
|
/// Filters out damage for creative mode
|
||||||
|
@ -338,6 +346,9 @@ protected:
|
||||||
/// Called in each tick to handle food-related processing
|
/// Called in each tick to handle food-related processing
|
||||||
void HandleFood(void);
|
void HandleFood(void);
|
||||||
|
|
||||||
|
/// Called in each tick to handle air-related processing i.e. drowning
|
||||||
|
void HandleAir(cChunk & a_Chunk);
|
||||||
|
|
||||||
/// Adds food exhaustion based on the difference between Pos and LastPos, sprinting status and swimming (in water block)
|
/// Adds food exhaustion based on the difference between Pos and LastPos, sprinting status and swimming (in water block)
|
||||||
void ApplyFoodExhaustionFromMovement(cChunk & a_Chunk);
|
void ApplyFoodExhaustionFromMovement(cChunk & a_Chunk);
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
|
Loading…
Reference in New Issue