diff options
author | megamage <none@none> | 2009-05-15 13:57:10 -0500 |
---|---|---|
committer | megamage <none@none> | 2009-05-15 13:57:10 -0500 |
commit | ff7f023ff1eb884213ca0efccf686c7387920952 (patch) | |
tree | 10bb1c87e9eda6ffd749100245c154f1fc8c7a28 | |
parent | e826b482a59347d55274e183125062534d0f4efb (diff) | |
parent | bfaaa8201e6887fedd2145d668f40a484a609dac (diff) |
*Merge.
--HG--
branch : trunk
-rw-r--r-- | src/game/AggressorAI.cpp | 1 | ||||
-rw-r--r-- | src/game/Chat.cpp | 1 | ||||
-rw-r--r-- | src/game/Creature.cpp | 2 | ||||
-rw-r--r-- | src/game/Creature.h | 5 | ||||
-rw-r--r-- | src/game/CreatureAI.cpp | 1 | ||||
-rw-r--r-- | src/game/Level2.cpp | 4 | ||||
-rw-r--r-- | src/game/OutdoorPvPSI.cpp | 4 | ||||
-rw-r--r-- | src/game/Player.cpp | 3 | ||||
-rw-r--r-- | src/game/ReactorAI.cpp | 1 | ||||
-rw-r--r-- | src/game/Unit.cpp | 23 | ||||
-rw-r--r-- | src/shared/vmap/TileAssembler.cpp | 36 |
11 files changed, 59 insertions, 22 deletions
diff --git a/src/game/AggressorAI.cpp b/src/game/AggressorAI.cpp index 22ebe87cdc6..556b24da9ad 100644 --- a/src/game/AggressorAI.cpp +++ b/src/game/AggressorAI.cpp @@ -71,6 +71,7 @@ void SpellAI::EnterCombat(Unit *who) else if(AISpellInfo[*i].condition == AICOND_COMBAT) events.ScheduleEvent(*i, AISpellInfo[*i].cooldown + rand()%AISpellInfo[*i].cooldown); } + i_creature.ResetDamageByPlayers(); } void SpellAI::UpdateAI(const uint32 diff) diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index bf8ee9d3a77..4bd3c699345 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -873,6 +873,7 @@ void ChatHandler::SendGlobalGMSysMessage(const char *str) FillSystemMessageData(&data, line); sWorld.SendGlobalGMMessage(&data); } + delete buf; } void ChatHandler::SendSysMessage(int32 entry) diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 8d7b877d4f5..17828752aac 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -152,6 +152,7 @@ m_creatureInfo(NULL), m_reactState(REACT_AGGRESSIVE), m_formation(NULL), m_summo m_GlobalCooldown = 0; m_unit_movement_flags = MOVEMENTFLAG_WALK_MODE; DisableReputationGain = false; + ResetDamageByPlayers(); } Creature::~Creature() @@ -1688,6 +1689,7 @@ void Creature::setDeathState(DeathState s) // setActive(true); SetHealth(GetMaxHealth()); SetLootRecipient(NULL); + ResetDamageByPlayers(); Unit::setDeathState(ALIVE); CreatureInfo const *cinfo = GetCreatureInfo(); RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); diff --git a/src/game/Creature.h b/src/game/Creature.h index f57f0592da5..504261c3e1e 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -706,6 +706,10 @@ class TRINITY_DLL_SPEC Creature : public Unit void SetDisableReputationGain(bool disable) { DisableReputationGain = disable; } bool IsReputationGainDisabled() { return DisableReputationGain; } + bool IsDamageEnoughForLootingAndReward() { return m_unDamageByPlayers >= (uint32)(GetMaxHealth() / 2); } + void AddDamageByPlayers(uint32 unDamage) { m_unDamageByPlayers += unDamage; } + void ResetDamageByPlayers() { m_unDamageByPlayers = 0; } + protected: bool CreateFromProto(uint32 guidlow,uint32 Entry,uint32 team, const CreatureData *data = NULL); bool InitEntry(uint32 entry, uint32 team=ALLIANCE, const CreatureData* data=NULL); @@ -720,6 +724,7 @@ class TRINITY_DLL_SPEC Creature : public Unit uint32 m_lootMoney; uint64 m_lootRecipient; + uint32 m_unDamageByPlayers; /// Timers uint32 m_deathTimer; // (msecs)timer for death or corpse disappearance diff --git a/src/game/CreatureAI.cpp b/src/game/CreatureAI.cpp index 0864bc973ab..67458f5a157 100644 --- a/src/game/CreatureAI.cpp +++ b/src/game/CreatureAI.cpp @@ -116,6 +116,7 @@ bool CreatureAI::_EnterEvadeMode() me->CombatStop(true); me->LoadCreaturesAddon(); me->SetLootRecipient(NULL); + me->ResetDamageByPlayers(); return true; } diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index ef3cb99d919..f08ef8aa40d 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -4392,6 +4392,9 @@ bool ChatHandler::HandleCreatePetCommand(const char* args) // Everything looks OK, create new pet Pet* pet = new Pet(player, HUNTER_PET); + if(!pet) + return false; + if(!pet->CreateBaseAtCreature(creatureTarget)) { delete pet; @@ -4410,6 +4413,7 @@ bool ChatHandler::HandleCreatePetCommand(const char* args) { sLog.outError("ERROR: InitStatsForLevel() in EffectTameCreature failed! Pet deleted."); PSendSysMessage("Error 2"); + delete pet; return false; } diff --git a/src/game/OutdoorPvPSI.cpp b/src/game/OutdoorPvPSI.cpp index bb4cd22edfa..366c5923351 100644 --- a/src/game/OutdoorPvPSI.cpp +++ b/src/game/OutdoorPvPSI.cpp @@ -201,7 +201,11 @@ bool OutdoorPvPSI::HandleDropFlag(Player *plr, uint32 spellId) GameObject * go = new GameObject; Map * map = MapManager::Instance().GetMap(plr->GetMapId(), plr); if(!map) + { + delete go; return true; + } + if(!go->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT),SI_SILITHYST_MOUND, map, plr->GetPhaseMask(), plr->GetPositionX(),plr->GetPositionY(),plr->GetPositionZ(),plr->GetOrientation(),0,0,0,0,100,GO_STATE_READY)) { delete go; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 1e759548ae6..548ef84ae7b 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -14768,6 +14768,9 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder ) bool Player::isAllowedToLoot(Creature* creature) { + if(creature->isDead() && !creature->IsDamageEnoughForLootingAndReward()) + return false; + if(Player* recipient = creature->GetLootRecipient()) { if (recipient == this) diff --git a/src/game/ReactorAI.cpp b/src/game/ReactorAI.cpp index 362a8c9fe56..5c0d75052b0 100644 --- a/src/game/ReactorAI.cpp +++ b/src/game/ReactorAI.cpp @@ -104,6 +104,7 @@ ReactorAI::EnterEvadeMode() i_victimGuid = 0; m_creature->CombatStop(true); m_creature->SetLootRecipient(NULL); + i_creature.ResetDamageByPlayers(); if(!m_creature->GetCharmerOrOwner()) { diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index d267a99b69d..9db62bf51fe 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -711,8 +711,15 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa if (pVictim->GetTypeId() == TYPEID_PLAYER) ((Player*)pVictim)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); - if (pVictim->GetTypeId() == TYPEID_UNIT && !((Creature*)pVictim)->isPet() && !((Creature*)pVictim)->hasLootRecipient()) - ((Creature*)pVictim)->SetLootRecipient(this); + if (pVictim->GetTypeId() == TYPEID_UNIT && !((Creature*)pVictim)->isPet()) + { + if(!((Creature*)pVictim)->hasLootRecipient()) + ((Creature*)pVictim)->SetLootRecipient(this); + + if(GetCharmerOrOwnerPlayerOrPlayerItself()) + ((Creature*)pVictim)->AddDamageByPlayers(health < damage ? health : damage); + } + if (health <= damage) { DEBUG_LOG("DealDamage: victim just died"); @@ -13005,11 +13012,19 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss) // find player: owner of controlled `this` or `this` itself maybe Player *player = GetCharmerOrOwnerPlayerOrPlayerItself(); - if(pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->GetLootRecipient()) + bool bRewardIsAllowed = true; + if(pVictim->GetTypeId() == TYPEID_UNIT) + { + bRewardIsAllowed = ((Creature*)pVictim)->IsDamageEnoughForLootingAndReward(); + if(!bRewardIsAllowed) + ((Creature*)pVictim)->SetLootRecipient(NULL); + } + + if(bRewardIsAllowed && pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->GetLootRecipient()) player = ((Creature*)pVictim)->GetLootRecipient(); // Reward player, his pets, and group/raid members // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop) - if(player && player!=pVictim) + if(bRewardIsAllowed && player && player!=pVictim) { if(player->RewardPlayerAndGroupAtKill(pVictim)) player->ProcDamageAndSpell(pVictim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_EX_NONE, 0); diff --git a/src/shared/vmap/TileAssembler.cpp b/src/shared/vmap/TileAssembler.cpp index 64d67205f68..904553cdf33 100644 --- a/src/shared/vmap/TileAssembler.cpp +++ b/src/shared/vmap/TileAssembler.cpp @@ -415,57 +415,57 @@ namespace VMAP AABSPTree<Triangle> *gtree = new AABSPTree<Triangle>(); G3D::uint32 flags; - if(fread(&flags, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&flags, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } G3D::uint32 branches; - if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); } - if(strcmp(blockId, "GRP ") != 0) { fclose(rf); return(false); } - if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } - if(fread(&branches, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); delete gtree; return(false); } + if(strcmp(blockId, "GRP ") != 0) { fclose(rf); delete gtree; return(false); } + if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } + if(fread(&branches, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } for(int b=0;b<(int)branches; b++) { G3D::uint32 indexes; // indexes for each branch (not used jet) - if(fread(&indexes, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&indexes, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } } // ---- indexes - if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); } - if(strcmp(blockId, "INDX") != 0) { fclose(rf); return(false); } - if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); delete gtree; return(false); } + if(strcmp(blockId, "INDX") != 0) { fclose(rf); delete gtree; return(false); } + if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } unsigned int nindexes; if(fread(&nindexes, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); } if(nindexes >0) { unsigned short *indexarray = new unsigned short[nindexes*sizeof(unsigned short)]; - if(fread(indexarray, sizeof(unsigned short), nindexes, rf) != nindexes) { fclose(rf); return(false); } + if(fread(indexarray, sizeof(unsigned short), nindexes, rf) != nindexes) { fclose(rf); delete gtree; delete[] indexarray; return(false); } for(int i=0;i<(int)nindexes; i++) { unsigned short val = indexarray[i]; tempIndexArray.append(val); } - delete indexarray; + delete[] indexarray; } // ---- vectors - if(fread(&blockId, 4, 1, rf) != 1) {fclose(rf); return(false); } + if(fread(&blockId, 4, 1, rf) != 1) {fclose(rf); delete gtree; return(false); } if(strcmp(blockId, "VERT") != 0) { fclose(rf); return(false); } - if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } unsigned int nvectors; - if(fread(&nvectors, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&nvectors, sizeof(int), 1, rf) != 1) { fclose(rf); delete gtree; return(false); } float *vectorarray = 0; if(nvectors >0) { vectorarray = new float[nvectors*sizeof(float)*3]; - if(fread(vectorarray, sizeof(float)*3, nvectors, rf) != nvectors) { fclose(rf); return(false); } + if(fread(vectorarray, sizeof(float)*3, nvectors, rf) != nvectors) { fclose(rf); delete gtree; delete[] vectorarray; return(false); } } // ----- liquit if(flags & 1) { // we have liquit -> not handled yet ... skip - if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); } - if(strcmp(blockId, "LIQU") != 0) { fclose(rf); return(false); } - if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); } + if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); delete gtree; delete[] vectorarray; return(false); } + if(strcmp(blockId, "LIQU") != 0) { fclose(rf); delete gtree; delete[] vectorarray; return(false); } + if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); delete gtree; delete[] vectorarray; return(false); } fseek(rf, blocksize, SEEK_CUR); } |