summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorlapayo94@gmail.com <lapayo94@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2011-12-28 03:10:05 +0100
committerlapayo94@gmail.com <lapayo94@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2011-12-28 03:10:05 +0100
commit1e9af56a67ae3765291361d9bf01e9009cfb4dcc (patch)
tree65878a8c373ec163eed3439b7db0fc440810d95b /source
parentFixed some things in Core to work for multiple worlds (diff)
downloadcuberite-1e9af56a67ae3765291361d9bf01e9009cfb4dcc.tar
cuberite-1e9af56a67ae3765291361d9bf01e9009cfb4dcc.tar.gz
cuberite-1e9af56a67ae3765291361d9bf01e9009cfb4dcc.tar.bz2
cuberite-1e9af56a67ae3765291361d9bf01e9009cfb4dcc.tar.lz
cuberite-1e9af56a67ae3765291361d9bf01e9009cfb4dcc.tar.xz
cuberite-1e9af56a67ae3765291361d9bf01e9009cfb4dcc.tar.zst
cuberite-1e9af56a67ae3765291361d9bf01e9009cfb4dcc.zip
Diffstat (limited to 'source')
-rw-r--r--source/Bindings.cpp97
-rw-r--r--source/Bindings.h2
-rw-r--r--source/cChicken.cpp8
-rw-r--r--source/cCow.cpp9
-rw-r--r--source/cEnderman.cpp4
-rw-r--r--source/cFluidSimulator.cpp2
-rw-r--r--source/cMonster.cpp75
-rw-r--r--source/cMonster.h6
-rw-r--r--source/cMonsterConfig.cpp4
-rw-r--r--source/cPawn.cpp96
-rw-r--r--source/cPawn.h23
-rw-r--r--source/cPlayer.cpp105
-rw-r--r--source/cPlayer.h31
-rw-r--r--source/cSkeleton.cpp4
-rw-r--r--source/cSquid.cpp11
-rw-r--r--source/cZombie.cpp4
-rw-r--r--source/cZombiepigman.cpp6
-rw-r--r--source/packets/cPacket_Metadata.cpp25
-rw-r--r--source/packets/cPacket_Metadata.h3
19 files changed, 218 insertions, 297 deletions
diff --git a/source/Bindings.cpp b/source/Bindings.cpp
index d6ea00987..33d6427d4 100644
--- a/source/Bindings.cpp
+++ b/source/Bindings.cpp
@@ -1,6 +1,6 @@
/*
** Lua binding: AllToLua
-** Generated automatically by tolua++-1.0.92 on 12/26/11 15:45:21.
+** Generated automatically by tolua++-1.0.92 on 12/28/11 01:31:37.
*/
#ifndef __cplusplus
@@ -5039,38 +5039,6 @@ static int tolua_AllToLua_cPlayer_TeleportTo00(lua_State* tolua_S)
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"cPlayer",0,&tolua_err) ||
- !tolua_isusertype(tolua_S,2,"cEntity",0,&tolua_err) ||
- !tolua_isnoobj(tolua_S,3,&tolua_err)
- )
- goto tolua_lerror;
- else
-#endif
- {
- cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0);
- cEntity* a_Entity = ((cEntity*) tolua_tousertype(tolua_S,2,0));
-#ifndef TOLUA_RELEASE
- if (!self) tolua_error(tolua_S,"invalid 'self' in function 'TeleportTo'", NULL);
-#endif
- {
- self->TeleportTo(a_Entity);
- }
- }
- return 0;
-#ifndef TOLUA_RELEASE
- tolua_lerror:
- tolua_error(tolua_S,"#ferror in function 'TeleportTo'.",&tolua_err);
- return 0;
-#endif
-}
-#endif //#ifndef TOLUA_DISABLE
-
-/* method: TeleportTo of class cPlayer */
-#ifndef TOLUA_DISABLE_tolua_AllToLua_cPlayer_TeleportTo01
-static int tolua_AllToLua_cPlayer_TeleportTo01(lua_State* tolua_S)
-{
- tolua_Error tolua_err;
- if (
- !tolua_isusertype(tolua_S,1,"cPlayer",0,&tolua_err) ||
!tolua_isnumber(tolua_S,2,0,&tolua_err) ||
!tolua_isnumber(tolua_S,3,0,&tolua_err) ||
!tolua_isnumber(tolua_S,4,0,&tolua_err) ||
@@ -5078,6 +5046,7 @@ static int tolua_AllToLua_cPlayer_TeleportTo01(lua_State* tolua_S)
)
goto tolua_lerror;
else
+#endif
{
cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0);
const double a_PosX = ((const double) tolua_tonumber(tolua_S,2,0));
@@ -5094,8 +5063,11 @@ static int tolua_AllToLua_cPlayer_TeleportTo01(lua_State* tolua_S)
}
}
return 3;
-tolua_lerror:
- return tolua_AllToLua_cPlayer_TeleportTo00(tolua_S);
+#ifndef TOLUA_RELEASE
+ tolua_lerror:
+ tolua_error(tolua_S,"#ferror in function 'TeleportTo'.",&tolua_err);
+ return 0;
+#endif
}
#endif //#ifndef TOLUA_DISABLE
@@ -5930,16 +5902,8 @@ public:
return ( void ) cPlayer:: Initialize(a_World);
};
};
- void TeleportTo( cEntity* a_Entity) {
- if (push_method("TeleportTo", tolua_AllToLua_cPlayer_TeleportTo00)) {
- tolua_pushusertype(lua_state, (void*)a_Entity, "cEntity");
- ToluaBase::dbcall(lua_state, 2, 0);
- } else {
- return ( void ) cPlayer:: TeleportTo(a_Entity);
- };
- };
void TeleportTo( const double& a_PosX, const double& a_PosY, const double& a_PosZ) {
- if (push_method("TeleportTo", tolua_AllToLua_cPlayer_TeleportTo01)) {
+ if (push_method("TeleportTo", tolua_AllToLua_cPlayer_TeleportTo00)) {
tolua_pushnumber(lua_state, (lua_Number)a_PosX);
tolua_pushnumber(lua_state, (lua_Number)a_PosY);
tolua_pushnumber(lua_state, (lua_Number)a_PosZ);
@@ -6036,9 +6000,6 @@ public:
void cPlayer__Initialize( cWorld* a_World) {
return ( void )cPlayer::Initialize(a_World);
};
- void cPlayer__TeleportTo( cEntity* a_Entity) {
- return ( void )cPlayer::TeleportTo(a_Entity);
- };
void cPlayer__TeleportTo( const double& a_PosX, const double& a_PosY, const double& a_PosZ) {
return ( void )cPlayer::TeleportTo(a_PosX,a_PosY,a_PosZ);
};
@@ -6136,38 +6097,6 @@ static int tolua_AllToLua_Lua__cPlayer_cPlayer__TeleportTo00(lua_State* tolua_S)
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"Lua__cPlayer",0,&tolua_err) ||
- !tolua_isusertype(tolua_S,2,"cEntity",0,&tolua_err) ||
- !tolua_isnoobj(tolua_S,3,&tolua_err)
- )
- goto tolua_lerror;
- else
-#endif
- {
- Lua__cPlayer* self = (Lua__cPlayer*) tolua_tousertype(tolua_S,1,0);
- cEntity* a_Entity = ((cEntity*) tolua_tousertype(tolua_S,2,0));
-#ifndef TOLUA_RELEASE
- if (!self) tolua_error(tolua_S,"invalid 'self' in function 'cPlayer__TeleportTo'", NULL);
-#endif
- {
- self->cPlayer__TeleportTo(a_Entity);
- }
- }
- return 0;
-#ifndef TOLUA_RELEASE
- tolua_lerror:
- tolua_error(tolua_S,"#ferror in function 'cPlayer__TeleportTo'.",&tolua_err);
- return 0;
-#endif
-}
-#endif //#ifndef TOLUA_DISABLE
-
-/* method: cPlayer__TeleportTo of class Lua__cPlayer */
-#ifndef TOLUA_DISABLE_tolua_AllToLua_Lua__cPlayer_cPlayer__TeleportTo01
-static int tolua_AllToLua_Lua__cPlayer_cPlayer__TeleportTo01(lua_State* tolua_S)
-{
- tolua_Error tolua_err;
- if (
- !tolua_isusertype(tolua_S,1,"Lua__cPlayer",0,&tolua_err) ||
!tolua_isnumber(tolua_S,2,0,&tolua_err) ||
!tolua_isnumber(tolua_S,3,0,&tolua_err) ||
!tolua_isnumber(tolua_S,4,0,&tolua_err) ||
@@ -6175,6 +6104,7 @@ static int tolua_AllToLua_Lua__cPlayer_cPlayer__TeleportTo01(lua_State* tolua_S)
)
goto tolua_lerror;
else
+#endif
{
Lua__cPlayer* self = (Lua__cPlayer*) tolua_tousertype(tolua_S,1,0);
const double a_PosX = ((const double) tolua_tonumber(tolua_S,2,0));
@@ -6191,8 +6121,11 @@ static int tolua_AllToLua_Lua__cPlayer_cPlayer__TeleportTo01(lua_State* tolua_S)
}
}
return 3;
-tolua_lerror:
- return tolua_AllToLua_Lua__cPlayer_cPlayer__TeleportTo00(tolua_S);
+#ifndef TOLUA_RELEASE
+ tolua_lerror:
+ tolua_error(tolua_S,"#ferror in function 'cPlayer__TeleportTo'.",&tolua_err);
+ return 0;
+#endif
}
#endif //#ifndef TOLUA_DISABLE
@@ -15992,7 +15925,6 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_function(tolua_S,"GetStance",tolua_AllToLua_cPlayer_GetStance00);
tolua_function(tolua_S,"GetInventory",tolua_AllToLua_cPlayer_GetInventory00);
tolua_function(tolua_S,"TeleportTo",tolua_AllToLua_cPlayer_TeleportTo00);
- tolua_function(tolua_S,"TeleportTo",tolua_AllToLua_cPlayer_TeleportTo01);
tolua_function(tolua_S,"GetGameMode",tolua_AllToLua_cPlayer_GetGameMode00);
tolua_function(tolua_S,"GetIP",tolua_AllToLua_cPlayer_GetIP00);
tolua_function(tolua_S,"GetLastBlockActionTime",tolua_AllToLua_cPlayer_GetLastBlockActionTime00);
@@ -16024,7 +15956,6 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_function(tolua_S,"tolua__set_instance",tolua_AllToLua_Lua__cPlayer_tolua__set_instance00);
tolua_function(tolua_S,"cPlayer__Initialize",tolua_AllToLua_Lua__cPlayer_cPlayer__Initialize00);
tolua_function(tolua_S,"cPlayer__TeleportTo",tolua_AllToLua_Lua__cPlayer_cPlayer__TeleportTo00);
- tolua_function(tolua_S,"cPlayer__TeleportTo",tolua_AllToLua_Lua__cPlayer_cPlayer__TeleportTo01);
tolua_function(tolua_S,"cPlayer__MoveTo",tolua_AllToLua_Lua__cPlayer_cPlayer__MoveTo00);
tolua_endmodule(tolua_S);
tolua_cclass(tolua_S,"cPluginManager","cPluginManager","",NULL);
diff --git a/source/Bindings.h b/source/Bindings.h
index 150efff75..7fede45f8 100644
--- a/source/Bindings.h
+++ b/source/Bindings.h
@@ -1,6 +1,6 @@
/*
** Lua binding: AllToLua
-** Generated automatically by tolua++-1.0.92 on 12/26/11 15:45:21.
+** Generated automatically by tolua++-1.0.92 on 12/28/11 01:31:37.
*/
/* Exported function */
diff --git a/source/cChicken.cpp b/source/cChicken.cpp
index 33d5d0755..201ea7f45 100644
--- a/source/cChicken.cpp
+++ b/source/cChicken.cpp
@@ -25,8 +25,12 @@ void cChicken::KilledBy( cEntity* a_Killer )
cMonster::RandomDropItem(E_ITEM_FEATHER, 0, 2);
// Raw Chicken
- // TODO: (Check wheather it is burning to drop cooked Chicken)
- cMonster::DropItem(E_ITEM_RAW_CHICKEN, 1);
+ if(GetMetaData() == BURNING)
+ {
+ cMonster::DropItem(E_ITEM_COOKED_CHICKEN, 1);
+ }else{
+ cMonster::DropItem(E_ITEM_RAW_CHICKEN, 1);
+ }
cMonster::KilledBy( a_Killer );
} \ No newline at end of file
diff --git a/source/cCow.cpp b/source/cCow.cpp
index 3d20bf2d9..de9815a9d 100644
--- a/source/cCow.cpp
+++ b/source/cCow.cpp
@@ -23,10 +23,13 @@ void cCow::KilledBy( cEntity* a_Killer )
//Drops 0-2 Lether
cMonster::RandomDropItem(E_ITEM_LEATHER, 0, 2);
- //Drops 1-3 Raw beefs
- cMonster::RandomDropItem(E_ITEM_LEATHER, 1, 3);
+ if(GetMetaData() == BURNING)
+ {
+ cMonster::RandomDropItem(E_ITEM_STEAK, 1, 3);
+ }else{
+ cMonster::RandomDropItem(E_ITEM_RAW_BEEF, 1, 3);
+ }
- //TODO: Check wheather burning and drop 1-3 steak instead
cMonster::KilledBy( a_Killer );
}
diff --git a/source/cEnderman.cpp b/source/cEnderman.cpp
index c7c785a9f..36982b1e8 100644
--- a/source/cEnderman.cpp
+++ b/source/cEnderman.cpp
@@ -21,8 +21,8 @@ void cEnderman::Tick(float a_Dt)
cMonster::Tick(a_Dt);
//TODO Same as stated in cSkeleton
- if (GetWorld()->GetWorldTime() < (12000 + 1000) ) { //if daylight
- m_EMMetaState = BURNING; // BURN, BABY, BURN! >:D
+ if (GetWorld()->GetWorldTime() < (12000 + 1000) && GetMetaData() != BURNING) { //if daylight
+ SetMetaData(BURNING); // BURN, BABY, BURN! >:D
}
}
diff --git a/source/cFluidSimulator.cpp b/source/cFluidSimulator.cpp
index 2ede7ba49..bc9bc8aae 100644
--- a/source/cFluidSimulator.cpp
+++ b/source/cFluidSimulator.cpp
@@ -224,7 +224,7 @@ Direction cFluidSimulator::GetFlowingDirection(int a_X, int a_Y, int a_Z, bool a
*/
char LowestPoint = m_World->GetBlockMeta(a_X, a_Y, a_Z); //Current Block Meta so only lower points will be counted
- int X, Y, Z; //Lowest Pos will be stored here
+ int X = 0, Y = 0, Z = 0; //Lowest Pos will be stored here
if(IsAllowedBlock(m_World->GetBlock(a_X, a_Y + 1, a_Z)) && a_Over) //check for upper block to flow because this also affects the flowing direction
{
diff --git a/source/cMonster.cpp b/source/cMonster.cpp
index 2f7567b15..cee068b08 100644
--- a/source/cMonster.cpp
+++ b/source/cMonster.cpp
@@ -56,25 +56,12 @@ cMonster::cMonster()
, m_AttackInterval(0)
, m_AttackRate(3)
, idle_interval(0)
- , m_bBurnable(true)
- , m_EMMetaState(NORMAL)
- , m_FireDamageInterval(0)
- , m_BurnPeriod(0)
{
LOG("cMonster::cMonster()");
- LOG("In state: %s",GetState());
- m_Health = 10;
+ LOG("In state: %s", GetState());
- MTRand r1;
- int RandVal = r1.randInt() % 4;
- if( RandVal == 0 )
- m_MobType = 90; // Pig
- else if( RandVal == 1 )
- m_MobType = 91; // Sheep
- else if( RandVal == 2 )
- m_MobType = 92; // Cow
- else
- m_MobType = 93; // Hen
+ m_bBurnable = true;
+ m_MetaData = NORMAL;
}
cMonster::~cMonster()
@@ -131,6 +118,8 @@ bool cMonster::ReachedDestination()
void cMonster::Tick(float a_Dt)
{
+ cPawn::Tick(a_Dt);
+
if( m_Health <= 0 )
{
m_DestroyTimer += a_Dt/1000;
@@ -196,12 +185,6 @@ void cMonster::Tick(float a_Dt)
SetPitch( Pitch );
}
- CheckMetaDataBurn(); //Check to see if Enemy should burn based on block they are on
-
- if(m_EMMetaState == BURNING) {
- InStateBurning(a_Dt);
- }
-
if(m_EMState == IDLE) { //If enemy passive we ignore checks for player visibility
InStateIdle(a_Dt);
}
@@ -448,37 +431,6 @@ void cMonster::InStateIdle(float a_Dt) {
}
}
-//What to do if On fire
-void cMonster::InStateBurning(float a_Dt) {
- m_FireDamageInterval += a_Dt;
- char block = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y, (int)m_Pos->z );
- char bblock = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y +1, (int)m_Pos->z );
- if(m_FireDamageInterval > 1) {
-
- m_FireDamageInterval -= 1;
- TakeDamage(1, this);
-
- m_BurnPeriod++;
- if(block == E_BLOCK_LAVA || block == E_BLOCK_STATIONARY_LAVA || block == E_BLOCK_FIRE
- || bblock == E_BLOCK_LAVA || bblock == E_BLOCK_STATIONARY_LAVA || bblock == E_BLOCK_FIRE) {
- m_BurnPeriod = 0;
- TakeDamage(6, this);
- }else{
- TakeDamage(1, this);
- }
-
- if(m_BurnPeriod > 8) {
- cChunk* InChunk = GetWorld()->GetChunkUnreliable( m_ChunkX, m_ChunkY, m_ChunkZ );
- m_EMMetaState = NORMAL;
- cPacket_Metadata md(NORMAL, GetUniqueID());
- InChunk->Broadcast(md);
- m_BurnPeriod = 0;
-
- }
- }
-
-}
-
//What to do if in Chasing State
//This state should always be defined in each child class
void cMonster::InStateChasing(float a_Dt) {
@@ -508,20 +460,7 @@ void cMonster::Attack(float a_Dt) {
((cPawn *)m_Target)->TakeDamage((int)m_AttackDamage,this);
}
}
-//----Change Entity MetaData
-void cMonster::CheckMetaDataBurn() {
- char block = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y, (int)m_Pos->z );
- char bblock = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y -1, (int)m_Pos->z );
- if(m_bBurnable && m_EMMetaState != BURNING && (block == E_BLOCK_LAVA || block == E_BLOCK_STATIONARY_LAVA || block == E_BLOCK_FIRE
- || bblock == E_BLOCK_LAVA || bblock == E_BLOCK_STATIONARY_LAVA || bblock == E_BLOCK_FIRE)) {
- cChunk* InChunk = GetWorld()->GetChunkUnreliable( m_ChunkX, m_ChunkY, m_ChunkZ );
- if(!InChunk)
- return;
- m_EMMetaState = BURNING;
- cPacket_Metadata md(BURNING,GetUniqueID());
- InChunk->Broadcast(md);
- }
-}
+
//----Debug
@@ -601,5 +540,5 @@ void cMonster::DropItem(ENUM_ITEM_ID a_Item, unsigned int a_Count)
void cMonster::RandomDropItem(ENUM_ITEM_ID a_Item, unsigned int a_Min, unsigned int a_Max)
{
MTRand r1;
- return cMonster::DropItem(a_Item, r1.randInt() % (a_Max + 1) + a_Min);
+ return cMonster::DropItem(a_Item, r1.randInt() % (a_Max + 1 - a_Min) + a_Min);
} \ No newline at end of file
diff --git a/source/cMonster.h b/source/cMonster.h
index 90340311e..faf54b04f 100644
--- a/source/cMonster.h
+++ b/source/cMonster.h
@@ -43,7 +43,6 @@ public:
virtual void InStateIdle(float a_Dt);
virtual void InStateChasing(float a_Dt);
virtual void InStateEscaping(float a_Dt);
- virtual void InStateBurning(float a_Dt);
virtual void Attack(float a_Dt);
int GetMobType() {return m_MobType;}
@@ -52,11 +51,9 @@ public:
void SetAttackRange(float ar);
void SetAttackDamage(float ad);
void SetSightDistance(float sd);
- virtual void CheckMetaDataBurn();
enum MState{ATTACKING, IDLE, CHASING, ESCAPING} m_EMState;
enum MPersonality{PASSIVE,AGGRESSIVE,COWARDLY} m_EMPersonality;
- enum MMetaState{NORMAL,BURNING,CROUCHED,RIDING} m_EMMetaState;
protected:
@@ -67,7 +64,6 @@ protected:
Vector3f* m_Destination;
bool m_bMovingToDestination;
bool m_bPassiveAggressive;
- bool m_bBurnable;
Vector3f* m_Speed;
float m_DestinationTime;
@@ -84,8 +80,6 @@ protected:
float m_AttackDamage;
float m_AttackRange;
float m_AttackInterval;
- float m_FireDamageInterval;
- float m_BurnPeriod;
void DropItem(ENUM_ITEM_ID a_Item, unsigned int a_Count);
void RandomDropItem(ENUM_ITEM_ID a_Item, unsigned int a_Min, unsigned int a_Max);
diff --git a/source/cMonsterConfig.cpp b/source/cMonsterConfig.cpp
index 456da1fc3..1226c74e2 100644
--- a/source/cMonsterConfig.cpp
+++ b/source/cMonsterConfig.cpp
@@ -17,6 +17,7 @@ struct cMonsterConfig::sAttributesStruct
float m_AttackDamage;
float m_AttackRange;
float m_AttackRate;
+ int m_MaxHealth;
};
struct cMonsterConfig::sMonsterConfigState
@@ -68,6 +69,8 @@ void cMonsterConfig::Initialize() {
printf("Got SightDistance: %3.3f \n",Attributes.m_SightDistance);
Attributes.m_AttackRate = (float)MonstersIniFile.GetValueF(SplitList[i].c_str(),"AttackRate",0);
printf("Got AttackRate: %3.3f \n",Attributes.m_AttackRate);
+ Attributes.m_MaxHealth = MonstersIniFile.GetValueI(SplitList[i].c_str(),"MaxHealth",0);
+ printf("Got MaxHealth: %d \n",Attributes.m_MaxHealth);
m_pState->AttributesList.push_front(Attributes);
}
}
@@ -84,6 +87,7 @@ void cMonsterConfig::AssignAttributes(cMonster *m, const char* n)
m->SetAttackRange(itr->m_AttackRange);
m->SetSightDistance(itr->m_SightDistance);
m->SetAttackRate((int)itr->m_AttackRate);
+ m->SetMaxHealth((int)itr->m_AttackRate);
}
}
}
diff --git a/source/cPawn.cpp b/source/cPawn.cpp
index 2c1471156..e696ffc18 100644
--- a/source/cPawn.cpp
+++ b/source/cPawn.cpp
@@ -6,9 +6,14 @@
#include "cChunk.h"
#include "cMCLogger.h"
#include "cPluginManager.h"
+#include "Vector3d.h"
+#include "BlockID.h"
+
+#include "Defines.h"
#include "packets/cPacket_TeleportEntity.h"
#include "packets/cPacket_EntityStatus.h"
+#include "packets/cPacket_Metadata.h"
CLASS_DEFINITION( cPawn, cEntity )
@@ -18,8 +23,11 @@ cPawn::cPawn()
, m_LastPosY( 0.0 )
, m_LastPosZ( 0.0 )
, m_TimeLastTeleportPacket( 0.f )
+ , m_bBurnable(true)
+ , m_MetaData(NORMAL)
+ , m_FireDamageInterval(0.f)
{
- m_Health = 20;
+ SetMaxHealth(20);
}
cPawn::~cPawn()
@@ -83,14 +91,88 @@ void cPawn::TeleportTo( cEntity* a_Entity )
void cPawn::TeleportTo( const double & a_PosX, const double & a_PosY, const double & a_PosZ )
{
SetPosition( a_PosX, a_PosY, a_PosZ );
+
cPacket_TeleportEntity TeleportEntity( this );
- if( IsA("cPlayer") )
- {
- cPlayer* Player = (cPlayer*)this;
- cRoot::Get()->GetServer()->Broadcast( TeleportEntity, Player->GetClientHandle() );
+
+ cRoot::Get()->GetServer()->Broadcast( TeleportEntity );
+
+}
+
+void cPawn::Tick(float a_Dt)
+{
+ CheckMetaDataBurn(); //Check to see if pawn should burn based on block they are on
+
+ if(GetMetaData() == BURNING)
+ InStateBurning(a_Dt);
+
+}
+
+
+void cPawn::SetMetaData(MetaData a_MetaData)
+{
+ cChunk* InChunk = GetWorld()->GetChunkUnreliable( m_ChunkX, m_ChunkY, m_ChunkZ );
+
+ if(InChunk)
+ { //Broadcast new status to clients in the chunk
+ m_MetaData = a_MetaData;
+ cPacket_Metadata md(a_MetaData, GetUniqueID());
+ InChunk->Broadcast(md);
}
- else
+}
+
+//----Change Entity MetaData
+void cPawn::CheckMetaDataBurn()
+{
+ char Block = GetWorld()->GetBlock((int) m_Pos->x, (int) m_Pos->y, (int) m_Pos->z);
+
+ char BlockAbove = GetWorld()->GetBlock((int) m_Pos->x, (int) m_Pos->y + 1, (int) m_Pos->z);
+ if(GetMetaData() == BURNING
+ && (IsBlockWater(Block)
+ || IsBlockWater(BlockAbove)))
{
- cRoot::Get()->GetServer()->Broadcast( TeleportEntity );
+ SetMetaData(NORMAL);
+ }else if(m_bBurnable && GetMetaData() != BURNING
+ && (IsBlockLava(Block) || Block == E_BLOCK_FIRE
+ || IsBlockLava(BlockAbove) || BlockAbove == E_BLOCK_FIRE)) {
+ SetMetaData(BURNING);
+ }
+}
+
+//What to do if On fire
+void cPawn::InStateBurning(float a_Dt)
+{
+ m_FireDamageInterval += a_Dt;
+ char Block = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y, (int)m_Pos->z );
+ char BlockAbove = GetWorld()->GetBlock( (int)m_Pos->x, (int)m_Pos->y + 1, (int)m_Pos->z );
+ if(m_FireDamageInterval > 800) {
+
+ m_FireDamageInterval = 0;
+ TakeDamage(1, this);
+
+ m_BurnPeriod++;
+ if(IsBlockLava(Block) || Block == E_BLOCK_FIRE
+ || IsBlockLava(BlockAbove) || BlockAbove == E_BLOCK_FIRE) {
+ m_BurnPeriod = 0;
+ TakeDamage(6, this);
+ }else{
+ TakeDamage(1, this);
+ }
+
+ if(m_BurnPeriod > 7) {
+ SetMetaData(NORMAL);
+ m_BurnPeriod = 0;
+
+ }
}
+
}
+
+void cPawn::SetMaxHealth(short a_MaxHealth)
+{
+ this->m_MaxHealth = a_MaxHealth;
+
+ //Reset health
+ m_Health = a_MaxHealth;
+}
+
+
diff --git a/source/cPawn.h b/source/cPawn.h
index 2339bde03..ff90e7276 100644
--- a/source/cPawn.h
+++ b/source/cPawn.h
@@ -18,14 +18,37 @@ public:
virtual void TeleportTo( cEntity* a_Entity ); //tolua_export
virtual void TeleportTo( const double & a_PosX, const double & a_PosY, const double & a_PosZ ); //tolua_export
+ virtual void Tick(float a_Dt);
+
void Heal( int a_Health ); //tolua_export
virtual void TakeDamage( int a_Damage, cEntity* a_Instigator ); //tolua_export
virtual void KilledBy( cEntity* a_Killer ); //tolua_export
int GetHealth() { return m_Health; } //tolua_export
+ enum MetaData {NORMAL, BURNING, CROUCHED, RIDING, SPRINTING, EATING, BLOCKING};
+
+ virtual inline void SetMetaData(MetaData a_MetaData);
+ virtual inline MetaData cPawn::GetMetaData() { return m_MetaData; }
+
+ virtual inline void InStateBurning(float a_Dt);
+
+ virtual void CheckMetaDataBurn();
+
+ virtual inline void SetMaxHealth(short a_MaxHealth);
+ virtual inline short GetMaxHealth() { return m_MaxHealth; }
+
protected:
short m_Health;
+ short m_MaxHealth;
+
+ bool m_bBurnable;
+
+ MetaData m_MetaData;
double m_LastPosX, m_LastPosY, m_LastPosZ;
float m_TimeLastTeleportPacket;
+
+ float m_FireDamageInterval;
+ float m_BurnPeriod;
+
}; //tolua_export
diff --git a/source/cPlayer.cpp b/source/cPlayer.cpp
index aca2879ca..b3d0e74b3 100644
--- a/source/cPlayer.cpp
+++ b/source/cPlayer.cpp
@@ -63,12 +63,10 @@ struct cPlayer::sPlayerState
};
cPlayer::cPlayer(cClientHandle* a_Client, const char* a_PlayerName)
- : m_bBurnable(true)
- , m_GameMode( 0 )
+ : m_GameMode( 0 )
, m_IP("")
, m_LastBlockActionTime( 0 )
, m_LastBlockActionCnt( 0 )
- , e_EPMetaState(NORMAL)
, m_bVisible( true )
, m_LastGroundHeight( 0 )
, m_bTouchGround( false )
@@ -77,12 +75,11 @@ cPlayer::cPlayer(cClientHandle* a_Client, const char* a_PlayerName)
, m_CurrentWindow( 0 )
, m_TimeLastPickupCheck( 0.f )
, m_Color('-')
- , m_FireDamageInterval(0)
- , m_BurnPeriod(0)
, m_ClientHandle( a_Client )
, m_pState( new sPlayerState )
{
m_EntityType = E_PLAYER;
+ SetMaxHealth(20);
m_Inventory = new cInventory( this );
cTimer t1;
m_LastPlayerListTime = t1.GetNowTime();
@@ -154,14 +151,14 @@ void cPlayer::Tick(float a_Dt)
cChunk* InChunk = GetWorld()->GetChunk( m_ChunkX, m_ChunkY, m_ChunkZ );
if( !InChunk ) return;
+ cPawn::Tick(a_Dt);
+
if(m_bDirtyOrientation && !m_bDirtyPosition)
{
cPacket_EntityLook EntityLook( this );
InChunk->Broadcast( EntityLook, m_ClientHandle );
m_bDirtyOrientation = false;
- }
-
- if(m_bDirtyPosition )
+ } else if(m_bDirtyPosition )
{
cRoot::Get()->GetPluginManager()->CallHook( cPluginManager::E_PLUGIN_PLAYER_MOVE, 1, this );
@@ -233,10 +230,6 @@ void cPlayer::Tick(float a_Dt)
Chunk->UnlockEntities();
}
}
- CheckMetaDataBurn();
- if(e_EPMetaState == BURNING){
- InStateBurning(a_Dt);
- }
cTimer t1;
// Send Player List (Once per m_LastPlayerListTime/1000 ms)
@@ -254,61 +247,6 @@ void cPlayer::Tick(float a_Dt)
}
-void cPlayer::InStateBurning(float a_Dt) {
- m_FireDamageInterval += a_Dt;
- char block = GetWorld()->GetBlock( float2int(m_Pos->x), float2int(m_Pos->y), float2int(m_Pos->z) );
- char bblock = GetWorld()->GetBlock( float2int(m_Pos->x), float2int(m_Pos->y)+1, float2int(m_Pos->z) );
- if(m_FireDamageInterval > 800) {
-
- m_FireDamageInterval = 0;
-
- m_BurnPeriod++;
- if(block == E_BLOCK_LAVA || block == E_BLOCK_STATIONARY_LAVA || block == E_BLOCK_FIRE
- || bblock == E_BLOCK_LAVA || bblock == E_BLOCK_STATIONARY_LAVA || bblock == E_BLOCK_FIRE) {
- m_BurnPeriod = 0;
- TakeDamage(6, this);
- }else{
- TakeDamage(1, this);
- }
- if(m_BurnPeriod > 7) {
-
- cChunk* InChunk = GetWorld()->GetChunkUnreliable( m_ChunkX, m_ChunkY, m_ChunkZ );
- e_EPMetaState = NORMAL;
- cPacket_Metadata md(NORMAL, GetUniqueID());
- //md.m_UniqueID = GetUniqueID();
- InChunk->Broadcast(md);
- m_BurnPeriod = 0;
-
- }
-
- }
-
-}
-
-//----Change Entity MetaData
-void cPlayer::CheckMetaDataBurn() {
- char block = GetWorld()->GetBlock( float2int(m_Pos->x), float2int(m_Pos->y), float2int(m_Pos->z) );
- char bblock = GetWorld()->GetBlock( float2int(m_Pos->x), float2int(m_Pos->y)+1, float2int(m_Pos->z) );
- if(e_EPMetaState == BURNING && (block == E_BLOCK_WATER || block == E_BLOCK_STATIONARY_WATER
- || bblock == E_BLOCK_WATER || bblock == E_BLOCK_STATIONARY_WATER)) {
- cChunk* InChunk = GetWorld()->GetChunkUnreliable( m_ChunkX, m_ChunkY, m_ChunkZ );
- if(!InChunk)
- return;
- e_EPMetaState = NORMAL;
- cPacket_Metadata md(NORMAL,GetUniqueID());
- InChunk->Broadcast(md);
- }else if(m_bBurnable && e_EPMetaState != BURNING && (block == E_BLOCK_LAVA || block == E_BLOCK_STATIONARY_LAVA || block == E_BLOCK_FIRE
- || bblock == E_BLOCK_LAVA || bblock == E_BLOCK_STATIONARY_LAVA || bblock == E_BLOCK_FIRE)) {
- cChunk* InChunk = GetWorld()->GetChunkUnreliable( m_ChunkX, m_ChunkY, m_ChunkZ );
- if(!InChunk)
- return;
- printf("I should burn\n");
- e_EPMetaState = BURNING;
- cPacket_Metadata md(BURNING,GetUniqueID());
- InChunk->Broadcast(md);
- }
-}
-
void cPlayer::SetTouchGround( bool a_bTouchGround )
{
m_bTouchGround = a_bTouchGround;
@@ -345,9 +283,9 @@ void cPlayer::SetTouchGround( bool a_bTouchGround )
void cPlayer::Heal( int a_Health )
{
- if( m_Health < 20 )
+ if( m_Health < GetMaxHealth() )
{
- m_Health = (short) MIN(a_Health + m_Health, 20);
+ m_Health = (short) MIN(a_Health + m_Health, GetMaxHealth());
cPacket_UpdateHealth Health;
Health.m_Health = m_Health;
@@ -396,17 +334,27 @@ void cPlayer::KilledBy( cEntity* a_Killer )
void cPlayer::Respawn()
{
- m_Health = 20;
+ m_Health = GetMaxHealth();
// Create Respawn player packet
cPacket_Respawn Packet;
//Set Gamemode for packet by looking at world's gamemode (Need to check players gamemode.)
//Packet.m_CreativeMode = (char)GetWorld()->GetGameMode();
Packet.m_CreativeMode = (char)m_GameMode; //Set GameMode packet based on Player's GameMode;
+
+ //TODO Less hardcoded
+ Packet.m_World = 0;
+
+ Packet.m_MapSeed = GetWorld()->GetWorldSeed();
+
//Send Packet
- e_EPMetaState = NORMAL;
m_ClientHandle->Send( Packet );
+
+ //Set non Burning
+ SetMetaData(NORMAL);
+
TeleportTo( GetWorld()->GetSpawnX(), GetWorld()->GetSpawnY(), GetWorld()->GetSpawnZ() );
+
SetVisible( true );
}
@@ -496,17 +444,16 @@ void cPlayer::SendMessage( const char* a_Message )
m_ClientHandle->Send( cPacket_Chat( a_Message ) );
}
-void cPlayer::TeleportTo( cEntity* a_Entity )
-{
- cPawn::TeleportTo( a_Entity );
- cPacket_PlayerPosition PlayerPosition( this );
- m_ClientHandle->Send( PlayerPosition );
-}
-
void cPlayer::TeleportTo( const double & a_PosX, const double & a_PosY, const double & a_PosZ )
{
- cPawn::TeleportTo( a_PosX, a_PosY, a_PosZ );
+ SetPosition( a_PosX, a_PosY, a_PosZ );
+
+ cPacket_TeleportEntity TeleportEntity( this );
+ cRoot::Get()->GetServer()->Broadcast( TeleportEntity, GetClientHandle() );
+
+
cPacket_PlayerPosition PlayerPosition( this );
+
m_ClientHandle->Send( PlayerPosition );
}
diff --git a/source/cPlayer.h b/source/cPlayer.h
index 621b1031c..b0d446434 100644
--- a/source/cPlayer.h
+++ b/source/cPlayer.h
@@ -28,21 +28,21 @@ public:
inline bool GetFlying() { return m_bTouchGround; } //tolua_export
inline const double & GetStance() { return m_Stance; } //tolua_export
cInventory & GetInventory() { return *m_Inventory; } //tolua_export
- virtual void TeleportTo( cEntity* a_Entity ); //tolua_export
- virtual void TeleportTo( const double & a_PosX, const double & a_PosY, const double & a_PosZ ); //tolua_export
-
- int GetGameMode() { return m_GameMode; } //tolua_export
- std::string GetIP() { return m_IP; } //tolua_export
- float GetLastBlockActionTime() { return m_LastBlockActionTime; } //tolua_export
- int GetLastBlockActionCnt() { return m_LastBlockActionCnt; } //tolua_export
- void SetLastBlockActionCnt( int ); //tolua_export
- void SetLastBlockActionTime(); //tolua_export
- void SetGameMode( int a_GameMode ); //tolua_export
+
+ virtual void TeleportTo( const double & a_PosX, const double & a_PosY, const double & a_PosZ ); //tolua_export
+
+ int GetGameMode() { return m_GameMode; } //tolua_export
+ std::string GetIP() { return m_IP; } //tolua_export
+ float GetLastBlockActionTime() { return m_LastBlockActionTime; } //tolua_export
+ int GetLastBlockActionCnt() { return m_LastBlockActionCnt; } //tolua_export
+ void SetLastBlockActionCnt( int ); //tolua_export
+ void SetLastBlockActionTime(); //tolua_export
+ void SetGameMode( int a_GameMode ); //tolua_export
void LoginSetGameMode( int a_GameMode );
void SetIP( std::string a_IP );
// Tries to move to a new position, with collision checks and stuff
- virtual void MoveTo( const Vector3d & a_NewPos ); //tolua_export
+ virtual void MoveTo( const Vector3d & a_NewPos ); //tolua_export
cWindow* GetWindow() { return m_CurrentWindow; }
void OpenWindow( cWindow* a_Window );
@@ -81,12 +81,7 @@ public:
bool LoadFromDisk();
const char* GetLoadedWorldName();
-
- //Burning logic
- bool m_bBurnable;
- enum PMetaState{NORMAL,BURNING,CROUCHED,RIDING} e_EPMetaState;
- virtual void CheckMetaDataBurn();
- virtual void InStateBurning(float a_Dt);
+
protected:
struct sPlayerState;
@@ -106,8 +101,6 @@ protected:
void ResolveGroups();
char m_Color;
- float m_FireDamageInterval;
- float m_BurnPeriod;
float m_LastBlockActionTime;
int m_LastBlockActionCnt;
diff --git a/source/cSkeleton.cpp b/source/cSkeleton.cpp
index ea1fd5a77..77a0984de 100644
--- a/source/cSkeleton.cpp
+++ b/source/cSkeleton.cpp
@@ -22,8 +22,8 @@ void cSkeleton::Tick(float a_Dt)
//TODO Outsource
//TODO should do lightcheck, not daylight -> mobs in the dark donīt burn
- if (GetWorld()->GetWorldTime() < (12000 + 1000) ) { //if daylight
- m_EMMetaState = BURNING; // BURN, BABY, BURN! >:D
+ if (GetWorld()->GetWorldTime() < (12000 + 1000) && GetMetaData() != BURNING ) { //if daylight
+ SetMetaData(BURNING); // BURN, BABY, BURN! >:D
}
}
diff --git a/source/cSquid.cpp b/source/cSquid.cpp
index af4b167f2..7ff964ce5 100644
--- a/source/cSquid.cpp
+++ b/source/cSquid.cpp
@@ -35,16 +35,9 @@ void cSquid::Tick(float a_Dt)
//TODO Not a real behavior, but cool :D
- if(!IsBlockWater(GetWorld()->GetBlock(Pos.x, Pos.y, Pos.z)))
+ if(!IsBlockWater(GetWorld()->GetBlock((int) Pos.x, (int) Pos.y, (int) Pos.z)) && GetMetaData() != BURNING)
{
- //Die slowly Muhahaha :D (To prevent all this squids on the land :D)
- m_NoWater += a_Dt;
-
- if(m_NoWater > 1000.f)
- {
- m_NoWater -= 1000.f;
- TakeDamage(1, this);
- }
+ SetMetaData(BURNING);
}
} \ No newline at end of file
diff --git a/source/cZombie.cpp b/source/cZombie.cpp
index 4530cc42f..62ba163e4 100644
--- a/source/cZombie.cpp
+++ b/source/cZombie.cpp
@@ -21,8 +21,8 @@ void cZombie::Tick(float a_Dt)
cMonster::Tick(a_Dt);
//TODO Same as in cSkeleton :D
- if (GetWorld()->GetWorldTime() < (12000 + 1000) ) { //if daylight
- m_EMMetaState = BURNING; // BURN, BABY, BURN! >:D
+ if (GetWorld()->GetWorldTime() < (12000 + 1000) && GetMetaData() != BURNING) { //if daylight
+ SetMetaData(BURNING); // BURN, BABY, BURN! >:D
}
}
diff --git a/source/cZombiepigman.cpp b/source/cZombiepigman.cpp
index 51e817a2b..95a78a4f2 100644
--- a/source/cZombiepigman.cpp
+++ b/source/cZombiepigman.cpp
@@ -20,9 +20,9 @@ void cZombiepigman::Tick(float a_Dt)
{
cMonster::Tick(a_Dt);
- //TODO Same as noticed in cSkeleton AND Do they really burn? :D In the neather there is no sun :D
- if (GetWorld()->GetWorldTime() < (12000 + 1000) ) { //if daylight
- m_EMMetaState = BURNING; // BURN, BABY, BURN! >:D
+ //TODO Same as noticed in cSkeleton AND Do they really burn by sun?? :D In the neather is no sun :D
+ if (GetWorld()->GetWorldTime() < (12000 + 1000) && GetMetaData() != BURNING ) { //if daylight
+ SetMetaData(BURNING); // BURN, BABY, BURN! >:D
}
}
diff --git a/source/packets/cPacket_Metadata.cpp b/source/packets/cPacket_Metadata.cpp
index 3d3df3b9c..d06bdacbe 100644
--- a/source/packets/cPacket_Metadata.cpp
+++ b/source/packets/cPacket_Metadata.cpp
@@ -1,7 +1,7 @@
#include "cPacket_Metadata.h"
cPacket_Metadata::cPacket_Metadata(int s, int id)
- : EMetaState( (MetaState)s )
+ : m_EMetaData( (cPawn::MetaData)s )
, m_UniqueID( id )
, m_Type( 0 )
, m_MetaData( 0 )
@@ -11,12 +11,12 @@ cPacket_Metadata::cPacket_Metadata(int s, int id)
}
cPacket_Metadata::cPacket_Metadata()
- : EMetaState(NORMAL)
- , m_UniqueID( 0 )
+ : m_UniqueID( 0 )
, m_Type( 0 )
, m_MetaData( 0 )
{
m_PacketID = E_METADATA;
+ m_EMetaData = cPawn::NORMAL;
FormPacket();
}
@@ -30,21 +30,28 @@ void cPacket_Metadata::FormPacket() {
m_MetaDataSize = 3;
//m_UniqueID = GetUniqueID();
m_MetaData[0] = 0x00;
- //m_MetaData[1] = 0x01; //Burning
+
m_MetaData[2] = 0x7f;
- switch(EMetaState) {
- case NORMAL:
+ switch(m_EMetaData) {
+ case cPawn::NORMAL:
m_MetaData[1] = 0x00;
break;
- case BURNING:
+ case cPawn::BURNING:
m_MetaData[1] = 0x01;
break;
- case CROUCHED:
+ case cPawn::CROUCHED:
m_MetaData[1] = 0x02;
break;
- case RIDING:
+ case cPawn::RIDING:
m_MetaData[1] = 0x04;
break;
+ case cPawn::SPRINTING:
+ m_MetaData[1] = 0x08;
+ break;
+ case cPawn::EATING:
+ case cPawn::BLOCKING:
+ m_MetaData[1] = 0x10;
+ break;
default:
m_MetaData[1] = 0x00;
break;
diff --git a/source/packets/cPacket_Metadata.h b/source/packets/cPacket_Metadata.h
index f96178a2c..00d0ae7d3 100644
--- a/source/packets/cPacket_Metadata.h
+++ b/source/packets/cPacket_Metadata.h
@@ -1,6 +1,7 @@
#pragma once
#include "cPacket.h"
#include "PacketID.h"
+#include "cPawn.h"
class cPacket_Metadata : public cPacket
{
@@ -13,7 +14,7 @@ public:
void FormPacket();
virtual cPacket* Clone() const { return new cPacket_Metadata( *this ); }
- enum MetaState{NORMAL,BURNING,CROUCHED,RIDING} EMetaState;
+ cPawn::MetaData m_EMetaData;
static const unsigned int c_Size = 4 + 1;
int m_UniqueID;