Merge branch 'master' into PreventNewWarnings
Conflicts: src/Entities/ArrowEntity.cpp
This commit is contained in:
commit
4956e8700d
@ -15,7 +15,7 @@
|
||||
<ul>
|
||||
<li><a href="#Introduction">Introduction</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="#ConsoleCommands">ConsoleCommands 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",
|
||||
|
||||
-- The following members will be documented in greater detail later:
|
||||
AdditionalInformation = {},
|
||||
AdditionalInfo = {},
|
||||
Commands = {},
|
||||
ConsoleCommands = {},
|
||||
Permissions = {},
|
||||
@ -63,13 +63,13 @@ g_PluginInfo =
|
||||
|
||||
|
||||
<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>The table should have the following layout:</p>
|
||||
<pre class="prettyprint lang-lua">
|
||||
AdditionalInformation =
|
||||
AdditionalInfo =
|
||||
{
|
||||
{
|
||||
Title = "Chapter 1",
|
||||
|
@ -33,15 +33,17 @@ function HandleDumpPluginRequest(a_Request)
|
||||
</tr>]]
|
||||
|
||||
-- Loop through each plugin that is found.
|
||||
for PluginName, k in pairs(cPluginManager:Get():GetAllPlugins()) do
|
||||
-- Check if there is a file called 'Info.lua' or 'info.lua'
|
||||
if (cFile:Exists("Plugins/" .. PluginName .. "/Info.lua")) then
|
||||
cPluginManager:Get():ForEachPlugin(
|
||||
function(a_Plugin)
|
||||
-- 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 .. "\t<td>" .. PluginName .. "</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>" .. a_Plugin:GetName() .. "</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"
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
Content = Content .. [[
|
||||
</table>]]
|
||||
|
@ -85,7 +85,6 @@ if [[ $MISSING_PROGRAMS != "" ]]; then
|
||||
missingDepsExit
|
||||
fi
|
||||
|
||||
exit
|
||||
# Echo: Branch choice.
|
||||
echo
|
||||
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
|
||||
{
|
||||
SendDisconnect("Nooooo!! You timed out! D: Come back!");
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_Player == nullptr)
|
||||
@ -2013,7 +2013,6 @@ void cClientHandle::ServerTick(float a_Dt)
|
||||
if (m_TicksSinceLastPacket > 600) // 30 seconds
|
||||
{
|
||||
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());
|
||||
m_Protocol->SendDisconnect(a_Reason);
|
||||
Destroy();
|
||||
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:
|
||||
LOGERROR("Too much data in queue for client \"%s\" @ %s, kicking them.", m_Username.c_str(), m_IPString.c_str());
|
||||
SendDisconnect("Server busy");
|
||||
Destroy();
|
||||
}
|
||||
|
||||
|
||||
@ -2936,7 +2935,6 @@ void cClientHandle::PacketUnknown(UInt32 a_PacketType)
|
||||
AString Reason;
|
||||
Printf(Reason, "Unknown [C->S] PacketType: 0x%x", a_PacketType);
|
||||
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());
|
||||
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());
|
||||
cRoot::Get()->GetPluginManager()->CallHookDisconnect(*this, "Player disconnected");
|
||||
}
|
||||
if (m_State < csDestroying)
|
||||
if ((m_State < csDestroying) && (m_Player != nullptr))
|
||||
{
|
||||
cWorld * World = m_Player->GetWorld();
|
||||
if (World != nullptr)
|
||||
|
@ -115,7 +115,7 @@ void cArrowEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos)
|
||||
Damage += ExtraDamage;
|
||||
}
|
||||
|
||||
int KnockbackAmount = 1;
|
||||
// int KnockbackAmount = 1;
|
||||
unsigned int PunchLevel = m_CreatorData.m_Enchantments.GetLevel(cEnchantments::enchPunch);
|
||||
if (PunchLevel > 0)
|
||||
{
|
||||
@ -130,7 +130,8 @@ void cArrowEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos)
|
||||
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())
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
|
||||
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)
|
||||
StopMovingToPosition();
|
||||
Attack(a_Dt);
|
||||
}
|
||||
}
|
||||
|
@ -517,8 +517,15 @@ void cMonster::SetPitchAndYawFromDestination()
|
||||
}
|
||||
|
||||
|
||||
|
||||
Vector3d BodyDistance = m_NextWayPointPosition - GetPosition();
|
||||
Vector3d BodyDistance;
|
||||
if (!m_IsFollowingPath && (m_Target != nullptr))
|
||||
{
|
||||
BodyDistance = m_Target->GetPosition() - GetPosition();
|
||||
}
|
||||
else
|
||||
{
|
||||
BodyDistance = m_NextWayPointPosition - GetPosition();
|
||||
}
|
||||
double BodyRotation, BodyPitch;
|
||||
BodyDistance.Normalize();
|
||||
VectorToEuler(BodyDistance.x, BodyDistance.y, BodyDistance.z, BodyRotation, BodyPitch);
|
||||
|
@ -193,13 +193,16 @@ protected:
|
||||
If no suitable position is found, returns cChunkDef::Height. */
|
||||
int FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ);
|
||||
|
||||
/** Returns if the ultimate, final destination has been reached */
|
||||
bool ReachedFinalDestination(void) { return ((m_FinalDestination - GetPosition()).SqrLength() < (m_AttackRange * m_AttackRange)); }
|
||||
/** Returns if the ultimate, final destination has been reached. */
|
||||
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 */
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
cFastRandom Random;
|
||||
m_AttackInterval += (static_cast<float>(a_Dt.count()) / 1000) * m_AttackRate;
|
||||
if ((m_Target != nullptr) && (m_AttackInterval > 3.0))
|
||||
{
|
||||
// Setting this higher gives us more wiggle room for attackrate
|
||||
Vector3d Speed = GetLookVector() * 20;
|
||||
Speed.y = Speed.y + 1;
|
||||
Vector3d Inaccuracy = Vector3d(Random.NextFloat(0.5) - 0.25, Random.NextFloat(0.5) - 0.25, Random.NextFloat(0.5) - 0.25);
|
||||
Vector3d Speed = (m_Target->GetPosition() + Inaccuracy - GetPosition()) * 5;
|
||||
Speed.y = Speed.y - 1 + Random.NextInt(3);
|
||||
cArrowEntity * Arrow = new cArrowEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
|
||||
if (Arrow == nullptr)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user