aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormegamage <none@none>2009-05-15 13:57:10 -0500
committermegamage <none@none>2009-05-15 13:57:10 -0500
commitff7f023ff1eb884213ca0efccf686c7387920952 (patch)
tree10bb1c87e9eda6ffd749100245c154f1fc8c7a28
parente826b482a59347d55274e183125062534d0f4efb (diff)
parentbfaaa8201e6887fedd2145d668f40a484a609dac (diff)
*Merge.
--HG-- branch : trunk
-rw-r--r--src/game/AggressorAI.cpp1
-rw-r--r--src/game/Chat.cpp1
-rw-r--r--src/game/Creature.cpp2
-rw-r--r--src/game/Creature.h5
-rw-r--r--src/game/CreatureAI.cpp1
-rw-r--r--src/game/Level2.cpp4
-rw-r--r--src/game/OutdoorPvPSI.cpp4
-rw-r--r--src/game/Player.cpp3
-rw-r--r--src/game/ReactorAI.cpp1
-rw-r--r--src/game/Unit.cpp23
-rw-r--r--src/shared/vmap/TileAssembler.cpp36
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);
}