Merge branch 'master' into PreventNewWarnings
Conflicts: src/Entities/ArrowEntity.cpp
This commit is contained in:
commit
4956e8700d
@ -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",
|
||||||
|
@ -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>]]
|
||||||
|
@ -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:"
|
||||||
|
@ -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)
|
||||||
|
@ -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())
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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));
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user