*Merge.
--HG-- branch : trunk
This commit is contained in:
@@ -71,6 +71,7 @@ void SpellAI::EnterCombat(Unit *who)
|
|||||||
else if(AISpellInfo[*i].condition == AICOND_COMBAT)
|
else if(AISpellInfo[*i].condition == AICOND_COMBAT)
|
||||||
events.ScheduleEvent(*i, AISpellInfo[*i].cooldown + rand()%AISpellInfo[*i].cooldown);
|
events.ScheduleEvent(*i, AISpellInfo[*i].cooldown + rand()%AISpellInfo[*i].cooldown);
|
||||||
}
|
}
|
||||||
|
i_creature.ResetDamageByPlayers();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpellAI::UpdateAI(const uint32 diff)
|
void SpellAI::UpdateAI(const uint32 diff)
|
||||||
|
|||||||
@@ -873,6 +873,7 @@ void ChatHandler::SendGlobalGMSysMessage(const char *str)
|
|||||||
FillSystemMessageData(&data, line);
|
FillSystemMessageData(&data, line);
|
||||||
sWorld.SendGlobalGMMessage(&data);
|
sWorld.SendGlobalGMMessage(&data);
|
||||||
}
|
}
|
||||||
|
delete buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatHandler::SendSysMessage(int32 entry)
|
void ChatHandler::SendSysMessage(int32 entry)
|
||||||
|
|||||||
@@ -152,6 +152,7 @@ m_creatureInfo(NULL), m_reactState(REACT_AGGRESSIVE), m_formation(NULL), m_summo
|
|||||||
m_GlobalCooldown = 0;
|
m_GlobalCooldown = 0;
|
||||||
m_unit_movement_flags = MOVEMENTFLAG_WALK_MODE;
|
m_unit_movement_flags = MOVEMENTFLAG_WALK_MODE;
|
||||||
DisableReputationGain = false;
|
DisableReputationGain = false;
|
||||||
|
ResetDamageByPlayers();
|
||||||
}
|
}
|
||||||
|
|
||||||
Creature::~Creature()
|
Creature::~Creature()
|
||||||
@@ -1688,6 +1689,7 @@ void Creature::setDeathState(DeathState s)
|
|||||||
// setActive(true);
|
// setActive(true);
|
||||||
SetHealth(GetMaxHealth());
|
SetHealth(GetMaxHealth());
|
||||||
SetLootRecipient(NULL);
|
SetLootRecipient(NULL);
|
||||||
|
ResetDamageByPlayers();
|
||||||
Unit::setDeathState(ALIVE);
|
Unit::setDeathState(ALIVE);
|
||||||
CreatureInfo const *cinfo = GetCreatureInfo();
|
CreatureInfo const *cinfo = GetCreatureInfo();
|
||||||
RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE);
|
RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE);
|
||||||
|
|||||||
@@ -706,6 +706,10 @@ class TRINITY_DLL_SPEC Creature : public Unit
|
|||||||
|
|
||||||
void SetDisableReputationGain(bool disable) { DisableReputationGain = disable; }
|
void SetDisableReputationGain(bool disable) { DisableReputationGain = disable; }
|
||||||
bool IsReputationGainDisabled() { return DisableReputationGain; }
|
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:
|
protected:
|
||||||
bool CreateFromProto(uint32 guidlow,uint32 Entry,uint32 team, const CreatureData *data = NULL);
|
bool CreateFromProto(uint32 guidlow,uint32 Entry,uint32 team, const CreatureData *data = NULL);
|
||||||
bool InitEntry(uint32 entry, uint32 team=ALLIANCE, 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;
|
uint32 m_lootMoney;
|
||||||
uint64 m_lootRecipient;
|
uint64 m_lootRecipient;
|
||||||
|
uint32 m_unDamageByPlayers;
|
||||||
|
|
||||||
/// Timers
|
/// Timers
|
||||||
uint32 m_deathTimer; // (msecs)timer for death or corpse disappearance
|
uint32 m_deathTimer; // (msecs)timer for death or corpse disappearance
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ bool CreatureAI::_EnterEvadeMode()
|
|||||||
me->CombatStop(true);
|
me->CombatStop(true);
|
||||||
me->LoadCreaturesAddon();
|
me->LoadCreaturesAddon();
|
||||||
me->SetLootRecipient(NULL);
|
me->SetLootRecipient(NULL);
|
||||||
|
me->ResetDamageByPlayers();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4392,6 +4392,9 @@ bool ChatHandler::HandleCreatePetCommand(const char* args)
|
|||||||
// Everything looks OK, create new pet
|
// Everything looks OK, create new pet
|
||||||
Pet* pet = new Pet(player, HUNTER_PET);
|
Pet* pet = new Pet(player, HUNTER_PET);
|
||||||
|
|
||||||
|
if(!pet)
|
||||||
|
return false;
|
||||||
|
|
||||||
if(!pet->CreateBaseAtCreature(creatureTarget))
|
if(!pet->CreateBaseAtCreature(creatureTarget))
|
||||||
{
|
{
|
||||||
delete pet;
|
delete pet;
|
||||||
@@ -4410,6 +4413,7 @@ bool ChatHandler::HandleCreatePetCommand(const char* args)
|
|||||||
{
|
{
|
||||||
sLog.outError("ERROR: InitStatsForLevel() in EffectTameCreature failed! Pet deleted.");
|
sLog.outError("ERROR: InitStatsForLevel() in EffectTameCreature failed! Pet deleted.");
|
||||||
PSendSysMessage("Error 2");
|
PSendSysMessage("Error 2");
|
||||||
|
delete pet;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -201,7 +201,11 @@ bool OutdoorPvPSI::HandleDropFlag(Player *plr, uint32 spellId)
|
|||||||
GameObject * go = new GameObject;
|
GameObject * go = new GameObject;
|
||||||
Map * map = MapManager::Instance().GetMap(plr->GetMapId(), plr);
|
Map * map = MapManager::Instance().GetMap(plr->GetMapId(), plr);
|
||||||
if(!map)
|
if(!map)
|
||||||
|
{
|
||||||
|
delete go;
|
||||||
return true;
|
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))
|
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;
|
delete go;
|
||||||
|
|||||||
@@ -14768,6 +14768,9 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
|
|||||||
|
|
||||||
bool Player::isAllowedToLoot(Creature* creature)
|
bool Player::isAllowedToLoot(Creature* creature)
|
||||||
{
|
{
|
||||||
|
if(creature->isDead() && !creature->IsDamageEnoughForLootingAndReward())
|
||||||
|
return false;
|
||||||
|
|
||||||
if(Player* recipient = creature->GetLootRecipient())
|
if(Player* recipient = creature->GetLootRecipient())
|
||||||
{
|
{
|
||||||
if (recipient == this)
|
if (recipient == this)
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ ReactorAI::EnterEvadeMode()
|
|||||||
i_victimGuid = 0;
|
i_victimGuid = 0;
|
||||||
m_creature->CombatStop(true);
|
m_creature->CombatStop(true);
|
||||||
m_creature->SetLootRecipient(NULL);
|
m_creature->SetLootRecipient(NULL);
|
||||||
|
i_creature.ResetDamageByPlayers();
|
||||||
|
|
||||||
if(!m_creature->GetCharmerOrOwner())
|
if(!m_creature->GetCharmerOrOwner())
|
||||||
{
|
{
|
||||||
|
|||||||
+19
-4
@@ -711,8 +711,15 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
|
|||||||
if (pVictim->GetTypeId() == TYPEID_PLAYER)
|
if (pVictim->GetTypeId() == TYPEID_PLAYER)
|
||||||
((Player*)pVictim)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage);
|
((Player*)pVictim)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage);
|
||||||
|
|
||||||
if (pVictim->GetTypeId() == TYPEID_UNIT && !((Creature*)pVictim)->isPet() && !((Creature*)pVictim)->hasLootRecipient())
|
if (pVictim->GetTypeId() == TYPEID_UNIT && !((Creature*)pVictim)->isPet())
|
||||||
((Creature*)pVictim)->SetLootRecipient(this);
|
{
|
||||||
|
if(!((Creature*)pVictim)->hasLootRecipient())
|
||||||
|
((Creature*)pVictim)->SetLootRecipient(this);
|
||||||
|
|
||||||
|
if(GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||||
|
((Creature*)pVictim)->AddDamageByPlayers(health < damage ? health : damage);
|
||||||
|
}
|
||||||
|
|
||||||
if (health <= damage)
|
if (health <= damage)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("DealDamage: victim just died");
|
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
|
// find player: owner of controlled `this` or `this` itself maybe
|
||||||
Player *player = GetCharmerOrOwnerPlayerOrPlayerItself();
|
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();
|
player = ((Creature*)pVictim)->GetLootRecipient();
|
||||||
// Reward player, his pets, and group/raid members
|
// 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)
|
// 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))
|
if(player->RewardPlayerAndGroupAtKill(pVictim))
|
||||||
player->ProcDamageAndSpell(pVictim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_EX_NONE, 0);
|
player->ProcDamageAndSpell(pVictim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_EX_NONE, 0);
|
||||||
|
|||||||
@@ -415,57 +415,57 @@ namespace VMAP
|
|||||||
AABSPTree<Triangle> *gtree = new AABSPTree<Triangle>();
|
AABSPTree<Triangle> *gtree = new AABSPTree<Triangle>();
|
||||||
|
|
||||||
G3D::uint32 flags;
|
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;
|
G3D::uint32 branches;
|
||||||
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, "GRP ") != 0) { fclose(rf); return(false); }
|
if(strcmp(blockId, "GRP ") != 0) { fclose(rf); delete gtree; 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); }
|
||||||
if(fread(&branches, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); 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++)
|
for(int b=0;b<(int)branches; b++)
|
||||||
{
|
{
|
||||||
G3D::uint32 indexes;
|
G3D::uint32 indexes;
|
||||||
// indexes for each branch (not used jet)
|
// 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
|
// ---- indexes
|
||||||
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, "INDX") != 0) { fclose(rf); return(false); }
|
if(strcmp(blockId, "INDX") != 0) { fclose(rf); delete gtree; 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 nindexes;
|
unsigned int nindexes;
|
||||||
if(fread(&nindexes, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); }
|
if(fread(&nindexes, sizeof(G3D::uint32), 1, rf) != 1) { fclose(rf); return(false); }
|
||||||
if(nindexes >0)
|
if(nindexes >0)
|
||||||
{
|
{
|
||||||
unsigned short *indexarray = new unsigned short[nindexes*sizeof(unsigned short)];
|
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++)
|
for(int i=0;i<(int)nindexes; i++)
|
||||||
{
|
{
|
||||||
unsigned short val = indexarray[i];
|
unsigned short val = indexarray[i];
|
||||||
tempIndexArray.append(val);
|
tempIndexArray.append(val);
|
||||||
}
|
}
|
||||||
delete indexarray;
|
delete[] indexarray;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---- vectors
|
// ---- 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(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;
|
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;
|
float *vectorarray = 0;
|
||||||
if(nvectors >0)
|
if(nvectors >0)
|
||||||
{
|
{
|
||||||
vectorarray = new float[nvectors*sizeof(float)*3];
|
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
|
// ----- liquit
|
||||||
if(flags & 1)
|
if(flags & 1)
|
||||||
{
|
{
|
||||||
// we have liquit -> not handled yet ... skip
|
// we have liquit -> not handled yet ... skip
|
||||||
if(fread(&blockId, 4, 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); 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); return(false); }
|
if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); delete gtree; delete[] vectorarray; return(false); }
|
||||||
fseek(rf, blocksize, SEEK_CUR);
|
fseek(rf, blocksize, SEEK_CUR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user