aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/authserver/authserver.rc5
-rwxr-xr-xsrc/server/game/Chat/Chat.cpp1
-rwxr-xr-xsrc/server/game/Chat/Chat.h1
-rwxr-xr-xsrc/server/game/Chat/Commands/Level3.cpp45
-rwxr-xr-xsrc/server/game/Entities/Item/Item.cpp11
-rwxr-xr-xsrc/server/game/Entities/Item/Item.h4
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp28
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h4
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp41
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.cpp21
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.h1
-rwxr-xr-xsrc/server/game/Grids/Cells/CellImpl.h4
-rwxr-xr-xsrc/server/game/Maps/Map.cpp4
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/MiscHandler.cpp8
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/NPCHandler.cpp6
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp1
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp6
-rwxr-xr-xsrc/server/game/Spells/SpellMgr.cpp6
-rwxr-xr-xsrc/server/game/Spells/SpellScript.cpp5
-rwxr-xr-xsrc/server/game/Spells/SpellScript.h3
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp57
-rw-r--r--src/server/scripts/Spells/spell_hunter.cpp70
-rwxr-xr-xsrc/server/worldserver/TCSoap/TCSoap.cpp19
-rwxr-xr-xsrc/server/worldserver/TCSoap/TCSoap.h29
-rwxr-xr-xsrc/server/worldserver/worldserver.rc7
25 files changed, 215 insertions, 172 deletions
diff --git a/src/server/authserver/authserver.rc b/src/server/authserver/authserver.rc
index 6c2feaa97e8..850fa6041b8 100755
--- a/src/server/authserver/authserver.rc
+++ b/src/server/authserver/authserver.rc
@@ -39,7 +39,7 @@
IDI_APPICON ICON "authserver.ico"
/////////////////////////////////////////////////////////////////////////////
-// Neutre (Par défaut système) resources
+// Neutre (Par défaut système) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEUSD)
#ifdef _WIN32
@@ -61,6 +61,9 @@ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
#ifndef _DEBUG
FILEFLAGS 0
#else
+ #define VER_PRERELEASE VS_FF_PRERELEASE
+ #define VER_PRIVATEBUILD VS_FF_PRIVATEBUILD
+ #define VER_DEBUG 0
FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG)
#endif
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index d0146184eae..9509302f87b 100755
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -98,6 +98,7 @@ ChatCommand * ChatHandler::getCommandTable()
{ "dist", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleCastDistCommand>, "", NULL },
{ "self", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleCastSelfCommand>, "", NULL },
{ "target", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleCastTargetCommand>, "", NULL },
+ { "dest", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleCastDestCommand>, "", NULL },
{ "", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleCastCommand>, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h
index 217bb9538e2..d7a9c0b66f5 100755
--- a/src/server/game/Chat/Chat.h
+++ b/src/server/game/Chat/Chat.h
@@ -152,6 +152,7 @@ class ChatHandler
bool HandleCastDistCommand(const char *args);
bool HandleCastSelfCommand(const char *args);
bool HandleCastTargetCommand(const char *args);
+ bool HandleCastDestCommand(const char *args);
bool HandleCharacterCustomizeCommand(const char * args);
bool HandleCharacterChangeFactionCommand(const char * args);
diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp
index 1959feaaa0e..901d41e5c54 100755
--- a/src/server/game/Chat/Commands/Level3.cpp
+++ b/src/server/game/Chat/Commands/Level3.cpp
@@ -3957,6 +3957,51 @@ bool ChatHandler::HandleCastTargetCommand(const char *args)
return true;
}
+bool ChatHandler::HandleCastDestCommand(const char *args)
+{
+ Unit* caster = getSelectedUnit();
+ if (!caster)
+ {
+ SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form
+ uint32 spell = extractSpellIdFromLink((char*)args);
+ if (!spell || !sSpellMgr->GetSpellInfo(spell))
+ {
+ PSendSysMessage(LANG_COMMAND_NOSPELLFOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ char* px = strtok(NULL, " ");
+ char* py = strtok(NULL, " ");
+ char* pz = strtok(NULL, " ");
+
+ if (!px || !py || !pz)
+ return false;
+
+ float x = (float)atof(px);
+ float y = (float)atof(py);
+ float z = (float)atof(pz);
+
+ char* trig_str = strtok(NULL, " ");
+ if (trig_str)
+ {
+ int l = strlen(trig_str);
+ if (strncmp(trig_str, "triggered", l) != 0)
+ return false;
+ }
+
+ bool triggered = (trig_str != NULL);
+
+ caster->CastSpell(x, y, z, spell, triggered);
+
+ return true;
+}
+
/*
ComeToMe command REQUIRED for 3rd party scripting library to have access to PointMovementGenerator
Without this function 3rd party scripting library will get linking errors (unresolved external)
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index 0478bf6a71b..75c810e8494 100755
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -1130,12 +1130,13 @@ void Item::SaveRefundDataToDB()
CharacterDatabase.CommitTransaction(trans);
}
-void Item::DeleteRefundDataFromDB()
+void Item::DeleteRefundDataFromDB(SQLTransaction* trans)
{
- CharacterDatabase.PExecute("DELETE FROM item_refund_instance WHERE item_guid = '%u'", GetGUIDLow());
+ if (trans && !trans->null())
+ (*trans)->PAppend("DELETE FROM item_refund_instance WHERE item_guid = '%u'", GetGUIDLow());
}
-void Item::SetNotRefundable(Player *owner, bool changestate)
+void Item::SetNotRefundable(Player *owner, bool changestate /*=true*/, SQLTransaction* trans /*=NULL*/)
{
if (!HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_REFUNDABLE))
return;
@@ -1144,11 +1145,11 @@ void Item::SetNotRefundable(Player *owner, bool changestate)
// Following is not applicable in the trading procedure
if (changestate)
SetState(ITEM_CHANGED, owner);
-
+
SetRefundRecipient(0);
SetPaidMoney(0);
SetPaidExtendedCost(0);
- DeleteRefundDataFromDB();
+ DeleteRefundDataFromDB(trans);
owner->DeleteRefundReference(GetGUIDLow());
}
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index 6dc6d920e9c..c6f4ef6d60a 100755
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -251,7 +251,7 @@ class Item : public Object
static void DeleteFromInventoryDB(SQLTransaction& trans, uint32 itemGuid);
void DeleteFromInventoryDB(SQLTransaction& trans);
void SaveRefundDataToDB();
- void DeleteRefundDataFromDB();
+ void DeleteRefundDataFromDB(SQLTransaction* trans);
Bag* ToBag() { if (IsBag()) return reinterpret_cast<Bag*>(this); else return NULL; }
const Bag* ToBag() const { if (IsBag()) return reinterpret_cast<const Bag*>(this); else return NULL; }
@@ -339,7 +339,7 @@ class Item : public Object
bool IsConjuredConsumable() const { return GetTemplate()->IsConjuredConsumable(); }
// Item Refund system
- void SetNotRefundable(Player *owner, bool changestate = true);
+ void SetNotRefundable(Player *owner, bool changestate = true, SQLTransaction* trans = NULL);
void SetRefundRecipient(uint32 pGuidLow) { m_refundRecipient = pGuidLow; }
void SetPaidMoney(uint32 money) { m_paidMoney = money; }
void SetPaidExtendedCost(uint32 iece) { m_paidExtendedCost = iece; }
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index cf3512acda3..04784e1705f 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -831,6 +831,8 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa
m_lastFallTime = 0;
m_lastFallZ = 0;
+
+ m_grantableLevels = 0;
m_ControlledByPlayer = true;
m_isWorldObject = true;
@@ -3068,7 +3070,7 @@ void Player::GiveLevel(uint8 level)
if (GetSession()->GetRecruiterId())
if (level < sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
if (level % 2 == 0) {
- m_grantableLevels++;
+ ++m_grantableLevels;
if (!HasByteFlag(PLAYER_FIELD_BYTES, 1, 0x01))
SetByteFlag(PLAYER_FIELD_BYTES, 1, 0x01);
@@ -7263,20 +7265,26 @@ void Player::SetArenaPoints(uint32 value)
AddKnownCurrency(ITEM_ARENA_POINTS_ID);
}
-void Player::ModifyHonorPoints(int32 value)
+void Player::ModifyHonorPoints(int32 value, SQLTransaction* trans /*=NULL*/)
{
int32 newValue = int32(GetHonorPoints()) + value;
if (newValue < 0)
newValue = 0;
SetHonorPoints(uint32(newValue));
+
+ if (trans && !trans->null())
+ (*trans)->PAppend("UPDATE characters SET totalHonorPoints=%u WHERE guid=%u", newValue, GetGUIDLow());
}
-void Player::ModifyArenaPoints(int32 value)
+void Player::ModifyArenaPoints(int32 value, SQLTransaction* trans /*=NULL*/)
{
int32 newValue = int32(GetArenaPoints()) + value;
if (newValue < 0)
newValue = 0;
SetArenaPoints(uint32(newValue));
+
+ if (trans && !trans->null())
+ (*trans)->PAppend("UPDATE characters SET arenaPoints=%u WHERE guid=%u", newValue, GetGUIDLow());
}
uint32 Player::GetGuildIdFromDB(uint64 guid)
@@ -24549,8 +24557,11 @@ void Player::RefundItem(Item *item)
uint32 moneyRefund = item->GetPaidMoney(); // item-> will be invalidated in DestroyItem
+ // Save all relevant data to DB to prevent desynchronisation exploits
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+
// Delete any references to the refund data
- item->SetNotRefundable(this);
+ item->SetNotRefundable(this, true, &trans);
// Destroy item
DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
@@ -24572,16 +24583,19 @@ void Player::RefundItem(Item *item)
// Grant back money
if (moneyRefund)
- ModifyMoney(moneyRefund);
+ ModifyMoney(moneyRefund); // Saved in SaveInventoryAndGoldToDB
// Grant back Honor points
if (uint32 honorRefund = iece->reqhonorpoints)
- ModifyHonorPoints(honorRefund);
+ ModifyHonorPoints(honorRefund, &trans);
// Grant back Arena points
if (uint32 arenaRefund = iece->reqarenapoints)
- ModifyArenaPoints(arenaRefund);
+ ModifyArenaPoints(arenaRefund, &trans);
+
+ SaveInventoryAndGoldToDB(trans);
+ CharacterDatabase.CommitTransaction(trans);
}
void Player::SetRandomWinner(bool isWinner)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 17f43cc37c1..881aade9b9f 100755
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2034,8 +2034,8 @@ class Player : public Unit, public GridObject<Player>
bool RewardHonor(Unit *pVictim, uint32 groupsize, int32 honor = -1, bool pvptoken = false);
uint32 GetHonorPoints() const { return GetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY); }
uint32 GetArenaPoints() const { return GetUInt32Value(PLAYER_FIELD_ARENA_CURRENCY); }
- void ModifyHonorPoints(int32 value);
- void ModifyArenaPoints(int32 value);
+ void ModifyHonorPoints(int32 value, SQLTransaction* trans = NULL); //! If trans is specified, honor save query will be added to trans
+ void ModifyArenaPoints(int32 value, SQLTransaction* trans = NULL); //! If trans is specified, arena point save query will be added to trans
uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const;
void SetHonorPoints(uint32 value);
void SetArenaPoints(uint32 value);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 95546ea99b4..e072a0846d9 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -3755,7 +3755,8 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit*
}
bool stealCharge = aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_CHARGES;
- int32 dur = std::min(2 * MINUTE * IN_MILLISECONDS, aura->GetDuration());
+ // Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
+ uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
if (Aura* newAura = stealer->GetAura(aura->GetId(), aura->GetCasterGUID()))
{
@@ -3763,7 +3764,7 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit*
newAura->ModCharges(1);
else
newAura->ModStackAmount(1);
- newAura->SetDuration(dur);
+ newAura->SetDuration(int32(dur));
}
else
{
@@ -3782,7 +3783,7 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit*
caster->GetSingleCastAuras().push_back(aura);
}
// FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate
- newAura->SetLoadedState(aura->GetMaxDuration(), dur, stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
+ newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
newAura->ApplyForTargets();
}
}
@@ -8392,7 +8393,22 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
// Soul Preserver
case 60510:
{
- trigger_spell_id = 60515;
+ switch (getClass())
+ {
+ case CLASS_DRUID:
+ trigger_spell_id = 60512;
+ break;
+ case CLASS_PALADIN:
+ trigger_spell_id = 60513;
+ break;
+ case CLASS_PRIEST:
+ trigger_spell_id = 60514;
+ break;
+ case CLASS_SHAMAN:
+ trigger_spell_id = 60515;
+ break;
+ }
+
target = this;
break;
}
@@ -8537,6 +8553,23 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
target = this;
break;
}
+ case 30881: // Nature's Guardian Rank 1
+ case 30883: // Nature's Guardian Rank 2
+ case 30884: // Nature's Guardian Rank 3
+ case 30885: // Nature's Guardian Rank 4
+ case 30886: // Nature's Guardian Rank 5
+ {
+ if (HealthBelowPct(30))
+ {
+ basepoints0 = int32(auraSpellInfo->Effects[EFFECT_0].CalcValue() * GetMaxHealth() / 100.0f);
+ target = this;
+ trigger_spell_id = 31616;
+ // TODO: Threat part
+ }
+ else
+ return false;
+ break;
+ }
default:
{
// Lightning Shield (overwrite non existing triggered spell call in spell.dbc
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 060326b8d84..e1b37c121a7 100755
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -5738,6 +5738,21 @@ void ObjectMgr::LoadGraveyardZones()
sLog->outString();
}
+WorldSafeLocsEntry const *ObjectMgr::GetDefaultGraveYard(uint32 team)
+{
+ enum DefaultGraveyard
+ {
+ HORDE_GRAVEYARD = 10, // Crossroads
+ ALLIANCE_GRAVEYARD = 4, // Westfall
+ };
+
+ if (team == HORDE)
+ return sWorldSafeLocsStore.LookupEntry(HORDE_GRAVEYARD);
+ else if (team == ALLIANCE)
+ return sWorldSafeLocsStore.LookupEntry(ALLIANCE_GRAVEYARD);
+ else return NULL;
+}
+
WorldSafeLocsEntry const *ObjectMgr::GetClosestGraveYard(float x, float y, float z, uint32 MapId, uint32 team)
{
// search for zone associated closest graveyard
@@ -5746,8 +5761,10 @@ WorldSafeLocsEntry const *ObjectMgr::GetClosestGraveYard(float x, float y, float
if (!zoneId)
{
if (z > -500)
+ {
sLog->outError("ZoneId not found for map %u coords (%f, %f, %f)", MapId, x, y, z);
- return NULL;
+ return GetDefaultGraveYard(team);
+ }
}
// Simulate std. algorithm:
@@ -5765,7 +5782,7 @@ WorldSafeLocsEntry const *ObjectMgr::GetClosestGraveYard(float x, float y, float
if (graveLow == graveUp && !map->IsBattleArena())
{
sLog->outErrorDb("Table `game_graveyard_zone` incomplete: Zone %u Team %u does not have a linked graveyard.", zoneId, team);
- return NULL;
+ return GetDefaultGraveYard(team);
}
// at corpse map
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 4898727e995..196bce7e9d8 100755
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -704,6 +704,7 @@ class ObjectMgr
GossipText const* GetGossipText(uint32 Text_ID) const;
+ WorldSafeLocsEntry const *GetDefaultGraveYard(uint32 team);
WorldSafeLocsEntry const *GetClosestGraveYard(float x, float y, float z, uint32 MapId, uint32 team);
bool AddGraveYardLink(uint32 id, uint32 zone, uint32 team, bool inDB = true);
void RemoveGraveYardLink(uint32 id, uint32 zone, uint32 team, bool inDB = false);
diff --git a/src/server/game/Grids/Cells/CellImpl.h b/src/server/game/Grids/Cells/CellImpl.h
index 069362466a8..b9e734ab7ed 100755
--- a/src/server/game/Grids/Cells/CellImpl.h
+++ b/src/server/game/Grids/Cells/CellImpl.h
@@ -183,8 +183,8 @@ Cell::Visit(const CellPair& standing_cell, TypeContainerVisitor<T, CONTAINER> &v
return;
}
//lets limit the upper value for search radius
- if (radius > 333.0f)
- radius = 333.0f;
+ if (radius > SIZE_OF_GRIDS)
+ radius = SIZE_OF_GRIDS;
//lets calculate object coord offsets from cell borders.
CellArea area = Cell::CalculateCellArea(x_off, y_off, radius);
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 4cde2913160..0cb9b318b54 100755
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -1869,8 +1869,8 @@ void Map::UpdateObjectsVisibilityFor(Player* player, Cell cell, CellPair cellpai
cell.SetNoCreate();
TypeContainerVisitor<Trinity::VisibleNotifier, WorldTypeMapContainer > world_notifier(notifier);
TypeContainerVisitor<Trinity::VisibleNotifier, GridTypeMapContainer > grid_notifier(notifier);
- cell.Visit(cellpair, world_notifier, *this, *player, player->GetVisibilityRange());
- cell.Visit(cellpair, grid_notifier, *this, *player, player->GetVisibilityRange());
+ cell.Visit(cellpair, world_notifier, *this, *player, player->GetSightRange());
+ cell.Visit(cellpair, grid_notifier, *this, *player, player->GetSightRange());
// send data
notifier.SendToSelf();
diff --git a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp
index 307d4352256..09897dcde19 100755
--- a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp
@@ -494,15 +494,7 @@ void WorldSession::HandleSetSelectionOpcode(WorldPacket & recv_data)
uint64 guid;
recv_data >> guid;
- // update reputation list if need
- Unit* unit = ObjectAccessor::GetUnit(*_player, guid);
- if (!unit)
- return;
-
_player->SetSelection(guid);
-
- if (FactionTemplateEntry const* factionTemplateEntry = sFactionTemplateStore.LookupEntry(unit->getFaction()))
- _player->GetReputationMgr().SetVisible(factionTemplateEntry);
}
void WorldSession::HandleStandStateChangeOpcode(WorldPacket & recv_data)
diff --git a/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp b/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp
index 1bb361fb97e..ef72d8ab5ba 100755
--- a/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp
@@ -278,7 +278,7 @@ void WorldSession::HandleTrainerBuySpellOpcode(WorldPacket & recv_data)
return;
_player->ModifyMoney(-int32(nSpellCost));
-
+
unit->SendPlaySpellVisual(179); // 53 SpellCastDirected
unit->SendPlaySpellImpact(_player->GetGUID(), 362); // 113 EmoteSalute
@@ -308,6 +308,10 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket & recv_data)
return;
}
+ // set faction visible if needed
+ if (FactionTemplateEntry const* factionTemplateEntry = sFactionTemplateStore.LookupEntry(unit->getFaction()))
+ _player->GetReputationMgr().SetVisible(factionTemplateEntry);
+
GetPlayer()->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK);
// remove fake death
//if (GetPlayer()->HasUnitState(UNIT_STAT_DIED))
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index ba7b96941c1..33046970722 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -515,6 +515,7 @@ m_caster(caster), m_spellValue(new SpellValue(m_spellInfo))
_triggeredCastFlags = TRIGGERED_FULL_MASK;
m_CastItem = NULL;
+ m_castItemGUID = 0;
unitTarget = NULL;
itemTarget = NULL;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 94bda85471e..528bf8beebb 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -3014,7 +3014,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
summon->SelectLevel(summon->GetCreatureInfo()); // some summoned creaters have different from 1 DB data for level/hp
summon->SetUInt32Value(UNIT_NPC_FLAGS, summon->GetCreatureInfo()->npcflag);
- summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_PASSIVE);
summon->AI()->EnterEvadeMode();
break;
@@ -5876,6 +5876,10 @@ void Spell::EffectReputation(SpellEffIndex effIndex)
{
rep_change = int32((float)rep_change * repData->spell_rate);
}
+
+ // Bonus from spells that increase reputation gain
+ float bonus = rep_change * _player->GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN) / 100.0; // 10%
+ rep_change += (int32)bonus;
_player->GetReputationMgr().ModifyReputation(factionEntry, rep_change);
}
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index c1f3c6b80c0..0fb144e016e 100755
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -3263,6 +3263,12 @@ void SpellMgr::LoadDbcDataCorrections()
case 72675: // Mutated Strength (Professor Putricide)
spellInfo->Effect[1] = 0;
break;
+ case 72454: // Mutated Plague (Professor Putricide)
+ case 72464: // Mutated Plague (Professor Putricide)
+ case 72506: // Mutated Plague (Professor Putricide)
+ case 72507: // Mutated Plague (Professor Putricide)
+ spellInfo->EffectRadiusIndex[0] = 28; // 50000yd
+ break;
case 70911: // Unbound Plague (Professor Putricide)
case 72854: // Unbound Plague (Professor Putricide)
case 72855: // Unbound Plague (Professor Putricide)
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index 069c0581590..bb7b242a561 100755
--- a/src/server/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -455,6 +455,11 @@ void SpellScript::CreateItem(uint32 effIndex, uint32 itemId)
m_spell->DoCreateItem(effIndex, itemId);
}
+SpellInfo const* SpellScript::GetTriggeringSpell()
+{
+ return m_spell->m_triggeredByAuraSpell;
+}
+
void SpellScript::FinishCast(SpellCastResult result)
{
m_spell->SendCastResult(result);
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index bbb68305983..e28030d7605 100755
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -320,6 +320,9 @@ class SpellScript : public _SpellScript
// Creates item. Calls Spell::DoCreateItem method.
void CreateItem(uint32 effIndex, uint32 itemId);
+ // Returns SpellInfo from the spell that triggered the current one
+ SpellInfo const* GetTriggeringSpell();
+
// finishes spellcast prematurely with selected error message
void FinishCast(SpellCastResult result);
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 0285699a621..48deb028625 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -1206,62 +1206,6 @@ class spell_gen_launch : public SpellScriptLoader
}
};
-class spell_gen_soul_preserver : public SpellScriptLoader
-{
- enum Spells
- {
- HEALING_TRANCE_DRUID = 60512,
- HEALING_TRANCE_PALADIN = 60513,
- HEALING_TRANCE_PRIEST = 60514,
- HEALING_TRANCE_SHAMAN = 60515,
- };
-
- public:
- spell_gen_soul_preserver() : SpellScriptLoader("spell_gen_soul_preserver") { }
-
- class spell_gen_soul_preserver_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_soul_preserver_SpellScript);
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- uint32 triggeredSpell = 0;
- Player* caster = GetCaster()->ToPlayer();
- if (!caster)
- return;
-
- switch (caster->getClass())
- {
- case CLASS_DRUID:
- triggeredSpell = HEALING_TRANCE_DRUID;
- break;
- case CLASS_PALADIN:
- triggeredSpell = HEALING_TRANCE_PALADIN;
- break;
- case CLASS_PRIEST:
- triggeredSpell = HEALING_TRANCE_PRIEST;
- break;
- case CLASS_SHAMAN:
- triggeredSpell = HEALING_TRANCE_SHAMAN;
- break;
- }
-
- if (triggeredSpell)
- caster->CastSpell(caster, triggeredSpell, true);
- }
-
- void Register()
- {
- OnEffect += SpellEffectFn(spell_gen_soul_preserver_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_gen_soul_preserver_SpellScript();
- }
-};
-
class spell_gen_vehicle_scaling : public SpellScriptLoader
{
public:
@@ -1342,6 +1286,5 @@ void AddSC_generic_spell_scripts()
new spell_gen_magic_rooster();
new spell_gen_allow_cast_from_item_only();
new spell_gen_launch();
- new spell_gen_soul_preserver();
new spell_gen_vehicle_scaling();
}
diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp
index afc1ee056d6..2c134f6a0b8 100644
--- a/src/server/scripts/Spells/spell_hunter.cpp
+++ b/src/server/scripts/Spells/spell_hunter.cpp
@@ -209,50 +209,52 @@ public:
class spell_hun_masters_call : public SpellScriptLoader
{
-public:
- spell_hun_masters_call() : SpellScriptLoader("spell_hun_masters_call") { }
+ public:
+ spell_hun_masters_call() : SpellScriptLoader("spell_hun_masters_call") { }
- class spell_hun_masters_call_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_hun_masters_call_SpellScript)
- bool Validate(SpellInfo const* spellEntry)
+ class spell_hun_masters_call_SpellScript : public SpellScript
{
- if (!sSpellMgr->GetSpellInfo(HUNTER_SPELL_MASTERS_CALL_TRIGGERED))
- return false;
- if (!sSpellMgr->GetSpellInfo(spellEntry->Effects[EFFECT_0].CalcValue()))
- return false;
- if (!sSpellMgr->GetSpellInfo(spellEntry->Effects[EFFECT_1].CalcValue()))
- return false;
- return true;
- }
+ PrepareSpellScript(spell_hun_masters_call_SpellScript)
+ bool Validate(SpellInfo const* spellEntry)
+ {
+ if (!sSpellMgr->GetSpellInfo(HUNTER_SPELL_MASTERS_CALL_TRIGGERED))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(spellEntry->Effects[EFFECT_0].CalcValue()))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(spellEntry->Effects[EFFECT_1].CalcValue()))
+ return false;
+ return true;
+ }
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
- {
- if (Unit* target = GetHitUnit())
+ void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
- target->CastSpell(target, GetEffectValue(), true);
- target->CastSpell(target, HUNTER_SPELL_MASTERS_CALL_TRIGGERED, true);
- // there is a possibility that this effect should access effect 0 (dummy) target, but i dubt that
- // it's more likely that on on retail it's possible to call target selector based on dbc values
- // anyways, we're using GetTargetUnit() here and it's ok
- if (Unit* ally = GetTargetUnit())
+ if (Unit* target = GetHitUnit())
{
- target->CastSpell(ally, GetEffectValue(), true);
- target->CastSpell(ally, GetSpellInfo()->Effects[EFFECT_0].CalcValue(), true);
+ // Cannot be processed while pet is dead
+ TriggerCastFlags castMask = TriggerCastFlags(TRIGGERED_FULL_MASK | ~TRIGGERED_IGNORE_CASTER_AURASTATE);
+ target->CastSpell(target, GetEffectValue(), castMask);
+ target->CastSpell(target, HUNTER_SPELL_MASTERS_CALL_TRIGGERED, castMask);
+ // there is a possibility that this effect should access effect 0 (dummy) target, but i dubt that
+ // it's more likely that on on retail it's possible to call target selector based on dbc values
+ // anyways, we're using GetTargetUnit() here and it's ok
+ if (Unit* ally = GetTargetUnit())
+ {
+ target->CastSpell(ally, GetEffectValue(), castMask);
+ target->CastSpell(ally, GetSpellInfo()->Effects[EFFECT_0].CalcValue(), castMask);
+ }
}
}
- }
- void Register()
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_hun_masters_call_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
{
- OnEffect += SpellEffectFn(spell_hun_masters_call_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ return new spell_hun_masters_call_SpellScript();
}
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_hun_masters_call_SpellScript();
- }
};
class spell_hun_readiness : public SpellScriptLoader
diff --git a/src/server/worldserver/TCSoap/TCSoap.cpp b/src/server/worldserver/TCSoap/TCSoap.cpp
index c0b3f8faebb..603b4824408 100755
--- a/src/server/worldserver/TCSoap/TCSoap.cpp
+++ b/src/server/worldserver/TCSoap/TCSoap.cpp
@@ -19,14 +19,8 @@
#include "soapH.h"
#include "soapStub.h"
-#define POOL_SIZE 5
-
void TCSoapRunnable::run()
{
- // create pool
- SOAPWorkingThread pool;
- pool.activate (THR_NEW_LWP | THR_JOINABLE, POOL_SIZE);
-
struct soap soap;
soap_init(&soap);
soap_set_imode(&soap, SOAP_C_UTFSTRING);
@@ -44,7 +38,7 @@ void TCSoapRunnable::run()
sLog->outString("TCSoap: bound to http://%s:%d", m_host.c_str(), m_port);
- while(!World::IsStopped())
+ while (!World::IsStopped())
{
if (!soap_valid_socket(soap_accept(&soap)))
continue; // ran into an accept timeout
@@ -53,22 +47,19 @@ void TCSoapRunnable::run()
struct soap* thread_soap = soap_copy(&soap);// make a safe copy
ACE_Message_Block *mb = new ACE_Message_Block(sizeof(struct soap*));
- ACE_OS::memcpy (mb->wr_ptr(), &thread_soap, sizeof(struct soap*));
- pool.putq(mb);
+ ACE_OS::memcpy(mb->wr_ptr(), &thread_soap, sizeof(struct soap*));
+ process_message(mb);
}
- pool.msg_queue()->deactivate();
- pool.wait();
-
soap_done(&soap);
}
-void SOAPWorkingThread::process_message (ACE_Message_Block *mb)
+void TCSoapRunnable::process_message(ACE_Message_Block *mb)
{
ACE_TRACE (ACE_TEXT ("SOAPWorkingThread::process_message"));
struct soap* soap;
- ACE_OS::memcpy (&soap, mb->rd_ptr (), sizeof(struct soap*));
+ ACE_OS::memcpy(&soap, mb->rd_ptr (), sizeof(struct soap*));
mb->release();
soap_serve(soap);
diff --git a/src/server/worldserver/TCSoap/TCSoap.h b/src/server/worldserver/TCSoap/TCSoap.h
index d5232f33773..863d7597ef8 100755
--- a/src/server/worldserver/TCSoap/TCSoap.h
+++ b/src/server/worldserver/TCSoap/TCSoap.h
@@ -41,37 +41,12 @@ class TCSoapRunnable: public ACE_Based::Runnable
m_port = port;
}
private:
+ void process_message(ACE_Message_Block *mb);
+
std::string m_host;
uint16 m_port;
};
-class SOAPWorkingThread : public ACE_Task<ACE_MT_SYNCH>
-{
- public:
- SOAPWorkingThread() { }
-
- virtual int svc(void)
- {
- while(1)
- {
- ACE_Message_Block *mb = 0;
- if (this->getq(mb) == -1)
- {
- ACE_DEBUG((LM_INFO,
- ACE_TEXT("(%t) Shutting down\n")));
- break;
- }
-
- // Process the message.
- process_message(mb);
- }
-
- return 0;
- }
- private:
- void process_message(ACE_Message_Block *mb);
-};
-
class SOAPCommand
{
public:
diff --git a/src/server/worldserver/worldserver.rc b/src/server/worldserver/worldserver.rc
index 08f311bcbfa..7712a50cffb 100755
--- a/src/server/worldserver/worldserver.rc
+++ b/src/server/worldserver/worldserver.rc
@@ -39,7 +39,7 @@
IDI_APPICON ICON "worldserver.ico"
/////////////////////////////////////////////////////////////////////////////
-// Neutre (Par défaut système) resources
+// Neutre (Par défaut système) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEUSD)
#ifdef _WIN32
@@ -56,13 +56,14 @@ VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION
PRODUCTVERSION VER_PRODUCTVERSION
-
-
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
#ifndef _DEBUG
FILEFLAGS 0
#else
+ #define VER_PRERELEASE VS_FF_PRERELEASE
+ #define VER_PRIVATEBUILD VS_FF_PRIVATEBUILD
+ #define VER_DEBUG 0
FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG)
#endif