Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Новичкам

Важная информация

Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.06.2011, 10:17   #1
BloodWarrior
Ученый
 
Аватар для BloodWarrior
 
Регистрация: 08.05.2010
Адрес: Новокузнецк
Сообщений: 141
Сказал(а) спасибо: 32
Поблагодарили 21 раз(а) в 9 сообщениях
BloodWarrior На верном пути
По умолчанию IsInRange для го MZero

Возникла необходимость в IsInRange функции для го
Решил глянуть, а как вообще можно бекпортнуть это дело.


Вроде работает и даже нормально.

Код:
+++ src/game/GameObject.cpp


----------------

    // spell target is user of GO
    SpellCastTargets targets;
    targets.setUnitTarget(user);

    spell->prepare(&targets);
}

+bool GameObject::IsInRange(float x, float y, float z, float radius) const
+{
+    GameObjectDisplayInfoEntry const *info = sGameObjectDisplayInfoStore.LookupEntry(GetUInt32Value(GAMEOBJECT_DISPLAYID));
+    if (!info)
+        return IsWithinDist3d(x, y, z, radius);
+
+    float dx = x - GetPositionX();
+    float dy = y - GetPositionY();
+    float dz = z - GetPositionZ();
+    float dist = sqrt(dx*dx + dy*dy);
+
+    if (dist <= CONTACT_DISTANCE)   // prevent division by 0
+        return true;
+
+    float sinA = sin(GetOrientation());
+    float cosA = cos(GetOrientation());
+    float sinB = dx / dist;
+    float cosB = dy / dist;
+
+    dx = dist * (cosA * cosB + sinA * sinB);
+    dy = dist * (cosA * sinB - sinA * cosB);
+
+    return true;
+}

// overwrite WorldObject function for proper name localization


+++ src/game/GameObject.h


----------------

        GridReference<GameObject> &GetGridRef() { return m_gridRef; }

+        bool IsInRange(float x, float y, float z, float radius) const;

    protected:


+++ src/game/GridNotifiers.h


----------------

            NearestCreatureEntryWithLiveStateInObjectRangeCheck(NearestCreatureEntryWithLiveStateInObjectRangeCheck const&);
    };

+    class GameObjectInRangeCheck
+    {
+        public:
+            GameObjectInRangeCheck(WorldObject const* _obj, float _x, float _y, float _z, float _range):
+              i_obj(_obj), x(_x), y(_y), z(_z), range(_range) {}
+
+            WorldObject const& GetFocusObject() const { return *i_obj; }
+
+            bool operator() (GameObject* go)
+            {
+        	if (go->IsWithinDist3d(x, y, z, range))
+		        return true;
+
+		return false;
+            }
+
+            float GetLastRange() const { return range; }
+        private:
+            WorldObject const* i_obj;
+            float x, y, z, range;
+
+            // prevent cloning this object
+            GameObjectInRangeCheck(GameObjectInRangeCheck const&);
+    };
+
    // Player checks and do
__________________
MZero - z1686 SDZero - z0354 - 17.05.2011

Последний раз редактировалось BloodWarrior; 10.06.2011 в 14:00.
BloodWarrior вне форума   Ответить с цитированием
Старый 10.06.2011, 14:00   #2
BloodWarrior
Ученый
 
Аватар для BloodWarrior
 
Регистрация: 08.05.2010
Адрес: Новокузнецк
Сообщений: 141
Сказал(а) спасибо: 32
Поблагодарили 21 раз(а) в 9 сообщениях
BloodWarrior На верном пути
По умолчанию

Ну вот вроде и работает.
__________________
MZero - z1686 SDZero - z0354 - 17.05.2011
BloodWarrior вне форума   Ответить с цитированием
Старый 10.06.2011, 14:19   #3
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

GO могут вращаться вокруг всех 3-х осей, а не только одной вертикальной.
zergtmn вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 23:59. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot