1
0

Merge branch 'master' into PreventNewWarnings

Conflicts:
	src/Entities/ArrowEntity.cpp
This commit is contained in:
tycho 2015-05-29 00:12:56 +01:00
commit 4956e8700d
9 changed files with 43 additions and 32 deletions

View File

@ -15,7 +15,7 @@
<ul> <ul>
<li><a href="#Introduction">Introduction</a></li> <li><a href="#Introduction">Introduction</a></li>
<li><a href="#Overall">The overall structure</a></li> <li><a href="#Overall">The overall structure</a></li>
<li><a href="#AdditionalInformation">AdditionalInformation table</a></li> <li><a href="#AdditionalInfo">AdditionalInfo table</a></li>
<li><a href="#Commands">Commands table</a></li> <li><a href="#Commands">Commands table</a></li>
<li><a href="#ConsoleCommands">ConsoleCommands table</a></li> <li><a href="#ConsoleCommands">ConsoleCommands table</a></li>
<li><a href="#Permissions">Permissions table</a></li> <li><a href="#Permissions">Permissions table</a></li>
@ -51,7 +51,7 @@ g_PluginInfo =
Description = "This is an example plugin that shows how to use the Info.lua file", Description = "This is an example plugin that shows how to use the Info.lua file",
-- The following members will be documented in greater detail later: -- The following members will be documented in greater detail later:
AdditionalInformation = {}, AdditionalInfo = {},
Commands = {}, Commands = {},
ConsoleCommands = {}, ConsoleCommands = {},
Permissions = {}, Permissions = {},
@ -63,13 +63,13 @@ g_PluginInfo =
<hr /> <hr />
<a name="AdditionalInformation"><h2>AdditionalInformation table</h2></a> <a name="AdditionalInfo"><h2>AdditionalInfo table</h2></a>
<p>This table is used for more detailed description of the plugin. If there is any non-trivial setup process, dependencies, describe them here. This is where the description should get detailed. Don't worry about using several paragraphs of text here, if it makes the plugin easier to understand.</p> <p>This table is used for more detailed description of the plugin. If there is any non-trivial setup process, dependencies, describe them here. This is where the description should get detailed. Don't worry about using several paragraphs of text here, if it makes the plugin easier to understand.</p>
<p>The table should have the following layout:</p> <p>The table should have the following layout:</p>
<pre class="prettyprint lang-lua"> <pre class="prettyprint lang-lua">
AdditionalInformation = AdditionalInfo =
{ {
{ {
Title = "Chapter 1", Title = "Chapter 1",

View File

@ -33,15 +33,17 @@ function HandleDumpPluginRequest(a_Request)
</tr>]] </tr>]]
-- Loop through each plugin that is found. -- Loop through each plugin that is found.
for PluginName, k in pairs(cPluginManager:Get():GetAllPlugins()) do cPluginManager:Get():ForEachPlugin(
-- Check if there is a file called 'Info.lua' or 'info.lua' function(a_Plugin)
if (cFile:Exists("Plugins/" .. PluginName .. "/Info.lua")) then -- Check if there is a file called 'Info.lua'
if (cFile:Exists("Plugins/" .. a_Plugin:GetName() .. "/Info.lua")) then
Content = Content .. "\n<tr>\n" Content = Content .. "\n<tr>\n"
Content = Content .. "\t<td>" .. PluginName .. "</td>\n" Content = Content .. "\t<td>" .. a_Plugin:GetName() .. "</td>\n"
Content = Content .. "\t<td><form method='POST'> <input type='hidden' value='" .. PluginName .. "' name='DumpInfo'> <input type='submit' value='DumpInfo'></form></td>\n" Content = Content .. "\t<td><form method='POST'> <input type='hidden' value='" .. a_Plugin:GetName() .. "' name='DumpInfo'> <input type='submit' value='DumpInfo'></form></td>\n"
Content = Content .. "</tr>\n" Content = Content .. "</tr>\n"
end end
end end
)
Content = Content .. [[ Content = Content .. [[
</table>]] </table>]]

View File

@ -85,7 +85,6 @@ if [[ $MISSING_PROGRAMS != "" ]]; then
missingDepsExit missingDepsExit
fi fi
exit
# Echo: Branch choice. # Echo: Branch choice.
echo echo
echo "You can choose between 2 branches:" echo "You can choose between 2 branches:"

View File

@ -1902,7 +1902,7 @@ void cClientHandle::Tick(float a_Dt)
if (m_TicksSinceLastPacket > 600) // 30 seconds time-out if (m_TicksSinceLastPacket > 600) // 30 seconds time-out
{ {
SendDisconnect("Nooooo!! You timed out! D: Come back!"); SendDisconnect("Nooooo!! You timed out! D: Come back!");
Destroy(); return;
} }
if (m_Player == nullptr) if (m_Player == nullptr)
@ -2013,7 +2013,6 @@ void cClientHandle::ServerTick(float a_Dt)
if (m_TicksSinceLastPacket > 600) // 30 seconds if (m_TicksSinceLastPacket > 600) // 30 seconds
{ {
SendDisconnect("Nooooo!! You timed out! D: Come back!"); SendDisconnect("Nooooo!! You timed out! D: Come back!");
Destroy();
} }
} }
@ -2186,6 +2185,7 @@ void cClientHandle::SendDisconnect(const AString & a_Reason)
{ {
LOGD("Sending a DC: \"%s\"", StripColorCodes(a_Reason).c_str()); LOGD("Sending a DC: \"%s\"", StripColorCodes(a_Reason).c_str());
m_Protocol->SendDisconnect(a_Reason); m_Protocol->SendDisconnect(a_Reason);
Destroy();
m_HasSentDC = true; m_HasSentDC = true;
} }
} }
@ -2922,7 +2922,6 @@ void cClientHandle::PacketBufferFull(void)
// Too much data in the incoming queue, the server is probably too busy, kick the client: // Too much data in the incoming queue, the server is probably too busy, kick the client:
LOGERROR("Too much data in queue for client \"%s\" @ %s, kicking them.", m_Username.c_str(), m_IPString.c_str()); LOGERROR("Too much data in queue for client \"%s\" @ %s, kicking them.", m_Username.c_str(), m_IPString.c_str());
SendDisconnect("Server busy"); SendDisconnect("Server busy");
Destroy();
} }
@ -2936,7 +2935,6 @@ void cClientHandle::PacketUnknown(UInt32 a_PacketType)
AString Reason; AString Reason;
Printf(Reason, "Unknown [C->S] PacketType: 0x%x", a_PacketType); Printf(Reason, "Unknown [C->S] PacketType: 0x%x", a_PacketType);
SendDisconnect(Reason); SendDisconnect(Reason);
Destroy();
} }
@ -2947,7 +2945,6 @@ void cClientHandle::PacketError(UInt32 a_PacketType)
{ {
LOGERROR("Protocol error while parsing packet type 0x%02x; disconnecting client \"%s\"", a_PacketType, m_Username.c_str()); LOGERROR("Protocol error while parsing packet type 0x%02x; disconnecting client \"%s\"", a_PacketType, m_Username.c_str());
SendDisconnect("Protocol error"); SendDisconnect("Protocol error");
Destroy();
} }
@ -2963,7 +2960,7 @@ void cClientHandle::SocketClosed(void)
LOGD("Client %s @ %s disconnected", m_Username.c_str(), m_IPString.c_str()); LOGD("Client %s @ %s disconnected", m_Username.c_str(), m_IPString.c_str());
cRoot::Get()->GetPluginManager()->CallHookDisconnect(*this, "Player disconnected"); cRoot::Get()->GetPluginManager()->CallHookDisconnect(*this, "Player disconnected");
} }
if (m_State < csDestroying) if ((m_State < csDestroying) && (m_Player != nullptr))
{ {
cWorld * World = m_Player->GetWorld(); cWorld * World = m_Player->GetWorld();
if (World != nullptr) if (World != nullptr)

View File

@ -115,7 +115,7 @@ void cArrowEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos)
Damage += ExtraDamage; Damage += ExtraDamage;
} }
int KnockbackAmount = 1; // int KnockbackAmount = 1;
unsigned int PunchLevel = m_CreatorData.m_Enchantments.GetLevel(cEnchantments::enchPunch); unsigned int PunchLevel = m_CreatorData.m_Enchantments.GetLevel(cEnchantments::enchPunch);
if (PunchLevel > 0) if (PunchLevel > 0)
{ {
@ -130,7 +130,8 @@ void cArrowEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos)
a_EntityHit.SetSpeed(FinalSpeed); a_EntityHit.SetSpeed(FinalSpeed);
} }
a_EntityHit.TakeDamage(dtRangedAttack, this, Damage, KnockbackAmount); // a_EntityHit.TakeDamage(dtRangedAttack, this, Damage, KnockbackAmount); // TODO fix knockback.
a_EntityHit.TakeDamage(dtRangedAttack, this, Damage, 0); // Until knockback is fixed.
if (IsOnFire() && !a_EntityHit.IsSubmerged() && !a_EntityHit.IsSwimming()) if (IsOnFire() && !a_EntityHit.IsSubmerged() && !a_EntityHit.IsSwimming())
{ {

View File

@ -80,9 +80,10 @@ void cAggressiveMonster::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
Vector3d AttackDirection(m_Target->GetPosition() + Vector3d(0, m_Target->GetHeight(), 0) - MyHeadPosition); Vector3d AttackDirection(m_Target->GetPosition() + Vector3d(0, m_Target->GetHeight(), 0) - MyHeadPosition);
if (ReachedFinalDestination() && !LineOfSight.Trace(MyHeadPosition, AttackDirection, static_cast<int>(AttackDirection.Length()))) if (TargetIsInRange() && !LineOfSight.Trace(MyHeadPosition, AttackDirection, static_cast<int>(AttackDirection.Length())))
{ {
// Attack if reached destination, target isn't null, and have a clear line of sight to target (so won't attack through walls) // Attack if reached destination, target isn't null, and have a clear line of sight to target (so won't attack through walls)
StopMovingToPosition();
Attack(a_Dt); Attack(a_Dt);
} }
} }

