diff --git a/source/WorldServer/Entity.cpp b/source/WorldServer/Entity.cpp index 0fc3799..108ecaf 100644 --- a/source/WorldServer/Entity.cpp +++ b/source/WorldServer/Entity.cpp @@ -1110,6 +1110,10 @@ void Entity::InCombat(bool val){ in_combat = val; + RefreshRegen(changeCombatState); +} + +void Entity::RefreshRegen(bool override_) { bool update_regen = false; if(GetInfoStruct()->get_engaged_encounter()) { if(!IsEngagedInEncounter()) { @@ -1117,8 +1121,7 @@ void Entity::InCombat(bool val){ update_regen = true; } } - - if(changeCombatState || update_regen) + if(override_ || update_regen) SetRegenValues((GetInfoStruct()->get_effective_level() > 0) ? GetInfoStruct()->get_effective_level() : GetLevel()); } @@ -3934,7 +3937,7 @@ bool Entity::IsEngagedInEncounter(Spawn** res) { if(IsPlayer()) { for (itr = HatedBy.begin(); itr != HatedBy.end(); itr++) { Spawn* spawn = GetZone()->GetSpawnByID(*itr); - if (spawn && spawn->IsNPC() && ((NPC*)spawn)->Brain() && (spawn->GetLockedNoLoot() == ENCOUNTER_STATE_LOCKED || spawn->GetLockedNoLoot() == ENCOUNTER_STATE_OVERMATCHED)) { + if (spawn && spawn->IsNPC() && ((NPC*)spawn)->Brain() && spawn->Alive() && (spawn->GetLockedNoLoot() == ENCOUNTER_STATE_LOCKED || spawn->GetLockedNoLoot() == ENCOUNTER_STATE_OVERMATCHED)) { if((ret = ((NPC*)spawn)->Brain()->IsPlayerInEncounter(((Player*)this)->GetCharacterID()))) { if(res) *res = spawn; @@ -3946,7 +3949,7 @@ bool Entity::IsEngagedInEncounter(Spawn** res) { else { for (itr = HatedBy.begin(); itr != HatedBy.end(); itr++) { Spawn* spawn = GetZone()->GetSpawnByID(*itr); - if (spawn && spawn->IsNPC() && ((NPC*)spawn)->Brain() && (spawn->GetLockedNoLoot() == ENCOUNTER_STATE_LOCKED || spawn->GetLockedNoLoot() == ENCOUNTER_STATE_OVERMATCHED)) { + if (spawn && spawn->IsNPC() && ((NPC*)spawn)->Brain() && spawn->Alive() && (spawn->GetLockedNoLoot() == ENCOUNTER_STATE_LOCKED || spawn->GetLockedNoLoot() == ENCOUNTER_STATE_OVERMATCHED)) { if((ret = ((NPC*)spawn)->Brain()->IsEntityInEncounter(GetID()))) { if(res) *res = spawn; diff --git a/source/WorldServer/Entity.h b/source/WorldServer/Entity.h index e6cb2af..23702d7 100644 --- a/source/WorldServer/Entity.h +++ b/source/WorldServer/Entity.h @@ -1069,7 +1069,7 @@ struct InfoStruct{ void set_reload_player_spells(int8 value) { std::lock_guard lk(classMutex); reload_player_spells_ = value; } - void set_group_loot_method(int8 value) { std::lock_guard lk(classMutex); group_loot_method_ = value; } + void set_group_loot_method(int8 value) { std::lock_guard lk(classMutex); if(value <= GroupLootMethod::METHOD_MAX_COUNT) group_loot_method_ = value; } void set_group_loot_items_rarity(int8 value) { std::lock_guard lk(classMutex); group_loot_items_rarity_ = value; } void set_group_auto_split(int8 value) { std::lock_guard lk(classMutex); group_auto_split_ = value; } void set_group_default_yell(int8 value) { std::lock_guard lk(classMutex); group_default_yell_ = value; } @@ -1584,7 +1584,8 @@ public: bool EngagedInCombat(); virtual void InCombat(bool val); - + void RefreshRegen(bool override_ = false); + bool IsCasting(); void IsCasting(bool val); void SetMount(int16 mount_id, int8 red = 0xFF, int8 green = 0xFF, int8 blue = 0xFF, bool setUpdateFlags = true) diff --git a/source/WorldServer/Spawn.h b/source/WorldServer/Spawn.h index 542151b..ee31e81 100644 --- a/source/WorldServer/Spawn.h +++ b/source/WorldServer/Spawn.h @@ -301,7 +301,8 @@ enum GroupLootMethod { METHOD_FFA=1, METHOD_LOTTO=2, METHOD_NEED_BEFORE_GREED=3, - METHOD_ROUND_ROBIN=4 + METHOD_ROUND_ROBIN=4, + METHOD_MAX_COUNT=5 }; enum AutoLootMode { diff --git a/source/WorldServer/zoneserver.cpp b/source/WorldServer/zoneserver.cpp index 1379a12..4f00d46 100644 --- a/source/WorldServer/zoneserver.cpp +++ b/source/WorldServer/zoneserver.cpp @@ -5224,6 +5224,7 @@ void ZoneServer::KillSpawn(bool spawnListLocked, Spawn* dead, Spawn* killer, boo killer_in_encounter = true; if (spawn && spawn->IsPlayer()) { + ((Player*)spawn)->RefreshRegen(); // Update players total kill count ((Player*)spawn)->UpdatePlayerStatistic(STAT_PLAYER_TOTAL_NPC_KILLS, 1);