mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
Merge remote branch 'origin/master' into 330
This commit is contained in:
commit
292f6189ea
50 changed files with 363 additions and 318 deletions
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `character_db_version`;
|
DROP TABLE IF EXISTS `character_db_version`;
|
||||||
CREATE TABLE `character_db_version` (
|
CREATE TABLE `character_db_version` (
|
||||||
`required_9375_01_characters_character_glyphs` bit(1) default NULL
|
`required_9611_01_characters` bit(1) default NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -466,7 +466,8 @@ CREATE TABLE `character_equipmentsets` (
|
||||||
`item17` int(11) NOT NULL default '0',
|
`item17` int(11) NOT NULL default '0',
|
||||||
`item18` int(11) NOT NULL default '0',
|
`item18` int(11) NOT NULL default '0',
|
||||||
PRIMARY KEY (`setguid`),
|
PRIMARY KEY (`setguid`),
|
||||||
UNIQUE KEY `idx_set` (`guid`,`setguid`,`setindex`)
|
UNIQUE KEY `idx_set` (`guid`,`setguid`,`setindex`),
|
||||||
|
INDEX `Idx_setindex` (`setindex`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -898,7 +899,9 @@ CREATE TABLE `corpse` (
|
||||||
`instance` int(11) unsigned NOT NULL default '0',
|
`instance` int(11) unsigned NOT NULL default '0',
|
||||||
PRIMARY KEY (`guid`),
|
PRIMARY KEY (`guid`),
|
||||||
KEY `idx_type` (`corpse_type`),
|
KEY `idx_type` (`corpse_type`),
|
||||||
KEY `instance` (`instance`)
|
KEY `instance` (`instance`),
|
||||||
|
INDEX `Idx_player`(`player`),
|
||||||
|
INDEX `Idx_time`(`time`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Death System';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Death System';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -978,7 +981,8 @@ CREATE TABLE `group_member` (
|
||||||
`memberGuid` int(11) unsigned NOT NULL,
|
`memberGuid` int(11) unsigned NOT NULL,
|
||||||
`assistant` tinyint(1) unsigned NOT NULL,
|
`assistant` tinyint(1) unsigned NOT NULL,
|
||||||
`subgroup` smallint(6) unsigned NOT NULL,
|
`subgroup` smallint(6) unsigned NOT NULL,
|
||||||
PRIMARY KEY (`groupId`,`memberGuid`)
|
PRIMARY KEY (`groupId`,`memberGuid`),
|
||||||
|
INDEX `Idx_memberGuid`(`memberGuid`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Groups';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Groups';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -1036,7 +1040,9 @@ CREATE TABLE `guild_bank_eventlog` (
|
||||||
`DestTabId` tinyint(1) unsigned NOT NULL default '0' COMMENT 'Destination Tab Id',
|
`DestTabId` tinyint(1) unsigned NOT NULL default '0' COMMENT 'Destination Tab Id',
|
||||||
`TimeStamp` bigint(20) unsigned NOT NULL default '0' COMMENT 'Event UNIX time',
|
`TimeStamp` bigint(20) unsigned NOT NULL default '0' COMMENT 'Event UNIX time',
|
||||||
PRIMARY KEY (`guildid`,`LogGuid`,`TabId`),
|
PRIMARY KEY (`guildid`,`LogGuid`,`TabId`),
|
||||||
KEY `guildid_key` (`guildid`)
|
KEY `guildid_key` (`guildid`),
|
||||||
|
INDEX `Idx_PlayerGuid`(`PlayerGuid`),
|
||||||
|
INDEX `Idx_LogGuid`(`LogGuid`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -1060,7 +1066,8 @@ CREATE TABLE `guild_bank_item` (
|
||||||
`item_guid` int(11) unsigned NOT NULL default '0',
|
`item_guid` int(11) unsigned NOT NULL default '0',
|
||||||
`item_entry` int(11) unsigned NOT NULL default '0',
|
`item_entry` int(11) unsigned NOT NULL default '0',
|
||||||
PRIMARY KEY (`guildid`,`tabid`,`slotid`),
|
PRIMARY KEY (`guildid`,`tabid`,`slotid`),
|
||||||
KEY `guildid_key` (`guildid`)
|
KEY `guildid_key` (`guildid`),
|
||||||
|
INDEX `Idx_item_guid`(`item_guid`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -1133,7 +1140,10 @@ CREATE TABLE `guild_eventlog` (
|
||||||
`PlayerGuid2` int(11) NOT NULL COMMENT 'Player 2',
|
`PlayerGuid2` int(11) NOT NULL COMMENT 'Player 2',
|
||||||
`NewRank` tinyint(2) NOT NULL COMMENT 'New rank(in case promotion/demotion)',
|
`NewRank` tinyint(2) NOT NULL COMMENT 'New rank(in case promotion/demotion)',
|
||||||
`TimeStamp` bigint(20) NOT NULL COMMENT 'Event UNIX time',
|
`TimeStamp` bigint(20) NOT NULL COMMENT 'Event UNIX time',
|
||||||
PRIMARY KEY (`guildid`, `LogGuid`)
|
PRIMARY KEY (`guildid`, `LogGuid`),
|
||||||
|
INDEX `Idx_PlayerGuid1`(`PlayerGuid1`),
|
||||||
|
INDEX `Idx_PlayerGuid2`(`PlayerGuid2`),
|
||||||
|
INDEX `Idx_LogGuid`(`LogGuid`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'Guild Eventlog';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'Guild Eventlog';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -1195,7 +1205,8 @@ CREATE TABLE `guild_rank` (
|
||||||
`rname` varchar(255) NOT NULL default '',
|
`rname` varchar(255) NOT NULL default '',
|
||||||
`rights` int(3) unsigned NOT NULL default '0',
|
`rights` int(3) unsigned NOT NULL default '0',
|
||||||
`BankMoneyPerDay` int(11) unsigned NOT NULL default '0',
|
`BankMoneyPerDay` int(11) unsigned NOT NULL default '0',
|
||||||
PRIMARY KEY (`guildid`,`rid`)
|
PRIMARY KEY (`guildid`,`rid`),
|
||||||
|
INDEX `Idx_rid`(`rid`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Guild System';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Guild System';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -1453,7 +1464,9 @@ CREATE TABLE `petition_sign` (
|
||||||
`playerguid` int(11) unsigned NOT NULL default '0',
|
`playerguid` int(11) unsigned NOT NULL default '0',
|
||||||
`player_account` int(11) unsigned NOT NULL default '0',
|
`player_account` int(11) unsigned NOT NULL default '0',
|
||||||
`type` int(10) unsigned NOT NULL default '0',
|
`type` int(10) unsigned NOT NULL default '0',
|
||||||
PRIMARY KEY (`petitionguid`,`playerguid`)
|
PRIMARY KEY (`petitionguid`,`playerguid`),
|
||||||
|
INDEX `Idx_playerguid`(`playerguid`),
|
||||||
|
INDEX `Idx_ownerguid`(`ownerguid`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Guild System';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Guild System';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ CREATE TABLE `db_version` (
|
||||||
`version` varchar(120) default NULL,
|
`version` varchar(120) default NULL,
|
||||||
`creature_ai_version` varchar(120) default NULL,
|
`creature_ai_version` varchar(120) default NULL,
|
||||||
`cache_id` int(10) default '0',
|
`cache_id` int(10) default '0',
|
||||||
`required_9539_01_mangos_spell_bonus_data` bit(1) default NULL
|
`required_9590_01_mangos_db_script_string` bit(1) default NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -1098,7 +1098,8 @@ CREATE TABLE `creature_template` (
|
||||||
`faction_A` smallint(5) unsigned NOT NULL default '0',
|
`faction_A` smallint(5) unsigned NOT NULL default '0',
|
||||||
`faction_H` smallint(5) unsigned NOT NULL default '0',
|
`faction_H` smallint(5) unsigned NOT NULL default '0',
|
||||||
`npcflag` int(10) unsigned NOT NULL default '0',
|
`npcflag` int(10) unsigned NOT NULL default '0',
|
||||||
`speed` float NOT NULL default '1',
|
`speed_walk` float NOT NULL default '1' COMMENT 'Result of 2.5/2.5, most common value',
|
||||||
|
`speed_run` float NOT NULL default '1.14286' COMMENT 'Result of 8.0/7.0, most common value',
|
||||||
`scale` float NOT NULL default '1',
|
`scale` float NOT NULL default '1',
|
||||||
`rank` tinyint(3) unsigned NOT NULL default '0',
|
`rank` tinyint(3) unsigned NOT NULL default '0',
|
||||||
`mindmg` float NOT NULL default '0',
|
`mindmg` float NOT NULL default '0',
|
||||||
|
|
@ -1165,7 +1166,7 @@ CREATE TABLE `creature_template` (
|
||||||
LOCK TABLES `creature_template` WRITE;
|
LOCK TABLES `creature_template` WRITE;
|
||||||
/*!40000 ALTER TABLE `creature_template` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `creature_template` DISABLE KEYS */;
|
||||||
INSERT INTO `creature_template` VALUES
|
INSERT INTO `creature_template` VALUES
|
||||||
(1,0,0,0,0,0,10045,0,10045,0,'Waypoint(Only GM can see it)','Visual',NULL,0,1,1,64,64,0,0,0,35,35,0,0.91,1,0,14,15,0,100,1,2000,2200,8,4096,0,0,0,0,0,0,1.76,2.42,100,8,5242886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,3,1.0,1.0,0,0,0,0,0,0,0,0,1,0,0,0x82,'');
|
(1,0,0,0,0,0,10045,0,10045,0,'Waypoint(Only GM can see it)','Visual',NULL,0,1,1,64,64,0,0,5,35,35,0,0.91,1.14286,1,0,2,3,0,10,1,2000,2200,8,4096,0,0,0,0,0,0,1,2,100,8,5242886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,3,1,1,0,0,0,0,0,0,0,0,1,0,0,130,'');
|
||||||
/*!40000 ALTER TABLE `creature_template` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `creature_template` ENABLE KEYS */;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
|
@ -1200,7 +1201,7 @@ UNLOCK TABLES;
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `db_script_string`;
|
DROP TABLE IF EXISTS `db_script_string`;
|
||||||
CREATE TABLE `db_script_string` (
|
CREATE TABLE `db_script_string` (
|
||||||
`entry` mediumint(8) unsigned NOT NULL default '0',
|
`entry` int(11) unsigned NOT NULL default '0',
|
||||||
`content_default` text NOT NULL,
|
`content_default` text NOT NULL,
|
||||||
`content_loc1` text,
|
`content_loc1` text,
|
||||||
`content_loc2` text,
|
`content_loc2` text,
|
||||||
|
|
@ -1972,22 +1973,22 @@ CREATE TABLE gossip_menu_option (
|
||||||
LOCK TABLES `gossip_menu_option` WRITE;
|
LOCK TABLES `gossip_menu_option` WRITE;
|
||||||
/*!40000 ALTER TABLE `gossip_menu_option` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `gossip_menu_option` DISABLE KEYS */;
|
||||||
INSERT INTO gossip_menu_option VALUES
|
INSERT INTO gossip_menu_option VALUES
|
||||||
(0,0,0,'GOSSIP_OPTION_QUESTGIVER',2,2,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0, 0,0,'GOSSIP_OPTION_QUESTGIVER', 2,0x000002,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,1,1,'GOSSIP_OPTION_VENDOR',3,128,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0, 1,1,'GOSSIP_OPTION_VENDOR', 3,0x000080,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,2,2,'GOSSIP_OPTION_TAXIVENDOR',4,8192,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0, 2,2,'GOSSIP_OPTION_TAXIVENDOR', 4,0x002000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,3,3,'GOSSIP_OPTION_TRAINER',5,16,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0, 3,3,'GOSSIP_OPTION_TRAINER', 5,0x000010,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,4,4,'GOSSIP_OPTION_SPIRITHEALER',6,16384,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0, 4,4,'GOSSIP_OPTION_SPIRITHEALER', 6,0x004000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,5,4,'GOSSIP_OPTION_SPIRITGUIDE',7,32768,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0, 5,4,'GOSSIP_OPTION_SPIRITGUIDE', 7,0x008000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,6,5,'GOSSIP_OPTION_INNKEEPER',8,65536,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0, 6,5,'GOSSIP_OPTION_INNKEEPER', 8,0x010000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,7,6,'GOSSIP_OPTION_BANKER',9,131072,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0, 7,6,'GOSSIP_OPTION_BANKER', 9,0x020000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,8,7,'GOSSIP_OPTION_PETITIONER',10,262144,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0, 8,7,'GOSSIP_OPTION_PETITIONER', 10,0x040000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,9,8,'GOSSIP_OPTION_TABARDDESIGNER',11,524288,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0, 9,8,'GOSSIP_OPTION_TABARDDESIGNER', 11,0x080000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,10,9,'GOSSIP_OPTION_BATTLEFIELD',12,1048576,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0,10,9,'GOSSIP_OPTION_BATTLEFIELD', 12,0x100000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,11,6,'GOSSIP_OPTION_AUCTIONEER',13,2097152,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0,11,6,'GOSSIP_OPTION_AUCTIONEER', 13,0x200000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,12,0,'GOSSIP_OPTION_STABLEPET',14,4194304,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0,12,0,'GOSSIP_OPTION_STABLEPET', 14,0x400000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,13,1,'GOSSIP_OPTION_ARMORER',15,4096,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0,13,1,'GOSSIP_OPTION_ARMORER', 15,0x001000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,14,2,'GOSSIP_OPTION_UNLEARNTALENTS',16,16,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
(0,14,2,'GOSSIP_OPTION_UNLEARNTALENTS', 16,0x000010,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
|
||||||
(0,15,2,'GOSSIP_OPTION_UNLEARNPETSKILLS',17,16,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0);
|
(0,15,2,'GOSSIP_OPTION_UNLEARNPETSKILLS',17,0x000010,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0);
|
||||||
/*!40000 ALTER TABLE `gossip_menu_option` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `gossip_menu_option` ENABLE KEYS */;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
|
|
||||||
4
sql/updates/9589_01_mangos_creature_template.sql
Normal file
4
sql/updates/9589_01_mangos_creature_template.sql
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
ALTER TABLE db_version CHANGE COLUMN required_9539_01_mangos_spell_bonus_data required_9589_01_mangos_creature_template bit;
|
||||||
|
|
||||||
|
ALTER TABLE creature_template ADD COLUMN speed_run float NOT NULL default '1.14286' COMMENT 'Result of 8.0/7.0, most common value' AFTER speed;
|
||||||
|
ALTER TABLE creature_template CHANGE COLUMN speed speed_walk float NOT NULL default '1' COMMENT 'Result of 2.5/2.5, most common value';
|
||||||
3
sql/updates/9590_01_mangos_db_script_string.sql
Normal file
3
sql/updates/9590_01_mangos_db_script_string.sql
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
ALTER TABLE db_version CHANGE COLUMN required_9589_01_mangos_creature_template required_9590_01_mangos_db_script_string bit;
|
||||||
|
|
||||||
|
ALTER TABLE `db_script_string` CHANGE `entry` `entry` INT( 11 ) UNSIGNED NOT NULL DEFAULT '0';
|
||||||
15
sql/updates/9611_01_characters.sql
Normal file
15
sql/updates/9611_01_characters.sql
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
ALTER TABLE character_db_version CHANGE COLUMN required_9375_01_characters_character_glyphs required_9611_01_characters bit;
|
||||||
|
|
||||||
|
ALTER TABLE `group_member` ADD INDEX `Idx_memberGuid`(`memberGuid`);
|
||||||
|
ALTER TABLE `guild_eventlog` ADD INDEX `Idx_PlayerGuid1`(`PlayerGuid1`);
|
||||||
|
ALTER TABLE `guild_eventlog` ADD INDEX `Idx_PlayerGuid2`(`PlayerGuid2`);
|
||||||
|
ALTER TABLE `guild_bank_eventlog` ADD INDEX `Idx_PlayerGuid`(`PlayerGuid`);
|
||||||
|
ALTER TABLE `petition_sign` ADD INDEX `Idx_playerguid`(`playerguid`);
|
||||||
|
ALTER TABLE `petition_sign` ADD INDEX `Idx_ownerguid`(`ownerguid`);
|
||||||
|
ALTER TABLE `guild_eventlog` ADD INDEX `Idx_LogGuid`(`LogGuid`);
|
||||||
|
ALTER TABLE `guild_bank_eventlog` ADD INDEX `Idx_LogGuid`(`LogGuid`);
|
||||||
|
ALTER TABLE `guild_bank_item` ADD INDEX `Idx_item_guid`(`item_guid`);
|
||||||
|
ALTER TABLE `corpse` ADD INDEX `Idx_player`(`player`);
|
||||||
|
ALTER TABLE `corpse` ADD INDEX `Idx_time`(`time`);
|
||||||
|
ALTER TABLE `guild_rank` ADD INDEX `Idx_rid`(`rid`);
|
||||||
|
ALTER TABLE `character_equipmentsets` ADD INDEX `Idx_setindex` (`setindex`);
|
||||||
|
|
@ -87,6 +87,9 @@ pkgdata_DATA = \
|
||||||
9526_01_mangos_spell_proc_event.sql \
|
9526_01_mangos_spell_proc_event.sql \
|
||||||
9528_01_mangos_spell_bonus_data.sql \
|
9528_01_mangos_spell_bonus_data.sql \
|
||||||
9539_01_mangos_spell_bonus_data.sql \
|
9539_01_mangos_spell_bonus_data.sql \
|
||||||
|
9589_01_mangos_creature_template.sql \
|
||||||
|
9590_01_mangos_db_script_string.sql \
|
||||||
|
9611_01_characters.sql \
|
||||||
README
|
README
|
||||||
|
|
||||||
## Additional files to include when running 'make dist'
|
## Additional files to include when running 'make dist'
|
||||||
|
|
@ -154,4 +157,7 @@ EXTRA_DIST = \
|
||||||
9526_01_mangos_spell_proc_event.sql \
|
9526_01_mangos_spell_proc_event.sql \
|
||||||
9528_01_mangos_spell_bonus_data.sql \
|
9528_01_mangos_spell_bonus_data.sql \
|
||||||
9539_01_mangos_spell_bonus_data.sql \
|
9539_01_mangos_spell_bonus_data.sql \
|
||||||
|
9589_01_mangos_creature_template.sql \
|
||||||
|
9590_01_mangos_db_script_string.sql \
|
||||||
|
9611_01_characters.sql \
|
||||||
README
|
README
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@
|
||||||
#include "SpellMgr.h"
|
#include "SpellMgr.h"
|
||||||
#include "ArenaTeam.h"
|
#include "ArenaTeam.h"
|
||||||
#include "ProgressBar.h"
|
#include "ProgressBar.h"
|
||||||
|
#include "Mail.h"
|
||||||
#include "GridNotifiersImpl.h"
|
#include "GridNotifiersImpl.h"
|
||||||
#include "CellImpl.h"
|
#include "CellImpl.h"
|
||||||
#include "Language.h"
|
#include "Language.h"
|
||||||
|
|
@ -331,6 +332,9 @@ bool AchievementCriteriaRequirement::Meets(uint32 criteria_id, Player const* sou
|
||||||
if (!source->IsInWorld())
|
if (!source->IsInWorld())
|
||||||
return false;
|
return false;
|
||||||
Map* map = source->GetMap();
|
Map* map = source->GetMap();
|
||||||
|
// BattleGroundMap-class is instanceable, but no InstanceMap-class
|
||||||
|
if (map->IsBattleGroundOrArena())
|
||||||
|
return false;
|
||||||
if (!map->Instanceable())
|
if (!map->Instanceable())
|
||||||
{
|
{
|
||||||
sLog.outErrorDb("Achievement system call ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT (%u) for achievement criteria %u for non-instance map %u",
|
sLog.outErrorDb("Achievement system call ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT (%u) for achievement criteria %u for non-instance map %u",
|
||||||
|
|
@ -1826,9 +1830,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 itemTextId = sObjectMgr.CreateItemText( text );
|
MailDraft draft(subject, text);
|
||||||
|
|
||||||
MailDraft draft(subject, itemTextId);
|
|
||||||
|
|
||||||
if(item)
|
if(item)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -47,9 +47,8 @@ AggressorAI::MoveInLineOfSight(Unit *u)
|
||||||
if( !m_creature->canFly() && m_creature->GetDistanceZ(u) > CREATURE_Z_ATTACK_RANGE )
|
if( !m_creature->canFly() && m_creature->GetDistanceZ(u) > CREATURE_Z_ATTACK_RANGE )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!m_creature->hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_DIED) && u->isTargetableForAttack() &&
|
if (m_creature->CanInitiateAttack() && u->isTargetableForAttack() &&
|
||||||
( m_creature->IsHostileTo( u ) /*|| u->getVictim() && m_creature->IsFriendlyTo( u->getVictim() )*/ ) &&
|
m_creature->IsHostileTo(u) && u->isInAccessablePlaceFor(m_creature))
|
||||||
u->isInAccessablePlaceFor(m_creature))
|
|
||||||
{
|
{
|
||||||
float attackRadius = m_creature->GetAttackDistance(u);
|
float attackRadius = m_creature->GetAttackDistance(u);
|
||||||
if(m_creature->IsWithinDistInMap(u, attackRadius) && m_creature->IsWithinLOSInMap(u) )
|
if(m_creature->IsWithinDistInMap(u, attackRadius) && m_creature->IsWithinLOSInMap(u) )
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
#include "UpdateMask.h"
|
#include "UpdateMask.h"
|
||||||
#include "AuctionHouseMgr.h"
|
#include "AuctionHouseMgr.h"
|
||||||
|
#include "Mail.h"
|
||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
|
|
||||||
//please DO NOT use iterator++, because it is slower than ++iterator!!!
|
//please DO NOT use iterator++, because it is slower than ++iterator!!!
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "WorldPacket.h"
|
#include "WorldPacket.h"
|
||||||
#include "WorldSession.h"
|
#include "WorldSession.h"
|
||||||
|
#include "Mail.h"
|
||||||
|
|
||||||
#include "Policies/SingletonImp.h"
|
#include "Policies/SingletonImp.h"
|
||||||
|
|
||||||
|
|
@ -134,9 +135,6 @@ void AuctionHouseMgr::SendAuctionWonMail( AuctionEntry *auction )
|
||||||
msgAuctionWonBody << std::dec << ":" << auction->bid << ":" << auction->buyout;
|
msgAuctionWonBody << std::dec << ":" << auction->bid << ":" << auction->buyout;
|
||||||
sLog.outDebug( "AuctionWon body string : %s", msgAuctionWonBody.str().c_str() );
|
sLog.outDebug( "AuctionWon body string : %s", msgAuctionWonBody.str().c_str() );
|
||||||
|
|
||||||
//prepare mail data... :
|
|
||||||
uint32 itemTextId = sObjectMgr.CreateItemText( msgAuctionWonBody.str() );
|
|
||||||
|
|
||||||
// set owner to bidder (to prevent delete item with sender char deleting)
|
// set owner to bidder (to prevent delete item with sender char deleting)
|
||||||
// owner in `data` will set at mail receive and item extracting
|
// owner in `data` will set at mail receive and item extracting
|
||||||
CharacterDatabase.PExecute("UPDATE item_instance SET owner_guid = '%u' WHERE guid='%u'",auction->bidder,pItem->GetGUIDLow());
|
CharacterDatabase.PExecute("UPDATE item_instance SET owner_guid = '%u' WHERE guid='%u'",auction->bidder,pItem->GetGUIDLow());
|
||||||
|
|
@ -152,7 +150,7 @@ void AuctionHouseMgr::SendAuctionWonMail( AuctionEntry *auction )
|
||||||
RemoveAItem(pItem->GetGUIDLow()); // we have to remove the item, before we delete it !!
|
RemoveAItem(pItem->GetGUIDLow()); // we have to remove the item, before we delete it !!
|
||||||
|
|
||||||
// will delete item or place to receiver mail list
|
// will delete item or place to receiver mail list
|
||||||
MailDraft(msgAuctionWonSubject.str(), itemTextId)
|
MailDraft(msgAuctionWonSubject.str(), msgAuctionWonBody.str())
|
||||||
.AddItem(pItem)
|
.AddItem(pItem)
|
||||||
.SendMailTo(MailReceiver(bidder,auction->bidder), auction, MAIL_CHECK_MASK_AUCTION);
|
.SendMailTo(MailReceiver(bidder,auction->bidder), auction, MAIL_CHECK_MASK_AUCTION);
|
||||||
}
|
}
|
||||||
|
|
@ -189,9 +187,7 @@ void AuctionHouseMgr::SendAuctionSalePendingMail( AuctionEntry * auction )
|
||||||
|
|
||||||
sLog.outDebug("AuctionSalePending body string : %s", msgAuctionSalePendingBody.str().c_str());
|
sLog.outDebug("AuctionSalePending body string : %s", msgAuctionSalePendingBody.str().c_str());
|
||||||
|
|
||||||
uint32 itemTextId = sObjectMgr.CreateItemText( msgAuctionSalePendingBody.str() );
|
MailDraft(msgAuctionSalePendingSubject.str(), msgAuctionSalePendingBody.str())
|
||||||
|
|
||||||
MailDraft(msgAuctionSalePendingSubject.str(), itemTextId)
|
|
||||||
.SendMailTo(MailReceiver(owner,auction->owner), auction, MAIL_CHECK_MASK_AUCTION);
|
.SendMailTo(MailReceiver(owner,auction->owner), auction, MAIL_CHECK_MASK_AUCTION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -222,8 +218,6 @@ void AuctionHouseMgr::SendAuctionSuccessfulMail( AuctionEntry * auction )
|
||||||
|
|
||||||
sLog.outDebug("AuctionSuccessful body string : %s", auctionSuccessfulBody.str().c_str());
|
sLog.outDebug("AuctionSuccessful body string : %s", auctionSuccessfulBody.str().c_str());
|
||||||
|
|
||||||
uint32 itemTextId = sObjectMgr.CreateItemText( auctionSuccessfulBody.str() );
|
|
||||||
|
|
||||||
uint32 profit = auction->bid + auction->deposit - auctionCut;
|
uint32 profit = auction->bid + auction->deposit - auctionCut;
|
||||||
|
|
||||||
if (owner)
|
if (owner)
|
||||||
|
|
@ -235,7 +229,7 @@ void AuctionHouseMgr::SendAuctionSuccessfulMail( AuctionEntry * auction )
|
||||||
owner->GetSession()->SendAuctionOwnerNotification( auction );
|
owner->GetSession()->SendAuctionOwnerNotification( auction );
|
||||||
}
|
}
|
||||||
|
|
||||||
MailDraft(msgAuctionSuccessfulSubject.str(), itemTextId)
|
MailDraft(msgAuctionSuccessfulSubject.str(), auctionSuccessfulBody.str())
|
||||||
.AddMoney(profit)
|
.AddMoney(profit)
|
||||||
.SendMailTo(MailReceiver(owner,auction->owner), auction, MAIL_CHECK_MASK_AUCTION, HOUR);
|
.SendMailTo(MailReceiver(owner,auction->owner), auction, MAIL_CHECK_MASK_AUCTION, HOUR);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@
|
||||||
#include "Group.h"
|
#include "Group.h"
|
||||||
#include "ObjectGuid.h"
|
#include "ObjectGuid.h"
|
||||||
#include "ObjectMgr.h"
|
#include "ObjectMgr.h"
|
||||||
|
#include "Mail.h"
|
||||||
#include "WorldPacket.h"
|
#include "WorldPacket.h"
|
||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
#include "Formulas.h"
|
#include "Formulas.h"
|
||||||
|
|
@ -208,7 +209,6 @@ void BattleGround::BroadcastWorker(Do& _do)
|
||||||
BattleGround::BattleGround()
|
BattleGround::BattleGround()
|
||||||
{
|
{
|
||||||
m_TypeID = BattleGroundTypeId(0);
|
m_TypeID = BattleGroundTypeId(0);
|
||||||
m_InstanceID = 0;
|
|
||||||
m_Status = STATUS_NONE;
|
m_Status = STATUS_NONE;
|
||||||
m_ClientInstanceID = 0;
|
m_ClientInstanceID = 0;
|
||||||
m_EndTime = 0;
|
m_EndTime = 0;
|
||||||
|
|
@ -226,7 +226,6 @@ BattleGround::BattleGround()
|
||||||
m_LevelMin = 0;
|
m_LevelMin = 0;
|
||||||
m_LevelMax = 0;
|
m_LevelMax = 0;
|
||||||
m_InBGFreeSlotQueue = false;
|
m_InBGFreeSlotQueue = false;
|
||||||
m_SetDeleteThis = false;
|
|
||||||
|
|
||||||
m_MaxPlayersPerTeam = 0;
|
m_MaxPlayersPerTeam = 0;
|
||||||
m_MaxPlayers = 0;
|
m_MaxPlayers = 0;
|
||||||
|
|
@ -297,6 +296,7 @@ BattleGround::~BattleGround()
|
||||||
}
|
}
|
||||||
|
|
||||||
sBattleGroundMgr.RemoveBattleGround(GetInstanceID(), GetTypeID());
|
sBattleGroundMgr.RemoveBattleGround(GetInstanceID(), GetTypeID());
|
||||||
|
sBattleGroundMgr.DeleteClientVisibleInstanceId(GetTypeID(), GetBracketId(), GetClientInstanceID());
|
||||||
|
|
||||||
// unload map
|
// unload map
|
||||||
// map can be null at bg destruction
|
// map can be null at bg destruction
|
||||||
|
|
@ -325,7 +325,8 @@ void BattleGround::Update(uint32 diff)
|
||||||
// ]]
|
// ]]
|
||||||
// BattleGround Template instance cannot be updated, because it would be deleted
|
// BattleGround Template instance cannot be updated, because it would be deleted
|
||||||
if (!GetInvitedCount(HORDE) && !GetInvitedCount(ALLIANCE))
|
if (!GetInvitedCount(HORDE) && !GetInvitedCount(ALLIANCE))
|
||||||
m_SetDeleteThis = true;
|
delete this;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -965,7 +966,7 @@ void BattleGround::SendRewardMarkByMail(Player *plr,uint32 mark, uint32 count)
|
||||||
snprintf(textBuf,300,textFormat.c_str(),GetName(),GetName());
|
snprintf(textBuf,300,textFormat.c_str(),GetName(),GetName());
|
||||||
uint32 itemTextId = sObjectMgr.CreateItemText( textBuf );
|
uint32 itemTextId = sObjectMgr.CreateItemText( textBuf );
|
||||||
|
|
||||||
MailDraft(subject, itemTextId)
|
MailDraft(subject, textBuf)
|
||||||
.AddItem(markItem)
|
.AddItem(markItem)
|
||||||
.SendMailTo(plr, MailSender(MAIL_CREATURE, bmEntry));
|
.SendMailTo(plr, MailSender(MAIL_CREATURE, bmEntry));
|
||||||
}
|
}
|
||||||
|
|
@ -1326,10 +1327,9 @@ void BattleGround::RemoveFromBGFreeSlotQueue()
|
||||||
{
|
{
|
||||||
// set to be able to re-add if needed
|
// set to be able to re-add if needed
|
||||||
m_InBGFreeSlotQueue = false;
|
m_InBGFreeSlotQueue = false;
|
||||||
// uncomment this code when battlegrounds will work like instances
|
|
||||||
for (BGFreeSlotQueueType::iterator itr = sBattleGroundMgr.BGFreeSlotQueue[m_TypeID].begin(); itr != sBattleGroundMgr.BGFreeSlotQueue[m_TypeID].end(); ++itr)
|
for (BGFreeSlotQueueType::iterator itr = sBattleGroundMgr.BGFreeSlotQueue[m_TypeID].begin(); itr != sBattleGroundMgr.BGFreeSlotQueue[m_TypeID].end(); ++itr)
|
||||||
{
|
{
|
||||||
if ((*itr)->GetInstanceID() == m_InstanceID)
|
if ((*itr)->GetInstanceID() == GetInstanceID())
|
||||||
{
|
{
|
||||||
sBattleGroundMgr.BGFreeSlotQueue[m_TypeID].erase(itr);
|
sBattleGroundMgr.BGFreeSlotQueue[m_TypeID].erase(itr);
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
#include "SharedDefines.h"
|
#include "SharedDefines.h"
|
||||||
|
#include "Map.h"
|
||||||
|
|
||||||
// magic event-numbers
|
// magic event-numbers
|
||||||
#define BG_EVENT_NONE 255
|
#define BG_EVENT_NONE 255
|
||||||
|
|
@ -298,7 +299,9 @@ class BattleGround
|
||||||
char const* GetName() const { return m_Name; }
|
char const* GetName() const { return m_Name; }
|
||||||
BattleGroundTypeId GetTypeID() const { return m_TypeID; }
|
BattleGroundTypeId GetTypeID() const { return m_TypeID; }
|
||||||
BattleGroundBracketId GetBracketId() const { return m_BracketId; }
|
BattleGroundBracketId GetBracketId() const { return m_BracketId; }
|
||||||
uint32 GetInstanceID() const { return m_InstanceID; }
|
// the instanceId check is also used to determine a bg-template
|
||||||
|
// that's why the m_map hack is here..
|
||||||
|
uint32 GetInstanceID() { return m_Map?GetBgMap()->GetInstanceId():0; }
|
||||||
BattleGroundStatus GetStatus() const { return m_Status; }
|
BattleGroundStatus GetStatus() const { return m_Status; }
|
||||||
uint32 GetClientInstanceID() const { return m_ClientInstanceID; }
|
uint32 GetClientInstanceID() const { return m_ClientInstanceID; }
|
||||||
uint32 GetStartTime() const { return m_StartTime; }
|
uint32 GetStartTime() const { return m_StartTime; }
|
||||||
|
|
@ -323,7 +326,6 @@ class BattleGround
|
||||||
void SetTypeID(BattleGroundTypeId TypeID) { m_TypeID = TypeID; }
|
void SetTypeID(BattleGroundTypeId TypeID) { m_TypeID = TypeID; }
|
||||||
//here we can count minlevel and maxlevel for players
|
//here we can count minlevel and maxlevel for players
|
||||||
void SetBracket(PvPDifficultyEntry const* bracketEntry);
|
void SetBracket(PvPDifficultyEntry const* bracketEntry);
|
||||||
void SetInstanceID(uint32 InstanceID) { m_InstanceID = InstanceID; }
|
|
||||||
void SetStatus(BattleGroundStatus Status) { m_Status = Status; }
|
void SetStatus(BattleGroundStatus Status) { m_Status = Status; }
|
||||||
void SetClientInstanceID(uint32 InstanceID) { m_ClientInstanceID = InstanceID; }
|
void SetClientInstanceID(uint32 InstanceID) { m_ClientInstanceID = InstanceID; }
|
||||||
void SetStartTime(uint32 Time) { m_StartTime = Time; }
|
void SetStartTime(uint32 Time) { m_StartTime = Time; }
|
||||||
|
|
@ -514,8 +516,6 @@ class BattleGround
|
||||||
uint32 GetOtherTeam(uint32 teamId){ return (teamId) ? ((teamId == ALLIANCE) ? HORDE : ALLIANCE) : 0; }
|
uint32 GetOtherTeam(uint32 teamId){ return (teamId) ? ((teamId == ALLIANCE) ? HORDE : ALLIANCE) : 0; }
|
||||||
bool IsPlayerInBattleGround(uint64 guid);
|
bool IsPlayerInBattleGround(uint64 guid);
|
||||||
|
|
||||||
void SetDeleteThis() {m_SetDeleteThis = true;}
|
|
||||||
|
|
||||||
/* virtual score-array - get's used in bg-subclasses */
|
/* virtual score-array - get's used in bg-subclasses */
|
||||||
int32 m_TeamScores[BG_TEAMS_COUNT];
|
int32 m_TeamScores[BG_TEAMS_COUNT];
|
||||||
|
|
||||||
|
|
@ -562,7 +562,6 @@ class BattleGround
|
||||||
private:
|
private:
|
||||||
/* Battleground */
|
/* Battleground */
|
||||||
BattleGroundTypeId m_TypeID;
|
BattleGroundTypeId m_TypeID;
|
||||||
uint32 m_InstanceID; //BattleGround Instance's GUID!
|
|
||||||
BattleGroundStatus m_Status;
|
BattleGroundStatus m_Status;
|
||||||
uint32 m_ClientInstanceID; //the instance-id which is sent to the client and without any other internal use
|
uint32 m_ClientInstanceID; //the instance-id which is sent to the client and without any other internal use
|
||||||
uint32 m_StartTime;
|
uint32 m_StartTime;
|
||||||
|
|
@ -571,7 +570,6 @@ class BattleGround
|
||||||
BattleGroundBracketId m_BracketId;
|
BattleGroundBracketId m_BracketId;
|
||||||
uint8 m_ArenaType; // 2=2v2, 3=3v3, 5=5v5
|
uint8 m_ArenaType; // 2=2v2, 3=3v3, 5=5v5
|
||||||
bool m_InBGFreeSlotQueue; // used to make sure that BG is only once inserted into the BattleGroundMgr.BGFreeSlotQueue[bgTypeId] deque
|
bool m_InBGFreeSlotQueue; // used to make sure that BG is only once inserted into the BattleGroundMgr.BGFreeSlotQueue[bgTypeId] deque
|
||||||
bool m_SetDeleteThis; // used for safe deletion of the bg after end / all players leave
|
|
||||||
bool m_IsArena;
|
bool m_IsArena;
|
||||||
uint8 m_Winner; // 0=alliance, 1=horde, 2=none
|
uint8 m_Winner; // 0=alliance, 1=horde, 2=none
|
||||||
int32 m_StartDelayTime;
|
int32 m_StartDelayTime;
|
||||||
|
|
|
||||||
|
|
@ -1138,55 +1138,21 @@ BattleGroundMgr::~BattleGroundMgr()
|
||||||
|
|
||||||
void BattleGroundMgr::DeleteAllBattleGrounds()
|
void BattleGroundMgr::DeleteAllBattleGrounds()
|
||||||
{
|
{
|
||||||
|
// will also delete template bgs:
|
||||||
for(uint32 i = BATTLEGROUND_TYPE_NONE; i < MAX_BATTLEGROUND_TYPE_ID; i++)
|
for(uint32 i = BATTLEGROUND_TYPE_NONE; i < MAX_BATTLEGROUND_TYPE_ID; i++)
|
||||||
{
|
{
|
||||||
for(BattleGroundSet::iterator itr = m_BattleGrounds[i].begin(); itr != m_BattleGrounds[i].end();)
|
for(BattleGroundSet::iterator itr = m_BattleGrounds[i].begin(); itr != m_BattleGrounds[i].end();)
|
||||||
{
|
{
|
||||||
BattleGround * bg = itr->second;
|
BattleGround * bg = itr->second;
|
||||||
m_BattleGrounds[i].erase(itr++);
|
itr++;
|
||||||
if (!m_ClientBattleGroundIds[i][bg->GetBracketId()].empty())
|
|
||||||
m_ClientBattleGroundIds[i][bg->GetBracketId()].erase(bg->GetClientInstanceID());
|
|
||||||
delete bg;
|
delete bg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// destroy template battlegrounds that listed only in queues (other already terminated)
|
|
||||||
for(uint32 bgTypeId = 0; bgTypeId < MAX_BATTLEGROUND_TYPE_ID; ++bgTypeId)
|
|
||||||
{
|
|
||||||
// ~BattleGround call unregistring BG from queue
|
|
||||||
while(!BGFreeSlotQueue[bgTypeId].empty())
|
|
||||||
delete BGFreeSlotQueue[bgTypeId].front();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// used to update running battlegrounds, and delete finished ones
|
// used to update running battlegrounds, and delete finished ones
|
||||||
void BattleGroundMgr::Update(uint32 diff)
|
void BattleGroundMgr::Update(uint32 diff)
|
||||||
{
|
{
|
||||||
BattleGroundSet::iterator itr, next;
|
|
||||||
for(uint32 i = BATTLEGROUND_TYPE_NONE; i < MAX_BATTLEGROUND_TYPE_ID; i++)
|
|
||||||
{
|
|
||||||
itr = m_BattleGrounds[i].begin();
|
|
||||||
// skip updating battleground template
|
|
||||||
if (itr != m_BattleGrounds[i].end())
|
|
||||||
++itr;
|
|
||||||
for(; itr != m_BattleGrounds[i].end(); itr = next)
|
|
||||||
{
|
|
||||||
next = itr;
|
|
||||||
++next;
|
|
||||||
itr->second->Update(diff);
|
|
||||||
// use the SetDeleteThis variable
|
|
||||||
// direct deletion caused crashes
|
|
||||||
if (itr->second->m_SetDeleteThis)
|
|
||||||
{
|
|
||||||
BattleGround * bg = itr->second;
|
|
||||||
m_BattleGrounds[i].erase(itr);
|
|
||||||
if (!m_ClientBattleGroundIds[i][bg->GetBracketId()].empty())
|
|
||||||
m_ClientBattleGroundIds[i][bg->GetBracketId()].erase(bg->GetClientInstanceID());
|
|
||||||
delete bg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// update scheduled queues
|
// update scheduled queues
|
||||||
if (!m_QueueUpdateScheduler.empty())
|
if (!m_QueueUpdateScheduler.empty())
|
||||||
{
|
{
|
||||||
|
|
@ -1576,8 +1542,9 @@ BattleGround * BattleGroundMgr::CreateNewBattleGround(BattleGroundTypeId bgTypeI
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate a new instance id
|
// will also set m_bgMap, instanceid
|
||||||
bg->SetInstanceID(sMapMgr.GenerateInstanceId()); // set instance id
|
sMapMgr.CreateBgMap(bg->GetMapId(), bg);
|
||||||
|
|
||||||
bg->SetClientInstanceID(CreateClientVisibleInstanceId(bgTypeId, bracketEntry->GetBracketId()));
|
bg->SetClientInstanceID(CreateClientVisibleInstanceId(bgTypeId, bracketEntry->GetBracketId()));
|
||||||
|
|
||||||
// reset the new bg (set status to status_wait_queue from status_none)
|
// reset the new bg (set status to status_wait_queue from status_none)
|
||||||
|
|
@ -1617,7 +1584,6 @@ uint32 BattleGroundMgr::CreateBattleGround(BattleGroundTypeId bgTypeId, bool IsA
|
||||||
|
|
||||||
bg->SetMapId(MapID);
|
bg->SetMapId(MapID);
|
||||||
bg->SetTypeID(bgTypeId);
|
bg->SetTypeID(bgTypeId);
|
||||||
bg->SetInstanceID(0);
|
|
||||||
bg->SetArenaorBGType(IsArena);
|
bg->SetArenaorBGType(IsArena);
|
||||||
bg->SetMinPlayersPerTeam(MinPlayersPerTeam);
|
bg->SetMinPlayersPerTeam(MinPlayersPerTeam);
|
||||||
bg->SetMaxPlayersPerTeam(MaxPlayersPerTeam);
|
bg->SetMaxPlayersPerTeam(MaxPlayersPerTeam);
|
||||||
|
|
|
||||||
|
|
@ -211,6 +211,11 @@ class BattleGroundMgr
|
||||||
void AddBattleGround(uint32 InstanceID, BattleGroundTypeId bgTypeId, BattleGround* BG) { m_BattleGrounds[bgTypeId][InstanceID] = BG; };
|
void AddBattleGround(uint32 InstanceID, BattleGroundTypeId bgTypeId, BattleGround* BG) { m_BattleGrounds[bgTypeId][InstanceID] = BG; };
|
||||||
void RemoveBattleGround(uint32 instanceID, BattleGroundTypeId bgTypeId) { m_BattleGrounds[bgTypeId].erase(instanceID); }
|
void RemoveBattleGround(uint32 instanceID, BattleGroundTypeId bgTypeId) { m_BattleGrounds[bgTypeId].erase(instanceID); }
|
||||||
uint32 CreateClientVisibleInstanceId(BattleGroundTypeId bgTypeId, BattleGroundBracketId bracket_id);
|
uint32 CreateClientVisibleInstanceId(BattleGroundTypeId bgTypeId, BattleGroundBracketId bracket_id);
|
||||||
|
void DeleteClientVisibleInstanceId(BattleGroundTypeId bgTypeId, BattleGroundBracketId bracket_id, uint32 clientInstanceID)
|
||||||
|
{
|
||||||
|
if (!m_ClientBattleGroundIds[bgTypeId][bracket_id].empty())
|
||||||
|
m_ClientBattleGroundIds[bgTypeId][bracket_id].erase(clientInstanceID);
|
||||||
|
}
|
||||||
|
|
||||||
void CreateInitialBattleGrounds();
|
void CreateInitialBattleGrounds();
|
||||||
void DeleteAllBattleGrounds();
|
void DeleteAllBattleGrounds();
|
||||||
|
|
|
||||||
|
|
@ -263,9 +263,10 @@ bool Creature::InitEntry(uint32 Entry, uint32 team, const CreatureData *data )
|
||||||
|
|
||||||
SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f);
|
SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f);
|
||||||
|
|
||||||
SetSpeedRate(MOVE_WALK, cinfo->speed);
|
SetSpeedRate(MOVE_WALK, cinfo->speed_walk);
|
||||||
SetSpeedRate(MOVE_RUN, cinfo->speed);
|
SetSpeedRate(MOVE_RUN, cinfo->speed_run);
|
||||||
SetSpeedRate(MOVE_SWIM, cinfo->speed);
|
SetSpeedRate(MOVE_SWIM, 1.0f); // using 1.0 rate
|
||||||
|
SetSpeedRate(MOVE_FLIGHT, 1.0f); // using 1.0 rate
|
||||||
|
|
||||||
SetFloatValue(OBJECT_FIELD_SCALE_X, cinfo->scale);
|
SetFloatValue(OBJECT_FIELD_SCALE_X, cinfo->scale);
|
||||||
|
|
||||||
|
|
@ -1633,6 +1634,20 @@ bool Creature::CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction /
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Creature::CanInitiateAttack()
|
||||||
|
{
|
||||||
|
if (hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_DIED))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (isPassiveToHostile())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void Creature::SaveRespawnTime()
|
void Creature::SaveRespawnTime()
|
||||||
{
|
{
|
||||||
if(isPet() || !m_DBTableGuid)
|
if(isPet() || !m_DBTableGuid)
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,8 @@ struct CreatureInfo
|
||||||
uint32 faction_A;
|
uint32 faction_A;
|
||||||
uint32 faction_H;
|
uint32 faction_H;
|
||||||
uint32 npcflag;
|
uint32 npcflag;
|
||||||
float speed;
|
float speed_walk;
|
||||||
|
float speed_run;
|
||||||
float scale;
|
float scale;
|
||||||
uint32 rank;
|
uint32 rank;
|
||||||
float mindmg;
|
float mindmg;
|
||||||
|
|
@ -555,6 +556,7 @@ class MANGOS_DLL_SPEC Creature : public Unit
|
||||||
void SetNoSearchAssistance(bool val) { m_AlreadySearchedAssistance = val; }
|
void SetNoSearchAssistance(bool val) { m_AlreadySearchedAssistance = val; }
|
||||||
bool HasSearchedAssistance() { return m_AlreadySearchedAssistance; }
|
bool HasSearchedAssistance() { return m_AlreadySearchedAssistance; }
|
||||||
bool CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction = true) const;
|
bool CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction = true) const;
|
||||||
|
bool CanInitiateAttack();
|
||||||
|
|
||||||
MovementGeneratorType GetDefaultMovementType() const { return m_defaultMovementType; }
|
MovementGeneratorType GetDefaultMovementType() const { return m_defaultMovementType; }
|
||||||
void SetDefaultMovementType(MovementGeneratorType mgt) { m_defaultMovementType = mgt; }
|
void SetDefaultMovementType(MovementGeneratorType mgt) { m_defaultMovementType = mgt; }
|
||||||
|
|
|
||||||
|
|
@ -875,6 +875,13 @@ void CreatureEventAI::JustDied(Unit* killer)
|
||||||
{
|
{
|
||||||
Reset();
|
Reset();
|
||||||
|
|
||||||
|
if (m_creature->isGuard())
|
||||||
|
{
|
||||||
|
//Send Zone Under Attack message to the LocalDefense and WorldDefense Channels
|
||||||
|
if (Player* pKiller = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||||
|
m_creature->SendZoneUnderAttackMessage(pKiller);
|
||||||
|
}
|
||||||
|
|
||||||
if (bEmptyList)
|
if (bEmptyList)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -1022,7 +1029,7 @@ void CreatureEventAI::MoveInLineOfSight(Unit *who)
|
||||||
if (m_creature->isCivilian() || m_creature->IsNeutralToAll())
|
if (m_creature->isCivilian() || m_creature->IsNeutralToAll())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!m_creature->hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_DIED) && who->isTargetableForAttack() &&
|
if (m_creature->CanInitiateAttack() && who->isTargetableForAttack() &&
|
||||||
m_creature->IsHostileTo(who) && who->isInAccessablePlaceFor(m_creature))
|
m_creature->IsHostileTo(who) && who->isInAccessablePlaceFor(m_creature))
|
||||||
{
|
{
|
||||||
if (!m_creature->canFly() && m_creature->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
|
if (!m_creature->canFly() && m_creature->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
|
||||||
|
|
|
||||||
|
|
@ -837,6 +837,51 @@ uint32 const* GetTalentTabPages(uint32 cls)
|
||||||
return sTalentTabPages[cls];
|
return sTalentTabPages[cls];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsPointInAreaTriggerZone(AreaTriggerEntry const* atEntry, uint32 mapid, float x, float y, float z, float delta)
|
||||||
|
{
|
||||||
|
if (mapid != atEntry->mapid)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (atEntry->radius > 0)
|
||||||
|
{
|
||||||
|
// if we have radius check it
|
||||||
|
float dist2 = (x-atEntry->x)*(x-atEntry->x) + (y-atEntry->y)*(y-atEntry->y) + (z-atEntry->z)*(z-atEntry->z);
|
||||||
|
if(dist2 > (atEntry->radius + delta)*(atEntry->radius + delta))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we have only extent
|
||||||
|
|
||||||
|
// rotate the players position instead of rotating the whole cube, that way we can make a simplified
|
||||||
|
// is-in-cube check and we have to calculate only one point instead of 4
|
||||||
|
|
||||||
|
// 2PI = 360°, keep in mind that ingame orientation is counter-clockwise
|
||||||
|
double rotation = 2*M_PI-atEntry->box_orientation;
|
||||||
|
double sinVal = sin(rotation);
|
||||||
|
double cosVal = cos(rotation);
|
||||||
|
|
||||||
|
float playerBoxDistX = x - atEntry->x;
|
||||||
|
float playerBoxDistY = y - atEntry->y;
|
||||||
|
|
||||||
|
float rotPlayerX = float(atEntry->x + playerBoxDistX * cosVal - playerBoxDistY*sinVal);
|
||||||
|
float rotPlayerY = float(atEntry->y + playerBoxDistY * cosVal + playerBoxDistX*sinVal);
|
||||||
|
|
||||||
|
// box edges are parallel to coordiante axis, so we can treat every dimension independently :D
|
||||||
|
float dz = z - atEntry->z;
|
||||||
|
float dx = rotPlayerX - atEntry->x;
|
||||||
|
float dy = rotPlayerY - atEntry->y;
|
||||||
|
if( (fabs(dx) > atEntry->box_x/2 + delta) ||
|
||||||
|
(fabs(dy) > atEntry->box_y/2 + delta) ||
|
||||||
|
(fabs(dz) > atEntry->box_z/2 + delta) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// script support functions
|
// script support functions
|
||||||
MANGOS_DLL_SPEC DBCStorage <SoundEntriesEntry> const* GetSoundEntriesStore() { return &sSoundEntriesStore; }
|
MANGOS_DLL_SPEC DBCStorage <SoundEntriesEntry> const* GetSoundEntriesStore() { return &sSoundEntriesStore; }
|
||||||
MANGOS_DLL_SPEC DBCStorage <SpellEntry> const* GetSpellStore() { return &sSpellStore; }
|
MANGOS_DLL_SPEC DBCStorage <SpellEntry> const* GetSpellStore() { return &sSpellStore; }
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,8 @@ MapDifficulty const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty);
|
||||||
|
|
||||||
uint32 const* /*[3]*/ GetTalentTabPages(uint32 cls);
|
uint32 const* /*[3]*/ GetTalentTabPages(uint32 cls);
|
||||||
|
|
||||||
|
bool IsPointInAreaTriggerZone(AreaTriggerEntry const* atEntry, uint32 mapid, float x, float y, float z, float delta = 0.0f);
|
||||||
|
|
||||||
PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level);
|
PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level);
|
||||||
PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattleGroundBracketId id);
|
PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattleGroundBracketId id);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,6 @@
|
||||||
#include "ProgressBar.h"
|
#include "ProgressBar.h"
|
||||||
#include "Policies/SingletonImp.h"
|
#include "Policies/SingletonImp.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
#include "ObjectGuid.h"
|
|
||||||
|
|
||||||
INSTANTIATE_SINGLETON_1(GMTicketMgr);
|
INSTANTIATE_SINGLETON_1(GMTicketMgr);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ static void CorpsesErase(bool bones,uint32 delay)
|
||||||
{
|
{
|
||||||
///- Get the list of eligible corpses/bones to be removed
|
///- Get the list of eligible corpses/bones to be removed
|
||||||
//No SQL injection (uint32 and enum)
|
//No SQL injection (uint32 and enum)
|
||||||
CharacterDatabase.AsyncPQuery(&CorpsesEraseCallBack, bones, "SELECT guid,position_x,position_y,map,player FROM corpse WHERE UNIX_TIMESTAMP()-time > '%u' AND corpse_type %s '0'", delay, (bones ? "=" : "<>"));
|
CharacterDatabase.AsyncPQuery(&CorpsesEraseCallBack, bones, "SELECT guid,position_x,position_y,map,player FROM corpse WHERE time < (UNIX_TIMESTAMP()+'%u') AND corpse_type %s '0'", delay, (bones ? "=" : "<>"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// not thread guarded variant for call from other thread
|
/// not thread guarded variant for call from other thread
|
||||||
|
|
|
||||||
|
|
@ -147,7 +147,7 @@ inline void MaNGOS::DynamicObjectUpdater::VisitHelper(Unit* target)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//Check targets for not_selectable unit flag and remove
|
//Check targets for not_selectable unit flag and remove
|
||||||
if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE))
|
if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Evade target
|
// Evade target
|
||||||
|
|
|
||||||
|
|
@ -711,7 +711,7 @@ bool Group::CountRollVote(ObjectGuid const& playerGUID, Rolls::iterator& rollI,
|
||||||
Roll::PlayerVote::iterator itr = roll->playerVote.find(playerGUID.GetRawValue());
|
Roll::PlayerVote::iterator itr = roll->playerVote.find(playerGUID.GetRawValue());
|
||||||
// this condition means that player joins to the party after roll begins
|
// this condition means that player joins to the party after roll begins
|
||||||
if (itr == roll->playerVote.end())
|
if (itr == roll->playerVote.end())
|
||||||
return false;
|
return true; // result used for need iterator ++, so avoid for end of list
|
||||||
|
|
||||||
if (roll->getLoot())
|
if (roll->getLoot())
|
||||||
if (roll->getLoot()->items.empty())
|
if (roll->getLoot()->items.empty())
|
||||||
|
|
@ -1246,12 +1246,15 @@ void Group::_setLeader(const uint64 &guid)
|
||||||
|
|
||||||
void Group::_removeRolls(const uint64 &guid)
|
void Group::_removeRolls(const uint64 &guid)
|
||||||
{
|
{
|
||||||
for (Rolls::iterator it = RollId.begin(); it < RollId.end(); )
|
for (Rolls::iterator it = RollId.begin(); it != RollId.end(); )
|
||||||
{
|
{
|
||||||
Roll* roll = *it;
|
Roll* roll = *it;
|
||||||
Roll::PlayerVote::iterator itr2 = roll->playerVote.find(guid);
|
Roll::PlayerVote::iterator itr2 = roll->playerVote.find(guid);
|
||||||
if(itr2 == roll->playerVote.end())
|
if(itr2 == roll->playerVote.end())
|
||||||
|
{
|
||||||
|
++it;
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (itr2->second == GREED || itr2->second == DISENCHANT)
|
if (itr2->second == GREED || itr2->second == DISENCHANT)
|
||||||
--roll->totalGreed;
|
--roll->totalGreed;
|
||||||
|
|
@ -1641,11 +1644,8 @@ InstanceGroupBind* Group::GetBoundInstance(Player* player)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
InstanceGroupBind* Group::GetBoundInstance(Map* aMap)
|
InstanceGroupBind* Group::GetBoundInstance(Map* aMap, Difficulty difficulty)
|
||||||
{
|
{
|
||||||
// Currently spawn numbering not different from map difficulty
|
|
||||||
Difficulty difficulty = GetDifficulty(aMap->IsRaid());
|
|
||||||
|
|
||||||
// some instances only have one difficulty
|
// some instances only have one difficulty
|
||||||
MapDifficulty const* mapDiff = GetMapDifficultyData(aMap->GetId(),difficulty);
|
MapDifficulty const* mapDiff = GetMapDifficultyData(aMap->GetId(),difficulty);
|
||||||
if(!mapDiff)
|
if(!mapDiff)
|
||||||
|
|
|
||||||
|
|
@ -328,7 +328,7 @@ class MANGOS_DLL_SPEC Group
|
||||||
InstanceGroupBind* BindToInstance(InstanceSave *save, bool permanent, bool load = false);
|
InstanceGroupBind* BindToInstance(InstanceSave *save, bool permanent, bool load = false);
|
||||||
void UnbindInstance(uint32 mapid, uint8 difficulty, bool unload = false);
|
void UnbindInstance(uint32 mapid, uint8 difficulty, bool unload = false);
|
||||||
InstanceGroupBind* GetBoundInstance(Player* player);
|
InstanceGroupBind* GetBoundInstance(Player* player);
|
||||||
InstanceGroupBind* GetBoundInstance(Map* aMap);
|
InstanceGroupBind* GetBoundInstance(Map* aMap, Difficulty difficulty);
|
||||||
BoundInstancesMap& GetBoundInstances(Difficulty difficulty) { return m_boundInstances[difficulty]; }
|
BoundInstancesMap& GetBoundInstances(Difficulty difficulty) { return m_boundInstances[difficulty]; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,7 @@ Guild::Guild()
|
||||||
m_BorderColor = 0;
|
m_BorderColor = 0;
|
||||||
m_BackgroundColor = 0;
|
m_BackgroundColor = 0;
|
||||||
|
|
||||||
m_CreatedYear = 0;
|
m_CreatedDate = time(0);
|
||||||
m_CreatedMonth = 0;
|
|
||||||
m_CreatedDay = 0;
|
|
||||||
|
|
||||||
m_GuildBankMoney = 0;
|
m_GuildBankMoney = 0;
|
||||||
m_PurchasedTabs = 0;
|
m_PurchasedTabs = 0;
|
||||||
|
|
@ -224,21 +222,13 @@ bool Guild::LoadGuildFromDB(QueryResult *guildDataResult)
|
||||||
m_BackgroundColor = fields[7].GetUInt32();
|
m_BackgroundColor = fields[7].GetUInt32();
|
||||||
GINFO = fields[8].GetCppString();
|
GINFO = fields[8].GetCppString();
|
||||||
MOTD = fields[9].GetCppString();
|
MOTD = fields[9].GetCppString();
|
||||||
time_t time = fields[10].GetUInt64();
|
m_CreatedDate = fields[10].GetUInt64();
|
||||||
m_GuildBankMoney = fields[11].GetUInt64();
|
m_GuildBankMoney = fields[11].GetUInt64();
|
||||||
m_PurchasedTabs = fields[12].GetUInt32();
|
m_PurchasedTabs = fields[12].GetUInt32();
|
||||||
|
|
||||||
if (m_PurchasedTabs > GUILD_BANK_MAX_TABS)
|
if (m_PurchasedTabs > GUILD_BANK_MAX_TABS)
|
||||||
m_PurchasedTabs = GUILD_BANK_MAX_TABS;
|
m_PurchasedTabs = GUILD_BANK_MAX_TABS;
|
||||||
|
|
||||||
if (time > 0)
|
|
||||||
{
|
|
||||||
tm local = *(localtime(&time)); // dereference and assign
|
|
||||||
m_CreatedDay = local.tm_mday;
|
|
||||||
m_CreatedMonth = local.tm_mon + 1;
|
|
||||||
m_CreatedYear = local.tm_year + 1900;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -301,9 +301,7 @@ class Guild
|
||||||
std::string const& GetMOTD() const { return MOTD; }
|
std::string const& GetMOTD() const { return MOTD; }
|
||||||
std::string const& GetGINFO() const { return GINFO; }
|
std::string const& GetGINFO() const { return GINFO; }
|
||||||
|
|
||||||
uint32 GetCreatedYear() const { return m_CreatedYear; }
|
time_t GetCreatedDate() const { return m_CreatedDate; }
|
||||||
uint32 GetCreatedMonth() const { return m_CreatedMonth; }
|
|
||||||
uint32 GetCreatedDay() const { return m_CreatedDay; }
|
|
||||||
|
|
||||||
uint32 GetEmblemStyle() const { return m_EmblemStyle; }
|
uint32 GetEmblemStyle() const { return m_EmblemStyle; }
|
||||||
uint32 GetEmblemColor() const { return m_EmblemColor; }
|
uint32 GetEmblemColor() const { return m_EmblemColor; }
|
||||||
|
|
@ -437,9 +435,7 @@ class Guild
|
||||||
uint64 m_LeaderGuid;
|
uint64 m_LeaderGuid;
|
||||||
std::string MOTD;
|
std::string MOTD;
|
||||||
std::string GINFO;
|
std::string GINFO;
|
||||||
uint32 m_CreatedYear;
|
time_t m_CreatedDate;
|
||||||
uint32 m_CreatedMonth;
|
|
||||||
uint32 m_CreatedDay;
|
|
||||||
|
|
||||||
uint32 m_EmblemStyle;
|
uint32 m_EmblemStyle;
|
||||||
uint32 m_EmblemColor;
|
uint32 m_EmblemColor;
|
||||||
|
|
|
||||||
|
|
@ -226,13 +226,11 @@ void WorldSession::HandleGuildInfoOpcode(WorldPacket& /*recvPacket*/)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldPacket data(SMSG_GUILD_INFO, (5*4 + guild->GetName().size() + 1));
|
WorldPacket data(SMSG_GUILD_INFO, (guild->GetName().size() + 4 + 4 + 4));
|
||||||
data << guild->GetName();
|
data << guild->GetName();
|
||||||
data << guild->GetCreatedDay();
|
data << uint32(secsToTimeBitFields(guild->GetCreatedDate())); // 3.x (prev. day + month + year)
|
||||||
data << guild->GetCreatedMonth();
|
data << uint32(guild->GetMemberSize()); // amount of chars
|
||||||
data << guild->GetCreatedYear();
|
data << uint32(guild->GetMemberSize()); // amount of accounts (TODO: implement)
|
||||||
data << guild->GetMemberSize();
|
|
||||||
data << guild->GetMemberSize();
|
|
||||||
|
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
#include "Language.h"
|
#include "Language.h"
|
||||||
#include "CellImpl.h"
|
#include "CellImpl.h"
|
||||||
#include "InstanceSaveMgr.h"
|
#include "InstanceSaveMgr.h"
|
||||||
|
#include "Mail.h"
|
||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
#ifdef _DEBUG_VMAPS
|
#ifdef _DEBUG_VMAPS
|
||||||
#include "VMapFactory.h"
|
#include "VMapFactory.h"
|
||||||
|
|
@ -1978,9 +1979,7 @@ bool ChatHandler::HandleSendMailCommand(const char* args)
|
||||||
// from console show not existed sender
|
// from console show not existed sender
|
||||||
MailSender sender(MAIL_NORMAL,m_session ? m_session->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
|
MailSender sender(MAIL_NORMAL,m_session ? m_session->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
|
||||||
|
|
||||||
uint32 itemTextId = !text.empty() ? sObjectMgr.CreateItemText( text ) : 0;
|
MailDraft(subject, text)
|
||||||
|
|
||||||
MailDraft(subject, itemTextId)
|
|
||||||
.SendMailTo(MailReceiver(target,GUID_LOPART(target_guid)),sender);
|
.SendMailTo(MailReceiver(target,GUID_LOPART(target_guid)),sender);
|
||||||
|
|
||||||
std::string nameLink = playerLink(target_name);
|
std::string nameLink = playerLink(target_name);
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@
|
||||||
#include "SkillExtraItems.h"
|
#include "SkillExtraItems.h"
|
||||||
#include "SystemConfig.h"
|
#include "SystemConfig.h"
|
||||||
#include "Config/ConfigEnv.h"
|
#include "Config/ConfigEnv.h"
|
||||||
|
#include "Mail.h"
|
||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
#include "ItemEnchantmentMgr.h"
|
#include "ItemEnchantmentMgr.h"
|
||||||
#include "BattleGroundMgr.h"
|
#include "BattleGroundMgr.h"
|
||||||
|
|
@ -6297,10 +6298,8 @@ bool ChatHandler::HandleSendItemsCommand(const char* args)
|
||||||
// from console show not existed sender
|
// from console show not existed sender
|
||||||
MailSender sender(MAIL_NORMAL,m_session ? m_session->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
|
MailSender sender(MAIL_NORMAL,m_session ? m_session->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
|
||||||
|
|
||||||
uint32 itemTextId = !text.empty() ? sObjectMgr.CreateItemText( text ) : 0;
|
|
||||||
|
|
||||||
// fill mail
|
// fill mail
|
||||||
MailDraft draft(subject, itemTextId);
|
MailDraft draft(subject, text);
|
||||||
|
|
||||||
for(ItemPairs::const_iterator itr = items.begin(); itr != items.end(); ++itr)
|
for(ItemPairs::const_iterator itr = items.begin(); itr != items.end(); ++itr)
|
||||||
{
|
{
|
||||||
|
|
@ -6357,9 +6356,7 @@ bool ChatHandler::HandleSendMoneyCommand(const char* args)
|
||||||
// from console show not existed sender
|
// from console show not existed sender
|
||||||
MailSender sender(MAIL_NORMAL,m_session ? m_session->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
|
MailSender sender(MAIL_NORMAL,m_session ? m_session->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
|
||||||
|
|
||||||
uint32 itemTextId = !text.empty() ? sObjectMgr.CreateItemText( text ) : 0;
|
MailDraft(subject, text)
|
||||||
|
|
||||||
MailDraft(subject, itemTextId)
|
|
||||||
.AddMoney(money)
|
.AddMoney(money)
|
||||||
.SendMailTo(MailReceiver(receiver,GUID_LOPART(receiver_guid)),sender);
|
.SendMailTo(MailReceiver(receiver,GUID_LOPART(receiver_guid)),sender);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -907,6 +907,19 @@ MailReceiver::MailReceiver( Player* receiver,uint32 receiver_lowguid ) : m_recei
|
||||||
{
|
{
|
||||||
ASSERT(!receiver || receiver->GetGUIDLow() == receiver_lowguid);
|
ASSERT(!receiver || receiver->GetGUIDLow() == receiver_lowguid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new MailDraft object using subject and contect texts.
|
||||||
|
*
|
||||||
|
* @param subject The subject of the mail.
|
||||||
|
* @param itemText The text of the body of the mail.
|
||||||
|
*/
|
||||||
|
MailDraft::MailDraft( std::string subject, std::string text ) : m_mailTemplateId(0), m_mailTemplateItemsNeed(false), m_subject(subject),
|
||||||
|
m_bodyId(!text.empty() ? sObjectMgr.CreateItemText(text) : 0), m_money(0), m_COD(0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an item to the MailDraft.
|
* Adds an item to the MailDraft.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -177,7 +177,7 @@ class MailDraft
|
||||||
|
|
||||||
public: // Constructors
|
public: // Constructors
|
||||||
/**
|
/**
|
||||||
* Creates a new MailDraft object.
|
* Creates a new MailDraft object using mail template id.
|
||||||
*
|
*
|
||||||
* @param mailTemplateId The ID of the Template to be used.
|
* @param mailTemplateId The ID of the Template to be used.
|
||||||
* @param a boolean specifying whether the mail needs items or not.
|
* @param a boolean specifying whether the mail needs items or not.
|
||||||
|
|
@ -187,13 +187,20 @@ class MailDraft
|
||||||
: m_mailTemplateId(mailTemplateId), m_mailTemplateItemsNeed(need_items), m_bodyId(0), m_money(0), m_COD(0)
|
: m_mailTemplateId(mailTemplateId), m_mailTemplateItemsNeed(need_items), m_bodyId(0), m_money(0), m_COD(0)
|
||||||
{}
|
{}
|
||||||
/**
|
/**
|
||||||
* Creates a new MailDraft object.
|
* Creates a new MailDraft object using subject text and content text id.
|
||||||
*
|
*
|
||||||
* @param subject The subject of the mail.
|
* @param subject The subject of the mail.
|
||||||
* @param itemTextId The id of the body of the mail.
|
* @param itemTextId The id of the body of the mail.
|
||||||
*/
|
*/
|
||||||
MailDraft(std::string subject, uint32 itemTextId = 0)
|
MailDraft(std::string subject, uint32 itemTextId = 0)
|
||||||
: m_mailTemplateId(0), m_mailTemplateItemsNeed(false), m_subject(subject), m_bodyId(itemTextId), m_money(0), m_COD(0) {}
|
: m_mailTemplateId(0), m_mailTemplateItemsNeed(false), m_subject(subject), m_bodyId(itemTextId), m_money(0), m_COD(0) {}
|
||||||
|
/**
|
||||||
|
* Creates a new MailDraft object using subject and contect texts.
|
||||||
|
*
|
||||||
|
* @param subject The subject of the mail.
|
||||||
|
* @param itemText The text of the body of the mail.
|
||||||
|
*/
|
||||||
|
MailDraft(std::string subject, std::string text);
|
||||||
public: // Accessors
|
public: // Accessors
|
||||||
/// Returns the template ID used for this MailDraft.
|
/// Returns the template ID used for this MailDraft.
|
||||||
uint16 GetMailTemplateId() const { return m_mailTemplateId; }
|
uint16 GetMailTemplateId() const { return m_mailTemplateId; }
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@
|
||||||
#include "MapInstanced.h"
|
#include "MapInstanced.h"
|
||||||
#include "InstanceSaveMgr.h"
|
#include "InstanceSaveMgr.h"
|
||||||
#include "VMapFactory.h"
|
#include "VMapFactory.h"
|
||||||
|
#include "BattleGroundMgr.h"
|
||||||
|
|
||||||
GridState* si_GridStates[MAX_GRID_STATE];
|
GridState* si_GridStates[MAX_GRID_STATE];
|
||||||
|
|
||||||
|
|
@ -2450,7 +2451,7 @@ bool InstanceMap::Add(Player *player)
|
||||||
if(pGroup)
|
if(pGroup)
|
||||||
{
|
{
|
||||||
// solo saves should be reset when entering a group
|
// solo saves should be reset when entering a group
|
||||||
InstanceGroupBind *groupBind = pGroup->GetBoundInstance(this);
|
InstanceGroupBind *groupBind = pGroup->GetBoundInstance(this,GetDifficulty());
|
||||||
if(playerBind)
|
if(playerBind)
|
||||||
{
|
{
|
||||||
sLog.outError("InstanceMap::Add: player %s(%d) is being put in instance %d,%d,%d,%d,%d,%d but he is in group %d and is bound to instance %d,%d,%d,%d,%d,%d!", player->GetName(), player->GetGUIDLow(), mapSave->GetMapId(), mapSave->GetInstanceId(), mapSave->GetDifficulty(), mapSave->GetPlayerCount(), mapSave->GetGroupCount(), mapSave->CanReset(), GUID_LOPART(pGroup->GetLeaderGUID()), playerBind->save->GetMapId(), playerBind->save->GetInstanceId(), playerBind->save->GetDifficulty(), playerBind->save->GetPlayerCount(), playerBind->save->GetGroupCount(), playerBind->save->CanReset());
|
sLog.outError("InstanceMap::Add: player %s(%d) is being put in instance %d,%d,%d,%d,%d,%d but he is in group %d and is bound to instance %d,%d,%d,%d,%d,%d!", player->GetName(), player->GetGUIDLow(), mapSave->GetMapId(), mapSave->GetInstanceId(), mapSave->GetDifficulty(), mapSave->GetPlayerCount(), mapSave->GetGroupCount(), mapSave->CanReset(), GUID_LOPART(pGroup->GetLeaderGUID()), playerBind->save->GetMapId(), playerBind->save->GetInstanceId(), playerBind->save->GetDifficulty(), playerBind->save->GetPlayerCount(), playerBind->save->GetGroupCount(), playerBind->save->CanReset());
|
||||||
|
|
@ -2527,6 +2528,13 @@ void InstanceMap::Update(const uint32& t_diff)
|
||||||
i_data->Update(t_diff);
|
i_data->Update(t_diff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BattleGroundMap::Update(const uint32& diff)
|
||||||
|
{
|
||||||
|
Map::Update(diff);
|
||||||
|
|
||||||
|
GetBG()->Update(diff);
|
||||||
|
}
|
||||||
|
|
||||||
void InstanceMap::Remove(Player *player, bool remove)
|
void InstanceMap::Remove(Player *player, bool remove)
|
||||||
{
|
{
|
||||||
sLog.outDetail("MAP: Removing player '%s' from instance '%u' of map '%s' before relocating to other map", player->GetName(), GetInstanceId(), GetMapName());
|
sLog.outDetail("MAP: Removing player '%s' from instance '%u' of map '%s' before relocating to other map", player->GetName(), GetInstanceId(), GetMapName());
|
||||||
|
|
|
||||||
|
|
@ -576,6 +576,7 @@ class MANGOS_DLL_SPEC BattleGroundMap : public Map
|
||||||
BattleGroundMap(uint32 id, time_t, uint32 InstanceId, Map* _parent, uint8 spawnMode);
|
BattleGroundMap(uint32 id, time_t, uint32 InstanceId, Map* _parent, uint8 spawnMode);
|
||||||
~BattleGroundMap();
|
~BattleGroundMap();
|
||||||
|
|
||||||
|
void Update(const uint32&);
|
||||||
bool Add(Player *);
|
bool Add(Player *);
|
||||||
void Remove(Player *, bool);
|
void Remove(Player *, bool);
|
||||||
bool CanEnter(Player* player);
|
bool CanEnter(Player* player);
|
||||||
|
|
|
||||||
|
|
@ -104,11 +104,8 @@ void MapInstanced::UnloadAll(bool pForce)
|
||||||
Map::UnloadAll(pForce);
|
Map::UnloadAll(pForce);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/// returns a new or existing Instance
|
||||||
- return the right instance for the object, based on its InstanceId
|
/// in case of battlegrounds it will only return an existing map, those maps are created by bg-system
|
||||||
- create the instance if it's not created already
|
|
||||||
- the player is not actually added to the instance (only in InstanceMap::Add)
|
|
||||||
*/
|
|
||||||
Map* MapInstanced::CreateInstance(const uint32 mapId, Player * player)
|
Map* MapInstanced::CreateInstance(const uint32 mapId, Player * player)
|
||||||
{
|
{
|
||||||
if(GetId() != mapId || !player)
|
if(GetId() != mapId || !player)
|
||||||
|
|
@ -119,13 +116,11 @@ Map* MapInstanced::CreateInstance(const uint32 mapId, Player * player)
|
||||||
|
|
||||||
if(IsBattleGroundOrArena())
|
if(IsBattleGroundOrArena())
|
||||||
{
|
{
|
||||||
// instantiate or find existing bg map for player
|
// find existing bg map for player
|
||||||
// the instance id is set in battlegroundid
|
|
||||||
NewInstanceId = player->GetBattleGroundId();
|
NewInstanceId = player->GetBattleGroundId();
|
||||||
ASSERT(NewInstanceId);
|
ASSERT(NewInstanceId);
|
||||||
map = _FindMap(NewInstanceId);
|
map = _FindMap(NewInstanceId);
|
||||||
if(!map)
|
ASSERT(map);
|
||||||
map = CreateBattleGroundMap(NewInstanceId, player->GetBattleGround());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -139,7 +134,7 @@ Map* MapInstanced::CreateInstance(const uint32 mapId, Player * player)
|
||||||
InstanceGroupBind *groupBind = NULL;
|
InstanceGroupBind *groupBind = NULL;
|
||||||
Group *group = player->GetGroup();
|
Group *group = player->GetGroup();
|
||||||
// use the player's difficulty setting (it may not be the same as the group's)
|
// use the player's difficulty setting (it may not be the same as the group's)
|
||||||
if(group && (groupBind = group->GetBoundInstance(this)))
|
if(group && (groupBind = group->GetBoundInstance(this,player->GetDifficulty(IsRaid()))))
|
||||||
pSave = groupBind->save;
|
pSave = groupBind->save;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,11 +58,11 @@ class MANGOS_DLL_DECL MapInstanced : public Map
|
||||||
|
|
||||||
InstancedMaps &GetInstancedMaps() { return m_InstancedMaps; }
|
InstancedMaps &GetInstancedMaps() { return m_InstancedMaps; }
|
||||||
virtual void InitVisibilityDistance();
|
virtual void InitVisibilityDistance();
|
||||||
|
BattleGroundMap* CreateBattleGroundMap(uint32 InstanceId, BattleGround* bg);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
InstanceMap* CreateInstance(uint32 InstanceId, InstanceSave *save, Difficulty difficulty);
|
InstanceMap* CreateInstance(uint32 InstanceId, InstanceSave *save, Difficulty difficulty);
|
||||||
BattleGroundMap* CreateBattleGroundMap(uint32 InstanceId, BattleGround* bg);
|
|
||||||
|
|
||||||
InstancedMaps m_InstancedMaps;
|
InstancedMaps m_InstancedMaps;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,13 @@ Map* MapManager::CreateMap(uint32 id, const WorldObject* obj)
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map* MapManager::CreateBgMap(uint32 mapid, BattleGround* bg)
|
||||||
|
{
|
||||||
|
Map *m = _createBaseMap(mapid);
|
||||||
|
((MapInstanced*)m)->CreateBattleGroundMap(sMapMgr.GenerateInstanceId(), bg);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
Map* MapManager::FindMap(uint32 mapid, uint32 instanceId) const
|
Map* MapManager::FindMap(uint32 mapid, uint32 instanceId) const
|
||||||
{
|
{
|
||||||
Map *map = _findMap(mapid);
|
Map *map = _findMap(mapid);
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@
|
||||||
#include "GridStates.h"
|
#include "GridStates.h"
|
||||||
|
|
||||||
class Transport;
|
class Transport;
|
||||||
|
class BattleGround;
|
||||||
|
|
||||||
class MANGOS_DLL_DECL MapManager : public MaNGOS::Singleton<MapManager, MaNGOS::ClassLevelLockable<MapManager, ACE_Thread_Mutex> >
|
class MANGOS_DLL_DECL MapManager : public MaNGOS::Singleton<MapManager, MaNGOS::ClassLevelLockable<MapManager, ACE_Thread_Mutex> >
|
||||||
{
|
{
|
||||||
|
|
@ -38,6 +39,7 @@ class MANGOS_DLL_DECL MapManager : public MaNGOS::Singleton<MapManager, MaNGOS::
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Map* CreateMap(uint32, const WorldObject* obj);
|
Map* CreateMap(uint32, const WorldObject* obj);
|
||||||
|
Map* CreateBgMap(uint32 mapid, BattleGround* bg);
|
||||||
Map const* CreateBaseMap(uint32 id) const { return const_cast<MapManager*>(this)->_createBaseMap(id); }
|
Map const* CreateBaseMap(uint32 id) const { return const_cast<MapManager*>(this)->_createBaseMap(id); }
|
||||||
Map* FindMap(uint32 mapid, uint32 instanceId = 0) const;
|
Map* FindMap(uint32 mapid, uint32 instanceId = 0) const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -696,92 +696,43 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket & recv_data)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetPlayer()->GetMapId() != atEntry->mapid)
|
|
||||||
{
|
|
||||||
sLog.outDebug("Player '%s' (GUID: %u) too far (trigger map: %u player map: %u), ignore Area Trigger ID: %u", GetPlayer()->GetName(), atEntry->mapid, GetPlayer()->GetMapId(), GetPlayer()->GetGUIDLow(), Trigger_ID);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// delta is safe radius
|
// delta is safe radius
|
||||||
const float delta = 5.0f;
|
const float delta = 5.0f;
|
||||||
// check if player in the range of areatrigger
|
// check if player in the range of areatrigger
|
||||||
Player* pl = GetPlayer();
|
Player* pl = GetPlayer();
|
||||||
|
|
||||||
if (atEntry->radius > 0)
|
if (!IsPointInAreaTriggerZone(atEntry, pl->GetMapId(), pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(), delta))
|
||||||
{
|
{
|
||||||
// if we have radius check it
|
sLog.outDebug("Player '%s' (GUID: %u) too far, ignore Area Trigger ID: %u", pl->GetName(), pl->GetGUIDLow(), Trigger_ID);
|
||||||
float dist = pl->GetDistance(atEntry->x, atEntry->y, atEntry->z);
|
|
||||||
if(dist > atEntry->radius + delta)
|
|
||||||
{
|
|
||||||
sLog.outDebug("Player '%s' (GUID: %u) too far (radius: %f distance: %f), ignore Area Trigger ID: %u",
|
|
||||||
pl->GetName(), pl->GetGUIDLow(), atEntry->radius, dist, Trigger_ID);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// we have only extent
|
|
||||||
|
|
||||||
// rotate the players position instead of rotating the whole cube, that way we can make a simplified
|
if(Script->scriptAreaTrigger(pl, atEntry))
|
||||||
// is-in-cube check and we have to calculate only one point instead of 4
|
|
||||||
|
|
||||||
// 2PI = 360°, keep in mind that ingame orientation is counter-clockwise
|
|
||||||
double rotation = 2*M_PI-atEntry->box_orientation;
|
|
||||||
double sinVal = sin(rotation);
|
|
||||||
double cosVal = cos(rotation);
|
|
||||||
|
|
||||||
float playerBoxDistX = pl->GetPositionX() - atEntry->x;
|
|
||||||
float playerBoxDistY = pl->GetPositionY() - atEntry->y;
|
|
||||||
|
|
||||||
float rotPlayerX = float(atEntry->x + playerBoxDistX * cosVal - playerBoxDistY*sinVal);
|
|
||||||
float rotPlayerY = float(atEntry->y + playerBoxDistY * cosVal + playerBoxDistX*sinVal);
|
|
||||||
|
|
||||||
// box edges are parallel to coordiante axis, so we can treat every dimension independently :D
|
|
||||||
float dz = pl->GetPositionZ() - atEntry->z;
|
|
||||||
float dx = rotPlayerX - atEntry->x;
|
|
||||||
float dy = rotPlayerY - atEntry->y;
|
|
||||||
if( (fabs(dx) > atEntry->box_x/2 + delta) ||
|
|
||||||
(fabs(dy) > atEntry->box_y/2 + delta) ||
|
|
||||||
(fabs(dz) > atEntry->box_z/2 + delta) )
|
|
||||||
{
|
|
||||||
sLog.outDebug("Player '%s' (GUID: %u) too far (1/2 box X: %f 1/2 box Y: %f 1/2 box Z: %f rotatedPlayerX: %f rotatedPlayerY: %f dZ:%f), ignore Area Trigger ID: %u",
|
|
||||||
pl->GetName(), pl->GetGUIDLow(), atEntry->box_x/2, atEntry->box_y/2, atEntry->box_z/2, rotPlayerX, rotPlayerY, dz, Trigger_ID);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Script->scriptAreaTrigger(GetPlayer(), atEntry))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint32 quest_id = sObjectMgr.GetQuestForAreaTrigger( Trigger_ID );
|
uint32 quest_id = sObjectMgr.GetQuestForAreaTrigger( Trigger_ID );
|
||||||
if( quest_id && GetPlayer()->isAlive() && GetPlayer()->IsActiveQuest(quest_id) )
|
if( quest_id && pl->isAlive() && pl->IsActiveQuest(quest_id) )
|
||||||
{
|
{
|
||||||
Quest const* pQuest = sObjectMgr.GetQuestTemplate(quest_id);
|
Quest const* pQuest = sObjectMgr.GetQuestTemplate(quest_id);
|
||||||
if( pQuest )
|
if( pQuest )
|
||||||
{
|
{
|
||||||
if(GetPlayer()->GetQuestStatus(quest_id) == QUEST_STATUS_INCOMPLETE)
|
if(pl->GetQuestStatus(quest_id) == QUEST_STATUS_INCOMPLETE)
|
||||||
GetPlayer()->AreaExploredOrEventHappens( quest_id );
|
pl->AreaExploredOrEventHappens( quest_id );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sObjectMgr.IsTavernAreaTrigger(Trigger_ID))
|
// enter to tavern, not overwrite city rest
|
||||||
|
if(sObjectMgr.IsTavernAreaTrigger(Trigger_ID) && pl->GetRestType() != REST_TYPE_IN_CITY)
|
||||||
{
|
{
|
||||||
// set resting flag we are in the inn
|
// set resting flag we are in the inn
|
||||||
GetPlayer()->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING);
|
pl->SetRestType(REST_TYPE_IN_TAVERN, Trigger_ID);
|
||||||
GetPlayer()->InnEnter(time(NULL), atEntry->mapid, atEntry->x, atEntry->y, atEntry->z);
|
|
||||||
GetPlayer()->SetRestType(REST_TYPE_IN_TAVERN);
|
|
||||||
|
|
||||||
if(sWorld.IsFFAPvPRealm())
|
|
||||||
GetPlayer()->SetFFAPvP(false);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GetPlayer()->InBattleGround())
|
if(pl->InBattleGround())
|
||||||
{
|
{
|
||||||
BattleGround* bg = GetPlayer()->GetBattleGround();
|
if (BattleGround* bg = pl->GetBattleGround())
|
||||||
if(bg)
|
bg->HandleAreaTrigger(pl, Trigger_ID);
|
||||||
bg->HandleAreaTrigger(GetPlayer(), Trigger_ID);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@
|
||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
#include "WaypointManager.h"
|
#include "WaypointManager.h"
|
||||||
#include "GossipDef.h"
|
#include "GossipDef.h"
|
||||||
|
#include "Mail.h"
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,6 @@
|
||||||
#include "ItemPrototype.h"
|
#include "ItemPrototype.h"
|
||||||
#include "NPCHandler.h"
|
#include "NPCHandler.h"
|
||||||
#include "Database/DatabaseEnv.h"
|
#include "Database/DatabaseEnv.h"
|
||||||
#include "Mail.h"
|
|
||||||
#include "Map.h"
|
#include "Map.h"
|
||||||
#include "ObjectAccessor.h"
|
#include "ObjectAccessor.h"
|
||||||
#include "ObjectGuid.h"
|
#include "ObjectGuid.h"
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,7 @@
|
||||||
#include "Spell.h"
|
#include "Spell.h"
|
||||||
#include "SocialMgr.h"
|
#include "SocialMgr.h"
|
||||||
#include "AchievementMgr.h"
|
#include "AchievementMgr.h"
|
||||||
|
#include "Mail.h"
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
|
|
@ -431,10 +432,7 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa
|
||||||
|
|
||||||
////////////////////Rest System/////////////////////
|
////////////////////Rest System/////////////////////
|
||||||
time_inn_enter=0;
|
time_inn_enter=0;
|
||||||
inn_pos_mapid=0;
|
inn_trigger_id=0;
|
||||||
inn_pos_x=0;
|
|
||||||
inn_pos_y=0;
|
|
||||||
inn_pos_z=0;
|
|
||||||
m_rest_bonus=0;
|
m_rest_bonus=0;
|
||||||
rest_type=REST_TYPE_NO;
|
rest_type=REST_TYPE_NO;
|
||||||
////////////////////Rest System/////////////////////
|
////////////////////Rest System/////////////////////
|
||||||
|
|
@ -4130,8 +4128,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
|
||||||
CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE guid = '%u'",guid);
|
CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE guid = '%u'",guid);
|
||||||
CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE guid = '%u'",guid);
|
CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE guid = '%u'",guid);
|
||||||
CharacterDatabase.PExecute("DELETE FROM character_equipmentsets WHERE guid = '%u'",guid);
|
CharacterDatabase.PExecute("DELETE FROM character_equipmentsets WHERE guid = '%u'",guid);
|
||||||
CharacterDatabase.PExecute("DELETE FROM guild_eventlog WHERE PlayerGuid1 = '%u'",guid);
|
CharacterDatabase.PExecute("DELETE FROM guild_eventlog WHERE PlayerGuid1 = '%u' OR PlayerGuid2 = '%u'",guid, guid);
|
||||||
CharacterDatabase.PExecute("DELETE FROM guild_eventlog WHERE PlayerGuid2 = '%u'",guid);
|
|
||||||
CharacterDatabase.PExecute("DELETE FROM guild_bank_eventlog WHERE PlayerGuid = '%u'",guid);
|
CharacterDatabase.PExecute("DELETE FROM guild_bank_eventlog WHERE PlayerGuid = '%u'",guid);
|
||||||
CharacterDatabase.CommitTransaction();
|
CharacterDatabase.CommitTransaction();
|
||||||
|
|
||||||
|
|
@ -6487,38 +6484,19 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(zone->flags & AREA_FLAG_CAPITAL) // in capital city
|
if(zone->flags & AREA_FLAG_CAPITAL) // in capital city
|
||||||
{
|
|
||||||
SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING);
|
|
||||||
SetRestType(REST_TYPE_IN_CITY);
|
SetRestType(REST_TYPE_IN_CITY);
|
||||||
InnEnter(time(0),GetMapId(),0,0,0);
|
|
||||||
|
|
||||||
if(sWorld.IsFFAPvPRealm())
|
|
||||||
SetFFAPvP(false);
|
|
||||||
}
|
|
||||||
else // anywhere else
|
else // anywhere else
|
||||||
{
|
{
|
||||||
if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING)) // but resting (walk from city or maybe in tavern or leave tavern recently)
|
if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING)) // but resting (walk from city or maybe in tavern or leave tavern recently)
|
||||||
{
|
{
|
||||||
if (GetRestType()==REST_TYPE_IN_TAVERN) // has been in tavern. Is still in?
|
if (GetRestType()==REST_TYPE_IN_TAVERN) // has been in tavern. Is still in?
|
||||||
{
|
{
|
||||||
if(GetMapId()!=GetInnPosMapId() || sqrt((GetPositionX()-GetInnPosX())*(GetPositionX()-GetInnPosX())+(GetPositionY()-GetInnPosY())*(GetPositionY()-GetInnPosY())+(GetPositionZ()-GetInnPosZ())*(GetPositionZ()-GetInnPosZ()))>40)
|
AreaTriggerEntry const* at = sAreaTriggerStore.LookupEntry(inn_trigger_id);
|
||||||
{
|
if (!at || !IsPointInAreaTriggerZone(at, GetMapId(), GetPositionX(), GetPositionY(), GetPositionY()))
|
||||||
RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING);
|
|
||||||
SetRestType(REST_TYPE_NO);
|
SetRestType(REST_TYPE_NO);
|
||||||
|
|
||||||
if(sWorld.IsFFAPvPRealm())
|
|
||||||
SetFFAPvP(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else // not in tavern (leave city then)
|
else // not in tavern (leave city then)
|
||||||
{
|
|
||||||
RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING);
|
|
||||||
SetRestType(REST_TYPE_NO);
|
SetRestType(REST_TYPE_NO);
|
||||||
|
|
||||||
// Set player to FFA PVP when not in rested environment.
|
|
||||||
if(sWorld.IsFFAPvPRealm())
|
|
||||||
SetFFAPvP(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -19384,9 +19362,9 @@ void Player::SendAurasForTarget(Unit *target)
|
||||||
else
|
else
|
||||||
data << uint8(aura->GetStackAmount());
|
data << uint8(aura->GetStackAmount());
|
||||||
|
|
||||||
if(!(auraFlags & AFLAG_NOT_CASTER))
|
if(!(auraFlags & AFLAG_NOT_CASTER)) // packed GUID of caster
|
||||||
{
|
{
|
||||||
data << uint8(0); // packed GUID of someone (caster?)
|
data.appendPackGUID(aura->GetCasterGUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(auraFlags & AFLAG_DURATION) // include aura duration
|
if(auraFlags & AFLAG_DURATION) // include aura duration
|
||||||
|
|
@ -21753,3 +21731,27 @@ Object* Player::GetObjectByTypeMask(ObjectGuid guid, TypeMask typemask)
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::SetRestType( RestType n_r_type, uint32 areaTriggerId /*= 0*/)
|
||||||
|
{
|
||||||
|
rest_type = n_r_type;
|
||||||
|
|
||||||
|
if (rest_type == REST_TYPE_NO)
|
||||||
|
{
|
||||||
|
RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING);
|
||||||
|
|
||||||
|
// Set player to FFA PVP when not in rested environment.
|
||||||
|
if(sWorld.IsFFAPvPRealm())
|
||||||
|
SetFFAPvP(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING);
|
||||||
|
|
||||||
|
inn_trigger_id = areaTriggerId;
|
||||||
|
time_inn_enter = time(NULL);
|
||||||
|
|
||||||
|
if(sWorld.IsFFAPvPRealm())
|
||||||
|
SetFFAPvP(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1103,25 +1103,11 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
|
|
||||||
void setDeathState(DeathState s); // overwrite Unit::setDeathState
|
void setDeathState(DeathState s); // overwrite Unit::setDeathState
|
||||||
|
|
||||||
void InnEnter (time_t time, uint32 mapid, float x, float y, float z)
|
|
||||||
{
|
|
||||||
inn_pos_mapid = mapid;
|
|
||||||
inn_pos_x = x;
|
|
||||||
inn_pos_y = y;
|
|
||||||
inn_pos_z = z;
|
|
||||||
time_inn_enter = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
float GetRestBonus() const { return m_rest_bonus; }
|
float GetRestBonus() const { return m_rest_bonus; }
|
||||||
void SetRestBonus(float rest_bonus_new);
|
void SetRestBonus(float rest_bonus_new);
|
||||||
|
|
||||||
RestType GetRestType() const { return rest_type; }
|
RestType GetRestType() const { return rest_type; }
|
||||||
void SetRestType(RestType n_r_type) { rest_type = n_r_type; }
|
void SetRestType(RestType n_r_type, uint32 areaTriggerId = 0);
|
||||||
|
|
||||||
uint32 GetInnPosMapId() const { return inn_pos_mapid; }
|
|
||||||
float GetInnPosX() const { return inn_pos_x; }
|
|
||||||
float GetInnPosY() const { return inn_pos_y; }
|
|
||||||
float GetInnPosZ() const { return inn_pos_z; }
|
|
||||||
|
|
||||||
time_t GetTimeInnEnter() const { return time_inn_enter; }
|
time_t GetTimeInnEnter() const { return time_inn_enter; }
|
||||||
void UpdateInnerTime (time_t time) { time_inn_enter = time; }
|
void UpdateInnerTime (time_t time) { time_inn_enter = time; }
|
||||||
|
|
@ -2476,10 +2462,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
|
|
||||||
////////////////////Rest System/////////////////////
|
////////////////////Rest System/////////////////////
|
||||||
time_t time_inn_enter;
|
time_t time_inn_enter;
|
||||||
uint32 inn_pos_mapid;
|
uint32 inn_trigger_id;
|
||||||
float inn_pos_x;
|
|
||||||
float inn_pos_y;
|
|
||||||
float inn_pos_z;
|
|
||||||
float m_rest_bonus;
|
float m_rest_bonus;
|
||||||
RestType rest_type;
|
RestType rest_type;
|
||||||
////////////////////Rest System/////////////////////
|
////////////////////Rest System/////////////////////
|
||||||
|
|
|
||||||
|
|
@ -1249,7 +1249,7 @@ void Aura::SendAuraUpdate(bool remove)
|
||||||
|
|
||||||
if(!(auraFlags & AFLAG_NOT_CASTER))
|
if(!(auraFlags & AFLAG_NOT_CASTER))
|
||||||
{
|
{
|
||||||
data << uint8(0); // pguid
|
data.appendPackGUID(GetCasterGUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(auraFlags & AFLAG_DURATION)
|
if(auraFlags & AFLAG_DURATION)
|
||||||
|
|
|
||||||
|
|
@ -3379,6 +3379,7 @@ void Spell::EffectEnergize(SpellEffectIndex eff_idx)
|
||||||
case 31930: // Judgements of the Wise
|
case 31930: // Judgements of the Wise
|
||||||
case 48542: // Revitalize (mana restore case)
|
case 48542: // Revitalize (mana restore case)
|
||||||
case 63375: // Improved Stormstrike
|
case 63375: // Improved Stormstrike
|
||||||
|
case 68082: // Glyph of Seal of Command
|
||||||
damage = damage * unitTarget->GetCreateMana() / 100;
|
damage = damage * unitTarget->GetCreateMana() / 100;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
@ -3863,6 +3864,7 @@ void Spell::DoSummon(SpellEffectIndex eff_idx)
|
||||||
m_caster->GetClosePoint(x, y, z, spawnCreature->GetObjectSize());
|
m_caster->GetClosePoint(x, y, z, spawnCreature->GetObjectSize());
|
||||||
|
|
||||||
spawnCreature->Relocate(x, y, z, -m_caster->GetOrientation());
|
spawnCreature->Relocate(x, y, z, -m_caster->GetOrientation());
|
||||||
|
spawnCreature->SetSummonPoint(x, y, z, -m_caster->GetOrientation());
|
||||||
|
|
||||||
if (!spawnCreature->IsPositionValid())
|
if (!spawnCreature->IsPositionValid())
|
||||||
{
|
{
|
||||||
|
|
@ -4280,6 +4282,7 @@ void Spell::DoSummonGuardian(SpellEffectIndex eff_idx, uint32 forceFaction)
|
||||||
m_caster->GetClosePoint(px, py, pz,spawnCreature->GetObjectSize());
|
m_caster->GetClosePoint(px, py, pz,spawnCreature->GetObjectSize());
|
||||||
|
|
||||||
spawnCreature->Relocate(px, py, pz, m_caster->GetOrientation());
|
spawnCreature->Relocate(px, py, pz, m_caster->GetOrientation());
|
||||||
|
spawnCreature->SetSummonPoint(px, py, pz, m_caster->GetOrientation());
|
||||||
|
|
||||||
if (!spawnCreature->IsPositionValid())
|
if (!spawnCreature->IsPositionValid())
|
||||||
{
|
{
|
||||||
|
|
@ -6372,6 +6375,7 @@ void Spell::DoSummonTotem(SpellEffectIndex eff_idx, uint8 slot_dbc)
|
||||||
z = m_caster->GetPositionZ();
|
z = m_caster->GetPositionZ();
|
||||||
|
|
||||||
pTotem->Relocate(x, y, z, m_caster->GetOrientation());
|
pTotem->Relocate(x, y, z, m_caster->GetOrientation());
|
||||||
|
pTotem->SetSummonPoint(x, y, z, m_caster->GetOrientation());
|
||||||
|
|
||||||
if (slot < MAX_TOTEM_SLOT)
|
if (slot < MAX_TOTEM_SLOT)
|
||||||
m_caster->_AddTotem(TotemSlot(slot),pTotem);
|
m_caster->_AddTotem(TotemSlot(slot),pTotem);
|
||||||
|
|
@ -6876,6 +6880,7 @@ void Spell::DoSummonCritter(SpellEffectIndex eff_idx, uint32 forceFaction)
|
||||||
m_caster->GetClosePoint(x, y, z, critter->GetObjectSize());
|
m_caster->GetClosePoint(x, y, z, critter->GetObjectSize());
|
||||||
|
|
||||||
critter->Relocate(x, y, z, m_caster->GetOrientation());
|
critter->Relocate(x, y, z, m_caster->GetOrientation());
|
||||||
|
critter->SetSummonPoint(x, y, z, m_caster->GetOrientation());
|
||||||
|
|
||||||
if(!critter->IsPositionValid())
|
if(!critter->IsPositionValid())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -50,12 +50,13 @@
|
||||||
#include "MovementGenerator.h"
|
#include "MovementGenerator.h"
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <varargs.h>
|
||||||
|
|
||||||
float baseMoveSpeed[MAX_MOVE_TYPE] =
|
float baseMoveSpeed[MAX_MOVE_TYPE] =
|
||||||
{
|
{
|
||||||
2.5f, // MOVE_WALK
|
2.5f, // MOVE_WALK
|
||||||
7.0f, // MOVE_RUN
|
7.0f, // MOVE_RUN
|
||||||
1.25f, // MOVE_RUN_BACK
|
2.5f, // MOVE_RUN_BACK
|
||||||
4.722222f, // MOVE_SWIM
|
4.722222f, // MOVE_SWIM
|
||||||
4.5f, // MOVE_SWIM_BACK
|
4.5f, // MOVE_SWIM_BACK
|
||||||
3.141594f, // MOVE_TURN_RATE
|
3.141594f, // MOVE_TURN_RATE
|
||||||
|
|
@ -343,8 +344,12 @@ bool Unit::haveOffhandWeapon() const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, SplineType type, SplineFlags flags, uint32 Time, Player* player)
|
void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, SplineType type, SplineFlags flags, uint32 Time, Player* player, ...)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
va_list vargs;
|
||||||
|
va_start(vargs,player);
|
||||||
|
|
||||||
float moveTime = (float)Time;
|
float moveTime = (float)Time;
|
||||||
|
|
||||||
WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) );
|
WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) );
|
||||||
|
|
@ -359,30 +364,36 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, SplineTy
|
||||||
case SPLINETYPE_NORMAL: // normal packet
|
case SPLINETYPE_NORMAL: // normal packet
|
||||||
break;
|
break;
|
||||||
case SPLINETYPE_STOP: // stop packet (raw pos?)
|
case SPLINETYPE_STOP: // stop packet (raw pos?)
|
||||||
|
va_end(vargs);
|
||||||
SendMessageToSet( &data, true );
|
SendMessageToSet( &data, true );
|
||||||
return;
|
return;
|
||||||
case SPLINETYPE_FACINGSPOT: // facing spot, not used currently
|
case SPLINETYPE_FACINGSPOT: // facing spot, not used currently
|
||||||
data << float(0);
|
{
|
||||||
data << float(0);
|
data << float(va_arg(vargs,float));
|
||||||
data << float(0);
|
data << float(va_arg(vargs,float));
|
||||||
|
data << float(va_arg(vargs,float));
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case SPLINETYPE_FACINGTARGET:
|
case SPLINETYPE_FACINGTARGET:
|
||||||
data << uint64(m_InteractionObject); // set in SetFacingToObject()
|
data << uint64(va_arg(vargs,uint64));
|
||||||
break;
|
break;
|
||||||
case SPLINETYPE_FACINGANGLE: // not used currently
|
case SPLINETYPE_FACINGANGLE: // not used currently
|
||||||
data << float(0); // facing angle
|
data << float(va_arg(vargs,float)); // facing angle
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
data << uint32(flags);
|
data << uint32(flags);
|
||||||
|
|
||||||
if(flags & SPLINEFLAG_WALKMODE)
|
// enable me if things goes wrong or looks ugly, it is however an old hack
|
||||||
moveTime *= 1.05f;
|
// if(flags & SPLINEFLAG_WALKMODE)
|
||||||
|
// moveTime *= 1.05f;
|
||||||
|
|
||||||
data << uint32(moveTime); // Time in between points
|
data << uint32(moveTime); // Time in between points
|
||||||
data << uint32(1); // 1 single waypoint
|
data << uint32(1); // 1 single waypoint
|
||||||
data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
|
data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
|
||||||
|
|
||||||
|
va_end(vargs);
|
||||||
|
|
||||||
if(player)
|
if(player)
|
||||||
player->GetSession()->SendPacket(&data);
|
player->GetSession()->SendPacket(&data);
|
||||||
else
|
else
|
||||||
|
|
@ -3514,12 +3525,10 @@ void Unit::SetFacingToObject(WorldObject* pObject)
|
||||||
if (!IsStopped())
|
if (!IsStopped())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_InteractionObject = pObject->GetGUID();
|
|
||||||
|
|
||||||
// TODO: figure out under what conditions creature will move towards object instead of facing it where it currently is.
|
// TODO: figure out under what conditions creature will move towards object instead of facing it where it currently is.
|
||||||
|
|
||||||
SetOrientation(GetAngle(pObject));
|
SetOrientation(GetAngle(pObject));
|
||||||
SendMonsterMove(GetPositionX(), GetPositionY(), GetPositionZ(), SPLINETYPE_FACINGTARGET, ((Creature*)this)->GetSplineFlags(), 0);
|
SendMonsterMove(GetPositionX(), GetPositionY(), GetPositionZ(), SPLINETYPE_FACINGTARGET, ((Creature*)this)->GetSplineFlags(), 0, NULL, pObject->GetGUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Unit::isInAccessablePlaceFor(Creature const* c) const
|
bool Unit::isInAccessablePlaceFor(Creature const* c) const
|
||||||
|
|
@ -10288,6 +10297,7 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy)
|
||||||
|
|
||||||
if (creatureNotInCombat)
|
if (creatureNotInCombat)
|
||||||
{
|
{
|
||||||
|
// should probably be removed for the attacked (+ it's party/group) only, not global
|
||||||
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
||||||
|
|
||||||
if (((Creature*)this)->AI())
|
if (((Creature*)this)->AI())
|
||||||
|
|
@ -11188,8 +11198,10 @@ bool Unit::SelectHostileTarget()
|
||||||
if (target)
|
if (target)
|
||||||
{
|
{
|
||||||
if (!hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_DIED))
|
if (!hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_DIED))
|
||||||
|
{
|
||||||
SetInFront(target);
|
SetInFront(target);
|
||||||
((Creature*)this)->AI()->AttackStart(target);
|
((Creature*)this)->AI()->AttackStart(target);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -545,8 +545,8 @@ enum UnitFlags
|
||||||
UNIT_FLAG_PREPARATION = 0x00000020, // don't take reagents for spells with SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP
|
UNIT_FLAG_PREPARATION = 0x00000020, // don't take reagents for spells with SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP
|
||||||
UNIT_FLAG_UNK_6 = 0x00000040,
|
UNIT_FLAG_UNK_6 = 0x00000040,
|
||||||
UNIT_FLAG_NOT_ATTACKABLE_1 = 0x00000080, // ?? (UNIT_FLAG_PVP_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1) is NON_PVP_ATTACKABLE
|
UNIT_FLAG_NOT_ATTACKABLE_1 = 0x00000080, // ?? (UNIT_FLAG_PVP_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1) is NON_PVP_ATTACKABLE
|
||||||
UNIT_FLAG_OOC_NOT_ATTACKABLE = 0x00000100, // 2.0.8 - (OOC Out Of Combat) Can not be attacked when not in combat. Removed if unit for some reason enter combat.
|
UNIT_FLAG_OOC_NOT_ATTACKABLE = 0x00000100, // 2.0.8 - (OOC Out Of Combat) Can not be attacked when not in combat. Removed if unit for some reason enter combat (flag probably removed for the attacked and it's party/group only)
|
||||||
UNIT_FLAG_UNK_9 = 0x00000200, // 3.0.3 - makes you unable to attack everything
|
UNIT_FLAG_PASSIVE = 0x00000200, // 3.0.3 - makes you unable to attack everything. Almost identical to our "civilian"-term. Will ignore it's surroundings and not engage in combat unless "called upon" or engaged by another unit.
|
||||||
UNIT_FLAG_LOOTING = 0x00000400, // loot animation
|
UNIT_FLAG_LOOTING = 0x00000400, // loot animation
|
||||||
UNIT_FLAG_PET_IN_COMBAT = 0x00000800, // in combat?, 2.0.8
|
UNIT_FLAG_PET_IN_COMBAT = 0x00000800, // in combat?, 2.0.8
|
||||||
UNIT_FLAG_PVP = 0x00001000, // changed in 3.0.3
|
UNIT_FLAG_PVP = 0x00001000, // changed in 3.0.3
|
||||||
|
|
@ -1342,6 +1342,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
void RemoveSpellbyDamageTaken(AuraType auraType, uint32 damage);
|
void RemoveSpellbyDamageTaken(AuraType auraType, uint32 damage);
|
||||||
|
|
||||||
bool isTargetableForAttack(bool inversAlive = false) const;
|
bool isTargetableForAttack(bool inversAlive = false) const;
|
||||||
|
bool isPassiveToHostile() { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE); }
|
||||||
|
|
||||||
virtual bool IsInWater() const;
|
virtual bool IsInWater() const;
|
||||||
virtual bool IsUnderWater() const;
|
virtual bool IsUnderWater() const;
|
||||||
bool isInAccessablePlaceFor(Creature const* c) const;
|
bool isInAccessablePlaceFor(Creature const* c) const;
|
||||||
|
|
@ -1374,7 +1376,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
void MonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime = 0);
|
void MonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime = 0);
|
||||||
|
|
||||||
// recommend use MonsterMove/MonsterMoveWithSpeed for most case that correctly work with movegens
|
// recommend use MonsterMove/MonsterMoveWithSpeed for most case that correctly work with movegens
|
||||||
void SendMonsterMove(float x, float y, float z, SplineType type, SplineFlags flags, uint32 Time, Player* player = NULL);
|
void SendMonsterMove(float x, float y, float z, SplineType type, SplineFlags flags, uint32 Time, Player* player = NULL, ...);
|
||||||
void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, SplineFlags flags);
|
void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, SplineFlags flags);
|
||||||
void SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime = 0, Player* player = NULL);
|
void SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime = 0, Player* player = NULL);
|
||||||
|
|
||||||
|
|
@ -1850,8 +1852,6 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
uint32 m_regenTimer;
|
uint32 m_regenTimer;
|
||||||
uint32 m_lastManaUseTimer;
|
uint32 m_lastManaUseTimer;
|
||||||
|
|
||||||
uint64 m_InteractionObject;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void CleanupDeletedAuras();
|
void CleanupDeletedAuras();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,8 @@ void MaNGOSsoapRunnable::run()
|
||||||
struct soap soap;
|
struct soap soap;
|
||||||
int m, s;
|
int m, s;
|
||||||
soap_init(&soap);
|
soap_init(&soap);
|
||||||
|
soap_set_imode(&soap, SOAP_C_UTFSTRING);
|
||||||
|
soap_set_omode(&soap, SOAP_C_UTFSTRING);
|
||||||
m = soap_bind(&soap, m_host.c_str(), m_port, 100);
|
m = soap_bind(&soap, m_host.c_str(), m_port, 100);
|
||||||
|
|
||||||
// check every 3 seconds if world ended
|
// check every 3 seconds if world ended
|
||||||
|
|
|
||||||
|
|
@ -25,8 +25,8 @@ extern DatabasePostgre WorldDatabase;
|
||||||
extern DatabaseMysql WorldDatabase;
|
extern DatabaseMysql WorldDatabase;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char CreatureInfosrcfmt[]="iiiiiiiiiisssiiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiiffliiiiiiiliiis";
|
const char CreatureInfosrcfmt[]="iiiiiiiiiisssiiiiiiiiiiifffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiiffliiiiiiiliiis";
|
||||||
const char CreatureInfodstfmt[]="iiiiiiiiiisssiiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiiffliiiiiiiliiii";
|
const char CreatureInfodstfmt[]="iiiiiiiiiisssiiiiiiiiiiifffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiiffliiiiiiiliiii";
|
||||||
const char CreatureDataAddonInfofmt[]="iiiiiis";
|
const char CreatureDataAddonInfofmt[]="iiiiiis";
|
||||||
const char CreatureModelfmt[]="iffbi";
|
const char CreatureModelfmt[]="iffbi";
|
||||||
const char CreatureInfoAddonInfofmt[]="iiiiiis";
|
const char CreatureInfoAddonInfofmt[]="iiiiiis";
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "9585"
|
#define REVISION_NR "9612"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef __REVISION_SQL_H__
|
#ifndef __REVISION_SQL_H__
|
||||||
#define __REVISION_SQL_H__
|
#define __REVISION_SQL_H__
|
||||||
#define REVISION_DB_CHARACTERS "required_9375_01_characters_character_glyphs"
|
#define REVISION_DB_CHARACTERS "required_9611_01_characters"
|
||||||
#define REVISION_DB_MANGOS "required_9539_01_mangos_spell_bonus_data"
|
#define REVISION_DB_MANGOS "required_9590_01_mangos_db_script_string"
|
||||||
#define REVISION_DB_REALMD "required_9010_01_realmd_realmlist"
|
#define REVISION_DB_REALMD "required_9010_01_realmd_realmlist"
|
||||||
#endif // __REVISION_SQL_H__
|
#endif // __REVISION_SQL_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue