diff options
Diffstat (limited to 'src')
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 |