View File

@ -517,8 +517,15 @@ void cMonster::SetPitchAndYawFromDestination()
} }
Vector3d BodyDistance;
Vector3d BodyDistance = m_NextWayPointPosition - GetPosition(); if (!m_IsFollowingPath && (m_Target != nullptr))
{
BodyDistance = m_Target->GetPosition() - GetPosition();
}
else
{
BodyDistance = m_NextWayPointPosition - GetPosition();
}
double BodyRotation, BodyPitch; double BodyRotation, BodyPitch;
BodyDistance.Normalize(); BodyDistance.Normalize();
VectorToEuler(BodyDistance.x, BodyDistance.y, BodyDistance.z, BodyRotation, BodyPitch); VectorToEuler(BodyDistance.x, BodyDistance.y, BodyDistance.z, BodyRotation, BodyPitch);

View File

@ -193,13 +193,16 @@ protected:
If no suitable position is found, returns cChunkDef::Height. */ If no suitable position is found, returns cChunkDef::Height. */
int FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ); int FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ);
/** Returns if the ultimate, final destination has been reached */ /** Returns if the ultimate, final destination has been reached. */
bool ReachedFinalDestination(void) { return ((m_FinalDestination - GetPosition()).SqrLength() < (m_AttackRange * m_AttackRange)); } bool ReachedFinalDestination(void) { return ((m_FinalDestination - GetPosition()).Length() < GetWidth()/2); }
/** Returns whether or not the target is close enough for attack. */
bool TargetIsInRange(void) { return ((m_FinalDestination - GetPosition()).SqrLength() < (m_AttackRange * m_AttackRange)); }
/** Returns if the intermediate waypoint of m_NextWayPointPosition has been reached */ /** Returns if the intermediate waypoint of m_NextWayPointPosition has been reached */
bool ReachedNextWaypoint(void) { return ((m_NextWayPointPosition - GetPosition()).SqrLength() < 0.25); } bool ReachedNextWaypoint(void) { return ((m_NextWayPointPosition - GetPosition()).SqrLength() < 0.25); }
/** Returns if a monster can reach a given height by jumping */ /** Returns if a monster can reach a given height by jumping. */
inline bool DoesPosYRequireJump(int a_PosY) inline bool DoesPosYRequireJump(int a_PosY)
{ {
return ((a_PosY > POSY_TOINT) && (a_PosY == POSY_TOINT + 1)); return ((a_PosY > POSY_TOINT) && (a_PosY == POSY_TOINT + 1));

View File

@ -50,12 +50,13 @@ void cSkeleton::GetDrops(cItems & a_Drops, cEntity * a_Killer)
void cSkeleton::Attack(std::chrono::milliseconds a_Dt) void cSkeleton::Attack(std::chrono::milliseconds a_Dt)
{ {
cFastRandom Random;
m_AttackInterval += (static_cast<float>(a_Dt.count()) / 1000) * m_AttackRate; m_AttackInterval += (static_cast<float>(a_Dt.count()) / 1000) * m_AttackRate;
if ((m_Target != nullptr) && (m_AttackInterval > 3.0)) if ((m_Target != nullptr) && (m_AttackInterval > 3.0))
{ {
// Setting this higher gives us more wiggle room for attackrate Vector3d Inaccuracy = Vector3d(Random.NextFloat(0.5) - 0.25, Random.NextFloat(0.5) - 0.25, Random.NextFloat(0.5) - 0.25);
Vector3d Speed = GetLookVector() * 20; Vector3d Speed = (m_Target->GetPosition() + Inaccuracy - GetPosition()) * 5;
Speed.y = Speed.y + 1; Speed.y = Speed.y - 1 + Random.NextInt(3);
cArrowEntity * Arrow = new cArrowEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed); cArrowEntity * Arrow = new cArrowEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
if (Arrow == nullptr) if (Arrow == nullptr)
{ {