Phase definitions

Материал из Uwow
Перейти к навигации Перейти к поиску

Поля в базе

zoneId

Поле зоны, в которой используется фазовые данные.

entry

Грубо говоря ид конкретного темплета фазы, с которым мы работаем. 1.2.3.4.5...

phasemask

Хардкод. Это форсированное присвоение фазовой маски цели. Маска фаз перестала использоваться еще на катаклизме на офе.

phaseId

Новая Blizz-like система определения фазирования. Грубо-говоря у одного моба есть фаз ид, и у игрока есть этот ид, значит игрок его видит. Сложность в работе в шаманстве. Т.к. у игрока по снифам пачка фазИдов и определить какой приходится разными ухищрениями (смотреть после каких событий добавилась фаза, какие мобы появились после это фазы, какие пропали после удаления фазы или самое сложное танцевание с бубном - отгадывать что в квесте должно появиться).

Пакет в снифах необходимый для работы: SMSG_PHASE_SHIFT_CHANGE

Примечание: после добавления квеста фазы не всегда обновляются т.к. в месте где мы берем квест не всегда меняется все (у близов квест флаги есть, которые показываю когда можно обновлять квест) :( так что порой, об обновлении, мы видем при смене области только.

PreloadMapID

Теран-фаза. Фазирование местности. Фактически, это ид карты из map.dbc в которую конкретная местность превращается в игре. На гилнеасе фазирование это затапливало постепенно город. Несколько фаз могут накладываться - одна топит половину города, 2-я еще дальше.

VisibleMapID

Толком оно ничего не делает умного. Но есть подозрение, что этот параметр влияет на миникарту и на определение областей клиентом.

flags

64 - Персональная фаза. Игроки не будут видеть в ней друг друга.

128 - Флаг для фазы, которая не будет автообновляться при выполнении условий ее наложения. Работает вместе со смарт экшеном 244 или функцией SetUpdateNonAutomaticPhasesTimer() в ядре. Устанавливается таймер до какого момента фаза не применится к игроку. По истечению таймреа произойдет автоматический рекалькулейт фаз. Выставляете какой нибудь таймер и в момент когда нужно обновить фазы, еще раз вызываете функцию/смарт с 0 таймером.

comment

Как работать с phaseId

phaseId это фазы которые игрок может видеть. Т.е. если у игрока фаза А а у моба фаза Б то игрок и моб друг друга не будут видеть. Однако если у игрока будет фаза А Б, а у моба Б то они друг друга увидят. В отличие от маски тут безграничное количество слоев, что позволяет издеваться над игрок как только пожелаете.

Важно! Если у одного обьекта фаз нет - а у другого есть - обьекты будут видеть друг друга. По этой самой причине заселение с фазами видимо для других игроков, НО!!! Если вы начнете использовать фазы - вы должны всю зону к которой вы подключили фазу рассчитывать правильно. НО! Есть хитрость, которую можно использовать для упращения работы.

К примеру, у нас есть зона, в которой мобы с фазами 5344 5595 5463 5305 5837 5324 5310 5116 5115 5114 5095 5094 5658 4881 5464 5461 4932 4931 4927 4925 5462 5161 5056 4883 6303 5534 5533 5381 5357 5160 4884 5203 5120 5117 5113 5343 5084 5077 для каждого моба фазы эти разные но в целом в этой зоне вся заселенка с этими фазами. И что бы игрок стал видеть всех этих мобов с разными идами - мы просто создаем один фаз дифинишн в котором это все будет. Вот как тут

REPLACE INTO `phase_definitions` (`zoneId`, `entry`, `phasemask`, `phaseId`, `PreloadMapID`, `VisibleMapID`, `flags`, `comment`) VALUES
('7705', '1', '0', '5344 5595 5463 5305 5837 5324 5310 5116 5115 5114 5095 5094 5658 4881 5464 5461 4932 4931 4927 4925 5462 5161 5056 4883 6303 5534 5533 5381 5357 5160 4884 5203 5120 5117 5113 5343 5084 5077', '0', '0', '16', 'Legion. Global'),

это фаза глобальная и будет всегда у игрока и игрок сможет увидеть любой обьект у которого будет эта фаза, которую мы указали. (порой сложно собрать все фазы из зоны и я просто добавляю в этот список мобов, которые видимы только в ГМ режиме, просто смотрю моба в базе какие у него фазы и сверяю с глобальным списком, если какой-то нет добавляю).

Важно! У каждого обьекта в мире на самом деле только 1 фаза, листинг который вы видите заселенки - это фазы которые были активны у игрока, когда он этого моба увидел. Работая со снифами наблюдая как моб себя вел можно понять после какого случая он пропадает. К примеру: после выполнения квеста пропал моб, и фазы SMSG_PHASE_SHIFT_CHANGE отличие от прошлой всего один фазовый ид - разумеется этот моб значит висит в этой фазе.

Далее.

Как нам управлять фазами, что бы они пропадали и появлялись.

К примеру, у нас после отключения фазы 5086 пропадает скала, что есть го с идом 245045. Значи у этого го 5086 и мы присваиваем этому го эту фазу

update gameobject set phaseId = '5086' WHERE id = 245045;

Но в глобальном списке что мы сделали 5344 5595 5463 5305 5837 5324 5310 5116 5115 5114 5095 5094 5658 4881 5464 5461 4932 4931 4927 4925 5462 5161 5056 4883 6303 5534 5533 5381 5357 5160 4884 5203 5120 5117 5113 5343 5084 5077 этой фазы нет и значит мы не увидим этого обьекта, пока мы не добавим его в нашу фазу дифинишн.

REPLACE INTO `phase_definitions` (`zoneId`, `entry`, `phasemask`, `phaseId`, `PreloadMapID`, `VisibleMapID`, `flags`, `comment`) VALUES('7705', '2', '0', '5086', '0', '0', '16', 'Legion. Global');

Теперь мы этот обьект будем видеть всегда, entry дифинишна 2 т.к. в прошлом случае мы сделали под энтри 1 глобальное перечисление всех фаз.

А теперь, самое важное кондишны. Конкретно эта фаза на игроке висит все время, пока он не возьмет квест 39495, причем эта фаза уже не появится когда этот квест будет выполнен или rewarded. поэтому мы используем ивент кондишны 14 - CONDITION_QUEST_NONE (http://wiki.uwow.biz/Conditions).

И создаем правило.

DELETE FROM `conditions` WHERE SourceTypeOrReferenceId = 23 AND SourceGroup = 7705;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(23, 7705, 2, 0, 0, 14, 0, 39495, 0, 0, 0, 0, '', 'Legion. is non 39495');

Все. SourceEntry это Entry фазовой дифинишны. SourceGroup - зона, SourceTypeOrReferenceId - 23 фазовые дифинишны..

Теперь фаза 2 будет в зоне 7705 у всех игроков и они будут видеть обьект 245045 пока игрок не возьмет квест 39495 и скала пропадет.