diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Player/Player.cpp | 45 | ||||
-rwxr-xr-x | src/server/game/Entities/Player/Player.h | 7 | ||||
-rwxr-xr-x | src/server/game/Miscellaneous/SharedDefines.h | 2 | ||||
-rwxr-xr-x | src/server/game/Server/WorldSession.cpp | 5 | ||||
-rwxr-xr-x | src/server/game/Server/WorldSession.h | 4 | ||||
-rwxr-xr-x | src/server/game/Server/WorldSocket.cpp | 15 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 23 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.h | 1 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 14 | ||||
-rwxr-xr-x | src/server/shared/Database/Implementation/CharacterDatabase.cpp | 2 |
10 files changed, 85 insertions, 33 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 814d28b078a..d5f45ef64a1 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -964,7 +964,10 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, uint32(-1)); SetUInt32Value(PLAYER_BYTES, (createInfo->Skin | (createInfo->Face << 8) | (createInfo->HairStyle << 16) | (createInfo->HairColor << 24))); - SetUInt32Value(PLAYER_BYTES_2, (createInfo->FacialHair | (0x00 << 8) | (0x00 << 16) | (0x02 << 24))); + SetUInt32Value(PLAYER_BYTES_2, (createInfo->FacialHair | + (0x00 << 8) | + (0x00 << 16) | + (((GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED) << 24))); SetByteValue(PLAYER_BYTES_3, 0, createInfo->Gender); SetByteValue(PLAYER_BYTES_3, 3, 0); // BattlefieldArenaFaction (0 or 1) @@ -5064,6 +5067,9 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) RemoveAurasDueToSpell(20584); // speed bonuses RemoveAurasDueToSpell(8326); // SPELL_AURA_GHOST + if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) + SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_REFER_A_FRIEND); + setDeathState(ALIVE); SetMovement(MOVE_LAND_WALK); @@ -5072,7 +5078,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) m_deathTimer = 0; // set health/powers (0- will be set in caller) - if (restore_percent>0.0f) + if (restore_percent > 0.0f) { SetHealth(uint32(GetMaxHealth()*restore_percent)); SetPower(POWER_MANA, uint32(GetMaxPower(POWER_MANA)*restore_percent)); @@ -16394,8 +16400,8 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) //"resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, " // 39 40 41 42 43 44 45 46 47 48 49 //"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, " - // 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 - //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars FROM characters WHERE guid = '%u'", guid); + // 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 + //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels FROM characters WHERE guid = '%u'", guid); PreparedQueryResult result = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADFROM); if (!result) @@ -16980,17 +16986,6 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) break; } - /*switch(sWorld->getIntConfig(CONFIG_GM_ACCEPT_TICKETS)) - { - default: - case 0: break; // disable - case 1: SetAcceptTicket(true); break; // enable - case 2: // save state - if (extraflags & PLAYER_EXTRA_GM_ACCEPT_TICKETS) - SetAcceptTicket(true); - break; - }*/ - switch (sWorld->getIntConfig(CONFIG_GM_CHAT)) { default: @@ -17014,6 +17009,14 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) } } + // RaF stuff. + m_grantableLevels = fields[66].GetUInt32(); + if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) + SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_REFER_A_FRIEND); + + if (m_grantableLevels > 0) + SetByteValue(PLAYER_FIELD_BYTES, 1, 0x01); + _LoadDeclinedNames(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES)); m_achievementMgr.CheckAllAchievementCriteria(); @@ -18196,7 +18199,7 @@ void Player::SaveToDB() "trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, " "death_expire_time, taxi_path, arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, " "todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, health, power1, power2, power3, " - "power4, power5, power6, power7, latency, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars) VALUES (" + "power4, power5, power6, power7, latency, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels) VALUES (" << GetGUIDLow() << ',' << GetSession()->GetAccountId() << ", '" << sql_name << "', " @@ -18328,6 +18331,8 @@ void Player::SaveToDB() ss << "',"; ss << uint32(GetByteValue(PLAYER_FIELD_BYTES, 2)); + ss << ","; + ss << uint32(m_grantableLevels); ss << ')'; SQLTransaction trans = CharacterDatabase.BeginTransaction(); @@ -19831,10 +19836,12 @@ void Player::SetRestBonus (float rest_bonus_new) m_rest_bonus = rest_bonus_new; // update data for client - if (m_rest_bonus>10) - SetByteValue(PLAYER_BYTES_2, 3, 0x01); // Set Reststate = Rested + if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) + SetByteValue(PLAYER_BYTES_2, 3, REST_STATE_RAF_LINKED); + else if (m_rest_bonus > 10) + SetByteValue(PLAYER_BYTES_2, 3, REST_STATE_RESTED); // Set Reststate = Rested else if (m_rest_bonus <= 1) - SetByteValue(PLAYER_BYTES_2, 3, 0x02); // Set Reststate = Normal + SetByteValue(PLAYER_BYTES_2, 3, REST_STATE_NOT_RAF_LINKED); // Set Reststate = Normal //RestTickUpdate SetUInt32Value(PLAYER_REST_STATE_EXPERIENCE, uint32(m_rest_bonus)); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8d0ce4e5e77..17f43cc37c1 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -884,6 +884,13 @@ enum ReferAFriendError ERR_REFER_A_FRIEND_SUMMON_OFFLINE_S = 0x0D }; +enum PlayerRestState +{ + REST_STATE_RESTED = 0x01, + REST_STATE_NOT_RAF_LINKED = 0x02, + REST_STATE_RAF_LINKED = 0x06 +}; + class PlayerTaxi { public: diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 07eef6b5f3c..c291f6538dd 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -807,7 +807,7 @@ enum SpellEffects SPELL_EFFECT_CHARGE_DEST = 149, SPELL_EFFECT_QUEST_START = 150, SPELL_EFFECT_TRIGGER_SPELL_2 = 151, - SPELL_EFFECT_152 = 152, + SPELL_EFFECT_SUMMON_RAF_FRIEND = 152, SPELL_EFFECT_CREATE_TAMED_PET = 153, SPELL_EFFECT_DISCOVER_TAXI = 154, SPELL_EFFECT_TITAN_GRIP = 155, diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index fdae9f18f6b..025fbeb9c90 100755 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -86,14 +86,15 @@ bool WorldSessionFilter::Process(WorldPacket* packet) } /// WorldSession constructor -WorldSession::WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter): +WorldSession::WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter): m_muteTime(mute_time), m_timeOutTime(0), _player(NULL), m_Socket(sock), _security(sec), _accountId(id), m_expansion(expansion), _logoutTime(0), m_inQueue(false), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false), m_playerSave(false), m_sessionDbcLocale(sWorld->GetAvailableDbcLocale(locale)), m_sessionDbLocaleIndex(locale), -m_latency(0), m_TutorialsChanged(false), recruiterId(recruiter) +m_latency(0), m_TutorialsChanged(false), recruiterId(recruiter), +isRecruiter(isARecruiter) { if (sock) { diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 1d6f69aac51..7c6ee20eeb2 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -214,7 +214,7 @@ class CharacterCreateInfo class WorldSession { public: - WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter); + WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter); ~WorldSession(); bool PlayerLoading() const { return m_playerLoading; } @@ -390,6 +390,7 @@ class WorldSession // Recruit-A-Friend Handling uint32 GetRecruiterId() { return recruiterId; } + bool IsARecruiter() { return isRecruiter; } public: // opcodes handlers @@ -953,6 +954,7 @@ class WorldSession bool m_TutorialsChanged; AddonsList m_addonsList; uint32 recruiterId; + bool isRecruiter; ACE_Based::LockedQueue<WorldPacket*, ACE_Thread_Mutex> _recvQueue; }; #endif diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index c63761a3255..74187686fe6 100755 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -849,7 +849,6 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) uint32 world_expansion = sWorld->getIntConfig(CONFIG_EXPANSION); if (expansion > world_expansion) expansion = world_expansion; - //expansion = ((sWorld->getIntConfig(CONFIG_EXPANSION) > fields[6].GetUInt8()) ? fields[6].GetUInt8() : sWorld->getIntConfig(CONFIG_EXPANSION)); N.SetHexStr ("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7"); g.SetDword (7); @@ -882,11 +881,6 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) } id = fields[0].GetUInt32(); - /* - if (security > SEC_ADMINISTRATOR) // prevent invalid security settings in DB - security = SEC_ADMINISTRATOR; - */ - K.SetHexStr (fields[1].GetCString()); int64 mutetime = fields[7].GetInt64(); @@ -982,6 +976,13 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) account.c_str(), address.c_str()); + // Check if this user is by any chance a recruiter + result = LoginDatabase.PQuery ("SELECT 1 FROM account WHERE recruiter = %u", id); + + bool isRecruiter = false; + if (result) + isRecruiter = true; + // Update the last_ip in the database // No SQL injection, username escaped. LoginDatabase.EscapeString (address); @@ -993,7 +994,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) safe_account.c_str()); // NOTE ATM the socket is single-threaded, have this in mind ... - ACE_NEW_RETURN (m_Session, WorldSession (id, this, AccountTypes(security), expansion, mutetime, locale, recruiter), -1); + ACE_NEW_RETURN (m_Session, WorldSession (id, this, AccountTypes(security), expansion, mutetime, locale, recruiter, isRecruiter), -1); m_Crypt.Init(&K); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 2ef8dd4583c..c0b04601b97 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -711,6 +711,7 @@ void Spell::SelectSpellTargets() else if (m_spellInfo->Effects[i].Effect == SPELL_EFFECT_TRIGGER_SPELL) AddUnitTarget(m_caster, i); break; + case SPELL_EFFECT_SUMMON_RAF_FRIEND: case SPELL_EFFECT_SUMMON_PLAYER: if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->ToPlayer()->GetSelection()) { @@ -5276,7 +5277,7 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_BAD_TARGETS; Player* target = ObjectAccessor::FindPlayer(m_caster->ToPlayer()->GetSelection()); - if (!target || m_caster->ToPlayer() == target || !target->IsInSameRaidWith(m_caster->ToPlayer())) + if (!target || m_caster->ToPlayer() == target || (!target->IsInSameRaidWith(m_caster->ToPlayer()) && m_spellInfo->Id != 48955)) // refer-a-friend spell return SPELL_FAILED_BAD_TARGETS; // check if our map is dungeon @@ -5298,6 +5299,25 @@ SpellCastResult Spell::CheckCast(bool strict) } break; } + // RETURN HERE + case SPELL_EFFECT_SUMMON_RAF_FRIEND: + { + if(m_caster->GetTypeId() != TYPEID_PLAYER) + return SPELL_FAILED_BAD_TARGETS; + + Player* playerCaster = m_caster->ToPlayer(); + // + if(!(playerCaster->GetSelection())) + return SPELL_FAILED_BAD_TARGETS; + + Player* target = ObjectAccessor::FindPlayer(playerCaster->GetSelection()); + + if (!target || + !(target->GetSession()->GetRecruiterId() == playerCaster->GetSession()->GetAccountId() || target->GetSession()->GetAccountId() == playerCaster->GetSession()->GetRecruiterId())) + return SPELL_FAILED_BAD_TARGETS; + + break; + } case SPELL_EFFECT_LEAP: case SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER: { @@ -6558,6 +6578,7 @@ bool Spell::CheckTarget(Unit* target, uint32 eff) //Check targets for LOS visibility (except spells without range limitations) switch(m_spellInfo->Effects[eff].Effect) { + case SPELL_EFFECT_SUMMON_RAF_FRIEND: case SPELL_EFFECT_SUMMON_PLAYER: // from anywhere break; case SPELL_EFFECT_DUMMY: diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 9007f44e26d..e334f6d29f6 100755 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -356,6 +356,7 @@ class Spell void EffectEnergizePct(SpellEffIndex effIndex); void EffectTriggerSpellWithValue(SpellEffIndex effIndex); void EffectTriggerRitualOfSummoning(SpellEffIndex effIndex); + void EffectSummonRaFFriend(SpellEffIndex effIndex); void EffectKillCreditPersonal(SpellEffIndex effIndex); void EffectKillCredit(SpellEffIndex effIndex); void EffectQuestFail(SpellEffIndex effIndex); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 3f68cd5c77f..fd1a5497999 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -216,7 +216,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectChargeDest, //149 SPELL_EFFECT_CHARGE_DEST &Spell::EffectQuestStart, //150 SPELL_EFFECT_QUEST_START &Spell::EffectTriggerRitualOfSummoning, //151 SPELL_EFFECT_TRIGGER_SPELL_2 - &Spell::EffectNULL, //152 SPELL_EFFECT_152 summon Refer-a-Friend + &Spell::EffectSummonRaFFriend, //152 SPELL_EFFECT_SUMMON_RAF_FRIEND summon Refer-a-Friend &Spell::EffectCreateTamedPet, //153 SPELL_EFFECT_CREATE_TAMED_PET misc value is creature entry &Spell::EffectDiscoverTaxi, //154 SPELL_EFFECT_DISCOVER_TAXI &Spell::EffectTitanGrip, //155 SPELL_EFFECT_TITAN_GRIP Allows you to equip two-handed axes, maces and swords in one hand, but you attack $49152s1% slower than normal. @@ -7074,3 +7074,15 @@ void Spell::EffectBind(SpellEffIndex effIndex) data << uint32(area_id); player->SendDirectMessage(&data); } + +void Spell::EffectSummonRaFFriend(SpellEffIndex effIndex) { + + if (m_caster->GetTypeId() != TYPEID_PLAYER) + return; + Player *player = m_caster->ToPlayer(); + + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + return; + + m_caster->CastSpell(m_caster, m_spellInfo->Effects[effIndex].TriggerSpell, true); +} diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index dddfbd293e2..e96319aa3a0 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -42,7 +42,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " "resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, " "arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, " - "health, power1, power2, power3, power4, power5, power6, power7, instance_id, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars FROM characters WHERE guid = ?", CONNECTION_ASYNC) + "health, power1, power2, power3, power4, power5, power6, power7, instance_id, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels FROM characters WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_LOAD_PLAYER_GROUP, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_LOAD_PLAYER_BOUNDINSTANCES, "SELECT id, permanent, map, difficulty, resettime FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?", CONNECTION_ASYNC) PREPARE_STATEMENT(CHAR_LOAD_PLAYER_AURAS, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, " |