Changeset 53 for trunk/src/game
- Timestamp:
- 11/19/08 13:29:34 (17 years ago)
- Location:
- trunk/src/game
- Files:
-
- 3 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/game/SharedDefines.h
r44 r53 774 774 { 775 775 TARGET_SELF = 1, 776 //TARGET_UNIT_CASTER 776 777 TARGET_RANDOM_ENEMY_CHAIN_IN_AREA = 2, // only one spell has that, but regardless, it's a target type after all 778 //TARGET_UNIT_NEARBY_ENEMY 779 TARGET_UNIT_SINGLE_UNKNOWN = 3, 780 TARGET_UNIT_NEARBY_ALLY = 4, 777 781 TARGET_PET = 5, 782 //TARGET_UNIT_PET 778 783 TARGET_CHAIN_DAMAGE = 6, 784 //TARGET_UNIT_TARGET_ENEMY 785 TARGET_UNIT_AREA_ENTRY = 7, 779 786 TARGET_AREAEFFECT_CUSTOM = 8, 787 //TARGET_UNIT_AREA_ENTRY_GROUND 780 788 TARGET_INNKEEPER_COORDINATES = 9, // uses in teleport to innkeeper spells 789 //TARGET_DEST_HOME 790 TARGET_UNIT_TARGET_DEST_CASTER = 11, // teleport target to caster 781 791 TARGET_ALL_ENEMY_IN_AREA = 15, 792 //TARGET_UNIT_AREA_ENEMY 782 793 TARGET_ALL_ENEMY_IN_AREA_INSTANT = 16, 794 //TARGET_UNIT_AREA_ENEMY_GROUND 783 795 TARGET_TABLE_X_Y_Z_COORDINATES = 17, // uses in teleport spells and some other 796 //TARGET_DEST_TABLE 784 797 TARGET_EFFECT_SELECT = 18, // highly depends on the spell effect 798 //TARGET_DEST_CASTER_GROUND 785 799 TARGET_ALL_PARTY_AROUND_CASTER = 20, 800 //TARGET_UNIT_PARTY_CASTER 786 801 TARGET_SINGLE_FRIEND = 21, 802 //TARGET_UNIT_TARGET_ALLY 787 803 TARGET_ALL_AROUND_CASTER = 22, // used only in TargetA, target selection dependent from TargetB 804 //TARGET_DEST_CASTER 788 805 TARGET_GAMEOBJECT = 23, 806 //TARGET_OBJECT_OPEN 789 807 TARGET_IN_FRONT_OF_CASTER = 24, 808 //TARGET_UNIT_CONE_ENEMY 790 809 TARGET_DUELVSPLAYER = 25, 810 //TARGET_UNIT_SINGLE 791 811 TARGET_GAMEOBJECT_ITEM = 26, 812 //TARGET_OBJECT_ITEM_PICKLOCK 792 813 TARGET_MASTER = 27, 814 //TARGET_UNIT_MASTER 793 815 TARGET_ALL_ENEMY_IN_AREA_CHANNELED = 28, 816 //TARGET_UNIT_AREA_ENEMY_CHANNEL 817 TARGET_UNIT_AREA_ALLY_CHANNEL = 29, // 28,29 only used for effect 27, if interrupt channel, pstAA cancel 794 818 TARGET_ALL_FRIENDLY_UNITS_AROUND_CASTER = 30, // in TargetB used only with TARGET_ALL_AROUND_CASTER and in self casting range in TargetA 819 //TARGET_UNIT_AREA_ALLY 795 820 TARGET_ALL_FRIENDLY_UNITS_IN_AREA = 31, 821 //TARGET_UNIT_AREA_ALLY_GROUND 796 822 TARGET_MINION = 32, 823 //TARGET_DEST_SUMMON 797 824 TARGET_ALL_PARTY = 33, 825 //TARGET_UNIT_AREA_PARTY 798 826 TARGET_ALL_PARTY_AROUND_CASTER_2 = 34, // used in Tranquility 827 //TARGET_UNIT_AREA_PARTY_GROUND 799 828 TARGET_SINGLE_PARTY = 35, 829 //TARGET_UNIT_TARGET_PARTY 830 TARGET_DEST_CASTER_RANDOM_UNKNOWN = 36, //unknown 800 831 TARGET_AREAEFFECT_PARTY = 37, 832 //TARGET_UNIT_PARTY_TARGET 801 833 TARGET_SCRIPT = 38, 834 //TARGET_UNIT_NEARBY_ENTRY 802 835 TARGET_SELF_FISHING = 39, 803 TARGET_TOTEM_EARTH = 41, 804 TARGET_TOTEM_WATER = 42, 805 TARGET_TOTEM_AIR = 43, 806 TARGET_TOTEM_FIRE = 44, 836 //TARGET_UNIT_CASTER_FISHING 837 TARGET_OBJECT_USE = 40, 838 TARGET_DEST_CASTER_FRONT_LEFT = 41, //earth totem 839 TARGET_DEST_CASTER_BACK_LEFT = 42, //water totem 840 TARGET_DEST_CASTER_BACK_RIGHT = 43, //air totem 841 TARGET_DEST_CASTER_FRONT_RIGHT = 44, //fire totem 807 842 TARGET_CHAIN_HEAL = 45, 843 //TARGET_UNIT_CHAINHEAL 808 844 TARGET_SCRIPT_COORDINATES = 46, 809 TARGET_DYNAMIC_OBJECT = 47, 810 TARGET_SUMMON = 48, 845 //TARGET_DEST_TABLE_UNKNOWN 846 TARGET_DEST_CASTER_FRONT = 47, 847 TARGET_DEST_CASTER_BACK = 48, 848 TARGET_DEST_CASTER_RIGHT = 49, 849 TARGET_DEST_CASTER_LEFT = 50, 850 TARGET_OBJECT_AREA = 51, 811 851 TARGET_AREAEFFECT_CUSTOM_2 = 52, 852 //TARGET_DUMMY 812 853 TARGET_CURRENT_ENEMY_COORDINATES = 53, // set unit coordinates as dest, only 16 target B imlemented 854 //TARGET_DEST_TARGET_ENEMY 855 TARGET_UNIT_CONE_ENEMY_UNKNOWN = 54, 856 TARGET_DEST_CASTER_FRONT_LEAP = 55, // for a leap spell 813 857 TARGET_RANDOM_RAID_MEMBER = 56, 858 //TARGET_UNIT_AREA_RAID 814 859 TARGET_SINGLE_FRIEND_2 = 57, 860 //TARGET_UNIT_TARGET_RAID 861 TARGET_UNIT_CONE_ALLY = 59, 862 TARGET_UNIT_AREA_SCRIPT = 60, 815 863 TARGET_AREAEFFECT_PARTY_AND_CLASS = 61, 864 //TARGET_UNIT_CLASS_TARGET 865 TARGET_TEST = 62, // for a test spell 816 866 TARGET_DUELVSPLAYER_COORDINATES = 63, 817 TARGET_BEHIND_VICTIM = 65, // uses in teleport behind spells 867 //TARGET_DEST_TARGET_ENEMY_UNKNOWN 868 TARGET_DEST_TARGET_FRONT = 64, 869 TARGET_DEST_TARGET_BACK = 65, // uses in teleport behind spells 870 TARGET_DEST_TARGET_RIGHT = 66, 871 TARGET_DEST_TARGET_LEFT = 67, 872 TARGET_DEST_TARGET_ENEMY_UNKNOWN2 = 70, 873 TARGET_DEST_CASTER_RANDOM = 72, 874 TARGET_DEST_CASTER_RADIUS = 73, 875 TARGET_DEST_TARGET_RANDOM = 74, 876 TARGET_DEST_TARGET_RADIUS = 75, 877 TARGET_DEST_CHANNEL = 76, 818 878 TARGET_SINGLE_ENEMY = 77, 879 //TARGET_UNIT_CHANNEL 880 TARGET_DEST_CASTER_FRONT_UNKNOWN = 78, 881 TARGET_DEST_TABLE_UNKNOWN2 = 80, 882 TARGET_DEST_DEST_RANDOM = 86, 819 883 TARGET_SELF2 = 87, 884 //TARGET_DEST_DEST 885 TARGET_UNIT_AREA_ALL_CHANNEL = 88, 820 886 TARGET_NONCOMBAT_PET = 90, 887 //TARGET_UNIT_MINIPET 821 888 }; 822 889 -
trunk/src/game/Spell.cpp
r44 r53 1184 1184 switch(cur) 1185 1185 { 1186 case TARGET_TOTEM_EARTH: 1187 case TARGET_TOTEM_WATER: 1188 case TARGET_TOTEM_AIR: 1189 case TARGET_TOTEM_FIRE: 1186 // destination around caster 1187 case TARGET_DEST_CASTER_FRONT_LEFT: 1188 case TARGET_DEST_CASTER_BACK_LEFT: 1189 case TARGET_DEST_CASTER_BACK_RIGHT: 1190 case TARGET_DEST_CASTER_FRONT_RIGHT: 1191 case TARGET_DEST_CASTER_FRONT: 1192 case TARGET_DEST_CASTER_BACK: 1193 case TARGET_DEST_CASTER_RIGHT: 1194 case TARGET_DEST_CASTER_LEFT: 1195 case TARGET_DEST_CASTER_RANDOM: 1196 case TARGET_DEST_CASTER_RADIUS: 1197 { 1198 float x, y, z, angle, dist; 1199 1200 if (m_spellInfo->EffectRadiusIndex[i]) 1201 dist = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i])); 1202 else 1203 dist = 3.0f;//do we need this? 1204 if (cur == TARGET_DEST_CASTER_RANDOM) 1205 dist *= rand_norm(); // This case we need to consider caster size 1206 else 1207 dist -= m_caster->GetObjectSize(); // Size is calculated in GetNearPoint(), but we do not need it 1208 //need a new function to remove this repeated work 1209 1210 switch(cur) 1211 { 1212 case TARGET_DEST_CASTER_FRONT_LEFT: angle = -M_PI/4; break; 1213 case TARGET_DEST_CASTER_BACK_LEFT: angle = -3*M_PI/4; break; 1214 case TARGET_DEST_CASTER_BACK_RIGHT: angle = 3*M_PI/4; break; 1215 case TARGET_DEST_CASTER_FRONT_RIGHT:angle = M_PI/4; break; 1216 case TARGET_DEST_CASTER_FRONT: angle = 0.0f; break; 1217 case TARGET_DEST_CASTER_BACK: angle = M_PI; break; 1218 case TARGET_DEST_CASTER_RIGHT: angle = M_PI/2; break; 1219 case TARGET_DEST_CASTER_LEFT: angle = -M_PI/2; break; 1220 default: angle = rand_norm()*2*M_PI; break; 1221 } 1222 1223 m_caster->GetClosePoint(x, y, z, 0, dist, angle); 1224 m_targets.setDestination(x, y, z); // do not know if has ground visual 1225 TagUnitMap.push_back(m_caster); // may remove this in the future, if unitmap is empty, push m_caster 1226 }break; 1227 1228 // destination around target 1229 case TARGET_DEST_TARGET_FRONT: 1230 case TARGET_DEST_TARGET_BACK: 1231 case TARGET_DEST_TARGET_RIGHT: 1232 case TARGET_DEST_TARGET_LEFT: 1233 case TARGET_DEST_TARGET_RANDOM: 1234 case TARGET_DEST_TARGET_RADIUS: 1235 { 1236 Unit *target = m_targets.getUnitTarget(); 1237 if(!target) 1238 { 1239 sLog.outError("SPELL: no unit target for spell ID %u\n", m_spellInfo->Id); 1240 break; 1241 } 1242 1243 float x, y, z, angle, dist; 1244 1245 if (m_spellInfo->EffectRadiusIndex[i]) 1246 dist = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i])); 1247 else 1248 dist = 3.0f;//do we need this? 1249 if (cur == TARGET_DEST_TARGET_RANDOM) 1250 dist *= rand_norm(); // This case we need to consider caster size 1251 else 1252 dist -= target->GetObjectSize(); // Size is calculated in GetNearPoint(), but we do not need it 1253 //need a new function to remove this repeated work 1254 1255 switch(cur) 1256 { 1257 case TARGET_DEST_TARGET_FRONT: angle = 0.0f; break; 1258 case TARGET_DEST_TARGET_BACK: angle = M_PI; break; 1259 case TARGET_DEST_TARGET_RIGHT: angle = M_PI/2; break; 1260 case TARGET_DEST_TARGET_LEFT: angle = -M_PI/2; break; 1261 default: angle = rand_norm()*2*M_PI; break; 1262 } 1263 1264 target->GetClosePoint(x, y, z, 0, dist, angle); 1265 m_targets.setDestination(x, y, z); // do not know if has ground visual 1266 TagUnitMap.push_back(m_caster); // may remove this in the future, if unitmap is empty, push m_caster 1267 }break; 1268 1269 // destination around destination 1270 case TARGET_DEST_DEST_RANDOM: 1271 { 1272 if(!(m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION)) 1273 { 1274 sLog.outError("SPELL: no destination for spell ID %u\n", m_spellInfo->Id); 1275 break; 1276 } 1277 float x, y, z, dist, px, py, pz; 1278 dist = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i])); 1279 x = m_targets.m_destX; 1280 y = m_targets.m_destY; 1281 z = m_targets.m_destZ; 1282 m_caster->GetRandomPoint(x, y, z, dist, px, py, pz); 1283 m_targets.setDestination(px, py, pz); 1284 TagUnitMap.push_back(m_caster); 1285 }break; 1286 case TARGET_SELF2: 1287 { 1288 TagUnitMap.push_back(m_caster); 1289 }break; 1290 1190 1291 case TARGET_SELF: 1191 case TARGET_SELF2:1192 case TARGET_DYNAMIC_OBJECT:1193 1292 case TARGET_AREAEFFECT_CUSTOM: 1194 1293 case TARGET_AREAEFFECT_CUSTOM_2: 1195 case TARGET_SUMMON:1196 1294 { 1197 1295 TagUnitMap.push_back(m_caster); … … 1865 1963 else 1866 1964 sLog.outError( "SPELL: unknown target coordinates for spell ID %u\n", m_spellInfo->Id ); 1867 }break;1868 case TARGET_BEHIND_VICTIM:1869 {1870 Unit *pTarget = m_caster->getVictim();1871 if(!pTarget && m_caster->GetTypeId() == TYPEID_PLAYER)1872 pTarget = ObjectAccessor::GetUnit(*m_caster, ((Player*)m_caster)->GetSelection());1873 1874 if(pTarget)1875 {1876 float _target_x, _target_y, _target_z;1877 pTarget->GetClosePoint(_target_x, _target_y, _target_z, m_caster->GetObjectSize(), CONTACT_DISTANCE, M_PI);1878 if(pTarget->IsWithinLOS(_target_x,_target_y,_target_z))1879 m_targets.setDestination(_target_x, _target_y, _target_z);1880 }1881 1965 }break; 1882 1966 default: -
trunk/src/game/SpellEffects.cpp
r44 r53 1920 1920 break; 1921 1921 } 1922 case TARGET_BEHIND_VICTIM:1923 {1924 // Get selected target for player (or victim for units)1925 Unit *pTarget = NULL;1926 if(m_caster->GetTypeId() == TYPEID_PLAYER)1927 pTarget = ObjectAccessor::GetUnit(*m_caster, ((Player*)m_caster)->GetSelection());1928 else1929 pTarget = m_caster->getVictim();1930 // No target present - return1931 if (!pTarget)1932 return;1933 // Init dest coordinates1934 uint32 mapid = m_caster->GetMapId();1935 float x = m_targets.m_destX;1936 float y = m_targets.m_destY;1937 float z = m_targets.m_destZ;1938 float orientation = pTarget->GetOrientation();1939 // Teleport1940 if(unitTarget->GetTypeId() == TYPEID_PLAYER)1941 ((Player*)unitTarget)->TeleportTo(mapid, x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET | (unitTarget==m_caster ? TELE_TO_SPELL : 0));1942 else1943 {1944 MapManager::Instance().GetMap(mapid, m_caster)->CreatureRelocation((Creature*)unitTarget, x, y, z, orientation);1945 WorldPacket data;1946 unitTarget->BuildTeleportAckMsg(&data, x, y, z, orientation);1947 unitTarget->SendMessageToSet(&data, false);1948 }1949 return;1950 }1951 1922 default: 1952 1923 {