aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2012_03_19_00_world_smart_scripts.sql21
-rw-r--r--sql/updates/world/2012_03_20_00_world_gossip.sql88
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h6
-rw-r--r--src/server/game/Battlegrounds/ArenaTeamMgr.cpp2
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp99
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h8
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.cpp16
-rwxr-xr-xsrc/server/game/Grids/Notifiers/GridNotifiers.h24
-rwxr-xr-xsrc/server/game/Instances/InstanceSaveMgr.cpp6
-rwxr-xr-xsrc/server/game/Miscellaneous/SharedDefines.h2
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp2
-rwxr-xr-xsrc/server/game/Server/WorldSession.cpp10
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuras.cpp9
-rwxr-xr-xsrc/server/game/World/World.cpp2
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp27
-rwxr-xr-xsrc/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp3
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp20
-rwxr-xr-xsrc/server/shared/Database/DatabaseWorkerPool.h6
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp5
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.h5
-rwxr-xr-xsrc/server/shared/Database/Implementation/WorldDatabase.cpp2
-rwxr-xr-xsrc/server/shared/Database/Implementation/WorldDatabase.h2
-rwxr-xr-xsrc/server/worldserver/Master.cpp16
-rwxr-xr-xsrc/server/worldserver/Master.h2
24 files changed, 245 insertions, 138 deletions
diff --git a/sql/updates/world/2012_03_19_00_world_smart_scripts.sql b/sql/updates/world/2012_03_19_00_world_smart_scripts.sql
new file mode 100644
index 00000000000..20241efa9cc
--- /dev/null
+++ b/sql/updates/world/2012_03_19_00_world_smart_scripts.sql
@@ -0,0 +1,21 @@
+-- SAI for Unrestrained Dragonhawk
+UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry`=25236;
+DELETE FROM `smart_scripts` WHERE (`entryorguid`=25236 AND `source_type`=0);
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(25236,0,0,1,62,0,100,0,9143,0,0,0,11,45353,0,0,0,0,0,7,0,0,0,0,0,0,0,'Unrestrained Dragonhawk - On Gossip option select - cast "Quest - Sunwell Daily - Ship Bombing Run Return" on player'),
+(25236,0,1,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Unrestrained Dragonhawk - On Gossip option select - Close Gossip');
+-- Unrestrained Dragonhawk Gossip
+UPDATE `creature_template` SET `gossip_menu_id`=9143 WHERE `entry`=25236;
+-- Gossip_menu from UDB
+DELETE FROM `gossip_menu` WHERE `entry`=9143;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES
+(9143,12371);
+-- Gossip_menu_option Update from UDB
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=9143;
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(9143,0,0, '<Ride the dragonhawk to Sun''s Reach.>',1,1,0,0,0,0, '');
+-- Gossip option Conditions
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9143;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(15,9143,0,0,9,11542,0,0,0,'','Show gossip option if player has quest 11542 but not complete'),
+(15,9143,0,1,9,11543,0,0,0,'','Show gossip option if player has quest 11543 but not complete');
diff --git a/sql/updates/world/2012_03_20_00_world_gossip.sql b/sql/updates/world/2012_03_20_00_world_gossip.sql
new file mode 100644
index 00000000000..00214d805e7
--- /dev/null
+++ b/sql/updates/world/2012_03_20_00_world_gossip.sql
@@ -0,0 +1,88 @@
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9052 WHERE `entry`=24965; -- Vindicator Xayann
+UPDATE `creature_template` SET `gossip_menu_id`=9050 WHERE `entry`=24975; -- Mar'nah
+UPDATE `creature_template` SET `gossip_menu_id`=9126 WHERE `entry`=25032; -- Eldara Dawnrunner
+UPDATE `creature_template` SET `gossip_menu_id`=9087 WHERE `entry`=25046; -- Smith Hauthaa
+UPDATE `creature_template` SET `gossip_menu_id`=9064 WHERE `entry`=25057; -- Battlemage Arynna
+UPDATE `creature_template` SET `gossip_menu_id`=9062, `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=25059; -- Ayren Cloudbreaker
+UPDATE `creature_template` SET `gossip_menu_id`=9063 WHERE `entry`=25061; -- Harbinger Inuuro
+UPDATE `creature_template` SET `gossip_menu_id`=9127 WHERE `entry`=25069; -- Magister Ilastar
+UPDATE `creature_template` SET `gossip_menu_id`=9115 WHERE `entry`=25112; -- Anchorite Ayuri
+UPDATE `creature_template` SET `gossip_menu_id`=9105 WHERE `entry`=25169; -- Archmage Ne'thul
+UPDATE `creature_template` SET `gossip_menu_id`=9286 WHERE `entry`=25632; -- Vindicator Moorba
+UPDATE `creature_template` SET `gossip_menu_id`=9285 WHERE `entry`=25638; -- Captain Selana
+UPDATE `creature_template` SET `gossip_menu_id`=9198 WHERE `entry`=25950; -- Shaani
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9050 AND `text_id`=12237;
+DELETE FROM `gossip_menu` WHERE `entry`=9052 AND `text_id`=12241;
+DELETE FROM `gossip_menu` WHERE `entry`=9062 AND `text_id`=12252;
+DELETE FROM `gossip_menu` WHERE `entry`=9063 AND `text_id`=12256;
+DELETE FROM `gossip_menu` WHERE `entry`=9064 AND `text_id`=12258;
+DELETE FROM `gossip_menu` WHERE `entry`=9087 AND `text_id`=12286;
+DELETE FROM `gossip_menu` WHERE `entry`=9115 AND `text_id`=12323;
+DELETE FROM `gossip_menu` WHERE `entry`=9126 AND `text_id`=12338;
+DELETE FROM `gossip_menu` WHERE `entry`=9127 AND `text_id`=12340;
+DELETE FROM `gossip_menu` WHERE `entry`=9198 AND `text_id`=12497;
+DELETE FROM `gossip_menu` WHERE `entry`=9285 AND `text_id`=12596;
+DELETE FROM `gossip_menu` WHERE `entry`=9286 AND `text_id`=12597;
+DELETE FROM `gossip_menu` WHERE `entry`=9287 AND `text_id`=12598;
+DELETE FROM `gossip_menu` WHERE `entry`=9288 AND `text_id`=12599;
+DELETE FROM `gossip_menu` WHERE `entry`=9289 AND `text_id`=12600;
+DELETE FROM `gossip_menu` WHERE `entry`=9290 AND `text_id`=12601;
+DELETE FROM `gossip_menu` WHERE `entry`=9293 AND `text_id`=12604;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES
+(9050,12237),
+(9052,12241),
+(9062,12252),
+(9063,12256),
+(9064,12258),
+(9087,12286),
+(9115,12323),
+(9126,12338),
+(9127,12340),
+(9198,12497),
+(9285,12596),
+(9286,12597),
+(9287,12598),
+(9288,12599),
+(9289,12600),
+(9290,12601),
+(9293,12604);
+
+-- Creature Gossip_menu_option insert from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9050,9087,9126,9198,9285,9287,9288,9289) AND `id`=0;
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=9062 AND `id` IN (0,1);
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=9286 AND `id`=2;
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`)VALUES
+(9050,0,1,'Let me browse your goods.',3,128,0,0,0,0,''),
+(9062,0,0,'Speaking of action, I''ve been ordered to undertake an air strike.',1,1,0,0,0,0,''),
+(9062,1,0,'I need to intercept the Dawnblade reinforcements.',1,1,0,0,0,0,''),
+(9087,0,1,'Let me browse your goods.',3,128,0,0,0,0,''),
+(9126,0,1,'Let me browse your goods.',3,128,0,0,0,0,''),
+(9198,0,1,'Let me browse your goods.',3,128,0,0,0,0,''),
+(9285,0,0,'Give me a situation report, Captain.',1,1,9287,0,0,0,''),
+(9286,2,0,'What is the current state of the Sunwell''s Gates?',1,1,9293,0,0,0,''),
+(9287,0,0,'What went wrong?',1,1,9288,0,0,0,''),
+(9288,0,0,'Why did they stop?',1,1,9289,0,0,0,''),
+(9289,0,0,'Your insight is appreciated.',1,1,9290,0,0,0,'');
+
+-- Conditions
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9062 AND `SourceEntry` IN (0,1);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(15,9062,0,0,0,9,11532,0,0,0,0,'','Show gossip option only if player has taken quest 11532'),
+(15,9062,0,0,1,9,11533,0,0,0,0,'','Show gossip option only if player has taken quest 11533'),
+(15,9062,1,0,0,9,11542,0,0,0,0,'','Show gossip option only if player has taken quest 11542'),
+(15,9062,1,0,1,9,11543,0,0,0,0,'','Show gossip option only if player has taken quest 11543');
+
+-- SmartAI
+DELETE FROM `smart_scripts` WHERE `entryorguid`=25059 AND `source_type`=0;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(25059,0,0,2,62,0,100,0,9062,0,0,0,11,45071,0,0,0,0,0,7,0,0,0,0,0,0,0,'Ayren Cloudbreaker - On Gossip option select - Cast "Quest - Sunwell Daily - Dead Scar Bombing Run" on player'),
+(25059,0,1,2,62,0,100,0,9062,1,0,0,11,45113,0,0,0,0,0,7,0,0,0,0,0,0,0,'Ayren Cloudbreaker - On Gossip option select - Cast "Quest - Sunwell Daily - Ship Bombing Run" on player'),
+(25059,0,2,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Ayren Cloudbreaker - On Gossip option select - Close Gossip');
+
+-- Spell scripts from sniff
+DELETE FROM `spell_scripts` WHERE `id`=45071;
+INSERT INTO `spell_scripts` (`id`,`effIndex`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES
+(45071,2,0,16,12318,1,0,0,0,0,0); -- Play sound
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index faba3c05394..5fb691c87f2 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -98,7 +98,13 @@ class SmartScript
return;
if (mTargetStorage->find(id) != mTargetStorage->end())
+ {
+ // check if already stored
+ if ((*mTargetStorage)[id] == targets)
+ return;
+
delete (*mTargetStorage)[id];
+ }
(*mTargetStorage)[id] = targets;
}
diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp
index 719206ac625..37aebab5225 100644
--- a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp
+++ b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp
@@ -92,7 +92,7 @@ void ArenaTeamMgr::LoadArenaTeams()
uint32 oldMSTime = getMSTime();
// Clean out the trash before loading anything
- CharacterDatabase.Execute("DELETE FROM arena_team_member WHERE arenaTeamId NOT IN (SELECT arenaTeamId FROM arena_team)");
+ CharacterDatabase.Execute("DELETE FROM arena_team_member WHERE arenaTeamId NOT IN (SELECT arenaTeamId FROM arena_team)"); // One-time query
// 0 1 2 3 4 5 6 7 8
QueryResult result = CharacterDatabase.Query("SELECT arena_team.arenaTeamId, name, captainGuid, type, backgroundColor, emblemStyle, emblemColor, borderStyle, borderColor, "
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 151f7491567..638e09a73bc 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -7991,10 +7991,10 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, Sp
{
*handled = true;
// Check if we are the target and prevent mana gain
- if (triggeredByAura->GetCasterGUID() == victim->GetGUID())
+ if (victim && triggeredByAura->GetCasterGUID() == victim->GetGUID())
return false;
// Lookup base amount mana restore
- for (uint8 i = 0; i<MAX_SPELL_EFFECTS; i++)
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++)
{
if (procSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE)
{
@@ -12199,7 +12199,7 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell) co
}
Creature const* creatureAttacker = ToCreature();
- if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_UNK26)
+ if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER)
return false;
Player const* playerAffectingAttacker = HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE) ? GetAffectingPlayer() : NULL;
@@ -12286,7 +12286,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co
// can't assist non-friendly targets
if (GetReactionTo(target) <= REP_NEUTRAL
&& target->GetReactionTo(this) <= REP_NEUTRAL
- && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_UNK26)))
+ && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER)))
return false;
// PvP case
@@ -12320,7 +12320,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co
&& !((target->GetByteValue(UNIT_FIELD_BYTES_2, 1) & UNIT_BYTE2_FLAG_PVP)))
{
if (Creature const* creatureTarget = target->ToCreature())
- return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_UNK26 || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS;
+ return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS;
}
return true;
}
@@ -16160,7 +16160,10 @@ bool Unit::IsInPartyWith(Unit const* unit) const
return true;
if (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_PLAYER)
- return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
+ return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
+ else if ((u2->GetTypeId() == TYPEID_PLAYER && u1->GetTypeId() == TYPEID_UNIT && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER) ||
+ (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_UNIT && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER))
+ return true;
else
return false;
}
@@ -16176,82 +16179,14 @@ bool Unit::IsInRaidWith(Unit const* unit) const
return true;
if (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_PLAYER)
- return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
+ return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
+ else if ((u2->GetTypeId() == TYPEID_PLAYER && u1->GetTypeId() == TYPEID_UNIT && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER) ||
+ (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_UNIT && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER))
+ return true;
else
return false;
}
-void Unit::GetRaidMember(std::list<Unit*> &nearMembers, float radius)
-{
- Player* owner = GetCharmerOrOwnerPlayerOrPlayerItself();
- if (!owner)
- return;
-
- Group* group = owner->GetGroup();
- if (group)
- {
- for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
- {
- Player* Target = itr->getSource();
-
- if (Target && !IsHostileTo(Target))
- {
- if (Target->isAlive() && IsWithinDistInMap(Target, radius))
- nearMembers.push_back(Target);
-
- if (Guardian* pet = Target->GetGuardianPet())
- if (pet->isAlive() && IsWithinDistInMap(pet, radius))
- nearMembers.push_back(pet);
- }
- }
- }
- else
- {
- if (owner->isAlive() && (owner == this || IsWithinDistInMap(owner, radius)))
- nearMembers.push_back(owner);
- if (Guardian* pet = owner->GetGuardianPet())
- if (pet->isAlive() && (pet == this || IsWithinDistInMap(pet, radius)))
- nearMembers.push_back(pet);
- }
-}
-
-void Unit::GetPartyMemberInDist(std::list<Unit*> &TagUnitMap, float radius)
-{
- Unit* owner = GetCharmerOrOwnerOrSelf();
- Group* group = NULL;
- if (owner->GetTypeId() == TYPEID_PLAYER)
- group = owner->ToPlayer()->GetGroup();
-
- if (group)
- {
- uint8 subgroup = owner->ToPlayer()->GetSubGroup();
-
- for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
- {
- Player* Target = itr->getSource();
-
- // IsHostileTo check duel and controlled by enemy
- if (Target && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
- {
- if (Target->isAlive() && IsWithinDistInMap(Target, radius))
- TagUnitMap.push_back(Target);
-
- if (Guardian* pet = Target->GetGuardianPet())
- if (pet->isAlive() && IsWithinDistInMap(pet, radius))
- TagUnitMap.push_back(pet);
- }
- }
- }
- else
- {
- if (owner->isAlive() && (owner == this || IsWithinDistInMap(owner, radius)))
- TagUnitMap.push_back(owner);
- if (Guardian* pet = owner->GetGuardianPet())
- if (pet->isAlive() && (pet == this || IsWithinDistInMap(pet, radius)))
- TagUnitMap.push_back(pet);
- }
-}
-
void Unit::GetPartyMembers(std::list<Unit*> &TagUnitMap)
{
Unit* owner = GetCharmerOrOwnerOrSelf();
@@ -17018,7 +16953,7 @@ void Unit::ExitVehicle(Position const* /*exitPosition*/)
//! to specify exit coordinates and either store those per passenger, or we need to
//! init spline movement based on those coordinates in unapply handlers, and
//! relocate exiting passengers based on Unit::moveSpline data. Either way,
- //! Coming Soon™
+ //! Coming Soon�
}
void Unit::_ExitVehicle(Position const* exitPosition)
@@ -17486,7 +17421,7 @@ bool Unit::SetDisableGravity(bool disable)
{
if (disable == IsLevitating())
return false;
-
+
if (disable)
AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);
else
@@ -17529,7 +17464,7 @@ void Unit::SendMovementHover()
SendMessageToSet(&data, true);
}
-void Unit::SendMovementWaterWalking()
+void Unit::SendMovementWaterWalking()
{
WorldPacket data(MSG_MOVE_WATER_WALK, 64);
data.append(GetPackGUID());
@@ -17544,7 +17479,7 @@ void Unit::SendMovementFeatherFall()
BuildMovementPacket(&data);
SendMessageToSet(&data, true);
}
-
+
void Unit::SendMovementGravityChange()
{
WorldPacket data(MSG_MOVE_GRAVITY_CHNG, 64);
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index cde2c67429c..e1717dc5858 100755
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -701,14 +701,14 @@ enum MovementFlags
// TODO: Check if PITCH_UP and PITCH_DOWN really belong here..
MOVEMENTFLAG_MASK_MOVING =
MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT |
- MOVEMENTFLAG_PITCH_UP | MOVEMENTFLAG_PITCH_DOWN | MOVEMENTFLAG_FALLING | MOVEMENTFLAG_FALLING | MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING |
+ MOVEMENTFLAG_PITCH_UP | MOVEMENTFLAG_PITCH_DOWN | MOVEMENTFLAG_FALLING | MOVEMENTFLAG_FALLING_FAR | MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING |
MOVEMENTFLAG_SPLINE_ELEVATION,
MOVEMENTFLAG_MASK_TURNING =
MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT,
//! TODO if needed: add more flags to this masks that are exclusive to players
- MOVEMENTFLAG_MASK_PLAYER_ONLY =
+ MOVEMENTFLAG_MASK_PLAYER_ONLY =
MOVEMENTFLAG_FLYING,
};
enum MovementFlags2
@@ -1398,9 +1398,7 @@ class Unit : public WorldObject
bool IsNeutralToAll() const;
bool IsInPartyWith(Unit const* unit) const;
bool IsInRaidWith(Unit const* unit) const;
- void GetPartyMemberInDist(std::list<Unit*> &units, float dist);
void GetPartyMembers(std::list<Unit*> &units);
- void GetRaidMember(std::list<Unit*> &units, float dist);
bool IsContestedGuard() const
{
if (FactionTemplateEntry const* entry = getFactionTemplateEntry())
@@ -1635,7 +1633,7 @@ class Unit : public WorldObject
/*! These methods send the same packet to the client in apply and unapply case.
The client-side interpretation of this packet depends on the presence of relevant movementflags
which are sent with movementinfo. Furthermore, these packets are broadcast to nearby players as well
- as the current unit.
+ as the current unit.
*/
void SendMovementHover();
void SendMovementFeatherFall();
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index f2b867b91ff..01f41866c5b 100755
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -495,7 +495,7 @@ void ObjectMgr::LoadCreatureTemplateAddons()
{
uint32 oldMSTime = getMSTime();
- // 0 1 2 3 4 5 6
+ // 0 1 2 3 4 5 6
QueryResult result = WorldDatabase.Query("SELECT entry, path_id, mount, bytes1, bytes2, emote, auras FROM creature_template_addon");
if (!result)
@@ -872,7 +872,7 @@ void ObjectMgr::LoadCreatureAddons()
{
uint32 oldMSTime = getMSTime();
- // 0 1 2 3 4 5 6
+ // 0 1 2 3 4 5 6
QueryResult result = WorldDatabase.Query("SELECT guid, path_id, mount, bytes1, bytes2, emote, auras FROM creature_addon");
if (!result)
@@ -909,7 +909,7 @@ void ObjectMgr::LoadCreatureAddons()
creatureAddon.bytes1 = fields[3].GetUInt32();
creatureAddon.bytes2 = fields[4].GetUInt32();
creatureAddon.emote = fields[5].GetUInt32();
-
+
Tokens tokens(fields[6].GetString(), ' ');
uint8 i = 0;
creatureAddon.auras.resize(tokens.size());
@@ -1903,7 +1903,7 @@ void ObjectMgr::LoadGameobjectRespawnTimes()
uint32 oldMSTime = getMSTime();
// Remove outdated data
- CharacterDatabase.DirectExecute(CharacterDatabase.GetPreparedStatement(CHAR_DEL_EXPIRED_GO_RESPAWNS));
+ CharacterDatabase.DirectExecute("DELETE FROM gameobject_respawn WHERE respawnTime <= UNIX_TIMESTAMP(NOW())");
uint32 count = 0;
@@ -6140,10 +6140,10 @@ void ObjectMgr::SetHighestGuids()
_hiItemGuid = (*result)[0].GetUInt32()+1;
// Cleanup other tables from not existed guids ( >= _hiItemGuid)
- CharacterDatabase.PExecute("DELETE FROM character_inventory WHERE item >= '%u'", _hiItemGuid);
- CharacterDatabase.PExecute("DELETE FROM mail_items WHERE item_guid >= '%u'", _hiItemGuid);
- CharacterDatabase.PExecute("DELETE FROM auctionhouse WHERE itemguid >= '%u'", _hiItemGuid);
- CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE item_guid >= '%u'", _hiItemGuid);
+ CharacterDatabase.PExecute("DELETE FROM character_inventory WHERE item >= '%u'", _hiItemGuid); // One-time query
+ CharacterDatabase.PExecute("DELETE FROM mail_items WHERE item_guid >= '%u'", _hiItemGuid); // One-time query
+ CharacterDatabase.PExecute("DELETE FROM auctionhouse WHERE itemguid >= '%u'", _hiItemGuid); // One-time query
+ CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE item_guid >= '%u'", _hiItemGuid); // One-time query
result = WorldDatabase.Query("SELECT MAX(guid) FROM gameobject");
if (result)
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index c639da15113..e623b98a13a 100755
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -858,6 +858,30 @@ namespace Trinity
float i_range;
};
+ class AnyGroupedUnitInObjectRangeCheck
+ {
+ public:
+ AnyGroupedUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range, bool raid) : _source(obj), _refUnit(funit), _range(range), _raid(raid) {}
+ bool operator()(Unit* u)
+ {
+ if (_raid)
+ {
+ if (!_refUnit->IsInRaidWith(u))
+ return false;
+ }
+ else if (!_refUnit->IsInPartyWith(u))
+ return false;
+
+ return !_refUnit->IsHostileTo(u) && u->isAlive() && _source->IsWithinDistInMap(u, _range);
+ }
+
+ private:
+ WorldObject const* _source;
+ Unit const* _refUnit;
+ float _range;
+ bool _raid;
+ };
+
class AnyUnitInObjectRangeCheck
{
public:
diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp
index 557977f9468..26bd053b891 100755
--- a/src/server/game/Instances/InstanceSaveMgr.cpp
+++ b/src/server/game/Instances/InstanceSaveMgr.cpp
@@ -250,13 +250,13 @@ void InstanceSaveManager::LoadInstances()
CharacterDatabase.DirectExecute("DELETE i.* FROM instance AS i LEFT JOIN character_instance AS ci ON i.id = ci.instance LEFT JOIN group_instance AS gi ON i.id = gi.instance WHERE ci.guid IS NULL AND gi.guid IS NULL");
// Delete invalid references to instance
- CharacterDatabase.DirectExecute(CharacterDatabase.GetPreparedStatement(CHAR_DEL_NONEXISTENT_INSTANCE_CREATURE_RESPAWNS));
- CharacterDatabase.DirectExecute(CharacterDatabase.GetPreparedStatement(CHAR_DEL_NONEXISTENT_INSTANCE_GO_RESPAWNS));
+ CharacterDatabase.DirectExecute("DELETE FROM creature_respawn WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)");
+ CharacterDatabase.DirectExecute("DELETE FROM gameobject_respawn WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)");
CharacterDatabase.DirectExecute("DELETE tmp.* FROM character_instance AS tmp LEFT JOIN instance ON tmp.instance = instance.id WHERE tmp.instance > 0 AND instance.id IS NULL");
CharacterDatabase.DirectExecute("DELETE tmp.* FROM group_instance AS tmp LEFT JOIN instance ON tmp.instance = instance.id WHERE tmp.instance > 0 AND instance.id IS NULL");
// Clean invalid references to instance
- CharacterDatabase.DirectExecute(CharacterDatabase.GetPreparedStatement(CHAR_UPD_NONEXISTENT_INSTANCE_FOR_CORPSES));
+ CharacterDatabase.DirectExecute("UPDATE corpse SET instanceId = 0 WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)");
CharacterDatabase.DirectExecute("UPDATE characters AS tmp LEFT JOIN instance ON tmp.instance_id = instance.id SET tmp.instance_id = 0 WHERE tmp.instance_id > 0 AND instance.id IS NULL");
// Initialize instance id storage (Needs to be done after the trash has been clean out)
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index c404277f61f..91a5f602327 100755
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -2589,7 +2589,7 @@ enum CreatureTypeFlags
CREATURE_TYPEFLAGS_UNK23 = 0x00800000, // ? First seen in 3.2.2. Related to banner/backpack of creature/companion?
CREATURE_TYPEFLAGS_UNK24 = 0x01000000,
CREATURE_TYPEFLAGS_UNK25 = 0x02000000,
- CREATURE_TYPEFLAGS_UNK26 = 0x04000000,
+ CREATURE_TYPEFLAGS_PARTY_MEMBER = 0x04000000, //! Creature can be targeted by spells that require target to be in caster's party/raid
CREATURE_TYPEFLAGS_UNK27 = 0x08000000,
CREATURE_TYPEFLAGS_UNK28 = 0x10000000,
CREATURE_TYPEFLAGS_UNK29 = 0x20000000,
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp
index fe1db906a26..e586cb4f4f9 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.cpp
+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp
@@ -58,7 +58,7 @@ namespace Movement
{
MoveSpline& move_spline = *unit.movespline;
- Location real_position(unit.GetPositionX(),unit.GetPositionY(),unit.GetPositionZ(),unit.GetOrientation());
+ Location real_position(unit.GetPositionX(),unit.GetPositionY(),unit.GetPositionZMinusOffset(),unit.GetOrientation());
// there is a big chane that current position is unknown if current state is not finalized, need compute it
// this also allows calculate spline position and update map position in much greater intervals
if (!move_spline.Finalized())
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index e4f8c2a39ac..af38a5f4cce 100755
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -105,7 +105,7 @@ isRecruiter(isARecruiter), timeLastWhoCommand(0)
m_Address = sock->GetRemoteAddress();
sock->AddReference();
ResetTimeOutTime();
- LoginDatabase.PExecute("UPDATE account SET online = 1 WHERE id = %u;", GetAccountId());
+ LoginDatabase.PExecute("UPDATE account SET online = 1 WHERE id = %u;", GetAccountId()); // One-time query
}
InitializeQueryCallbackParameters();
@@ -134,7 +134,7 @@ WorldSession::~WorldSession()
while (_recvQueue.next(packet))
delete packet;
- LoginDatabase.PExecute("UPDATE account SET online = 0 WHERE id = %u;", GetAccountId());
+ LoginDatabase.PExecute("UPDATE account SET online = 0 WHERE id = %u;", GetAccountId()); // One-time query
}
void WorldSession::SizeError(WorldPacket const& packet, uint32 size) const
@@ -825,13 +825,13 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi)
if (check) \
mi->RemoveMovementFlag((maskToRemove));
#endif
-
-
+
+
/*! This must be a packet spoofing attempt. MOVEMENTFLAG_ROOT sent from the client is not valid
in conjunction with any of the moving movement flags such as MOVEMENTFLAG_FORWARD.
It will freeze clients that receive this player's movement info.
*/
- REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_ROOT) && mi->HasMovementFlag(MOVEMENTFLAG_MASK_MOVING),
+ REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_ROOT) && mi->HasMovementFlag(MOVEMENTFLAG_MASK_MOVING),
MOVEMENTFLAG_MASK_MOVING);
//! Cannot hover without SPELL_AURA_HOVER
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 32473a93a26..1fddd3a04ba 100755
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -2357,13 +2357,14 @@ void UnitAura::FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster)
switch (GetSpellInfo()->Effects[effIndex].Effect)
{
case SPELL_EFFECT_APPLY_AREA_AURA_PARTY:
- targetList.push_back(GetUnitOwner());
- GetUnitOwner()->GetPartyMemberInDist(targetList, radius);
- break;
case SPELL_EFFECT_APPLY_AREA_AURA_RAID:
+ {
targetList.push_back(GetUnitOwner());
- GetUnitOwner()->GetRaidMember(targetList, radius);
+ Trinity::AnyGroupedUnitInObjectRangeCheck u_check(GetUnitOwner(), GetUnitOwner(), radius, GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID);
+ Trinity::UnitListSearcher<Trinity::AnyGroupedUnitInObjectRangeCheck> searcher(GetUnitOwner(), targetList, u_check);
+ GetUnitOwner()->VisitNearbyObject(radius, searcher);
break;
+ }
case SPELL_EFFECT_APPLY_AREA_AURA_FRIEND:
{
targetList.push_back(GetUnitOwner());
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 3efa976e1d3..4c02d1058b2 100755
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1750,7 +1750,7 @@ void World::SetInitialWorldSettings()
sWardenCheckMgr->LoadWardenOverrides();
sLog->outString("Deleting expired bans...");
- LoginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate<>bandate");
+ LoginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate<>bandate"); // One-time query
sLog->outString("Calculate next daily quest reset time...");
InitDailyQuestResetTime();
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index af6952cdf40..90615a3bd88 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -131,7 +131,19 @@ public:
{
uint32 tguid = chr->GetTransport()->AddNPCPassenger(0, id, chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO());
if (tguid > 0)
- WorldDatabase.PExecute("INSERT INTO creature_transport (guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO) values (%u, %u, %f, %f, %f, %f, %u)", tguid, id, chr->GetTransport()->GetEntry(), chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO());
+ {
+ PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_CREATURE_TRANSPORT);
+
+ stmt->setInt32(0, int32(tguid));
+ stmt->setInt32(1, int32(id));
+ stmt->setInt32(2, int32(chr->GetTransport()->GetEntry()));
+ stmt->setFloat(3, chr->GetTransOffsetX());
+ stmt->setFloat(4, chr->GetTransOffsetY());
+ stmt->setFloat(5, chr->GetTransOffsetZ());
+ stmt->setFloat(6, chr->GetTransOffsetO());
+
+ WorldDatabase.Execute(stmt);
+ }
return true;
}
@@ -678,9 +690,16 @@ public:
return false;
}
- if (target->GetTransport())
- if (target->GetGUIDTransport())
- WorldDatabase.PExecute("UPDATE creature_transport SET emote=%u WHERE transport_entry=%u AND guid=%u", emote, target->GetTransport()->GetEntry(), target->GetGUIDTransport());
+ if (target->GetTransport() && target->GetGUIDTransport())
+ {
+ PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_TRANSPORT_EMOTE);
+
+ stmt->setInt16(0, int16(emote));
+ stmt->setInt32(1, target->GetTransport()->GetEntry());
+ stmt->setInt32(2, target->GetGUIDTransport());
+
+ WorldDatabase.Execute(stmt);
+ }
target->SetUInt32Value(UNIT_NPC_EMOTESTATE, emote);
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
index 940191f68cb..37516e5e0df 100755
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
@@ -278,6 +278,9 @@ public:
if (!UpdateVictim())
return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
switch (m_uiStage)
{
case 0:
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp
index ecca909914c..ad718504465 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp
@@ -53,6 +53,7 @@ EndScriptData */
#define MODEL_NIGHTELF 20514
#define DEMON_FORM 21875
#define MOB_SPELLBINDER 21806
+#define INNER_DEMON_VICTIM 1
#define SAY_AGGRO -1548009
#define SAY_SWITCH_TO_DEMON -1548010
@@ -94,6 +95,20 @@ public:
ShadowBolt_Timer = 10000;
Link_Timer = 1000;
}
+
+ void SetGUID(uint64 guid, int32 id/* = 0 */)
+ {
+ if (id == INNER_DEMON_VICTIM)
+ victimGUID = guid;
+ }
+
+ uint64 GetGUID(int32 id/* = 0 */)
+ {
+ if (id == INNER_DEMON_VICTIM)
+ return victimGUID;
+ return 0;
+ }
+
void JustDied(Unit* /*victim*/)
{
Unit* unit = Unit::GetUnit((*me), victimGUID);
@@ -219,6 +234,7 @@ public:
IsFinalForm = false;
NeedThreatReset = false;
EnrageUsed = false;
+ memset(InnderDemon, 0, sizeof(InnderDemon));
InnerDemon_Count = 0;
me->SetSpeed(MOVE_RUN, 2.0f, true);
me->SetDisplayId(MODEL_NIGHTELF);
@@ -357,7 +373,7 @@ public:
Creature* unit = Unit::GetCreature((*me), InnderDemon[i]);
if (unit && unit->isAlive())
{
- Unit* unit_target = Unit::GetUnit(*unit, CAST_AI(mob_inner_demon::mob_inner_demonAI, unit->AI())->victimGUID);
+ Unit* unit_target = Unit::GetUnit(*unit, unit->AI()->GetGUID(INNER_DEMON_VICTIM));
if (unit_target && unit_target->isAlive())
{
unit->CastSpell(unit_target, SPELL_CONSUMING_MADNESS, true);
@@ -525,7 +541,7 @@ public:
if (demon)
{
demon->AI()->AttackStart((*itr));
- CAST_AI(mob_inner_demon::mob_inner_demonAI, demon->AI())->victimGUID = (*itr)->GetGUID();
+ demon->AI()->SetGUID((*itr)->GetGUID(), INNER_DEMON_VICTIM);
(*itr)->AddAura(SPELL_INSIDIOUS_WHISPER, *itr);
diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h
index b91972e5b0c..01b79c9ac58 100755
--- a/src/server/shared/Database/DatabaseWorkerPool.h
+++ b/src/server/shared/Database/DatabaseWorkerPool.h
@@ -133,6 +133,7 @@ class DatabaseWorkerPool
*/
//! Enqueues a one-way SQL operation in string format that will be executed asynchronously.
+ //! This method should only be used for queries that are only executed once, e.g during startup.
void Execute(const char* sql)
{
if (!sql)
@@ -143,6 +144,7 @@ class DatabaseWorkerPool
}
//! Enqueues a one-way SQL operation in string format -with variable args- that will be executed asynchronously.
+ //! This method should only be used for queries that are only executed once, e.g during startup.
void PExecute(const char* sql, ...)
{
if (!sql)
@@ -166,10 +168,11 @@ class DatabaseWorkerPool
}
/**
- Direct syncrhonous one-way statement methods.
+ Direct synchronous one-way statement methods.
*/
//! Directly executes a one-way SQL operation in string format, that will block the calling thread until finished.
+ //! This method should only be used for queries that are only executed once, e.g during startup.
void DirectExecute(const char* sql)
{
if (!sql)
@@ -181,6 +184,7 @@ class DatabaseWorkerPool
}
//! Directly executes a one-way SQL operation in string format -with variable args-, that will block the calling thread until finished.
+ //! This method should only be used for queries that are only executed once, e.g during startup.
void DirectPExecute(const char* sql, ...)
{
if (!sql)
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 125c4509b18..29026b9bef7 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -280,7 +280,6 @@ void CharacterDatabaseConnection::DoPrepareStatements()
// Character battleground data
PREPARE_STATEMENT(CHAR_INS_PLAYER_BGDATA, "INSERT INTO character_battleground_data (guid, instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_DEL_PLAYER_BGDATA, "DELETE FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_PLAYERS_BGDATA, "UPDATE character_battleground_data SET instanceId = 0", CONNECTION_SYNCH)
// Character homebind
PREPARE_STATEMENT(CHAR_INS_PLAYER_HOMEBIND, "INSERT INTO character_homebind (guid, mapId, zoneId, posX, posY, posZ) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
@@ -293,7 +292,6 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_DEL_CORPSE, "DELETE FROM corpse WHERE corpseGuid = ?", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_DEL_PLAYER_CORPSES, "DELETE FROM corpse WHERE guid = ? AND corpseType <> 0", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_DEL_OLD_CORPSES, "DELETE FROM corpse WHERE corpseType = 0 OR time < (UNIX_TIMESTAMP(NOW()) - ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_NONEXISTENT_INSTANCE_FOR_CORPSES, "UPDATE corpse SET instanceId = 0 WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)", CONNECTION_SYNCH)
// Creature respawn
PREPARE_STATEMENT(CHAR_SEL_CREATURE_RESPAWNS, "SELECT guid, respawnTime, instanceId FROM creature_respawn", CONNECTION_SYNCH)
@@ -302,15 +300,12 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN_BY_GUID, "DELETE FROM creature_respawn WHERE guid = ?", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, "DELETE FROM creature_respawn WHERE instanceId = ?", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_SEL_MAX_CREATURE_RESPAWNS, "SELECT MAX(respawnTime), instanceId FROM creature_respawn WHERE instanceId > 0 GROUP BY instanceId", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_DEL_NONEXISTENT_INSTANCE_CREATURE_RESPAWNS, "DELETE FROM creature_respawn WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)", CONNECTION_SYNCH)
// Gameobject respawn
PREPARE_STATEMENT(CHAR_SEL_GO_RESPAWNS, "SELECT guid, respawnTime, instanceId FROM gameobject_respawn", CONNECTION_SYNCH)
PREPARE_STATEMENT(CHAR_REP_GO_RESPAWN, "REPLACE INTO gameobject_respawn (guid, respawnTime, instanceId) VALUES (?, ?, ?)", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN, "DELETE FROM gameobject_respawn WHERE guid = ? AND instanceId = ?", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN_BY_INSTANCE, "DELETE FROM gameobject_respawn WHERE instanceId = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_EXPIRED_GO_RESPAWNS, "DELETE FROM gameobject_respawn WHERE respawnTime <= UNIX_TIMESTAMP(NOW())", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_DEL_NONEXISTENT_INSTANCE_GO_RESPAWNS, "DELETE FROM gameobject_respawn WHERE instanceId > 0 AND instanceId NOT IN (SELECT id FROM instance)", CONNECTION_SYNCH)
// GM Tickets
PREPARE_STATEMENT(CHAR_SEL_GM_TICKETS, "SELECT ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, completed, escalated, viewed FROM gm_tickets", CONNECTION_SYNCH)
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index ca53712fbaa..2f2aa2301d1 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -262,7 +262,6 @@ enum CharacterDatabaseStatements
CHAR_INS_PLAYER_BGDATA,
CHAR_DEL_PLAYER_BGDATA,
- CHAR_UPD_PLAYERS_BGDATA,
CHAR_INS_PLAYER_HOMEBIND,
CHAR_UPD_PLAYER_HOMEBIND,
@@ -273,7 +272,6 @@ enum CharacterDatabaseStatements
CHAR_DEL_CORPSE,
CHAR_DEL_PLAYER_CORPSES,
CHAR_DEL_OLD_CORPSES,
- CHAR_UPD_NONEXISTENT_INSTANCE_FOR_CORPSES,
CHAR_SEL_CREATURE_RESPAWNS,
CHAR_REP_CREATURE_RESPAWN,
@@ -281,14 +279,11 @@ enum CharacterDatabaseStatements
CHAR_DEL_CREATURE_RESPAWN_BY_GUID,
CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE,
CHAR_SEL_MAX_CREATURE_RESPAWNS,
- CHAR_DEL_NONEXISTENT_INSTANCE_CREATURE_RESPAWNS,
CHAR_SEL_GO_RESPAWNS,
CHAR_REP_GO_RESPAWN,
CHAR_DEL_GO_RESPAWN,
CHAR_DEL_GO_RESPAWN_BY_INSTANCE,
- CHAR_DEL_EXPIRED_GO_RESPAWNS,
- CHAR_DEL_NONEXISTENT_INSTANCE_GO_RESPAWNS,
CHAR_SEL_GM_TICKETS,
CHAR_REP_GM_TICKET,
diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp
index d7d8491008b..d9338bec401 100755
--- a/src/server/shared/Database/Implementation/WorldDatabase.cpp
+++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp
@@ -60,4 +60,6 @@ void WorldDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_SCRIPT_Z, "UPDATE waypoint_scripts SET z = ? WHERE guid = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_SCRIPT_O, "UPDATE waypoint_scripts SET o = ? WHERE guid = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(WORLD_INS_CREATURE_TRANSPORT, "INSERT INTO creature_transport (guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO) values (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(WORLD_UPD_CREATURE_TRANSPORT_EMOTE, "UPDATE creature_transport SET emote = ? WHERE transport_entry = ? AND guid = ?", CONNECTION_ASYNC);
}
diff --git a/src/server/shared/Database/Implementation/WorldDatabase.h b/src/server/shared/Database/Implementation/WorldDatabase.h
index e708177503f..1d7cd1151e5 100755
--- a/src/server/shared/Database/Implementation/WorldDatabase.h
+++ b/src/server/shared/Database/Implementation/WorldDatabase.h
@@ -80,6 +80,8 @@ enum WorldDatabaseStatements
WORLD_UPD_WAYPOINT_SCRIPT_Z,
WORLD_UPD_WAYPOINT_SCRIPT_O,
WORLD_DEL_CREATURE,
+ WORLD_INS_CREATURE_TRANSPORT,
+ WORLD_UPD_CREATURE_TRANSPORT_EMOTE,
MAX_WORLDDATABASE_STATEMENTS,
};
diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp
index d84cfc1a4a4..45827b10c2c 100755
--- a/src/server/worldserver/Master.cpp
+++ b/src/server/worldserver/Master.cpp
@@ -294,7 +294,7 @@ int Master::Run()
rar_thread.wait();
///- Clean database before leaving
- clearOnlineAccounts();
+ ClearOnlineAccounts();
_StopDB();
@@ -454,7 +454,7 @@ bool Master::_StartDB()
sLog->SetRealmID(realmID);
///- Clean the database before starting
- clearOnlineAccounts();
+ ClearOnlineAccounts();
///- Insert version info into DB
WorldDatabase.PExecute("UPDATE version SET core_version = '%s', core_revision = '%s'", _FULLVERSION, _HASH); // One-time query
@@ -475,16 +475,14 @@ void Master::_StopDB()
}
/// Clear 'online' status for all accounts with characters in this realm
-void Master::clearOnlineAccounts()
+void Master::ClearOnlineAccounts()
{
- // Cleanup online status for characters hosted at current realm
- /// \todo Only accounts with characters logged on *this* realm should have online status reset. Move the online column from 'account' to 'realmcharacters'?
- LoginDatabase.DirectPExecute(
- "UPDATE account SET online = 0 WHERE online > 0 "
- "AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = '%d')", realmID);
+ // Reset online status for all accounts with characters on the current realm
+ LoginDatabase.DirectPExecute("UPDATE account SET online = 0 WHERE online > 0 AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = %d)", realmID);
+ // Reset online status for all characters
CharacterDatabase.DirectExecute("UPDATE characters SET online = 0 WHERE online <> 0");
// Battleground instance ids reset at server restart
- CharacterDatabase.DirectExecute(CharacterDatabase.GetPreparedStatement(CHAR_UPD_PLAYERS_BGDATA));
+ CharacterDatabase.DirectExecute("UPDATE character_battleground_data SET instanceId = 0");
}
diff --git a/src/server/worldserver/Master.h b/src/server/worldserver/Master.h
index 17c230ef7c7..548cd02c64a 100755
--- a/src/server/worldserver/Master.h
+++ b/src/server/worldserver/Master.h
@@ -37,7 +37,7 @@ class Master
bool _StartDB();
void _StopDB();
- void clearOnlineAccounts();
+ void ClearOnlineAccounts();
};
#define sMaster ACE_Singleton<Master, ACE_Null_Mutex>::instance()