From 471c9dd621d0725caec6c649265c07e3059dfe7e Mon Sep 17 00:00:00 2001 From: Wilds Date: Sat, 10 Dec 2011 01:46:06 +0100 Subject: Core/Spells: stop channeling bar when interrupted also for creature --- src/server/game/Spells/Spell.cpp | 3 --- 1 file changed, 3 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 8a4c0a768d8..e1c5b9074ba 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4126,9 +4126,6 @@ void Spell::SendChannelUpdate(uint32 time) m_caster->SetUInt32Value(UNIT_CHANNEL_SPELL, 0); } - if (m_caster->GetTypeId() != TYPEID_PLAYER) - return; - WorldPacket data(MSG_CHANNEL_UPDATE, 8+4); data.append(m_caster->GetPackGUID()); data << uint32(time); -- cgit v1.2.3 From a85ca687eb6c280f775cb90540fa18f87ea1a201 Mon Sep 17 00:00:00 2001 From: kaelima Date: Sat, 10 Dec 2011 15:40:55 +0100 Subject: Core/Spell: Fixed compile broken in 11fb0beaf0cb877b14f24aa88f19832e0aa3dc88 and renamed _player to player. --- src/server/game/Spells/SpellEffects.cpp | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 72a7c79dc69..d8095456fca 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2093,10 +2093,10 @@ void Spell::EffectUnlearnSpecialization(SpellEffIndex effIndex) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - Player* _player = unitTarget->ToPlayer(); + Player* player = unitTarget->ToPlayer(); uint32 spellToUnlearn = m_spellInfo->Effects[effIndex].TriggerSpell; - _player->removeSpell(spellToUnlearn); + player->removeSpell(spellToUnlearn); sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell: Player %u has unlearned spell %u from NpcGUID: %u", _player->GetGUIDLow(), spellToUnlearn, m_caster->GetGUIDLow()); } @@ -5875,16 +5875,15 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (m_caster->GetTypeId() != TYPEID_PLAYER) + Player* player = m_caster->ToPlayer(); + if (!player) return; - Player* _player = m_caster->ToPlayer(); - Item* foodItem = itemTarget; if (!foodItem) return; - Pet* pet = _player->GetPet(); + Pet* pet = player->GetPet(); if (!pet) return; @@ -5898,7 +5897,7 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex) ExecuteLogEffectDestroyItem(effIndex, foodItem->GetEntry()); uint32 count = 1; - _player->DestroyItemCount(foodItem, count, true); + player->DestroyItemCount(foodItem, count, true); // TODO: fix crash when a spell has two effects, both pointed at the same item target m_caster->CastCustomSpell(pet, m_spellInfo->Effects[effIndex].TriggerSpell, &benefit, NULL, NULL, true); @@ -6097,7 +6096,7 @@ void Spell::EffectReputation(SpellEffIndex effIndex) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - Player* _player = unitTarget->ToPlayer(); + Player* player = unitTarget->ToPlayer(); int32 rep_change = damage; @@ -6114,10 +6113,10 @@ void Spell::EffectReputation(SpellEffIndex effIndex) } // Bonus from spells that increase reputation gain - float bonus = rep_change * _player->GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN) / 100.0f; // 10% + float bonus = rep_change * player->GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN) / 100.0f; // 10% rep_change += (int32)bonus; - _player->GetReputationMgr().ModifyReputation(factionEntry, rep_change); + player->GetReputationMgr().ModifyReputation(factionEntry, rep_change); } void Spell::EffectQuestComplete(SpellEffIndex effIndex) @@ -6432,12 +6431,11 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - Player* _player = m_caster->ToPlayer() - - if (!_player) + Player* player = m_caster->ToPlayer(); + if (!player) return; - Pet* pet = _player->GetPet(); + Pet* pet = player->GetPet(); if (!pet || pet->isAlive()) return; @@ -6445,8 +6443,8 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/) return; float x, y, z; - _player->GetPosition(x, y, z); - _player->GetMap()->CreatureRelocation(pet, x, y, z, _player->GetOrientation()); + player->GetPosition(x, y, z); + player->GetMap()->CreatureRelocation(pet, x, y, z, player->GetOrientation()); pet->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_NONE); pet->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); @@ -6455,7 +6453,7 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/) pet->SetHealth(pet->CountPctFromMaxHealth(damage)); //pet->AIM_Initialize(); - //_player->PetSpellInitialize(); + //player->PetSpellInitialize(); pet->SavePetToDB(PET_SAVE_AS_CURRENT); } -- cgit v1.2.3 From 39be215811e404187600168caa421304a9ada632 Mon Sep 17 00:00:00 2001 From: kaelima Date: Sat, 10 Dec 2011 16:26:04 +0100 Subject: Core/Protocol: Add debug output when receiving auction house packets. --- .../game/Server/Protocol/Handlers/AuctionHouseHandler.cpp | 14 +++++++++++++- src/server/game/Spells/SpellEffects.cpp | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp b/src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp index 8c45b030603..0deaa6b984d 100755 --- a/src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp @@ -115,6 +115,8 @@ void WorldSession::SendAuctionOwnerNotification(AuctionEntry* auction) //this void creates new auction and adds auction to some auctionhouse void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) { + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_SELL_ITEM"); + uint64 auctioneer, item; uint32 etime, bid, buyout, count; recv_data >> auctioneer; @@ -253,6 +255,8 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) //this function is called when client bids or buys out auction void WorldSession::HandleAuctionPlaceBid(WorldPacket & recv_data) { + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_PLACE_BID"); + uint64 auctioneer; uint32 auctionId; uint32 price; @@ -374,6 +378,8 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket & recv_data) //this void is called when auction_owner cancels his auction void WorldSession::HandleAuctionRemoveItem(WorldPacket & recv_data) { + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_REMOVE_ITEM"); + uint64 auctioneer; uint32 auctionId; recv_data >> auctioneer; @@ -452,6 +458,8 @@ void WorldSession::HandleAuctionRemoveItem(WorldPacket & recv_data) //called when player lists his bids void WorldSession::HandleAuctionListBidderItems(WorldPacket & recv_data) { + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_LIST_BIDDER_ITEMS"); + uint64 guid; //NPC guid uint32 listfrom; //page of auctions uint32 outbiddedCount; //count of outbidded auctions @@ -507,6 +515,8 @@ void WorldSession::HandleAuctionListBidderItems(WorldPacket & recv_data) //this void sends player info about his auctions void WorldSession::HandleAuctionListOwnerItems(WorldPacket & recv_data) { + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_LIST_OWNER_ITEMS"); + uint32 listfrom; uint64 guid; @@ -542,6 +552,8 @@ void WorldSession::HandleAuctionListOwnerItems(WorldPacket & recv_data) //this void is called when player clicks on search button void WorldSession::HandleAuctionListItems(WorldPacket & recv_data) { + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_LIST_ITEMS"); + std::string searchedname; uint8 levelmin, levelmax, usable; uint32 listfrom, auctionSlotID, auctionMainCategory, auctionSubCategory, quality; @@ -607,7 +619,7 @@ void WorldSession::HandleAuctionListItems(WorldPacket & recv_data) void WorldSession::HandleAuctionListPendingSales(WorldPacket & recv_data) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_AUCTION_LIST_PENDING_SALES"); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_LIST_PENDING_SALES"); recv_data.read_skip(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d8095456fca..4eb514c5869 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2098,7 +2098,7 @@ void Spell::EffectUnlearnSpecialization(SpellEffIndex effIndex) player->removeSpell(spellToUnlearn); - sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell: Player %u has unlearned spell %u from NpcGUID: %u", _player->GetGUIDLow(), spellToUnlearn, m_caster->GetGUIDLow()); + sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell: Player %u has unlearned spell %u from NpcGUID: %u", player->GetGUIDLow(), spellToUnlearn, m_caster->GetGUIDLow()); } void Spell::EffectPowerDrain(SpellEffIndex effIndex) -- cgit v1.2.3 From cfe5a8daf2404f95592e13f72743c792787e7b5b Mon Sep 17 00:00:00 2001 From: Shocker Date: Sat, 10 Dec 2011 19:32:44 +0200 Subject: Core/Achievements: Typo-fix in AchievementCriteriaData::IsValid error log --- src/server/game/Achievements/AchievementMgr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 8967446f199..9d7b3a53f9a 100755 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -135,13 +135,13 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) } if (classRace.class_id && ((1 << (classRace.class_id-1)) & CLASSMASK_ALL_PLAYABLE) == 0) { - sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_CREATURE (%u) has non-existing class in value1 (%u), ignored.", + sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_CLASS_RACE (%u) has non-existing class in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, classRace.class_id); return false; } if (classRace.race_id && ((1 << (classRace.race_id-1)) & RACEMASK_ALL_PLAYABLE) == 0) { - sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_CREATURE (%u) has non-existing race in value2 (%u), ignored.", + sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_CLASS_RACE (%u) has non-existing race in value2 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, classRace.race_id); return false; } -- cgit v1.2.3 From b2e71e7b4b55f2da1983ae2262a67a8df45bcae8 Mon Sep 17 00:00:00 2001 From: Shocker Date: Sat, 10 Dec 2011 19:46:54 +0200 Subject: Core/Achievements: Allow ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL to have criteria data --- src/server/game/Achievements/AchievementMgr.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/server/game') diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 9d7b3a53f9a..4b35c9e00f6 100755 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -102,6 +102,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST: // only Children's Week achievements case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: // only Children's Week achievements case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS: + case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL: break; default: if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT) @@ -846,6 +847,9 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; } case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL: + if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria)) + if (!data->Meets(GetPlayer(), unit)) + continue; SetCriteriaProgress(achievementCriteria, GetPlayer()->getLevel()); break; case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL: -- cgit v1.2.3 From 4e6fcc18ea1291b155c14c1b69dab3adc9369d9e Mon Sep 17 00:00:00 2001 From: Shocker Date: Sat, 10 Dec 2011 20:01:10 +0200 Subject: Core/Achievements: Remove hardcoded ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL criteria datas --- ...11_12_10_01_world_achievement_criteria_data.sql | 23 ++++++++++++++++++++++ src/server/game/Achievements/AchievementMgr.cpp | 16 --------------- 2 files changed, 23 insertions(+), 16 deletions(-) create mode 100644 sql/updates/world/2011_12_10_01_world_achievement_criteria_data.sql (limited to 'src/server/game') diff --git a/sql/updates/world/2011_12_10_01_world_achievement_criteria_data.sql b/sql/updates/world/2011_12_10_01_world_achievement_criteria_data.sql new file mode 100644 index 00000000000..70e4a4fc544 --- /dev/null +++ b/sql/updates/world/2011_12_10_01_world_achievement_criteria_data.sql @@ -0,0 +1,23 @@ +DELETE FROM `achievement_criteria_data` WHERE criteria_id IN (5220, 5215, 5218, 5221, 5216, 5219, 5213, 5018, 5217, 5214, 5233, 5235, 5232, 5234, 5238, 5236, 5229, 5237, 5230, 5231); +-- Classes +INSERT INTO `achievement_criteria_data` VALUES (5220, 2, 1, 0, ''); -- Realm First! Level 80 Warrior +INSERT INTO `achievement_criteria_data` VALUES (5215, 2, 2, 0, ''); -- Realm First! Level 80 Paladin +INSERT INTO `achievement_criteria_data` VALUES (5218, 2, 3, 0, ''); -- Realm First! Level 80 Hunter +INSERT INTO `achievement_criteria_data` VALUES (5221, 2, 4, 0, ''); -- Realm First! Level 80 Rogue +INSERT INTO `achievement_criteria_data` VALUES (5216, 2, 5, 0, ''); -- Realm First! Level 80 Priest +INSERT INTO `achievement_criteria_data` VALUES (5219, 2, 6, 0, ''); -- Realm First! Level 80 Death Knight +INSERT INTO `achievement_criteria_data` VALUES (5213, 2, 7, 0, ''); -- Realm First! Level 80 Shaman +INSERT INTO `achievement_criteria_data` VALUES (5018, 2, 8, 0, ''); -- Realm First! Level 80 Mage +INSERT INTO `achievement_criteria_data` VALUES (5217, 2, 9, 0, ''); -- Realm First! Level 80 Warlock +INSERT INTO `achievement_criteria_data` VALUES (5214, 2, 11, 0, ''); -- Realm First! Level 80 Druid +-- Races +INSERT INTO `achievement_criteria_data` VALUES (5233, 2, 0, 1, ''); -- Realm First! Level 80 Human +INSERT INTO `achievement_criteria_data` VALUES (5235, 2, 0, 2, ''); -- Realm First! Level 80 Orc +INSERT INTO `achievement_criteria_data` VALUES (5232, 2, 0, 3, ''); -- Realm First! Level 80 Dwarf +INSERT INTO `achievement_criteria_data` VALUES (5234, 2, 0, 4, ''); -- Realm First! Level 80 Night Elf +INSERT INTO `achievement_criteria_data` VALUES (5238, 2, 0, 5, ''); -- Realm First! Level 80 Undead +INSERT INTO `achievement_criteria_data` VALUES (5236, 2, 0, 6, ''); -- Realm First! Level 80 Tauren +INSERT INTO `achievement_criteria_data` VALUES (5229, 2, 0, 7, ''); -- Realm First! Level 80 Gnome +INSERT INTO `achievement_criteria_data` VALUES (5237, 2, 0, 8, ''); -- Realm First! Level 80 Troll +INSERT INTO `achievement_criteria_data` VALUES (5230, 2, 0, 10, ''); -- Realm First! Level 80 Blood Elf +INSERT INTO `achievement_criteria_data` VALUES (5231, 2, 0, 11, ''); -- Realm First! Level 80 Draenei diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 4b35c9e00f6..a0463227931 100755 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -1601,9 +1601,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui } } -static const uint32 achievIdByClass[MAX_CLASSES] = { 0, 459, 465, 462, 458, 464, 461, 467, 460, 463, 0, 466 }; -static const uint32 achievIdByRace[MAX_RACES] = { 0, 1408, 1410, 1407, 1409, 1413, 1411, 1404, 1412, 0, 1405, 1406 }; - bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement) { // counter can never complete @@ -1628,20 +1625,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: return progress->counter >= achievementCriteria->kill_creature.creatureCount; case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL: - { - // skip wrong class achievements - for (int i = 1; i < MAX_CLASSES; ++i) - if (achievIdByClass[i] == achievement->ID && i != GetPlayer()->getClass()) - return false; - - // skip wrong race achievements - for (int i = 1; i < MAX_RACES; ++i) - if (achievIdByRace[i] == achievement->ID && i != GetPlayer()->getRace()) - return false; - - // appropriate class/race or not class/race specific return progress->counter >= achievementCriteria->reach_level.level; - } case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL: return progress->counter >= achievementCriteria->reach_skill_level.skillLevel; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: -- cgit v1.2.3 From d4921e0f259e3e9b8cb40fac992c3dcf884d219b Mon Sep 17 00:00:00 2001 From: Shocker Date: Sat, 10 Dec 2011 20:05:51 +0200 Subject: Core/Misc: Small english fix --- src/server/game/Entities/Player/Player.cpp | 4 ++-- .../game/Server/Protocol/Handlers/AuctionHouseHandler.cpp | 14 +++++++------- src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0e98eb27596..efa792bc59e 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15052,11 +15052,11 @@ void Player::FailQuest(uint32 questId) // Destroy quest items on quest failure. for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) if (quest->RequiredItemId[i] > 0 && quest->RequiredItemCount[i] > 0) - // Destroy items recieved on starting the quest. + // Destroy items received on starting the quest. DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true, true); for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) if (quest->RequiredSourceItemId[i] > 0 && quest->RequiredSourceItemCount[i] > 0) - // Destroy items recieved during the quest. + // Destroy items received during the quest. DestroyItemCount(quest->RequiredSourceItemId[i], quest->RequiredSourceItemCount[i], true, true); } } diff --git a/src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp b/src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp index 0deaa6b984d..1710a387307 100755 --- a/src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp @@ -115,7 +115,7 @@ void WorldSession::SendAuctionOwnerNotification(AuctionEntry* auction) //this void creates new auction and adds auction to some auctionhouse void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_SELL_ITEM"); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_SELL_ITEM"); uint64 auctioneer, item; uint32 etime, bid, buyout, count; @@ -255,7 +255,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data) //this function is called when client bids or buys out auction void WorldSession::HandleAuctionPlaceBid(WorldPacket & recv_data) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_PLACE_BID"); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_PLACE_BID"); uint64 auctioneer; uint32 auctionId; @@ -378,7 +378,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket & recv_data) //this void is called when auction_owner cancels his auction void WorldSession::HandleAuctionRemoveItem(WorldPacket & recv_data) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_REMOVE_ITEM"); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_REMOVE_ITEM"); uint64 auctioneer; uint32 auctionId; @@ -458,7 +458,7 @@ void WorldSession::HandleAuctionRemoveItem(WorldPacket & recv_data) //called when player lists his bids void WorldSession::HandleAuctionListBidderItems(WorldPacket & recv_data) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_LIST_BIDDER_ITEMS"); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_LIST_BIDDER_ITEMS"); uint64 guid; //NPC guid uint32 listfrom; //page of auctions @@ -515,7 +515,7 @@ void WorldSession::HandleAuctionListBidderItems(WorldPacket & recv_data) //this void sends player info about his auctions void WorldSession::HandleAuctionListOwnerItems(WorldPacket & recv_data) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_LIST_OWNER_ITEMS"); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_LIST_OWNER_ITEMS"); uint32 listfrom; uint64 guid; @@ -552,7 +552,7 @@ void WorldSession::HandleAuctionListOwnerItems(WorldPacket & recv_data) //this void is called when player clicks on search button void WorldSession::HandleAuctionListItems(WorldPacket & recv_data) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_LIST_ITEMS"); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_LIST_ITEMS"); std::string searchedname; uint8 levelmin, levelmax, usable; @@ -619,7 +619,7 @@ void WorldSession::HandleAuctionListItems(WorldPacket & recv_data) void WorldSession::HandleAuctionListPendingSales(WorldPacket & recv_data) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recieved CMSG_AUCTION_LIST_PENDING_SALES"); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_LIST_PENDING_SALES"); recv_data.read_skip(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index e7d8b070e53..877971aa502 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -526,7 +526,7 @@ class boss_freya : public CreatureScript { uint8 n = 0; - // Handling recieved data + // Handling received data for (uint8 i = 0; i < 5; ++i) // We have created "instances" for keeping informations about last 6 death lashers - needed because of respawning { deforestation[i][0] = deforestation[(i + 1)][0]; // Time -- cgit v1.2.3 From 196159dbcfeaa6d3a581a2fb6119d537a4b39baf Mon Sep 17 00:00:00 2001 From: Shocker Date: Sat, 10 Dec 2011 20:29:23 +0200 Subject: Core/Player: Remove unused Player method TeleportOutOfMap --- src/server/game/Entities/Player/Player.cpp | 22 ---------------------- src/server/game/Entities/Player/Player.h | 3 --- 2 files changed, 25 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index efa792bc59e..c434105610c 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2052,28 +2052,6 @@ void Player::SendTeleportAckPacket() GetSession()->SendPacket(&data); } -// this is not used anywhere -void Player::TeleportOutOfMap(Map* oldMap) -{ - while (IsBeingTeleportedFar()) - GetSession()->HandleMoveWorldportAckOpcode(); - - if (GetMap() != oldMap) - return; - - TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GetOrientation()); - - while (IsBeingTeleportedFar()) - GetSession()->HandleMoveWorldportAckOpcode(); - - if (GetMap() == oldMap) - { - sLog->outCrash("Cannot teleport player out of map!"); - ResetMap(); - ASSERT(false); - } -} - bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options) { if (!MapManager::IsValidMapCoord(mapid, x, y, z, orientation)) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 651b99e7cb4..2b84a116ee8 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1091,13 +1091,10 @@ class Player : public Unit, public GridObject void RemoveFromWorld(); bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0); - void TeleportOutOfMap(Map* oldMap); - bool TeleportTo(WorldLocation const &loc, uint32 options = 0) { return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options); } - bool TeleportToBGEntryPoint(); void SetSummonPoint(uint32 mapid, float x, float y, float z) -- cgit v1.2.3 From 761c5c9e2f1c6c37f850353458c39f0dc1a14c77 Mon Sep 17 00:00:00 2001 From: Kapoeira Date: Sat, 10 Dec 2011 14:50:37 -0500 Subject: Core/Spells: Rake's initial damage is a bleeding effect, it should thus ignore armor. So far this is the only example of such a mechanic (3.3.5), so this does not break anything. --- src/server/game/Entities/Unit/Unit.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 298f9c60af8..240850646ea 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1478,9 +1478,13 @@ bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* s return false; // bleeding effects are not reduced by armor - if (effIndex != MAX_SPELL_EFFECTS && spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE) - if (spellInfo->GetEffectMechanicMask(effIndex) & (1<Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE || + spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE) + if (spellInfo->GetEffectMechanicMask(effIndex) & (1< Date: Sun, 11 Dec 2011 14:40:01 +0100 Subject: Core/Vehicles: In CMSG_ATTACKSWING check if current vehicle seat flags permit attacking before updating standstate etc. Client also checks this. Furthermore, removed incorrect vehicle_seat_flag_b definition and added an unknown vehicle_seat_flag that was found in the client. --- src/server/game/DataStores/DBCEnums.h | 4 ++-- .../Server/Protocol/Handlers/CombatHandler.cpp | 23 ++++++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index dcdc2b2ea0a..a13761d121f 100755 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -417,7 +417,7 @@ enum SummonPropFlags enum VehicleSeatFlags { VEHICLE_SEAT_FLAG_HIDE_PASSENGER = 0x00000200, // Passenger is hidden - VEHICLE_SEAT_FLAG_UNK11 = 0x00000400, // needed for CGCamera__SyncFreeLookFacing + VEHICLE_SEAT_FLAG_UNK1 = 0x00000400, // needed for CGCamera__SyncFreeLookFacing VEHICLE_SEAT_FLAG_CAN_CONTROL = 0x00000800, // Lua_UnitInVehicleControlSeat VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL = 0x00001000, // Can cast spells with SPELL_AURA_MOUNTED from seat (possibly 4.x only, 0 seats on 3.3.5a) VEHICLE_SEAT_FLAG_UNCONTROLLED = 0x00002000, // can override !& VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT @@ -425,6 +425,7 @@ enum VehicleSeatFlags VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT = 0x02000000, // Lua_CanExitVehicle - can enter and exit at free will VEHICLE_SEAT_FLAG_CAN_SWITCH = 0x04000000, // Lua_CanSwitchVehicleSeats VEHICLE_SEAT_FLAG_CAN_CAST = 0x20000000, // Lua_UnitHasVehicleUI + VEHICLE_SEAT_FLAG_UNK2 = 0x40000000, // checked in conjunction with 0x800 in CastSpell2 }; enum VehicleSeatFlagsB @@ -435,7 +436,6 @@ enum VehicleSeatFlagsB VEHICLE_SEAT_FLAG_B_EJECTABLE = 0x00000020, // ejectable VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 = 0x00000040, VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 = 0x00000100, - VEHICLE_SEAT_FLAG_B_CANSWITCH = 0x04000000, // can switch seats VEHICLE_SEAT_FLAG_B_VEHICLE_PLAYERFRAME_UI = 0x80000000, // Lua_UnitHasVehiclePlayerFrameUI - actually checked for flagsb &~ 0x80000000 }; diff --git a/src/server/game/Server/Protocol/Handlers/CombatHandler.cpp b/src/server/game/Server/Protocol/Handlers/CombatHandler.cpp index 31a09e830ff..df375c80482 100755 --- a/src/server/game/Server/Protocol/Handlers/CombatHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/CombatHandler.cpp @@ -23,13 +23,15 @@ #include "ObjectAccessor.h" #include "CreatureAI.h" #include "ObjectDefines.h" +#include "Vehicle.h" +#include "VehicleDefines.h" -void WorldSession::HandleAttackSwingOpcode(WorldPacket & recv_data) +void WorldSession::HandleAttackSwingOpcode(WorldPacket& recv_data) { uint64 guid; recv_data >> guid; - sLog->outStaticDebug("WORLD: Recvd CMSG_ATTACKSWING Message guidlow:%u guidhigh:%u", GUID_LOPART(guid), GUID_HIPART(guid)); + sLog->outDebug(LOG_FILTER_PACKETIO, "WORLD: Recvd CMSG_ATTACKSWING Message guidlow:%u guidhigh:%u", GUID_LOPART(guid), GUID_HIPART(guid)); Unit* pEnemy = ObjectAccessor::GetUnit(*_player, guid); @@ -47,6 +49,20 @@ void WorldSession::HandleAttackSwingOpcode(WorldPacket & recv_data) return; } + //! Client explicitly checks the following before sending CMSG_ATTACKSWING packet, + //! so we'll place the same check here. Note that it might be possible to reuse this snippet + //! in other places as well. + if (Vehicle* vehicle = _player->GetVehicle()) + { + VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(_player); + ASSERT(seat); + if (!(seat->m_flags & VEHICLE_SEAT_FLAG_CAN_ATTACK)) + { + SendAttackStop(pEnemy); + return; + } + } + _player->Attack(pEnemy, true); } @@ -55,7 +71,7 @@ void WorldSession::HandleAttackStopOpcode(WorldPacket & /*recv_data*/) GetPlayer()->AttackStop(); } -void WorldSession::HandleSetSheathedOpcode(WorldPacket & recv_data) +void WorldSession::HandleSetSheathedOpcode(WorldPacket& recv_data) { uint32 sheathed; recv_data >> sheathed; @@ -79,4 +95,3 @@ void WorldSession::SendAttackStop(Unit const* enemy) data << uint32(0); // unk, can be 1 also SendPacket(&data); } - -- cgit v1.2.3 From d7d79f058d5b547dada9316db2b5b2379f3c7a28 Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Sun, 11 Dec 2011 15:28:33 +0100 Subject: Forgotten change to seat flag defines, thanks to Venugh. --- src/server/game/DataStores/DBCStructure.h | 2 +- src/server/game/Entities/Vehicle/Vehicle.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index ba7be495c77..f04f3368b0f 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1939,7 +1939,7 @@ struct VehicleSeatEntry // 46-57 added in 3.1, floats mostly bool CanEnterOrExit() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT; } - bool CanSwitchFromSeat() const { return m_flags & VEHICLE_SEAT_FLAG_B_CANSWITCH; } + bool CanSwitchFromSeat() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_SWITCH; } bool IsUsableByOverride() const { return (m_flags & VEHICLE_SEAT_FLAG_UNCONTROLLED) || (m_flagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3)); } bool IsEjectable() const { return m_flagsB & VEHICLE_SEAT_FLAG_B_EJECTABLE; } diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index fe018ec78ce..d3c3268e9ce 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -341,7 +341,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) } } - if (seat->second.SeatInfo->m_flags && !(seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK11)) + if (seat->second.SeatInfo->m_flags && !(seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK1)) unit->AddUnitState(UNIT_STAT_ONVEHICLE); unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); -- cgit v1.2.3 From 7e43bae94e5f18850d5f04b26cbea95c373ced16 Mon Sep 17 00:00:00 2001 From: Venugh Date: Sun, 11 Dec 2011 16:02:37 +0100 Subject: Core/Server: Fix typo from previous commit. --- src/server/game/Server/Protocol/Handlers/CombatHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Server/Protocol/Handlers/CombatHandler.cpp b/src/server/game/Server/Protocol/Handlers/CombatHandler.cpp index df375c80482..e6c4499baab 100755 --- a/src/server/game/Server/Protocol/Handlers/CombatHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/CombatHandler.cpp @@ -31,7 +31,7 @@ void WorldSession::HandleAttackSwingOpcode(WorldPacket& recv_data) uint64 guid; recv_data >> guid; - sLog->outDebug(LOG_FILTER_PACKETIO, "WORLD: Recvd CMSG_ATTACKSWING Message guidlow:%u guidhigh:%u", GUID_LOPART(guid), GUID_HIPART(guid)); + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_ATTACKSWING Message guidlow:%u guidhigh:%u", GUID_LOPART(guid), GUID_HIPART(guid)); Unit* pEnemy = ObjectAccessor::GetUnit(*_player, guid); -- cgit v1.2.3 From 1b2c413933f19aec82371a5b55cba9c3b3ded43a Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Sun, 11 Dec 2011 16:22:18 +0100 Subject: Core/SAI: Preliminary implementation of SMART_EVENT_GAME_EVENT_START and SMART_EVENT_GAME_EVENT_END {param1: game_event.entry} --- src/server/game/AI/CoreAI/GameObjectAI.h | 1 + src/server/game/AI/CoreAI/UnitAI.h | 1 + src/server/game/AI/SmartScripts/SmartAI.cpp | 11 +++++++++ src/server/game/AI/SmartScripts/SmartAI.h | 2 ++ src/server/game/AI/SmartScripts/SmartScript.cpp | 12 +++++++++- src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 9 ++++++++ src/server/game/AI/SmartScripts/SmartScriptMgr.h | 13 +++++++++-- src/server/game/Events/GameEventMgr.cpp | 27 ++++++++++++++++++++++ src/server/game/Events/GameEventMgr.h | 1 + src/server/game/Globals/ObjectAccessor.h | 20 ++++++++-------- 10 files changed, 84 insertions(+), 13 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index 8d0e0508113..93cd3a6d237 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -49,6 +49,7 @@ class GameObjectAI virtual uint32 GetDialogStatus(Player* /*player*/) {return 100;} virtual void Destroyed(Player* /*player*/, uint32 /*eventId*/) {} virtual void SetData(uint32 /*id*/, uint32 /*value*/) {} + virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) {} }; class NullGameObjectAI : public GameObjectAI diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 3c16fe493b4..444dce0339e 100755 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -267,6 +267,7 @@ class UnitAI virtual void sQuestComplete(Player* /*player*/, Quest const* /*quest*/) {} virtual void sQuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) {} virtual bool sOnDummyEffect(Unit* /*caster*/, uint32 /*spellId*/, SpellEffIndex /*effIndex*/) { return false; } + virtual void sOnGameEvent(bool /*start*/, uint16 /*eventId*/) {} }; class PlayerAI : public UnitAI diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index fde660e483e..7dd793a302b 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -811,6 +811,12 @@ void SmartAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker) GetScript()->mLastInvoker = invoker->GetGUID(); GetScript()->SetScript9(e, entry); } + +void SmartAI::sOnGameEvent(bool start, uint16 eventId) +{ + GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, NULL, eventId); +} + /* SMART_EVENT_UPDATE_OOC SMART_EVENT_SPELLHIT @@ -913,6 +919,11 @@ void SmartGameObjectAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* inv GetScript()->SetScript9(e, entry); } +void SmartGameObjectAI::OnGameEvent(bool start, uint16 eventId) +{ + GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, NULL, eventId); +} + class SmartTrigger : public AreaTriggerScript { public: diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index 8bb3bda8dd6..dc1f901d477 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -183,6 +183,7 @@ class SmartAI : public CreatureAI //void sQuestComplete(Player* player, Quest const* quest); void sQuestReward(Player* player, Quest const* quest, uint32 opt); bool sOnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effIndex); + void sOnGameEvent(bool start, uint16 eventId); uint32 mEscortQuestID; @@ -249,6 +250,7 @@ public: void Destroyed(Player* player, uint32 eventId); void SetData(uint32 id, uint32 value); void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker); + void OnGameEvent(bool start, uint16 eventId); protected: GameObject* const go; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 9755055cd6e..dded086b584 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2595,6 +2595,14 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui ProcessAction(e, unit, var0, var1); break; } + case SMART_EVENT_GAME_EVENT_START: + case SMART_EVENT_GAME_EVENT_END: + { + if (e.event.gameEvent.gameEventId != var0) + return; + ProcessAction(e, NULL, var0); + break; + } default: sLog->outErrorDb("SmartScript::ProcessEvent: Unhandled Event type %u", e.GetEventType()); break; @@ -2996,7 +3004,9 @@ void SmartScript::SetScript9(SmartScriptHolder& e, uint32 entry) mResumeActionList = e.action.timedActionList.dontResume ? false : true; InitTimer((*i)); } -}Unit* SmartScript::GetLastInvoker() +} + +Unit* SmartScript::GetLastInvoker() { return ObjectAccessor::FindUnit(mLastInvoker); } diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 011ed75205d..efc342def2d 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -26,6 +26,7 @@ #include "CellImpl.h" #include "InstanceScript.h" #include "ScriptedCreature.h" +#include "GameEventMgr.h" #include "SmartScriptMgr.h" @@ -466,6 +467,14 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) if (!IsMinMaxValid(e, e.event.behindTarget.cooldownMin, e.event.behindTarget.cooldownMax)) return false; break; + case SMART_EVENT_GAME_EVENT_START: + case SMART_EVENT_GAME_EVENT_END: + { + GameEventMgr::GameEventDataMap const& events = sGameEventMgr->GetEventMap(); + if (e.event.gameEvent.gameEventId >= events.size() || !events[e.event.gameEvent.gameEventId].isValid()) + return false; + break; + } case SMART_EVENT_TIMED_EVENT_TRIGGERED: case SMART_EVENT_INSTANCE_PLAYER_ENTER: case SMART_EVENT_TRANSPORT_RELOCATE: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index e80da52ccd3..ea15cb46375 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -152,8 +152,10 @@ enum SMART_EVENT SMART_EVENT_FOLLOW_COMPLETED = 65, //1 // none SMART_EVENT_DUMMY_EFFECT = 66, //1 // spellId, effectIndex SMART_EVENT_IS_BEHIND_TARGET = 67, //1 // cooldownMin, CooldownMax + SMART_EVENT_GAME_EVENT_START = 68, //1 // game_event.Entry + SMART_EVENT_GAME_EVENT_END = 69, //1 // game_event.Entry - SMART_EVENT_END = 68, + SMART_EVENT_END = 70, }; struct SmartEvent @@ -338,6 +340,11 @@ struct SmartEvent uint32 cooldownMax; } behindTarget; + struct + { + uint32 gameEventId; + } gameEvent; + struct { uint32 param1; @@ -1128,7 +1135,9 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] = {SMART_EVENT_GOSSIP_HELLO, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_FOLLOW_COMPLETED, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_DUMMY_EFFECT, SMART_SCRIPT_TYPE_MASK_SPELL }, - {SMART_EVENT_IS_BEHIND_TARGET, SMART_SCRIPT_TYPE_MASK_CREATURE } + {SMART_EVENT_IS_BEHIND_TARGET, SMART_SCRIPT_TYPE_MASK_CREATURE }, + {SMART_EVENT_GAME_EVENT_START, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, + {SMART_EVENT_GAME_EVENT_END, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, }; diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index d3cc27c9e6c..2c2c5fb25c5 100755 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -27,6 +27,8 @@ #include "GossipDef.h" #include "Player.h" #include "BattlegroundMgr.h" +#include "UnitAI.h" +#include "GameObjectAI.h" bool GameEventMgr::CheckOneGameEvent(uint16 entry) const { @@ -1059,6 +1061,8 @@ uint32 GameEventMgr::Update() // return the next e void GameEventMgr::UnApplyEvent(uint16 event_id) { sLog->outDetail("GameEvent %u \"%s\" removed.", event_id, mGameEvent[event_id].description.c_str()); + //! Run SAI scripts with SMART_EVENT_GAME_EVENT_END + RunSmartAIScripts(event_id, false); // un-spawn positive event tagged objects GameEventUnspawn(event_id); // spawn negative event tagget objects @@ -1090,6 +1094,9 @@ void GameEventMgr::ApplyNewEvent(uint16 event_id) sLog->outDetail("GameEvent %u \"%s\" started.", event_id, mGameEvent[event_id].description.c_str()); + //! Run SAI scripts with SMART_EVENT_GAME_EVENT_END + RunSmartAIScripts(event_id, true); + // spawn positive event tagget objects GameEventSpawn(event_id); // un-spawn negative event tagged objects @@ -1601,6 +1608,26 @@ void GameEventMgr::SendWorldStateUpdate(Player* player, uint16 event_id) } } +void GameEventMgr::RunSmartAIScripts(uint16 event_id, bool activate) +{ + //! Iterate over every supported source type (creature and gameobject) + //! Not entirely sure how this will affect units in non-loaded grids. + { + TRINITY_READ_GUARD(HashMapHolder::LockType, *HashMapHolder::GetLock()); + HashMapHolder::MapType const& m = ObjectAccessor::GetCreatures(); + for (HashMapHolder::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter) + if (iter->second->IsInWorld()) + iter->second->AI()->sOnGameEvent(activate, event_id); + } + { + TRINITY_READ_GUARD(HashMapHolder::LockType, *HashMapHolder::GetLock()); + HashMapHolder::MapType const& m = ObjectAccessor::GetGameObjects(); + for (HashMapHolder::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter) + if (iter->second->IsInWorld()) + iter->second->AI()->OnGameEvent(activate, event_id); + } +} + bool IsHolidayActive(HolidayIds id) { if (id == HOLIDAY_NONE) diff --git a/src/server/game/Events/GameEventMgr.h b/src/server/game/Events/GameEventMgr.h index a2a35a85098..bba92b4d24c 100755 --- a/src/server/game/Events/GameEventMgr.h +++ b/src/server/game/Events/GameEventMgr.h @@ -132,6 +132,7 @@ class GameEventMgr void UpdateEventNPCFlags(uint16 event_id); void UpdateEventNPCVendor(uint16 event_id, bool activate); void UpdateBattlegroundSettings(); + void RunSmartAIScripts(uint16 event_id, bool activate); //! Runs SMART_EVENT_GAME_EVENT_START/_END SAI bool CheckOneGameEventConditions(uint16 event_id); void SaveWorldEventStateToDB(uint16 event_id); bool hasCreatureQuestActiveEventExcept(uint32 quest_id, uint16 event_id); diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index 25fa20dce70..92c947eb86f 100755 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -201,16 +201,16 @@ class ObjectAccessor } // when using this, you must use the hashmapholder's lock - //HashMapHolder::MapType& GetCreatures() - //{ - // return HashMapHolder::GetContainer(); - //} - - //// when using this, you must use the hashmapholder's lock - //HashMapHolder::MapType& GetGameObjects() - //{ - // return HashMapHolder::GetContainer(); - //} + static HashMapHolder::MapType const& GetCreatures() + { + return HashMapHolder::GetContainer(); + } + + // when using this, you must use the hashmapholder's lock + static HashMapHolder::MapType const& GetGameObjects() + { + return HashMapHolder::GetContainer(); + } template static void AddObject(T* object) { -- cgit v1.2.3 From 7c9093e32c386894e4af5d1c3864ec8bc286c091 Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Sun, 11 Dec 2011 16:36:40 +0100 Subject: Core/GameEventMgr: Use correct lock type --- src/server/game/Events/GameEventMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index 2c2c5fb25c5..5cb130b93e4 100755 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -1620,7 +1620,7 @@ void GameEventMgr::RunSmartAIScripts(uint16 event_id, bool activate) iter->second->AI()->sOnGameEvent(activate, event_id); } { - TRINITY_READ_GUARD(HashMapHolder::LockType, *HashMapHolder::GetLock()); + TRINITY_READ_GUARD(HashMapHolder::LockType, *HashMapHolder::GetLock()); HashMapHolder::MapType const& m = ObjectAccessor::GetGameObjects(); for (HashMapHolder::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter) if (iter->second->IsInWorld()) -- cgit v1.2.3 From aefbc5701c9a945fe29881161c16488b7204d431 Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Sun, 11 Dec 2011 19:04:21 +0100 Subject: Core/SAI: Remove an improper value in case switch.. no idea when/how/why that got there, but it's conflicting with recent changes. --- src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index efc342def2d..1df5849ca75 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -501,7 +501,6 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_EVENT_WAYPOINT_RESUMED: case SMART_EVENT_WAYPOINT_STOPPED: case SMART_EVENT_WAYPOINT_ENDED: - case SMART_ACTION_PLAYMOVIE: case SMART_EVENT_GOSSIP_SELECT: case SMART_EVENT_GOSSIP_HELLO: case SMART_EVENT_JUST_CREATED: -- cgit v1.2.3 From 3103915994ae2885cfccafc94e315e6d8194ebd7 Mon Sep 17 00:00:00 2001 From: Wilds Date: Sun, 11 Dec 2011 20:46:47 +0100 Subject: Core/Spells: attribute research --- src/server/game/Miscellaneous/SharedDefines.h | 72 +++++++++++++-------------- 1 file changed, 36 insertions(+), 36 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index a99d0f37c02..952df731c19 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -312,13 +312,13 @@ enum SpellAttr1 SPELL_ATTR1_MELEE_COMBAT_START = 0x00000200, // 9 player starts melee combat after this spell is cast SPELL_ATTR1_NO_THREAT = 0x00000400, // 10 no generates threat on cast 100% (old NO_INITIAL_AGGRO) SPELL_ATTR1_UNK11 = 0x00000800, // 11 aura - SPELL_ATTR1_UNK12 = 0x00001000, // 12 + SPELL_ATTR1_UNK12 = 0x00001000, // 12 pickpoket SPELL_ATTR1_FARSIGHT = 0x00002000, // 13 Client removes farsight on aura loss SPELL_ATTR1_CHANNEL_TRACK_TARGET = 0x00004000, // 14 Client automatically forces player to face target when channeling SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY = 0x00008000, // 15 remove auras on immunity SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE = 0x00010000, // 16 on immuniy SPELL_ATTR1_UNAUTOCASTABLE_BY_PET = 0x00020000, // 17 - SPELL_ATTR1_UNK18 = 0x00040000, // 18 + SPELL_ATTR1_UNK18 = 0x00040000, // 18 stun, polymorph, daze, hex SPELL_ATTR1_CANT_TARGET_SELF = 0x00080000, // 19 SPELL_ATTR1_REQ_COMBO_POINTS1 = 0x00100000, // 20 Req combo points on target SPELL_ATTR1_UNK21 = 0x00200000, // 21 @@ -327,17 +327,17 @@ enum SpellAttr1 SPELL_ATTR1_UNK24 = 0x01000000, // 24 only fishing spells SPELL_ATTR1_UNK25 = 0x02000000, // 25 SPELL_ATTR1_UNK26 = 0x04000000, // 26 works correctly with [target=focus] and [target=mouseover] macros? - SPELL_ATTR1_UNK27 = 0x08000000, // 27 + SPELL_ATTR1_UNK27 = 0x08000000, // 27 melee spell? SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR = 0x10000000, // 28 client doesn't display these spells in aura bar SPELL_ATTR1_CHANNEL_DISPLAY_SPELL_NAME = 0x20000000, // 29 spell name is displayed in cast bar instead of 'channeling' text - SPELL_ATTR1_ENABLE_AT_DODGE = 0x40000000, // 30 Overpower, Wolverine Bite + SPELL_ATTR1_ENABLE_AT_DODGE = 0x40000000, // 30 Overpower SPELL_ATTR1_UNK31 = 0x80000000 // 31 }; enum SpellAttr2 { SPELL_ATTR2_CAN_TARGET_DEAD = 0x00000001, // 0 can target dead unit or corpse - SPELL_ATTR2_UNK1 = 0x00000002, // 1 ? many triggered spells have this flag + SPELL_ATTR2_UNK1 = 0x00000002, // 1 vanish, shadowform, Ghost Wolf and other SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS = 0x00000004, // 2 26368 4.0.1 dbc change SPELL_ATTR2_UNK3 = 0x00000008, // 3 SPELL_ATTR2_DISPLAY_IN_STANCE_BAR = 0x00000010, // 4 client displays icon in stance bar when learned, even if not shapeshift @@ -346,9 +346,9 @@ enum SpellAttr2 SPELL_ATTR2_UNK7 = 0x00000080, // 7 SPELL_ATTR2_UNK8 = 0x00000100, // 8 not set in 3.0.3 SPELL_ATTR2_UNK9 = 0x00000200, // 9 - SPELL_ATTR2_UNK10 = 0x00000400, // 10 + SPELL_ATTR2_UNK10 = 0x00000400, // 10 related to tame SPELL_ATTR2_HEALTH_FUNNEL = 0x00000800, // 11 - SPELL_ATTR2_UNK12 = 0x00001000, // 12 + SPELL_ATTR2_UNK12 = 0x00001000, // 12 Cleave, Heart Strike, Maul, Sunder Armor, Swipe SPELL_ATTR2_UNK13 = 0x00002000, // 13 Items enchanted by spells with this flag preserve the enchant to arenas SPELL_ATTR2_UNK14 = 0x00004000, // 14 SPELL_ATTR2_UNK15 = 0x00008000, // 15 not set in 3.0.3 @@ -358,13 +358,13 @@ enum SpellAttr2 SPELL_ATTR2_NOT_NEED_SHAPESHIFT = 0x00080000, // 19 does not necessarly need shapeshift SPELL_ATTR2_UNK20 = 0x00100000, // 20 SPELL_ATTR2_DAMAGE_REDUCED_SHIELD = 0x00200000, // 21 for ice blocks, pala immunity buffs, priest absorb shields, but used also for other spells -> not sure! - SPELL_ATTR2_UNK22 = 0x00400000, // 22 + SPELL_ATTR2_UNK22 = 0x00400000, // 22 Ambush, Backstab, Cheap Shot, Death Grip, Garrote, Judgements, Mutilate, Pounce, Ravage, Shiv, Shred SPELL_ATTR2_UNK23 = 0x00800000, // 23 Only mage Arcane Concentration have this flag SPELL_ATTR2_UNK24 = 0x01000000, // 24 SPELL_ATTR2_UNK25 = 0x02000000, // 25 SPELL_ATTR2_UNK26 = 0x04000000, // 26 unaffected by school immunity SPELL_ATTR2_UNK27 = 0x08000000, // 27 - SPELL_ATTR2_UNK28 = 0x10000000, // 28 no breaks stealth if it fails?? + SPELL_ATTR2_UNK28 = 0x10000000, // 28 SPELL_ATTR2_CANT_CRIT = 0x20000000, // 29 Spell can't crit SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC = 0x40000000, // 30 spell can trigger even if triggered SPELL_ATTR2_FOOD_BUFF = 0x80000000 // 31 Food or Drink Buff (like Well Fed) @@ -393,7 +393,7 @@ enum SpellAttr3 SPELL_ATTR3_IGNORE_HIT_RESULT = 0x00040000, // 18 Spell should always hit its target SPELL_ATTR3_DISABLE_PROC = 0x00080000, // 19 during aura proc no spells can trigger (20178, 20375) SPELL_ATTR3_DEATH_PERSISTENT = 0x00100000, // 20 Death persistent spells - SPELL_ATTR3_UNK21 = 0x00200000, // 21 + SPELL_ATTR3_UNK21 = 0x00200000, // 21 unused SPELL_ATTR3_REQ_WAND = 0x00400000, // 22 Req wand SPELL_ATTR3_UNK23 = 0x00800000, // 23 SPELL_ATTR3_REQ_OFFHAND = 0x01000000, // 24 Req offhand weapon @@ -417,7 +417,7 @@ enum SpellAttr4 SPELL_ATTR4_NOT_STEALABLE = 0x00000040, // 6 although such auras might be dispellable, they cannot be stolen SPELL_ATTR4_TRIGGERED = 0x00000080, // 7 spells forced to be triggered SPELL_ATTR4_UNK8 = 0x00000100, // 8 ignores taken percent damage mods? - SPELL_ATTR4_UNK9 = 0x00000200, // 9 + SPELL_ATTR4_TRIGGER_ACTIVATE = 0x00000200, // 9 initially disabled / trigger activate from event (Execute, Riposte, Deep Freeze end other) SPELL_ATTR4_SPELL_VS_EXTEND_COST = 0x00000400, // 10 Rogue Shiv have this flag SPELL_ATTR4_UNK11 = 0x00000800, // 11 SPELL_ATTR4_UNK12 = 0x00001000, // 12 @@ -427,16 +427,16 @@ enum SpellAttr4 SPELL_ATTR4_NOT_USABLE_IN_ARENA = 0x00010000, // 16 SPELL_ATTR4_USABLE_IN_ARENA = 0x00020000, // 17 SPELL_ATTR4_AREA_TARGET_CHAIN = 0x00040000, // 18 (NYI)hits area targets one after another instead of all at once - SPELL_ATTR4_UNK19 = 0x00080000, // 19 + SPELL_ATTR4_UNK19 = 0x00080000, // 19 proc dalayed, after damage or don't proc on absorb? SPELL_ATTR4_NOT_CHECK_SELFCAST_POWER = 0x00100000, // 20 supersedes message "More powerful spell applied" for self casts. - SPELL_ATTR4_UNK21 = 0x00200000, // 21 + SPELL_ATTR4_UNK21 = 0x00200000, // 21 Pally aura, dk presence, dudu form, warrior stance, shadowform, hunter track SPELL_ATTR4_UNK22 = 0x00400000, // 22 SPELL_ATTR4_UNK23 = 0x00800000, // 23 - SPELL_ATTR4_UNK24 = 0x01000000, // 24 + SPELL_ATTR4_UNK24 = 0x01000000, // 24 some shoot spell SPELL_ATTR4_UNK25 = 0x02000000, // 25 pet scaling auras SPELL_ATTR4_CAST_ONLY_IN_OUTLAND = 0x04000000, // 26 Can only be used in Outland. SPELL_ATTR4_UNK27 = 0x08000000, // 27 - SPELL_ATTR4_UNK28 = 0x10000000, // 28 + SPELL_ATTR4_UNK28 = 0x10000000, // 28 Aimed Shot SPELL_ATTR4_UNK29 = 0x20000000, // 29 SPELL_ATTR4_UNK30 = 0x40000000, // 30 SPELL_ATTR4_UNK31 = 0x80000000 // 31 @@ -456,7 +456,7 @@ enum SpellAttr5 SPELL_ATTR5_START_PERIODIC_AT_APPLY = 0x00000200, // 9 begin periodic tick at aura apply SPELL_ATTR5_HIDE_DURATION = 0x00000400, // 10 do not send duration to client SPELL_ATTR5_ALLOW_TARGET_OF_TARGET_AS_TARGET = 0x00000800, // 11 (NYI) uses target's target as target if original target not valid (intervene for example) - SPELL_ATTR5_UNK12 = 0x00001000, // 12 + SPELL_ATTR5_UNK12 = 0x00001000, // 12 Cleave related? SPELL_ATTR5_HASTE_AFFECT_DURATION = 0x00002000, // 13 haste effects decrease duration of this SPELL_ATTR5_UNK14 = 0x00004000, // 14 SPELL_ATTR5_UNK15 = 0x00008000, // 15 @@ -470,7 +470,7 @@ enum SpellAttr5 SPELL_ATTR5_UNK23 = 0x00800000, // 23 SPELL_ATTR5_UNK24 = 0x01000000, // 24 SPELL_ATTR5_UNK25 = 0x02000000, // 25 - SPELL_ATTR5_UNK26 = 0x04000000, // 26 + SPELL_ATTR5_UNK26 = 0x04000000, // 26 aoe related - Boulder, Cannon, Corpse Explosion, Fire Nova, Flames, Frost Bomb, Living Bomb, Seed of Corruption, Starfall, Thunder Clap, Volley SPELL_ATTR5_UNK27 = 0x08000000, // 27 SPELL_ATTR5_UNK28 = 0x10000000, // 28 SPELL_ATTR5_UNK29 = 0x20000000, // 29 @@ -495,23 +495,23 @@ enum SpellAttr6 SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE = 0x00001000, // 12 castable while caster is on vehicle SPELL_ATTR6_CAN_TARGET_INVISIBLE = 0x00002000, // 13 ignore visibility requirement for spell target (phases, invisibility, etc.) SPELL_ATTR6_UNK14 = 0x00004000, // 14 - SPELL_ATTR6_UNK15 = 0x00008000, // 15 not set in 3.0.3 + SPELL_ATTR6_UNK15 = 0x00008000, // 15 only 54368, 67892 SPELL_ATTR6_UNK16 = 0x00010000, // 16 - SPELL_ATTR6_UNK17 = 0x00020000, // 17 + SPELL_ATTR6_UNK17 = 0x00020000, // 17 Mount spell SPELL_ATTR6_CAST_BY_CHARMER = 0x00040000, // 18 client won't allow to cast these spells when unit is not possessed && charmer of caster will be original caster - SPELL_ATTR6_UNK19 = 0x00080000, // 19 - SPELL_ATTR6_UNK20 = 0x00100000, // 20 + SPELL_ATTR6_UNK19 = 0x00080000, // 19 only 47488, 50782 + SPELL_ATTR6_UNK20 = 0x00100000, // 20 only 58371, 62218 SPELL_ATTR6_CLIENT_UI_TARGET_EFFECTS = 0x00200000, // 21 it's only client-side attribute - SPELL_ATTR6_UNK22 = 0x00400000, // 22 + SPELL_ATTR6_UNK22 = 0x00400000, // 22 only 72054 SPELL_ATTR6_UNK23 = 0x00800000, // 23 SPELL_ATTR6_CAN_TARGET_UNTARGETABLE = 0x01000000, // 24 - SPELL_ATTR6_UNK25 = 0x02000000, // 25 - SPELL_ATTR6_UNK26 = 0x04000000, // 26 + SPELL_ATTR6_UNK25 = 0x02000000, // 25 Exorcism, Flash of Light + SPELL_ATTR6_UNK26 = 0x04000000, // 26 related to player castable positive buff SPELL_ATTR6_UNK27 = 0x08000000, // 27 - SPELL_ATTR6_UNK28 = 0x10000000, // 28 + SPELL_ATTR6_UNK28 = 0x10000000, // 28 Death Grip SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS = 0x20000000, // 29 ignores done percent damage mods? SPELL_ATTR6_UNK30 = 0x40000000, // 30 - SPELL_ATTR6_UNK31 = 0x80000000 // 31 some special cooldown calc? + SPELL_ATTR6_UNK31 = 0x80000000 // 31 some special cooldown calc? only 2894 }; enum SpellAttr7 @@ -520,7 +520,7 @@ enum SpellAttr7 SPELL_ATTR7_UNK1 = 0x00000002, // 1 Not set in 3.2.2a. SPELL_ATTR7_REACTIVATE_AT_RESURRECT = 0x00000004, // 2 Paladin's auras and 65607 only. SPELL_ATTR7_IS_CHEAT_SPELL = 0x00000008, // 3 Cannot cast if caster doesn't have UnitFlag2 & UNIT_FLAG2_ALLOW_CHEAT_SPELLS - SPELL_ATTR7_UNK4 = 0x00000010, // 4 Only 66109 test spell. + SPELL_ATTR7_UNK4 = 0x00000010, // 4 Only 47883 (Soulstone Resurrection) and test spell. SPELL_ATTR7_SUMMON_PLAYER_TOTEM = 0x00000020, // 5 Only Shaman player totems. SPELL_ATTR7_UNK6 = 0x00000040, // 6 Dark Surge, Surge of Light, Burning Breath triggers (boss spells). SPELL_ATTR7_UNK7 = 0x00000080, // 7 66218 (Launch) spell. @@ -536,18 +536,18 @@ enum SpellAttr7 SPELL_ATTR7_UNK17 = 0x00020000, // 17 Only 27965 (Suicide) spell. SPELL_ATTR7_HAS_CHARGE_EFFECT = 0x00040000, // 18 Only spells that have Charge among effects. SPELL_ATTR7_ZONE_TELEPORT = 0x00080000, // 19 Teleports to specific zones. - SPELL_ATTR7_UNK20 = 0x00100000, // 20 - SPELL_ATTR7_UNK21 = 0x00200000, // 21 + SPELL_ATTR7_UNK20 = 0x00100000, // 20 Blink, Divine Shield, Ice Block + SPELL_ATTR7_UNK21 = 0x00200000, // 21 Not set SPELL_ATTR7_UNK22 = 0x00400000, // 22 - SPELL_ATTR7_UNK23 = 0x00800000, // 23 - SPELL_ATTR7_UNK24 = 0x01000000, // 24 + SPELL_ATTR7_UNK23 = 0x00800000, // 23 Motivate, Mutilate, Shattering Throw + SPELL_ATTR7_UNK24 = 0x01000000, // 24 Motivate, Mutilate, Perform Speech, Shattering Throw SPELL_ATTR7_UNK25 = 0x02000000, // 25 SPELL_ATTR7_UNK26 = 0x04000000, // 26 - SPELL_ATTR7_UNK27 = 0x08000000, // 27 - SPELL_ATTR7_UNK28 = 0x10000000, // 28 - SPELL_ATTR7_UNK29 = 0x20000000, // 29 - SPELL_ATTR7_UNK30 = 0x40000000, // 30 - SPELL_ATTR7_UNK31 = 0x80000000 // 31 + SPELL_ATTR7_UNK27 = 0x08000000, // 27 Not set + SPELL_ATTR7_UNK28 = 0x10000000, // 28 related to player positive buff + SPELL_ATTR7_UNK29 = 0x20000000, // 29 only 69028, 71237 + SPELL_ATTR7_UNK30 = 0x40000000, // 30 Burning Determination, Divine Sacrifice, Earth Shield, Prayer of Mending + SPELL_ATTR7_UNK31 = 0x80000000 // 31 only 70769 }; #define MIN_TALENT_SPEC 0 -- cgit v1.2.3 From af32d0f616657a8a60065b5742339e9e87984d64 Mon Sep 17 00:00:00 2001 From: elecyb Date: Sun, 11 Dec 2011 19:11:22 -0300 Subject: Core/Spells: Fixed Healing Stream Totem bonus and Glyph of Healing Stream Totem Closes #2165 --- sql/updates/world/2011_12_11_00_world_spell_bonus_data.sql | 3 +++ src/server/game/Spells/SpellEffects.cpp | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 sql/updates/world/2011_12_11_00_world_spell_bonus_data.sql (limited to 'src/server/game') diff --git a/sql/updates/world/2011_12_11_00_world_spell_bonus_data.sql b/sql/updates/world/2011_12_11_00_world_spell_bonus_data.sql new file mode 100644 index 00000000000..6e53fccf210 --- /dev/null +++ b/sql/updates/world/2011_12_11_00_world_spell_bonus_data.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_bonus_data` WHERE `entry` IN (52042,5672); +INSERT INTO `spell_bonus_data` (`entry`, `direct_bonus`, `dot_bonus`,`ap_bonus`, `ap_dot_bonus`, `comments`) VALUES +('5672','0.0827','-1','-1','-1','Shaman - Healing Stream Totem Rank 1'); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 4eb514c5869..839a466f0f0 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1421,11 +1421,19 @@ void Spell::EffectDummy(SpellEffIndex effIndex) { if (!unitTarget) return; - // Restorative Totems if (Unit* owner = m_caster->GetOwner()) + { + if (m_triggeredByAuraSpell) + damage = int32(owner->SpellHealingBonus(unitTarget, m_triggeredByAuraSpell, damage, HEAL)); + + // Restorative Totems if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 338, 1)) AddPctN(damage, dummy->GetAmount()); + // Glyph of Healing Stream Totem + if (AuraEffect const* aurEff = owner->GetAuraEffect(55456, EFFECT_0)) + AddPctN(damage, aurEff->GetAmount()); + } m_caster->CastCustomSpell(unitTarget, 52042, &damage, 0, 0, true, 0, 0, m_originalCasterGUID); return; } -- cgit v1.2.3 From 3ff67fb2573537f7a9d575d7dcbc6194d91c68a9 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 12 Dec 2011 18:19:26 +0100 Subject: Core/Achievements: Refactored HasAchieved to take only achievement id as parameter --- src/server/game/Achievements/AchievementMgr.cpp | 10 +++++----- src/server/game/Achievements/AchievementMgr.h | 2 +- src/server/game/Conditions/ConditionMgr.cpp | 5 +---- src/server/game/DungeonFinding/LFGMgr.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 2 +- 5 files changed, 9 insertions(+), 12 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index a0463227931..004da0ca7c1 100755 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -451,7 +451,7 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uin continue; // don't update already completed criteria if not forced or achievement already complete - if ((IsCompletedCriteria(achievementCriteria, achievement) && !evenIfCriteriaComplete) || HasAchieved(achievement)) + if ((IsCompletedCriteria(achievementCriteria, achievement) && !evenIfCriteriaComplete) || HasAchieved(achievement->ID)) continue; for (uint8 j = 0; j < MAX_CRITERIA_REQUIREMENTS; ++j) @@ -1766,7 +1766,7 @@ void AchievementMgr::CompletedCriteriaFor(AchievementEntry const* achievement) return; // already completed and stored - if (HasAchieved(achievement)) + if (HasAchieved(achievement->ID)) return; if (IsCompletedAchievement(achievement)) @@ -2000,7 +2000,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) if (m_player->isGameMaster()) return; - if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement)) + if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement->ID)) return; SendAchievementEarned(achievement); @@ -2115,9 +2115,9 @@ void AchievementMgr::BuildAllDataPacket(WorldPacket* data) const *data << int32(-1); } -bool AchievementMgr::HasAchieved(AchievementEntry const* achievement) const +bool AchievementMgr::HasAchieved(uint32 achievementId) const { - return m_completedAchievements.find(achievement->ID) != m_completedAchievements.end(); + return m_completedAchievements.find(achievementId) != m_completedAchievements.end(); } bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement) diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 7f66565622f..f88be974c9d 100755 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -257,7 +257,7 @@ class AchievementMgr void CheckAllAchievementCriteria(); void SendAllAchievementData() const; void SendRespondInspectAchievements(Player* player) const; - bool HasAchieved(AchievementEntry const* achievement) const; + bool HasAchieved(uint32 achievementId) const; Player* GetPlayer() const { return m_player; } void UpdateTimedAchievements(uint32 timeDiff); void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0); diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index bfefb3e4e76..cf349044042 100755 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -67,11 +67,8 @@ bool Condition::Meets(Player* player, Unit* invoker) break; } case CONDITION_ACHIEVEMENT: - { - AchievementEntry const* achievement = GetAchievementStore()->LookupEntry(mConditionValue1); - condMeets = player->GetAchievementMgr().HasAchieved(achievement); + condMeets = player->GetAchievementMgr().HasAchieved(mConditionValue1); break; - } case CONDITION_TEAM: condMeets = player->GetTeam() == mConditionValue1; break; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 55f798204db..21ff3c6e4e8 100755 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -389,7 +389,7 @@ void LFGMgr::InitializeLockedDungeons(Player* player) locktype = LFG_LOCKSTATUS_TOO_HIGH_LEVEL; else if (locktype == LFG_LOCKSTATUS_OK && ar) { - if (ar->achievement && !player->GetAchievementMgr().HasAchieved(sAchievementStore.LookupEntry(ar->achievement))) + if (ar->achievement && !player->GetAchievementMgr().HasAchieved(ar->achievement)) locktype = LFG_LOCKSTATUS_RAID_LOCKED; // FIXME: Check the correct lock value else if (player->GetTeam() == ALLIANCE && ar->quest_A && !player->GetQuestRewardStatus(ar->quest_A)) locktype = LFG_LOCKSTATUS_QUEST_NOT_COMPLETED; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c434105610c..b2ace1bd614 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -18121,7 +18121,7 @@ bool Player::Satisfy(AccessRequirement const* ar, uint32 target_map, bool report missingQuest = ar->quest_H; uint32 missingAchievement = 0; - if (ar->achievement && !GetAchievementMgr().HasAchieved(sAchievementStore.LookupEntry(ar->achievement))) + if (ar->achievement && !GetAchievementMgr().HasAchieved(ar->achievement)) missingAchievement = ar->achievement; Difficulty target_difficulty = GetDifficulty(mapEntry->IsRaid()); -- cgit v1.2.3 From 7147063c17669dbb1e83cd5c32f4642da122bc3e Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 12 Dec 2011 18:20:46 +0100 Subject: Core/Instances: Required achievement to enter instance should only apply to group leader, original patch by kandera Closes #4279 --- src/server/game/Entities/Player/Player.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index b2ace1bd614..5a9a3d2c751 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -18121,8 +18121,14 @@ bool Player::Satisfy(AccessRequirement const* ar, uint32 target_map, bool report missingQuest = ar->quest_H; uint32 missingAchievement = 0; - if (ar->achievement && !GetAchievementMgr().HasAchieved(ar->achievement)) - missingAchievement = ar->achievement; + Player* leader = this; + uint64 leaderGuid = GetGroup() ? GetGroup()->GetLeaderGUID() : GetGUID(); + if (leaderGuid != GetGUID()) + leader = ObjectAccessor::FindPlayer(leaderGuid); + + if (ar->achievement) + if (!leader || !leader->GetAchievementMgr().HasAchieved(ar->achievement)) + missingAchievement = ar->achievement; Difficulty target_difficulty = GetDifficulty(mapEntry->IsRaid()); MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty); -- cgit v1.2.3 From f8cb2f528ba2bc4d4006c529be41430d46031282 Mon Sep 17 00:00:00 2001 From: Vinolentus Date: Mon, 12 Dec 2011 20:36:46 +0100 Subject: Core/ObjectMgr: Fix possible SQL injection for game_tele --- src/server/game/Globals/ObjectMgr.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 75573367241..ff3815d367f 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8040,8 +8040,11 @@ bool ObjectMgr::AddGameTele(GameTele& tele) m_GameTeleMap[new_id] = tele; + std::string safeName(tele.name); + WorldDatabase.escape_string(safeName); + WorldDatabase.PExecute("INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (%u, %f, %f, %f, %f, %d, '%s')", - new_id, tele.position_x, tele.position_y, tele.position_z, tele.orientation, tele.mapId, tele.name.c_str()); + new_id, tele.position_x, tele.position_y, tele.position_z, tele.orientation, tele.mapId, safeName.c_str()); return true; } -- cgit v1.2.3 From cb5ad13906583dec40362290b1c075b167cd7f35 Mon Sep 17 00:00:00 2001 From: Kapoeira Date: Mon, 12 Dec 2011 14:54:19 -0500 Subject: Core/Spells: Fix Warrior's T10 4P DPS Bonus. --- src/server/game/Entities/Unit/Unit.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 298f9c60af8..2b4bfeb9082 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8920,6 +8920,20 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg } break; } + case 46916: // Slam! (Bloodsurge proc) + case 52437: // Sudden Death + { + // Item - Warrior T10 Melee 4P Bonus + if (AuraEffect const* aurEff = GetAuraEffect(70847, 0)) + { + if (!roll_chance_i(aurEff->GetAmount())) + break; + CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge! + CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced + CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced + } + break; + } // Sword and Board case 50227: { -- cgit v1.2.3 From 17771b20c170ea4fd673dc221269aa95b35fd80f Mon Sep 17 00:00:00 2001 From: kaelima Date: Mon, 12 Dec 2011 21:04:51 +0100 Subject: Copy/paste error in f8cb2f528ba2bc4d4006c529be41430d46031282 --- src/server/game/Globals/ObjectMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index ff3815d367f..4e159209e86 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8041,7 +8041,7 @@ bool ObjectMgr::AddGameTele(GameTele& tele) m_GameTeleMap[new_id] = tele; std::string safeName(tele.name); - WorldDatabase.escape_string(safeName); + WorldDatabase.EscapeString(safeName); WorldDatabase.PExecute("INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (%u, %f, %f, %f, %f, %d, '%s')", new_id, tele.position_x, tele.position_y, tele.position_z, tele.orientation, tele.mapId, safeName.c_str()); -- cgit v1.2.3 From a045015bf2cf2abf8fc83ec06f91c0d70194e5bb Mon Sep 17 00:00:00 2001 From: Shocker Date: Tue, 13 Dec 2011 00:05:48 +0200 Subject: Core/Mail: Mails sent by game masters should last 90 days --- src/server/game/Mails/Mail.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp index 6d54aacb311..e5de3e35956 100755 --- a/src/server/game/Mails/Mail.cpp +++ b/src/server/game/Mails/Mail.cpp @@ -171,6 +171,7 @@ void MailDraft::SendReturnToSender(uint32 sender_acc, uint32 sender_guid, uint32 void MailDraft::SendMailTo(SQLTransaction& trans, MailReceiver const& receiver, MailSender const& sender, MailCheckMask checked, uint32 deliver_delay) { Player* pReceiver = receiver.GetPlayer(); // can be NULL + Player* pSender = sObjectMgr->GetPlayerByLowGUID(sender.GetSenderId()); if (pReceiver) prepareItems(pReceiver, trans); // generate mail template items @@ -188,9 +189,12 @@ void MailDraft::SendMailTo(SQLTransaction& trans, MailReceiver const& receiver, // mail from battlemaster (rewardmarks) should last only one day else if (sender.GetMailMessageType() == MAIL_CREATURE && sBattlegroundMgr->GetBattleMasterBG(sender.GetSenderId()) != BATTLEGROUND_TYPE_NONE) expire_delay = DAY; - // default case: expire time if COD 3 days, if no COD 30 days + // default case: expire time if COD 3 days, if no COD 30 days (or 90 days if sender is a game master) else - expire_delay = (m_COD > 0) ? 3 * DAY : 30 * DAY; + if (m_COD) + expire_delay = 3 * DAY; + else + expire_delay = pSender && pSender->isGameMaster() ? 90 * DAY : 30 * DAY; time_t expire_time = deliver_time + expire_delay; -- cgit v1.2.3 From bd82427d65cc1afaf45d711dbf422b93c475ae8a Mon Sep 17 00:00:00 2001 From: Shocker Date: Tue, 13 Dec 2011 00:17:01 +0200 Subject: Core/Achievements: m_allCompletedAchievements should store only realm firsts --- src/server/game/Achievements/AchievementMgr.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 004da0ca7c1..c43bfb2ca8b 100755 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -2381,15 +2381,16 @@ void AchievementGlobalMgr::LoadCompletedAchievements() Field* fields = result->Fetch(); uint32 achievement_id = fields[0].GetUInt32(); - if (!sAchievementStore.LookupEntry(achievement_id)) + const AchievementEntry* achievement = sAchievementStore.LookupEntry(achievement_id); + if (!achievement) { // we will remove not existed achievement for all characters sLog->outError("Non-existing achievement %u data removed from table `character_achievement`.", achievement_id); CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE achievement = %u", achievement_id); continue; } - - m_allCompletedAchievements.insert(achievement_id); + else if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL)) + m_allCompletedAchievements.insert(achievement_id); } while (result->NextRow()); sLog->outString(">> Loaded %lu completed achievements in %u ms", (unsigned long)m_allCompletedAchievements.size(), GetMSTimeDiffToNow(oldMSTime)); -- cgit v1.2.3 From 599a24df249ab43cb08864a6ffa19b1b769aab54 Mon Sep 17 00:00:00 2001 From: Vinolentus Date: Mon, 12 Dec 2011 20:36:46 +0100 Subject: Core/ObjectMgr: Fix possible SQL injection for game_tele --- src/server/game/Globals/ObjectMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 4e159209e86..ff3815d367f 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8041,7 +8041,7 @@ bool ObjectMgr::AddGameTele(GameTele& tele) m_GameTeleMap[new_id] = tele; std::string safeName(tele.name); - WorldDatabase.EscapeString(safeName); + WorldDatabase.escape_string(safeName); WorldDatabase.PExecute("INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (%u, %f, %f, %f, %f, %d, '%s')", new_id, tele.position_x, tele.position_y, tele.position_z, tele.orientation, tele.mapId, safeName.c_str()); -- cgit v1.2.3 From ef519bd31345b16388f7b38e46eca66a29547f8c Mon Sep 17 00:00:00 2001 From: kaelima Date: Mon, 12 Dec 2011 21:04:51 +0100 Subject: Copy/paste error in f8cb2f528ba2bc4d4006c529be41430d46031282 --- src/server/game/Globals/ObjectMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index ff3815d367f..4e159209e86 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8041,7 +8041,7 @@ bool ObjectMgr::AddGameTele(GameTele& tele) m_GameTeleMap[new_id] = tele; std::string safeName(tele.name); - WorldDatabase.escape_string(safeName); + WorldDatabase.EscapeString(safeName); WorldDatabase.PExecute("INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (%u, %f, %f, %f, %f, %d, '%s')", new_id, tele.position_x, tele.position_y, tele.position_z, tele.orientation, tele.mapId, safeName.c_str()); -- cgit v1.2.3