Merge pull request #461 from mc-server/repeaters
Repeaters, pressure plates, and others
This commit is contained in:
+21
-4
@@ -13,6 +13,7 @@
|
||||
#include "../Bindings/PluginManager.h"
|
||||
#include "../Tracer.h"
|
||||
#include "Minecart.h"
|
||||
#include "Player.h"
|
||||
|
||||
|
||||
|
||||
@@ -239,10 +240,14 @@ void cEntity::TakeDamage(eDamageType a_DamageType, cEntity * a_Attacker, int a_R
|
||||
TDI.Attacker = a_Attacker;
|
||||
TDI.RawDamage = a_RawDamage;
|
||||
TDI.FinalDamage = a_FinalDamage;
|
||||
Vector3d Heading;
|
||||
Heading.x = sin(GetRotation());
|
||||
Heading.y = 0.4; // TODO: adjust the amount of "up" knockback when testing
|
||||
Heading.z = cos(GetRotation());
|
||||
|
||||
Vector3d Heading(0, 0, 0);
|
||||
if (a_Attacker != NULL)
|
||||
{
|
||||
Heading = a_Attacker->GetLookVector() * (a_Attacker->IsSprinting() ? 10 : 8);
|
||||
}
|
||||
Heading.y = 2;
|
||||
|
||||
TDI.Knockback = Heading * a_KnockbackAmount;
|
||||
DoTakeDamage(TDI);
|
||||
}
|
||||
@@ -297,6 +302,16 @@ void cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
|
||||
return;
|
||||
}
|
||||
|
||||
if ((a_TDI.Attacker != NULL) && (a_TDI.Attacker->IsPlayer()))
|
||||
{
|
||||
// IsOnGround() only is false if the player is moving downwards
|
||||
if (!((cPlayer *)a_TDI.Attacker)->IsOnGround()) // TODO: Better damage increase, and check for enchantments (and use magic critical instead of plain)
|
||||
{
|
||||
a_TDI.FinalDamage += 2;
|
||||
m_World->BroadcastEntityAnimation(*this, 4); // Critical hit
|
||||
}
|
||||
}
|
||||
|
||||
m_Health -= (short)a_TDI.FinalDamage;
|
||||
|
||||
// TODO: Apply damage to armor
|
||||
@@ -306,6 +321,8 @@ void cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
|
||||
m_Health = 0;
|
||||
}
|
||||
|
||||
AddSpeed(a_TDI.Knockback * 2);
|
||||
|
||||
m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_HURT);
|
||||
|
||||
if (m_Health <= 0)
|
||||
|
||||
+20
-3
@@ -252,6 +252,11 @@ void cPlayer::Tick(float a_Dt, cChunk & a_Chunk)
|
||||
m_World->SendPlayerList(this);
|
||||
m_LastPlayerListTime = t1.GetNowTime();
|
||||
}
|
||||
|
||||
if (IsFlying())
|
||||
{
|
||||
m_LastGroundHeight = (float)GetPosY();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -452,10 +457,16 @@ void cPlayer::SetTouchGround(bool a_bTouchGround)
|
||||
if (m_LastJumpHeight > m_LastGroundHeight) Damage++;
|
||||
m_LastJumpHeight = (float)GetPosY();
|
||||
|
||||
if ((Damage > 0) && (!IsGameModeCreative()))
|
||||
if (Damage > 0)
|
||||
{
|
||||
TakeDamage(dtFalling, NULL, Damage, Damage, 0);
|
||||
}
|
||||
if (!IsGameModeCreative())
|
||||
{
|
||||
TakeDamage(dtFalling, NULL, Damage, Damage, 0);
|
||||
}
|
||||
|
||||
// Mojang uses floor() to get X and Z positions, instead of just casting it to an (int)
|
||||
GetWorld()->BroadcastSoundParticleEffect(2006, (int)floor(GetPosX()), (int)GetPosY() - 1, (int)floor(GetPosZ()), Damage /* Used as particle effect speed modifier */);
|
||||
}
|
||||
|
||||
m_LastGroundHeight = (float)GetPosY();
|
||||
}
|
||||
@@ -979,6 +990,12 @@ void cPlayer::SetGameMode(eGameMode a_GameMode)
|
||||
|
||||
m_GameMode = a_GameMode;
|
||||
m_ClientHandle->SendGameMode(a_GameMode);
|
||||
|
||||
if (!IsGameModeCreative())
|
||||
{
|
||||
SetFlying(false);
|
||||
SetCanFly(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user