Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Noudess 2019-04-12 10:35:10 -04:00
commit f18b9c99b5
5 changed files with 58 additions and 59 deletions

View File

@ -307,13 +307,11 @@ namespace EQEmu
} // namespace bug } // namespace bug
namespace waypoints {
enum WaypointStatus : int { enum WaypointStatus : int {
wpsRoamBoxPauseInProgress = -3, RoamBoxPauseInProgress = -3,
wpsQuestControlNoGrid = -2, QuestControlNoGrid = -2,
wpsQuestControlGrid = -1 QuestControlGrid = -1
}; };
} // waypoint_status behavior
} /*EQEmu*/ } /*EQEmu*/

View File

@ -1092,7 +1092,7 @@ public:
inline glm::vec4 GetCurrentWayPoint() const { return m_CurrentWayPoint; } inline glm::vec4 GetCurrentWayPoint() const { return m_CurrentWayPoint; }
inline float GetCWPP() const { return(static_cast<float>(cur_wp_pause)); } inline float GetCWPP() const { return(static_cast<float>(cur_wp_pause)); }
inline int GetCWP() const { return(cur_wp); } inline int GetCWP() const { return(cur_wp); }
void SetCurrentWP(uint16 waypoint) { cur_wp = waypoint; } void SetCurrentWP(int waypoint) { cur_wp = waypoint; }
virtual FACTION_VALUE GetReverseFactionCon(Mob* iOther) { return FACTION_INDIFFERENT; } virtual FACTION_VALUE GetReverseFactionCon(Mob* iOther) { return FACTION_INDIFFERENT; }
virtual const bool IsUnderwaterOnly() const { return false; } virtual const bool IsUnderwaterOnly() const { return false; }

View File

