|
Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь |
|
Опции темы | Поиск в этой теме | Опции просмотра |
06.06.2011, 10:17 | #1 |
Ученый
Регистрация: 08.05.2010
Адрес: Новокузнецк
Сообщений: 141
Сказал(а) спасибо: 32
Поблагодарили 21 раз(а) в 9 сообщениях
|
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. |
10.06.2011, 14:00 | #2 |
Ученый
Регистрация: 08.05.2010
Адрес: Новокузнецк
Сообщений: 141
Сказал(а) спасибо: 32
Поблагодарили 21 раз(а) в 9 сообщениях
|
Ну вот вроде и работает.
__________________
MZero - z1686 SDZero - z0354 - 17.05.2011 |
10.06.2011, 14:19 | #3 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
GO могут вращаться вокруг всех 3-х осей, а не только одной вертикальной.
|
|
|