Code
void TeleportAndFly()
{
Map *pMap = me->GetMap();
Map::PlayerList const &PlayerList = pMap->GetPlayers();
if (PlayerList.isEmpty())
return;
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
Player* plr = i->getSource();
if (plr->isAlive())
{
plr->TeleportTo(plr->GetMap(), plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ()+50.0f, plr->GetOrientation());
plr->CastSpell(plr, SPELL_EYE_OFTHE_STORM, false);
}
}
}
Теперь разберем все:
Map *pMap = me->GetMap();
Класс (Map) с ссылкой на действующий элемент (pMap) и определение его. (me->GetMap())
Теперь у нас pMap означает карту, на которой в данный момент находится босс.
Map::PlayerList const &PlayerList = pMap->GetPlayers();
трудная для понимания новичков строка. Если кратко, то значит, мы вводим переменную с ссылкой на значения от мап и приравниваем ее к выбору игроков на карте.
Code
if (PlayerList.isEmpty())
return;
Это необходимая проверка. В противном случае будет краш сервера. Означает, что в случае, если ни одного игрока не найдено - возврат ф-ции.
Дальше объемная строка, но если ее разобрать, то она в полне простая
Code
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
начало цикла для игроков. итератор(переменная для подсчета) вводим тут же и приравниваем к первому же игроку, которого мы нашли через (pMap->GetPlayers()) и считаем игроков до тех пор, пока на карте не останется ни одного неподсчитанного
Code
Player* plr = i->getSource();
это для простоты. Можно и не использовать, но вместо последующих "plr" нужно будет писать везде "i->getSource();->"
- проверка на то, жив ли игрок. (если мертв, то в цикле идет сл. игрок)
Code
plr->TeleportTo(plr->GetMap(), plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ()+50.0f, plr->GetOrientation());
каждого игрока(plr->) насильно (т.е. нет больше никаких проверок, и, пусть игрок кастует или что-то еще делает - он все равно будет телепортирован) телепортируем игрока в следующие позиции:
plr->GetMap(), - в ту же карту, где находится игрок
plr->GetPositionX(), plr->GetPositionY(), - на те же позиции X и Y, что использует игрок(т.е. остается на месте, ни вправо, ни влево он не сместится)
plr->GetPositionZ()+50.0f к исходной высоте игрока добавляем значение и телепортируем его туда. (т.е. игрок очутиться на 50 ярдов выше, чем был)
plr->GetOrientation() - ориентация игрока. Не меняем.(поворот и "взгляд" камеры будет прежним)
plr->CastSpell(plr, SPELL_EYE_OFTHE_STORM, false);
заставляем игрока самого на себя кастануть спелл.
CastSpell(plr, SPELL_EYE_OFTHE_STORM, false);
-(цель, спелл, булевая переменная (true / false), означающая триггерность каста(с визуал - без визуального эффекта)