aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp6
-rw-r--r--src/server/game/Entities/Player/Player.cpp24
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Guilds/Guild.cpp14
-rw-r--r--src/server/game/Handlers/MailHandler.cpp9
-rw-r--r--src/server/game/Handlers/TradeHandler.cpp15
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp19
-rw-r--r--src/server/game/Spells/SpellEffects.cpp18
-rw-r--r--src/server/game/Spells/SpellInfo.cpp2
-rw-r--r--src/server/game/Spells/SpellMgr.cpp2
-rw-r--r--src/server/game/World/World.cpp9
11 files changed, 60 insertions, 60 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index d754ef967e6..c71b85b2d27 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -3151,14 +3151,14 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
}
uint32 dataType = fields[1].GetUInt8();
- const char* scriptName = fields[4].GetCString();
+ std::string scriptName = fields[4].GetString();
uint32 scriptId = 0;
- if (strcmp(scriptName, "")) // not empty
+ if (scriptName.length()) // not empty
{
if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT)
sLog->outError(LOG_FILTER_SQL, "Table `achievement_criteria_data` has ScriptName set for non-scripted data type (Entry: %u, type %u), useless data.", criteria_id, dataType);
else
- scriptId = sObjectMgr->GetScriptId(scriptName);
+ scriptId = sObjectMgr->GetScriptId(scriptName.c_str());
}
AchievementCriteriaData data(dataType, fields[2].GetUInt32(), fields[3].GetUInt32(), scriptId);
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 41142e2de27..93ae1fbd963 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -22456,26 +22456,28 @@ void Player::InitPrimaryProfessions()
SetFreePrimaryProfessions(sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL));
}
-void Player::ModifyMoney(int64 d)
+bool Player::ModifyMoney(int64 amount, bool sendError /*= true*/)
{
- sScriptMgr->OnPlayerMoneyChanged(this, d);
+ if (!amount)
+ return true;
+
+ sScriptMgr->OnPlayerMoneyChanged(this, amount);
- if (d < 0)
- SetMoney (GetMoney() > uint64(-d) ? GetMoney() + d : 0);
+ if (amount < 0)
+ SetMoney (GetMoney() > uint64(-amount) ? GetMoney() + amount : 0);
else
{
- uint64 newAmount = 0;
- if (GetMoney() < uint64(MAX_MONEY_AMOUNT - d))
- newAmount = GetMoney() + d;
+ if (GetMoney() < uint64(MAX_MONEY_AMOUNT - amount))
+ SetMoney(GetMoney() + amount);
else
{
- // "At Gold Limit"
- newAmount = MAX_MONEY_AMOUNT;
- if (d)
+ if (sendError)
SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, NULL, NULL);
+ return false;
}
- SetMoney(newAmount);
}
+
+ return true;
}
Unit* Player::GetSelectedUnit() const
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 6f5c5b71369..9034c26d4f1 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1731,7 +1731,7 @@ class Player : public Unit, public GridObject<Player>
void setWeaponChangeTimer(uint32 time) {m_weaponChangeTimer = time;}
uint64 GetMoney() const { return GetUInt64Value(PLAYER_FIELD_COINAGE); }
- void ModifyMoney(int64 d);
+ bool ModifyMoney(int64 amount, bool sendError = true);
bool HasEnoughMoney(uint64 amount) const { return GetMoney() >= amount; }
bool HasEnoughMoney(int64 amount) const
{
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 04169bb7b7d..b112888d1b3 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -2035,16 +2035,20 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint64 amount, bool
sScriptMgr->OnGuildMemberWitdrawMoney(this, player, amount, repair);
SQLTransaction trans = CharacterDatabase.BeginTransaction();
- // Update remaining money amount
- member->UpdateBankWithdrawValue(trans, GUILD_BANK_MAX_TABS, amount);
- // Remove money from bank
- _ModifyBankMoney(trans, amount, false);
// Add money to player (if required)
if (!repair)
{
- player->ModifyMoney((int64)amount);
+ if (!player->ModifyMoney(amount))
+ return false;
+
player->SaveGoldToDB(trans);
}
+
+ // Update remaining money amount
+ member->UpdateBankWithdrawValue(trans, GUILD_BANK_MAX_TABS, amount);
+ // Remove money from bank
+ _ModifyBankMoney(trans, amount, false);
+
// Log guild bank event
_LogBankEvent(trans, repair ? GUILD_BANK_LOG_REPAIR_MONEY : GUILD_BANK_LOG_WITHDRAW_MONEY, uint8(0), player->GetGUIDLow(), amount);
CharacterDatabase.CommitTransaction(trans);
diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp
index c21d16d3600..48f11c596d2 100644
--- a/src/server/game/Handlers/MailHandler.cpp
+++ b/src/server/game/Handlers/MailHandler.cpp
@@ -570,13 +570,18 @@ void WorldSession::HandleMailTakeMoney(WorldPacket& recvData)
return;
}
- player->SendMailResult(mailId, MAIL_MONEY_TAKEN, MAIL_OK);
+ if (!player->ModifyMoney(m->money, false))
+ {
+ player->SendMailResult(mailId, MAIL_MONEY_TAKEN, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_TOO_MUCH_GOLD);
+ return;
+ }
- player->ModifyMoney(money);
m->money = 0;
m->state = MAIL_STATE_CHANGED;
player->m_mailsUpdated = true;
+ player->SendMailResult(mailId, MAIL_MONEY_TAKEN, MAIL_OK);
+
// save money and mail to prevent cheating
SQLTransaction trans = CharacterDatabase.BeginTransaction();
player->SaveGoldToDB(trans);
diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp
index 4545a8df353..b25f0a301a9 100644
--- a/src/server/game/Handlers/TradeHandler.cpp
+++ b/src/server/game/Handlers/TradeHandler.cpp
@@ -353,6 +353,20 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
return;
}
+ if (_player->GetMoney() >= uint64(MAX_MONEY_AMOUNT) - his_trade->GetMoney())
+ {
+ _player->SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, NULL, NULL);
+ my_trade->SetAccepted(false, true);
+ return;
+ }
+
+ if (trader->GetMoney() >= uint64(MAX_MONEY_AMOUNT) - my_trade->GetMoney())
+ {
+ trader->SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, NULL, NULL);
+ his_trade->SetAccepted(false, true);
+ return;
+ }
+
// not accept if some items now can't be trade (cheating)
for (uint8 i = 0; i < TRADE_SLOT_TRADED_COUNT; ++i)
{
@@ -363,6 +377,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
SendTradeStatus(TRADE_STATUS_TRADE_CANCELED);
return;
}
+
if (item->IsBindedNotWith(trader))
{
SendTradeStatus(TRADE_STATUS_NOT_ELIGIBLE);
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index b836b589f9c..43e31c34919 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -3429,22 +3429,19 @@ void AuraEffect::HandleAuraModEffectImmunity(AuraApplication const* aurApp, uint
Unit* target = aurApp->GetTarget();
- target->ApplySpellImmune(GetId(), IMMUNITY_EFFECT, GetMiscValue(), apply);
+ target->ApplySpellImmune(GetId(), IMMUNITY_EFFECT, GetMiscValue(), apply);
// when removing flag aura, handle flag drop
- if (!apply && target->GetTypeId() == TYPEID_PLAYER
- && (GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION))
+ Player* player = target->ToPlayer();
+ if (!apply && player && (GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION))
{
- if (target->GetTypeId() == TYPEID_PLAYER)
+ if (player->InBattleground())
{
- if (target->ToPlayer()->InBattleground())
- {
- if (Battleground* bg = target->ToPlayer()->GetBattleground())
- bg->EventPlayerDroppedFlag(target->ToPlayer());
- }
- else
- sOutdoorPvPMgr->HandleDropFlag((Player*)target, GetSpellInfo()->Id);
+ if (Battleground* bg = player->GetBattleground())
+ bg->EventPlayerDroppedFlag(player);
}
+ else
+ sOutdoorPvPMgr->HandleDropFlag(player, GetSpellInfo()->Id);
}
}
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index aac9240e387..bb730b94002 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2987,24 +2987,6 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex)
switch (m_spellInfo->SpellFamilyName)
{
- case SPELLFAMILY_GENERIC:
- {
- switch (m_spellInfo->Id)
- {
- case 69055: // Saber Lash
- case 70814: // Saber Lash
- {
- uint32 count = 0;
- for (std::list<TargetInfo>::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit)
- if (ihit->effectMask & (1 << effIndex))
- ++count;
-
- totalDamagePercentMod /= count;
- break;
- }
- }
- break;
- }
case SPELLFAMILY_WARRIOR:
{
// Devastate (player ones)
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index cb071bdaa1d..652cc34ae5d 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -1007,7 +1007,7 @@ bool SpellInfo::IsLootCrafting() const
return (Effects[0].Effect == SPELL_EFFECT_CREATE_RANDOM_ITEM ||
// different random cards from Inscription (121==Virtuoso Inking Set category) r without explicit item
(Effects[0].Effect == SPELL_EFFECT_CREATE_ITEM_2 &&
- (TotemCategory[0] != 0 || Effects[0].ItemType == 0)));
+ ((TotemCategory[0] != 0 || (Totem[0] != 0 && SpellIconID == 1)) || Effects[0].ItemType == 0)));
}
bool SpellInfo::IsQuestTame() const
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 4ce2604810c..b648a14fce5 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -3382,7 +3382,7 @@ void SpellMgr::LoadSpellInfoCorrections()
break;
case 69055: // Saber Lash (Lord Marrowgar)
case 70814: // Saber Lash (Lord Marrowgar)
- spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_5_YARDS); // 5yd
+ spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_8_YARDS); // 8yd
break;
case 69075: // Bone Storm (Lord Marrowgar)
case 70834: // Bone Storm (Lord Marrowgar)
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 62e792a711a..e72910aab76 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -2967,8 +2967,6 @@ void World::ResetMonthlyQuests()
if (itr->second->GetPlayer())
itr->second->GetPlayer()->ResetMonthlyQuestStatus();
- time_t mostRecentQuestTime = 0;
-
// generate time
time_t curTime = time(NULL);
tm localTm = *localtime(&curTime);
@@ -2998,11 +2996,8 @@ void World::ResetMonthlyQuests()
// last reset time before current moment
time_t resetTime = (curTime < nextMonthResetTime) ? nextMonthResetTime - MONTH : nextMonthResetTime;
- // need reset (if we have quest time before last reset time (not processed by some reason)
- if (mostRecentQuestTime && mostRecentQuestTime <= resetTime)
- m_NextMonthlyQuestReset = mostRecentQuestTime;
- else // plan next reset time
- m_NextMonthlyQuestReset = (curTime >= nextMonthResetTime) ? nextMonthResetTime + MONTH : nextMonthResetTime;
+ // plan next reset time
+ m_NextMonthlyQuestReset = (curTime >= nextMonthResetTime) ? nextMonthResetTime + MONTH : nextMonthResetTime;
sWorld->setWorldState(WS_MONTHLY_QUEST_RESET_TIME, uint64(m_NextMonthlyQuestReset));
}