diff --git a/changelog.txt b/changelog.txt index ab4ef1edd..814673eba 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,12 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 03/05/2014 == +demonstar55: Corrected rogue's evade to be single target + +== 03/04/2014 == +Sorvani: Created RemoveFromInstance and RemoveAllFromInstance to remove a single player or all players in an instance. +Sorvani: Exported to Lua as eq.remove_from_instance(instance_id) and eq.remove_all_from_instance(instance_id). + == 03/03/2014 == demonstar55: Implemented deadly strikes and gave rogues higher innate throwing crit chance diff --git a/zone/StringIDs.h b/zone/StringIDs.h index 4fb04539b..afa598e1c 100644 --- a/zone/StringIDs.h +++ b/zone/StringIDs.h @@ -99,6 +99,12 @@ #define TRADESKILL_FAILED 336 //You lacked the skills to fashion the items together. #define TRADESKILL_TRIVIAL 338 //You can no longer advance your skill from making this item. #define TRADESKILL_SUCCEED 339 //You have fashioned the items together to create something new! +#define EVADE_SUCCESS 343 //You have momentarily ducked away from the main combat. +#define EVADE_FAIL 344 //Your attempts at ducking clear of combat fail. +#define HIDE_FAIL 345 //You failed to hide yourself. +#define HIDE_SUCCESS 346 //You have hidden yourself from view. +#define SNEAK_SUCCESS 347 //You are as quiet as a cat stalking its prey. +#define SNEAK_FAIL 348 //You are as quiet as a herd of running elephants. #define MEND_CRITICAL 349 //You magically mend your wounds and heal considerable damage. #define MEND_SUCCESS 350 //You mend your wounds and heal some damage. #define MEND_WORSEN 351 //You have worsened your wounds! diff --git a/zone/aggro.cpp b/zone/aggro.cpp index 07a8569a6..612edd47a 100644 --- a/zone/aggro.cpp +++ b/zone/aggro.cpp @@ -1447,3 +1447,11 @@ bool Mob::PassCharismaCheck(Mob* caster, Mob* spellTarget, uint16 spell_id) { return false; } +void Mob::RogueEvade(Mob *other) +{ + int amount = other->GetHateAmount(this) - (GetLevel() * 13); + other->SetHate(this, std::max(1, amount)); + + return; +} + diff --git a/zone/bot.cpp b/zone/bot.cpp index 7bd337a14..425402b65 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -14967,7 +14967,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { return; } - Bot* targetedBot; + Bot *targetedBot = nullptr; if(c->GetTarget() != nullptr) { if (c->GetTarget()->IsBot() && (c->GetTarget()->CastToBot()->GetBotOwner() == c)) diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index f8d90f745..441681fd0 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -3478,21 +3478,23 @@ void Client::Handle_OP_Hide(const EQApplicationPacket *app) } if(GetClass() == ROGUE){ EQApplicationPacket *outapp = new EQApplicationPacket(OP_SimpleMessage,sizeof(SimpleMessage_Struct)); - SimpleMessage_Struct *msg=(SimpleMessage_Struct *)outapp->pBuffer; - msg->color=0x010E; - if (!auto_attack && entity_list.Fighting(this)) { + SimpleMessage_Struct *msg = (SimpleMessage_Struct *)outapp->pBuffer; + msg->color = 0x010E; + Mob *evadetar = GetTarget(); + if (!auto_attack && (evadetar && evadetar->CheckAggro(this) + && evadetar->IsNPC())) { if (MakeRandomInt(0, 260) < (int)GetSkill(SkillHide)) { - msg->string_id=343; - entity_list.Evade(this); + msg->string_id = EVADE_SUCCESS; + RogueEvade(evadetar); } else { - msg->string_id=344; + msg->string_id = EVADE_FAIL; } } else { if (hidden){ - msg->string_id=346; + msg->string_id = HIDE_SUCCESS; } else { - msg->string_id=345; + msg->string_id = HIDE_FAIL; } } FastQueuePacket(&outapp); diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index 7b275ea67..cca71641e 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -659,6 +659,14 @@ void lua_assign_raid_to_instance(uint32 instance_id) { quest_manager.AssignRaidToInstance(instance_id); } +void lua_remove_from_instance(uint32 instance_id) { + quest_manager.RemoveFromInstance(instance_id); +} + +void lua_remove_all_from_instance(uint32 instance_id) { + quest_manager.RemoveAllFromInstance(instance_id); +} + void lua_flag_instance_by_group_leader(uint32 zone, uint32 version) { quest_manager.FlagInstanceByGroupLeader(zone, version); } @@ -1195,6 +1203,8 @@ luabind::scope lua_register_general() { luabind::def("assign_to_instance", &lua_assign_to_instance), luabind::def("assign_group_to_instance", &lua_assign_group_to_instance), luabind::def("assign_raid_to_instance", &lua_assign_raid_to_instance), + luabind::def("remove_from_instance", &lua_remove_from_instance), + luabind::def("remove_all_from_instance", &lua_remove_all_from_instance), luabind::def("flag_instance_by_group_leader", &lua_flag_instance_by_group_leader), luabind::def("flag_instance_by_raid_leader", &lua_flag_instance_by_raid_leader), luabind::def("fly_mode", &lua_fly_mode), diff --git a/zone/mob.h b/zone/mob.h index c9f1aa299..6e76c9ce7 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -146,6 +146,7 @@ public: virtual int32 GetMeleeMitDmg(Mob *attacker, int32 damage, int32 minhit, float mit_rating, float atk_rating); bool CombatRange(Mob* other); virtual inline bool IsBerserk() { return false; } // only clients + void RogueEvade(Mob *other); //Appearance void SendLevelAppearance(); diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 484a63d40..3d51cf6c6 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -2557,6 +2557,43 @@ void QuestManager::AssignRaidToInstance(uint16 instance_id) } } +void QuestManager::RemoveFromInstance(uint16 instance_id) +{ + QuestManagerCurrentQuestVars(); + if(initiator) { + if(database.RemoveClientFromInstance(instance_id, initiator->CharacterID())) { + initiator->Message(MT_Say, "Removed client from instance."); + } else { + initiator->Message(MT_Say, "Failed to remove client from instance."); + } + } +} + +void QuestManager::RemoveAllFromInstance(uint16 instance_id) +{ + QuestManagerCurrentQuestVars(); + if(initiator) { + std::list charid_list; + bool removed_all = true; + uint16 fail_count = 0; + database.GetCharactersInInstance(instance_id,charid_list); + auto iter = charid_list.begin(); + while(iter != charid_list.end()) { + if(!database.RemoveClientFromInstance(instance_id, *iter)) { + removed_all = false; + ++fail_count; + } + ++iter; + } + if (removed_all) { + initiator->Message(MT_Say, "Removed all players from instance."); + } else { + // once the expedition system is in, this message it not relevant + initiator->Message(MT_Say, "Failed to remove %i player(s) from instance.", fail_count); + } + } +} + void QuestManager::MovePCInstance(int zone_id, int instance_id, float x, float y, float z, float heading) { QuestManagerCurrentQuestVars(); diff --git a/zone/questmgr.h b/zone/questmgr.h index 7c1960283..86568349c 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -211,6 +211,10 @@ public: void AssignToInstance(uint16 instance_id); void AssignGroupToInstance(uint16 instance_id); void AssignRaidToInstance(uint16 instance_id); + void RemoveFromInstance(uint16 instance_id); + //void RemoveGroupFromInstance(uint16 instance_id); //potentially useful but not implmented at this time. + //void RemoveRaidFromInstance(uint16 instance_id); //potentially useful but not implmented at this time. + void RemoveAllFromInstance(uint16 instance_id); void MovePCInstance(int zone_id, int instance_id, float x, float y, float z, float heading); void FlagInstanceByGroupLeader(uint32 zone, int16 version); void FlagInstanceByRaidLeader(uint32 zone, int16 version);