@ -1572,14 +1572,12 @@ void NPC::AI_DoMovement() {
/** /**
* Roambox logic sets precedence * Roambox logic sets precedence
*/ */
using EQEmu::waypoints::WaypointStatus;
if (roambox_distance > 0) { if (roambox_distance > 0) {
// Check if we're already moving to a WP // Check if we're already moving to a WP
// If so, if we're not moving we have arrived and need to set delay // If so, if we're not moving we have arrived and need to set delay
if (GetCWP() == WaypointStatus::wpsRoamBoxPauseInProgress && !IsMoving()) { if (GetCWP() == EQEmu::WaypointStatus::RoamBoxPauseInProgress && !IsMoving()) {
// We have arrived // We have arrived
time_until_can_move = Timer::GetCurrentTime() + RandomTimer(roambox_min_delay, roambox_delay); time_until_can_move = Timer::GetCurrentTime() + RandomTimer(roambox_min_delay, roambox_delay);
SetCurrentWP(0); SetCurrentWP(0);
@ -1657,7 +1655,7 @@ void NPC::AI_DoMovement() {
roambox_destination_y); roambox_destination_y);
Log(Logs::Detail, Logs::NPCRoamBox, "Dest Z is (%f)", roambox_destination_z); Log(Logs::Detail, Logs::NPCRoamBox, "Dest Z is (%f)", roambox_destination_z);
SetCurrentWP(WaypointStatus::wpsRoamBoxPauseInProgress); SetCurrentWP(EQEmu::WaypointStatus::RoamBoxPauseInProgress);
NavigateTo(roambox_destination_x, roambox_destination_y, roambox_destination_z); NavigateTo(roambox_destination_x, roambox_destination_y, roambox_destination_z);
} }
@ -1671,7 +1669,7 @@ void NPC::AI_DoMovement() {
int32 gridno = CastToNPC()->GetGrid(); int32 gridno = CastToNPC()->GetGrid();
if (gridno > 0 || cur_wp == WaypointStatus::wpsQuestControlNoGrid) { if (gridno > 0 || cur_wp == EQEmu::WaypointStatus::QuestControlNoGrid) {
if (pause_timer_complete == true) { // time to pause at wp is over if (pause_timer_complete == true) { // time to pause at wp is over
AI_SetupNextWaypoint(); AI_SetupNextWaypoint();
} // endif (pause_timer_complete==true) } // endif (pause_timer_complete==true)
@ -1703,7 +1701,7 @@ void NPC::AI_DoMovement() {
// as that is where roamer is unset and we don't want // as that is where roamer is unset and we don't want
// the next trip through to move again based on grid stuff. // the next trip through to move again based on grid stuff.
doMove = false; doMove = false;
if (cur_wp == WaypointStatus::wpsQuestControlNoGrid) { if (cur_wp == EQEmu::WaypointStatus::QuestControlNoGrid) {
AI_SetupNextWaypoint(); AI_SetupNextWaypoint();
} }
@ -1802,10 +1800,8 @@ void NPC::AI_SetupNextWaypoint() {
pause_timer_complete = false; pause_timer_complete = false;
Log(Logs::Detail, Logs::Pathing, "We are departing waypoint %d.", cur_wp); Log(Logs::Detail, Logs::Pathing, "We are departing waypoint %d.", cur_wp);
using EQEmu::waypoints::WaypointStatus;
//if we were under quest control (with no grid), we are done now.. //if we were under quest control (with no grid), we are done now..
if (cur_wp == WaypointStatus::wpsQuestControlNoGrid) { if (cur_wp == EQEmu::WaypointStatus::QuestControlNoGrid) {
Log(Logs::Detail, Logs::Pathing, "Non-grid quest mob has reached its quest ordered waypoint. Leaving pathing mode."); Log(Logs::Detail, Logs::Pathing, "Non-grid quest mob has reached its quest ordered waypoint. Leaving pathing mode.");
roamer = false; roamer = false;
cur_wp = 0; cur_wp = 0;

View File

@ -4206,7 +4206,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
{ {
if(GetSpecialAbility(UNMEZABLE)) { if(GetSpecialAbility(UNMEZABLE)) {
Log(Logs::Detail, Logs::Spells, "We are immune to Mez spells."); Log(Logs::Detail, Logs::Spells, "We are immune to Mez spells.");
caster->Message_StringID(MT_Shout, CANNOT_MEZ); caster->Message_StringID(MT_SpellFailure, CANNOT_MEZ);
int32 aggro = caster->CheckAggroAmount(spell_id, this); int32 aggro = caster->CheckAggroAmount(spell_id, this);
if(aggro > 0) { if(aggro > 0) {
AddToHateList(caster, aggro); AddToHateList(caster, aggro);
@ -4224,7 +4224,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
(!caster->IsNPC() || (caster->IsNPC() && !RuleB(Spells, NPCIgnoreBaseImmunity)))) (!caster->IsNPC() || (caster->IsNPC() && !RuleB(Spells, NPCIgnoreBaseImmunity))))
{ {
Log(Logs::Detail, Logs::Spells, "Our level (%d) is higher than the limit of this Mez spell (%d)", GetLevel(), spells[spell_id].max[effect_index]); Log(Logs::Detail, Logs::Spells, "Our level (%d) is higher than the limit of this Mez spell (%d)", GetLevel(), spells[spell_id].max[effect_index]);
caster->Message_StringID(MT_Shout, CANNOT_MEZ_WITH_SPELL); caster->Message_StringID(MT_SpellFailure, CANNOT_MEZ_WITH_SPELL);
AddToHateList(caster, 1,0,true,false,false,spell_id); AddToHateList(caster, 1,0,true,false,false,spell_id);
return true; return true;
} }
@ -4234,7 +4234,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
if(GetSpecialAbility(UNSLOWABLE) && IsEffectInSpell(spell_id, SE_AttackSpeed)) if(GetSpecialAbility(UNSLOWABLE) && IsEffectInSpell(spell_id, SE_AttackSpeed))
{ {
Log(Logs::Detail, Logs::Spells, "We are immune to Slow spells."); Log(Logs::Detail, Logs::Spells, "We are immune to Slow spells.");
caster->Message_StringID(MT_Shout, IMMUNE_ATKSPEED); caster->Message_StringID(CC_Red, IMMUNE_ATKSPEED);
int32 aggro = caster->CheckAggroAmount(spell_id, this); int32 aggro = caster->CheckAggroAmount(spell_id, this);
if(aggro > 0) { if(aggro > 0) {
AddToHateList(caster, aggro); AddToHateList(caster, aggro);
@ -4250,7 +4250,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
effect_index = GetSpellEffectIndex(spell_id, SE_Fear); effect_index = GetSpellEffectIndex(spell_id, SE_Fear);
if(GetSpecialAbility(UNFEARABLE)) { if(GetSpecialAbility(UNFEARABLE)) {
Log(Logs::Detail, Logs::Spells, "We are immune to Fear spells."); Log(Logs::Detail, Logs::Spells, "We are immune to Fear spells.");
caster->Message_StringID(MT_Shout, IMMUNE_FEAR); caster->Message_StringID(CC_Red, IMMUNE_FEAR); // need to verify message type, not in MQ2Cast for easy look up
int32 aggro = caster->CheckAggroAmount(spell_id, this); int32 aggro = caster->CheckAggroAmount(spell_id, this);
if(aggro > 0) { if(aggro > 0) {
AddToHateList(caster, aggro); AddToHateList(caster, aggro);
@ -4261,7 +4261,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
} else if(IsClient() && caster->IsClient() && (caster->CastToClient()->GetGM() == false)) } else if(IsClient() && caster->IsClient() && (caster->CastToClient()->GetGM() == false))
{ {
Log(Logs::Detail, Logs::Spells, "Clients cannot fear eachother!"); Log(Logs::Detail, Logs::Spells, "Clients cannot fear eachother!");
caster->Message_StringID(MT_Shout, IMMUNE_FEAR); caster->Message_StringID(CC_Red, IMMUNE_FEAR); // need to verify message type, not in MQ2Cast for easy look up
return true; return true;
} }
else if(GetLevel() > spells[spell_id].max[effect_index] && spells[spell_id].max[effect_index] != 0) else if(GetLevel() > spells[spell_id].max[effect_index] && spells[spell_id].max[effect_index] != 0)
@ -4280,7 +4280,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
{ {
Message(13, "Your are immune to fear."); Message(13, "Your are immune to fear.");
Log(Logs::Detail, Logs::Spells, "Clients has WarCry effect, immune to fear!"); Log(Logs::Detail, Logs::Spells, "Clients has WarCry effect, immune to fear!");
caster->Message_StringID(MT_Shout, IMMUNE_FEAR); caster->Message_StringID(CC_Red, IMMUNE_FEAR); // need to verify message type, not in MQ2Cast for easy look up
return true; return true;
} }
} }
@ -4290,7 +4290,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
if(GetSpecialAbility(UNCHARMABLE)) if(GetSpecialAbility(UNCHARMABLE))
{ {
Log(Logs::Detail, Logs::Spells, "We are immune to Charm spells."); Log(Logs::Detail, Logs::Spells, "We are immune to Charm spells.");
caster->Message_StringID(MT_Shout, CANNOT_CHARM); caster->Message_StringID(CC_Red, CANNOT_CHARM); // need to verify message type, not in MQ2Cast for easy look up
int32 aggro = caster->CheckAggroAmount(spell_id, this); int32 aggro = caster->CheckAggroAmount(spell_id, this);
if(aggro > 0) { if(aggro > 0) {
AddToHateList(caster, aggro); AddToHateList(caster, aggro);
@ -4303,7 +4303,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
if(this == caster) if(this == caster)
{ {
Log(Logs::Detail, Logs::Spells, "You are immune to your own charms."); Log(Logs::Detail, Logs::Spells, "You are immune to your own charms.");
caster->Message(MT_Shout, "You cannot charm yourself."); caster->Message(CC_Red, "You cannot charm yourself."); // need to look up message?
return true; return true;
} }
@ -4316,7 +4316,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
if(GetLevel() > spells[spell_id].max[effect_index] && spells[spell_id].max[effect_index] != 0) if(GetLevel() > spells[spell_id].max[effect_index] && spells[spell_id].max[effect_index] != 0)
{ {
Log(Logs::Detail, Logs::Spells, "Our level (%d) is higher than the limit of this Charm spell (%d)", GetLevel(), spells[spell_id].max[effect_index]); Log(Logs::Detail, Logs::Spells, "Our level (%d) is higher than the limit of this Charm spell (%d)", GetLevel(), spells[spell_id].max[effect_index]);
caster->Message_StringID(MT_Shout, CANNOT_CHARM_YET); caster->Message_StringID(CC_Red, CANNOT_CHARM_YET); // need to verify message type, not in MQ2Cast for easy look up<Paste>
AddToHateList(caster, 1,0,true,false,false,spell_id); AddToHateList(caster, 1,0,true,false,false,spell_id);
return true; return true;
} }
@ -4331,7 +4331,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
{ {
if(GetSpecialAbility(UNSNAREABLE)) { if(GetSpecialAbility(UNSNAREABLE)) {
Log(Logs::Detail, Logs::Spells, "We are immune to Snare spells."); Log(Logs::Detail, Logs::Spells, "We are immune to Snare spells.");
caster->Message_StringID(MT_Shout, IMMUNE_MOVEMENT); caster->Message_StringID(CC_Red, IMMUNE_MOVEMENT);
int32 aggro = caster->CheckAggroAmount(spell_id, this); int32 aggro = caster->CheckAggroAmount(spell_id, this);
if(aggro > 0) { if(aggro > 0) {
AddToHateList(caster, aggro); AddToHateList(caster, aggro);
@ -4347,7 +4347,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
if(this == caster) if(this == caster)
{ {
Log(Logs::Detail, Logs::Spells, "You cannot lifetap yourself."); Log(Logs::Detail, Logs::Spells, "You cannot lifetap yourself.");
caster->Message_StringID(MT_Shout, CANT_DRAIN_SELF); caster->Message_StringID(MT_SpellFailure, CANT_DRAIN_SELF);
return true; return true;
} }
} }
@ -4357,7 +4357,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
if(this == caster) if(this == caster)
{ {
Log(Logs::Detail, Logs::Spells, "You cannot sacrifice yourself."); Log(Logs::Detail, Logs::Spells, "You cannot sacrifice yourself.");
caster->Message_StringID(MT_Shout, CANNOT_SAC_SELF); caster->Message_StringID(MT_SpellFailure, CANNOT_SAC_SELF);
return true; return true;
} }
} }

View File

@ -108,7 +108,7 @@ void NPC::ResumeWandering()
{ // we were paused by a quest { // we were paused by a quest
AI_walking_timer->Disable(); AI_walking_timer->Disable();
SetGrid(0 - GetGrid()); SetGrid(0 - GetGrid());
if (cur_wp == EQEmu::waypoints::WaypointStatus::wpsQuestControlGrid) if (cur_wp == EQEmu::WaypointStatus::QuestControlGrid)
{ // got here by a MoveTo() { // got here by a MoveTo()
cur_wp = save_wp; cur_wp = save_wp;
UpdateWaypoint(cur_wp); // have him head to last destination from here UpdateWaypoint(cur_wp); // have him head to last destination from here
@ -166,29 +166,30 @@ void NPC::PauseWandering(int pausetime)
void NPC::MoveTo(const glm::vec4 &position, bool saveguardspot) void NPC::MoveTo(const glm::vec4 &position, bool saveguardspot)
{ // makes mob walk to specified location { // makes mob walk to specified location
if (IsNPC() && GetGrid() != 0) { // he is on a grid
using EQEmu::waypoints::WaypointStatus; if (GetGrid() < 0) { // currently stopped by a quest command
if (IsNPC() && GetGrid() != 0)
{ // he is on a grid
if (GetGrid() < 0)
{ // currently stopped by a quest command
SetGrid(0 - GetGrid()); // get him moving again SetGrid(0 - GetGrid()); // get him moving again
Log(Logs::Detail, Logs::AI, "MoveTo during quest wandering. Canceling quest wandering and going back to grid %d when MoveTo is done.", GetGrid()); Log(Logs::Detail,
Logs::AI,
"MoveTo during quest wandering. Canceling quest wandering and going back to grid %d when MoveTo is done.",
GetGrid());
} }
AI_walking_timer->Disable(); // disable timer in case he is paused at a wp AI_walking_timer->Disable(); // disable timer in case he is paused at a wp
if (cur_wp >= 0) if (cur_wp >= 0) { // we've not already done a MoveTo()
{ // we've not already done a MoveTo()
save_wp = cur_wp; // save the current waypoint save_wp = cur_wp; // save the current waypoint
cur_wp = WaypointStatus::wpsQuestControlGrid; cur_wp = EQEmu::WaypointStatus::QuestControlGrid;
} }
Log(Logs::Detail, Logs::AI, "MoveTo %s, pausing regular grid wandering. Grid %d, save_wp %d", to_string(static_cast<glm::vec3>(position)).c_str(), -GetGrid(), save_wp); Log(Logs::Detail,
Logs::AI,
"MoveTo %s, pausing regular grid wandering. Grid %d, save_wp %d",
to_string(static_cast<glm::vec3>(position)).c_str(),
-GetGrid(),
save_wp);
} }
else else { // not on a grid
{ // not on a grid
roamer = true; roamer = true;
save_wp = 0; save_wp = 0;
cur_wp = WaypointStatus::wpsQuestControlNoGrid; cur_wp = EQEmu::WaypointStatus::QuestControlNoGrid;
Log(Logs::Detail, Logs::AI, "MoveTo %s without a grid.", to_string(static_cast<glm::vec3>(position)).c_str()); Log(Logs::Detail, Logs::AI, "MoveTo %s without a grid.", to_string(static_cast<glm::vec3>(position)).c_str());
} }
@ -197,24 +198,28 @@ void NPC::MoveTo(const glm::vec4& position, bool saveguardspot)
m_CurrentWayPoint = position; m_CurrentWayPoint = position;
m_CurrentWayPoint.z = GetFixedZ(dest); m_CurrentWayPoint.z = GetFixedZ(dest);
if (saveguardspot) if (saveguardspot) {
{
m_GuardPoint = m_CurrentWayPoint; m_GuardPoint = m_CurrentWayPoint;
if (m_GuardPoint.w == 0) if (m_GuardPoint.w == 0) {
m_GuardPoint.w = 0.0001; //hack to make IsGuarding simpler m_GuardPoint.w = 0.0001;
} //hack to make IsGuarding simpler
if (m_GuardPoint.w == -1) if (m_GuardPoint.w == -1)
m_GuardPoint.w = this->CalculateHeadingToTarget(position.x, position.y); m_GuardPoint.w = this->CalculateHeadingToTarget(position.x, position.y);
Log(Logs::Detail, Logs::AI, "Setting guard position to %s", to_string(static_cast<glm::vec3>(m_GuardPoint)).c_str()); Log(Logs::Detail,
Logs::AI,
"Setting guard position to %s",
to_string(static_cast<glm::vec3>(m_GuardPoint)).c_str());
} }
cur_wp_pause = 0; cur_wp_pause = 0;
time_until_can_move = 0; time_until_can_move = 0;
if (AI_walking_timer->Enabled()) if (AI_walking_timer->Enabled()) {
AI_walking_timer->Start(100); AI_walking_timer->Start(100);
} }
}
void NPC::UpdateWaypoint(int wp_index) void NPC::UpdateWaypoint(int wp_index)
{ {