void Team::markRadiusSeenToTeams(Stuff::Vector3D& location, float radius, bool shrinkForNight) { if(radius < 0.0) radius = fireVisualRange; if(shrinkForNight) radius -= (radius * 0.25f); bool didTeam[MAX_TEAMS] = {false, false, false, false, false, false, false, false}; for(size_t i = 0; i < ObjectManager->getNumMovers(); i++) { MoverPtr mover = ObjectManager->getMover(i); if(mover->getTeam() && !didTeam[mover->getTeamId()] && !isFriendly(mover->getTeam())) { Stuff::Vector3D result; result.x = location.x - mover->getPosition().x; result.y = location.y - mover->getPosition().y; result.z = 0.0; float dist = result.GetLength() * metersPerWorldUnit; if(dist < maxVisualRange) { markRadiusSeen(location, radius); didTeam[mover->getTeamId()] = true; } } } }
void SupplyDrop::collide(Collisionable* target, float force) { P<SpaceShip> ship = P<Collisionable>(target); if (ship && isFriendly(ship)) { bool picked_up = false; P<PlayerSpaceship> player = ship; if (player) { player->energy_level += energy; picked_up = true; } for(int n=0; n<MW_Count; n++) { uint8_t delta = std::min(int(weapon_storage[n]), ship->weapon_storage_max[n] - ship->weapon_storage[n]); if (delta > 0) { ship->weapon_storage[n] += delta; weapon_storage[n] -= delta; picked_up = true; } } if (on_pickup_callback.isSet()) { on_pickup_callback.call(P<SupplyDrop>(this), player); picked_up = true; } if (picked_up) destroy(); } }
void SpaceStation::drawOnRadar(sf::RenderTarget& window, sf::Vector2f position, float scale, bool long_range) { sf::Sprite objectSprite; textureManager.setTexture(objectSprite, radar_trace); objectSprite.setPosition(position); float sprite_scale = scale * getRadius() * 1.5 / objectSprite.getTextureRect().width; if (!long_range) { sprite_scale *= 0.7; drawShieldsOnRadar(window, position, scale, sprite_scale, true); } sprite_scale = std::max(0.15f, sprite_scale); objectSprite.setScale(sprite_scale, sprite_scale); if (my_spaceship) { if (isEnemy(my_spaceship)) objectSprite.setColor(sf::Color::Red); if (isFriendly(my_spaceship)) objectSprite.setColor(sf::Color(128, 255, 128)); }else{ objectSprite.setColor(factionInfo[getFactionId()]->gm_color); } window.draw(objectSprite); }
bool survivesFire(eMonster m) { return isGhost(m) || m == moWitchWinter || m == moWitchGhost || m == moBomberbird || m == moTameBomberbird || m == moTameBomberbirdMoved || (isFriendly(m) && markOrb(itOrbWinter)) || isWorm(m) || m == moFireElemental || isDragon(m); }
QString Modification::accessModifierString() const { if (isPrivate()) return "private"; if (isProtected()) return "protected"; if (isPublic()) return "public"; if (isFriendly()) return "friendly"; return QString(); }
// forpc = true (for PC), false (for golems) bool isActiveEnemy(cell *w, eMonster forwho) { if(((forwho == moPlayer) ? realstuntime(w) : realstuntime(w) > 1)) return false; if(w->monst == moNone) return false; if(isFriendly(w)) return false; if(isInactiveEnemy(w, forwho)) return false; return true; }
void CastSpellOnRandomTarget(uint32 i, float mindist2cast, float maxdist2cast, int minhp2cast, int maxhp2cast) { if(!maxdist2cast) maxdist2cast = 100.0f; if(!maxhp2cast) maxhp2cast = 100; if(_unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->getNextTarget()) { std::vector<Unit*> TargetTable; /* From M4ksiu - Big THX to Capt who helped me with std stuff to make it simple and fully working <3 */ /* If anyone wants to use this function, then leave this note! */ for(set<Object*>::iterator itr = _unit->GetInRangeSetBegin(); itr != _unit->GetInRangeSetEnd(); ++itr) { if(((spells[i].targettype == TARGET_RANDOM_FRIEND && isFriendly(_unit, (*itr))) || (spells[i].targettype != TARGET_RANDOM_FRIEND && isHostile(_unit, (*itr)) && (*itr) != _unit)) && (*itr)->IsUnit()) // isAttackable(_unit, (*itr)) && { Unit* RandomTarget = NULL; RandomTarget = TO_UNIT(*itr); if(RandomTarget->isAlive() && _unit->GetDistance2dSq(RandomTarget) >= mindist2cast * mindist2cast && _unit->GetDistance2dSq(RandomTarget) <= maxdist2cast * maxdist2cast && ((RandomTarget->GetHealthPct() >= minhp2cast && RandomTarget->GetHealthPct() <= maxhp2cast && spells[i].targettype == TARGET_RANDOM_FRIEND) || (_unit->GetAIInterface()->getThreatByPtr(RandomTarget) > 0 && isHostile(_unit, RandomTarget)))) { TargetTable.push_back(RandomTarget); } } } if(_unit->GetHealthPct() >= minhp2cast && _unit->GetHealthPct() <= maxhp2cast && spells[i].targettype == TARGET_RANDOM_FRIEND) TargetTable.push_back(_unit); if(!TargetTable.size()) return; size_t RandTarget = rand() % TargetTable.size(); Unit* RTarget = TargetTable[RandTarget]; if(!RTarget) return; switch(spells[i].targettype) { case TARGET_RANDOM_FRIEND: case TARGET_RANDOM_SINGLE: _unit->CastSpell(RTarget, spells[i].info, spells[i].instant); break; case TARGET_RANDOM_DESTINATION: _unit->CastSpellAoF(RTarget->GetPositionX(), RTarget->GetPositionY(), RTarget->GetPositionZ(), spells[i].info, spells[i].instant); break; } if(i == 0) { _unit->GetAIInterface()->StopMovement(9000); _unit->setAttackTimer(9000, false); } TargetTable.clear(); } }
bool isFriendlyGhost(eMonster m) { return m == moFriendlyGhost || (markEmpathy(itOrbGhost) && isFriendly(m)); }
bool isInactiveEnemy(cell *w, eMonster forwho) { if(w->monst == moWormtail || w->monst == moWormwait || w->monst == moTentacletail || w->monst == moTentaclewait || w->monst == moHexSnakeTail) return true; if(w->monst == moLesserM || w->monst == moGreaterM) return true; if(w->monst == moIvyRoot || w->monst == moIvyWait || w->monst == moIvyNext || w->monst == moIvyDead) return true; if(w->monst && ((forwho == moPlayer) ? realstuntime(w) : realstuntime(w) > 1) && !isFriendly(w)) return true; return false; }
bool isFlying(eMonster m) { return isBird(m) || isGhost(m) || m == moAirElemental || isDragon(m) || (isFriendly(m) && checkOrb(m, itOrbGhost)); }
bool isGhostable(eMonster m) { return m && !isFriendly(m) && !isIvy(m) && !isMultitile(m) && !isMutantIvy(m); }
bool isFriendlyOrBug(cell *c) { // or killable discord! // do not attack the stunned Princess if(isPrincess(c->monst) && c->stuntime) return false; return isFriendly(c) || isBug(c) || (c->monst && markOrb(itOrbDiscord) && !c->stuntime); }
bool Spell::AddTarget(uint32 i, uint32 TargetType, Object* obj) { TargetsList* t = &m_targetUnits[i]; if(obj == NULL || !obj->IsInWorld()) return false; //GO target, not item if((TargetType & SPELL_TARGET_REQUIRE_GAMEOBJECT) && !(TargetType & SPELL_TARGET_REQUIRE_ITEM) && !obj->IsGameObject()) return false; //target go, not able to target go if(obj->IsGameObject() && !(TargetType & SPELL_TARGET_OBJECT_SCRIPTED) && !(TargetType & SPELL_TARGET_REQUIRE_GAMEOBJECT) && !m_triggeredSpell) return false; //target item, not able to target item if(obj->IsItem() && !(TargetType & SPELL_TARGET_REQUIRE_ITEM) && !m_triggeredSpell) return false; if(u_caster != NULL && u_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_9) && ((obj->IsPlayer() || obj->IsPet()) || (p_caster != NULL || m_caster->IsPet()))) return false; if(TargetType & SPELL_TARGET_REQUIRE_FRIENDLY && !isFriendly(m_caster, obj)) return false; if(TargetType & SPELL_TARGET_REQUIRE_ATTACKABLE && !isAttackable(m_caster, obj)) return false; if(TargetType & SPELL_TARGET_OBJECT_TARCLASS) { Object* originaltarget = m_caster->GetMapMgr()->_GetObject(m_targets.m_unitTarget); if(originaltarget == NULL || (originaltarget->IsPlayer() && obj->IsPlayer() && TO_PLAYER(originaltarget)->getClass() != TO_PLAYER(obj)->getClass()) || (originaltarget->IsPlayer() && !obj->IsPlayer()) || (!originaltarget->IsPlayer() && obj->IsPlayer())) return false; } if(TargetType & SPELL_TARGET_OBJECT_CURPET && !obj->IsPet()) return false; if(TargetType & (SPELL_TARGET_AREA | SPELL_TARGET_AREA_SELF | SPELL_TARGET_AREA_CURTARGET | SPELL_TARGET_AREA_CONE | SPELL_TARGET_AREA_PARTY | SPELL_TARGET_AREA_RAID) && ((obj->IsUnit() && !TO_UNIT(obj)->isAlive()) || (obj->IsCreature() && obj->IsTotem()))) return false; uint8 hitresult = TargetType & SPELL_TARGET_REQUIRE_ATTACKABLE && obj->IsUnit() ? DidHit(i, TO_UNIT(obj)) : SPELL_DID_HIT_SUCCESS; if(hitresult != SPELL_DID_HIT_SUCCESS) { uint8 extended = 0; if(hitresult == SPELL_DID_HIT_REFLECT && u_caster != NULL) { //for checks Unit* tmp = u_caster; u_caster = TO_UNIT(obj); extended = DidHit(i, tmp); u_caster = tmp; } ModeratedTargets.push_back(SpellTargetMod(obj->GetGUID(), hitresult)); return false; } else { //check target isnt already in for(TargetsList::iterator itr = m_targetUnits[i].begin(); itr != m_targetUnits[i].end(); ++itr) { if(obj->GetGUID() == *itr) return false; } t->push_back(obj->GetGUID()); } //final checks, require line of sight unless range/radius is 50000 yards SpellRange* r = dbcSpellRange.LookupEntry(m_spellInfo->rangeIndex); if(sWorld.Collision && r->maxRange < 50000 && GetRadius(i) < 50000 && !obj->IsItem()) { float x = m_caster->GetPositionX(), y = m_caster->GetPositionY(), z = m_caster->GetPositionZ() + 0.5f; //are we using a different location? if(TargetType & SPELL_TARGET_AREA) { x = m_targets.m_destX; y = m_targets.m_destY; z = m_targets.m_destZ; } else if(TargetType & SPELL_TARGET_AREA_CHAIN) { //TODO: Add support for this in arcemu /*Object* lasttarget = NULL; if (m_orderedObjects.size() > 0) { lasttarget = m_caster->GetMapMgr()->_GetObject(m_orderedObjects[m_orderedObjects.size() - 1]); if (lasttarget != NULL) { x = lasttarget->GetPositionX(); y = lasttarget->GetPositionY(); z = lasttarget->GetPositionZ(); } }*/ } if(!CollideInterface.CheckLOS(m_caster->GetMapId(), x, y, z + 2, obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ() + 2)) return false; } return true; }
bool Spell::AddTarget(uint32 i, uint32 TargetType, Object* obj) { if(obj == NULL || !obj->IsInWorld()) return false; //GO target, not item if((TargetType & SPELL_TARGET_REQUIRE_GAMEOBJECT) && !(TargetType & SPELL_TARGET_REQUIRE_ITEM) && !obj->IsGameObject()) return false; //target go, not able to target go if(obj->IsGameObject() && !(TargetType & SPELL_TARGET_OBJECT_SCRIPTED) && !(TargetType & SPELL_TARGET_REQUIRE_GAMEOBJECT) && !m_triggeredSpell) return false; //target item, not able to target item if(obj->IsItem() && !(TargetType & SPELL_TARGET_REQUIRE_ITEM) && !m_triggeredSpell) return false; if(u_caster != NULL && u_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_9) && ((obj->IsPlayer() || obj->IsPet()) || (p_caster != NULL || m_caster->IsPet()))) return false; if(TargetType & SPELL_TARGET_REQUIRE_FRIENDLY && !isFriendly(m_caster, obj)) return false; if(TargetType & SPELL_TARGET_REQUIRE_ATTACKABLE && !isAttackable(m_caster, obj)) return false; if(TargetType & SPELL_TARGET_OBJECT_TARCLASS) { Object* originaltarget = m_caster->GetMapMgr()->_GetObject(m_targets.m_unitTarget); if(originaltarget == NULL || (originaltarget->IsPlayer() && obj->IsPlayer() && TO_PLAYER(originaltarget)->getClass() != TO_PLAYER(obj)->getClass()) || (originaltarget->IsPlayer() && !obj->IsPlayer()) || (!originaltarget->IsPlayer() && obj->IsPlayer())) return false; } if(TargetType & SPELL_TARGET_OBJECT_CURPET && !obj->IsPet()) return false; if(TargetType & (SPELL_TARGET_AREA | SPELL_TARGET_AREA_SELF | SPELL_TARGET_AREA_CURTARGET | SPELL_TARGET_AREA_CONE | SPELL_TARGET_AREA_PARTY | SPELL_TARGET_AREA_RAID) && ((obj->IsUnit() && !TO_UNIT(obj)->isAlive()) || (obj->IsCreature() && obj->IsTotem()))) return false; if(TargetType & SPELL_TARGET_REQUIRE_ATTACKABLE && obj->IsUnit()) _AddTarget(TO_UNIT(obj), i); else _AddTargetForced(obj->GetGUID(), i); //final checks, require line of sight unless range/radius is 50000 yards SpellRange* r = dbcSpellRange.LookupEntry(m_spellInfo->rangeIndex); if(sWorld.Collision && r->maxRangeHostile < 50000 && GetRadius(i) < 50000 && !obj->IsItem()) { float x = m_caster->GetPositionX(), y = m_caster->GetPositionY(), z = m_caster->GetPositionZ() + 0.5f; //are we using a different location? if(TargetType & SPELL_TARGET_AREA) { x = m_targets.m_destX; y = m_targets.m_destY; z = m_targets.m_destZ; } else if(TargetType & SPELL_TARGET_AREA_CHAIN) { //TODO: Add support for this in arcemu /*Object* lasttarget = NULL; if (m_orderedObjects.size() > 0) { lasttarget = m_caster->GetMapMgr()->_GetObject(m_orderedObjects[m_orderedObjects.size() - 1]); if (lasttarget != NULL) { x = lasttarget->GetPositionX(); y = lasttarget->GetPositionY(); z = lasttarget->GetPositionZ(); } }*/ } if(!CollideInterface.CheckLOS(m_caster->GetMapId(), x, y, z + 2, obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ() + 2)) return false; } return true; }
void CH_14177( ProcHandlerContextShare *context ) { if(context->in_Victim==context->in_Caller || isFriendly(context->in_Caller, context->in_Victim)) return; context->out_handler_result = PROC_HANDLER_CONTINUE_EXECUTION; }
bool HolyShock(uint32 i, Spell* pSpell) { Unit* target = pSpell->GetUnitTarget(); if(target == NULL) return true; Player* caster = pSpell->p_caster; if(caster == NULL) return true; uint32 spell_id = 0; if(isFriendly(caster, target)) switch(pSpell->GetProto()->Id) { case 20473: spell_id = 25914; break; case 20929: spell_id = 25913; break; case 20930: spell_id = 25903; break; case 27174: spell_id = 27175; break; case 33072: spell_id = 33074; break; case 48824: spell_id = 48820; break; case 48825: spell_id = 48821; break; } else switch(pSpell->GetProto()->Id) { case 20473: spell_id = 25912; break; case 20929: spell_id = 25911; break; case 20930: spell_id = 25902; break; case 27174: spell_id = 27176; break; case 33072: spell_id = 33073; break; case 48824: spell_id = 48822; break; case 48825: spell_id = 48823; break; } if(spell_id) caster->CastSpell(target, spell_id, false); return true; }
bool checkOrb(eMonster m1, eItem orb) { if(m1 == moPlayer) return markOrb(orb); if(isFriendly(m1)) return markEmpathy(orb); return false; }
bool isFriendly(cell *c) { if(items[itOrbDomination] && c->monst && sameMonster(c, cwt.c)) return true; return isFriendly(c->monst); }