diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/zone/eversong_woods/eversong_woods.cpp | 41 | ||||
-rw-r--r-- | src/game/Level1.cpp | 36 | ||||
-rw-r--r-- | src/game/Player.cpp | 2 | ||||
-rw-r--r-- | src/game/SpellMgr.cpp | 74 | ||||
-rw-r--r-- | src/game/TicketHandler.cpp | 25 | ||||
-rw-r--r-- | src/game/TicketMgr.cpp | 10 | ||||
-rw-r--r-- | src/game/TicketMgr.h | 2 | ||||
-rw-r--r-- | src/game/World.cpp | 4 |
8 files changed, 119 insertions, 75 deletions
diff --git a/src/bindings/scripts/scripts/zone/eversong_woods/eversong_woods.cpp b/src/bindings/scripts/scripts/zone/eversong_woods/eversong_woods.cpp index bfd8a5d51ce..1126352de8c 100644 --- a/src/bindings/scripts/scripts/zone/eversong_woods/eversong_woods.cpp +++ b/src/bindings/scripts/scripts/zone/eversong_woods/eversong_woods.cpp @@ -604,8 +604,9 @@ struct TRINITY_DLL_DECL npc_apprentice_mirvedaAI : public ScriptedAI { if (PlayerGUID) { - Unit* player = Unit::GetUnit((*m_creature), PlayerGUID); - ((Player*)player)->GroupEventHappens(QUEST_UNEXPECTED_RESULT, m_creature); + Unit* player = Unit::GetUnit((*m_creature), PlayerGUID); + if(player) + ((Player*)player)->CompleteQuest(QUEST_UNEXPECTED_RESULT); } } @@ -672,28 +673,20 @@ struct TRINITY_DLL_DECL npc_infused_crystalAI : public Scripted_NoMovementAI void Reset() { EndTimer = 0; - WaveTimer = 0; - PlayerGUID = 0; Completed = false; Progress = false; + PlayerGUID = 0; + WaveTimer = 0; } void Aggro(Unit* who){} - void JustSummoned(Creature *summoned) - { - summoned->AI()->AttackStart(m_creature); - } - void MoveInLineOfSight(Unit* who) { - error_log("MoveLos"); - if( who->GetTypeId() == TYPEID_PLAYER && !m_creature->canStartAttack(who) ) + if( who->GetTypeId() == TYPEID_PLAYER && !m_creature->canStartAttack(who) && !Progress) { - error_log("TypeId check"); if( ((Player*)who)->GetQuestStatus(QUEST_POWERING_OUR_DEFENSES) == QUEST_STATUS_INCOMPLETE ) { - error_log("Queststaus"); float Radius = 10.0; if( m_creature->IsWithinDistInMap(who, Radius) ) { @@ -701,10 +694,14 @@ struct TRINITY_DLL_DECL npc_infused_crystalAI : public Scripted_NoMovementAI WaveTimer = 1000; EndTimer = 60000; Progress = true; - error_log("Event started"); } } } + } + + void JustSummoned(Creature *summoned) + { + summoned->AI()->AttackStart(m_creature); } void JustDied(Unit* killer) @@ -726,26 +723,26 @@ struct TRINITY_DLL_DECL npc_infused_crystalAI : public Scripted_NoMovementAI if (PlayerGUID) { Unit* player = Unit::GetUnit((*m_creature), PlayerGUID); - ((Player*)player)->GroupEventHappens(QUEST_POWERING_OUR_DEFENSES, m_creature); + if(player) + ((Player*)player)->CompleteQuest(QUEST_POWERING_OUR_DEFENSES); } m_creature->DealDamage(m_creature,m_creature->GetHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); m_creature->RemoveCorpse(); - error_log("EndTimer done"); }else EndTimer -= diff; if(WaveTimer < diff && !Completed && Progress) { - uint32 ran = rand()%8; - DoSpawnCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran].x, SpawnLocations[ran].y, SpawnLocations[ran].z, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000); - DoSpawnCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran].x, SpawnLocations[ran].y, SpawnLocations[ran].z, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000); - DoSpawnCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran].x, SpawnLocations[ran].y, SpawnLocations[ran].z, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000); + uint32 ran1 = rand()%8; + uint32 ran2 = rand()%8; + uint32 ran3 = rand()%8; + m_creature->SummonCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran1].x, SpawnLocations[ran1].y, SpawnLocations[ran1].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); + m_creature->SummonCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran2].x, SpawnLocations[ran2].y, SpawnLocations[ran2].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); + m_creature->SummonCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran3].x, SpawnLocations[ran3].y, SpawnLocations[ran3].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); WaveTimer = 30000; - error_log("Wave summon"); }else WaveTimer -= diff; } }; - CreatureAI* GetAI_npc_infused_crystalAI(Creature *_Creature) { return new npc_infused_crystalAI (_Creature); diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index be8d4cfb0bf..4d30987836e 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -275,7 +275,7 @@ bool ChatHandler::HandleGMTicketListCommand(const char* args) SendSysMessage(LANG_COMMAND_TICKETSHOWLIST); for(GmTicketList::iterator itr = ticketmgr.GM_TicketList.begin(); itr != ticketmgr.GM_TicketList.end(); ++itr) { - if((*itr)->closed) + if((*itr)->closed == 1) continue; std::stringstream message; @@ -298,7 +298,7 @@ bool ChatHandler::HandleGMTicketListOnlineCommand(const char* args) SendSysMessage(LANG_COMMAND_TICKETSHOWONLINELIST); for(GmTicketList::iterator itr = ticketmgr.GM_TicketList.begin(); itr != ticketmgr.GM_TicketList.end(); ++itr) { - if((*itr)->closed || !objmgr.GetPlayer((*itr)->playerGuid)) + if((*itr)->closed == 1 || !objmgr.GetPlayer((*itr)->playerGuid)) continue; std::stringstream message; @@ -383,22 +383,22 @@ bool ChatHandler::HandleGMTicketCloseByIdCommand(const char* args) uint64 tguid = atoi(args); GM_Ticket *ticket = ticketmgr.GetGMTicket(tguid); - if(!ticket || ticket->closed) + if(!ticket || ticket->closed == 1) { SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; + return false; } - if(ticket && ticket->assignedToGM != m_session->GetPlayer()->GetGUID()) + if(ticket && ticket->assignedToGM != 0 && ticket->assignedToGM != m_session->GetPlayer()->GetGUID()) { PSendSysMessage(LANG_COMMAND_TICKETCANNOTCLOSE, ticket->guid); - + return false; } - sWorld.SendGMText(LANG_COMMAND_TICKETCLOSED, ticket->name, ticket->guid); + sWorld.SendGMText(LANG_COMMAND_TICKETCLOSED, ticket->name.c_str(), ticket->guid); ticketmgr.RemoveGMTicket(ticket->guid); Player *plr = objmgr.GetPlayer(ticket->playerGuid); if(!plr || !plr->IsInWorld()) - return true; + return false; // send abandon ticket WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4); @@ -422,13 +422,13 @@ bool ChatHandler::HandleGMTicketAssignToCommand(const char* args) std::string targm = targetgm; if(!normalizePlayerName(targm)) - return false; + return true; Player *cplr = m_session->GetPlayer(); std::string gmname; GM_Ticket *ticket = ticketmgr.GetGMTicket(ticketGuid); - if(!ticket || ticket->closed) + if(!ticket || ticket->closed == 1) { SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); return true; @@ -506,7 +506,7 @@ bool ChatHandler::HandleGMTicketUnAssignCommand(const char* args) bool ChatHandler::HandleGMTicketCommentCommand(const char* args) { - if(!args) + if(!*args) return false; char* tguid = strtok((char*)args, " "); @@ -516,19 +516,17 @@ bool ChatHandler::HandleGMTicketCommentCommand(const char* args) if(!comment) return false; - std::string gmname; Player *cplr = m_session->GetPlayer(); GM_Ticket *ticket = ticketmgr.GetGMTicket(ticketGuid); - if(!ticket || ticket->closed) + if(!ticket || ticket->closed == 1) { PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST); return true; } - if(ticket->assignedToGM = 0 && ticket->assignedToGM != cplr->GetGUID()) + if(ticket->assignedToGM != 0 && ticket->assignedToGM != cplr->GetGUID()) { - gmname = objmgr.GetPlayer(ticket->assignedToGM)->GetName(); - PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->guid, gmname.c_str()); + PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->guid); return true; } @@ -552,10 +550,10 @@ bool ChatHandler::HandleGMTicketDeleteByIdCommand(const char* args) if(!ticket) { - PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST, ticketGuid); + SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); return true; } - if(!ticket->closed) + if(!ticket->closed == 1) { SendSysMessage(LANG_COMMAND_TICKETCLOSEFIRST); return true; @@ -563,8 +561,8 @@ bool ChatHandler::HandleGMTicketDeleteByIdCommand(const char* args) std::string gmname = m_session->GetPlayer()->GetName(); sWorld.SendGMText(LANG_COMMAND_TICKETDELETED, ticket->guid, gmname.c_str()); - ticketmgr.DeleteGMTicketPermanently(ticket->guid); Player *plr = objmgr.GetPlayer(ticket->playerGuid); + ticketmgr.DeleteGMTicketPermanently(ticket->guid); if(plr && plr->IsInWorld()) { // Force abandon ticket diff --git a/src/game/Player.cpp b/src/game/Player.cpp index f0b20f5d880..ed8c38297b6 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -3742,7 +3742,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC CharacterDatabase.PExecute("DELETE FROM character_reputation WHERE guid = '%u'",guid); CharacterDatabase.PExecute("DELETE FROM character_spell WHERE guid = '%u'",guid); CharacterDatabase.PExecute("DELETE FROM character_spell_cooldown WHERE guid = '%u'",guid); - CharacterDatabase.PExecute("DELETE FROM gm_ticket WHERE playerGuid = '%u'", guid); + CharacterDatabase.PExecute("DELETE FROM gm_tickets WHERE playerGuid = '%u'", guid); CharacterDatabase.PExecute("DELETE FROM item_instance WHERE owner_guid = '%u'",guid); CharacterDatabase.PExecute("DELETE FROM character_social WHERE guid = '%u' OR friend='%u'",guid,guid); CharacterDatabase.PExecute("DELETE FROM mail WHERE receiver = '%u'",guid); diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index a7096b818d1..5ff242537d0 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -1473,6 +1473,19 @@ void SpellMgr::LoadSpellChains() { mSpellChains.clear(); // need for reload case + std::vector<uint32> ChainedSpells; + for (uint32 ability_id=0;ability_id<sSkillLineAbilityStore.GetNumRows();ability_id++) + { + SkillLineAbilityEntry const *AbilityInfo=sSkillLineAbilityStore.LookupEntry(ability_id); + if (!AbilityInfo) + continue; + if (AbilityInfo->spellId==20154) //exception to these rules (not needed in 3.0.3) + continue; + if (!AbilityInfo->forward_spellid) + continue; + ChainedSpells.push_back(AbilityInfo->forward_spellid); + } + std::multimap<SpellRankEntry, SpellRankValue,SpellRankEntry> RankMap; for (uint32 ability_id=0;ability_id<sSkillLineAbilityStore.GetNumRows();ability_id++) @@ -1483,6 +1496,17 @@ void SpellMgr::LoadSpellChains() //get only spell with lowest ability_id to prevent doubles uint32 spell_id=AbilityInfo->spellId; + if (spell_id==20154) //exception to these rules (not needed in 3.0.3) + continue; + bool found=false; + for (uint32 i=0; i<ChainedSpells.size(); i++) + { + if (ChainedSpells.at(i)==spell_id) + found=true; + } + if (found) + continue; + if(mSkillLineAbilityMap.lower_bound(spell_id)->second->id!=ability_id) continue; SpellEntry const *SpellInfo=sSpellStore.LookupEntry(spell_id); @@ -1491,6 +1515,9 @@ void SpellMgr::LoadSpellChains() std::string sRank = SpellInfo->Rank[sWorld.GetDefaultDbcLocale()]; if(sRank.empty()) continue; + //exception to polymorph spells-make pig and turtle other chain than sheep + if ((SpellInfo->SpellFamilyName==SPELLFAMILY_MAGE) && (SpellInfo->SpellFamilyFlags & 0x1000000) && (SpellInfo->SpellIconID!=82)) + continue; SpellRankEntry entry; SpellRankValue value; @@ -1503,10 +1530,18 @@ void SpellMgr::LoadSpellChains() entry.TargetAuraState=SpellInfo->TargetAuraState; entry.SpellVisual=SpellInfo->SpellVisual[0]; entry.ManaCost=SpellInfo->manaCost; - - value.Id=spell_id; - value.Rank=SpellInfo->Rank[sWorld.GetDefaultDbcLocale()]; - RankMap.insert(std::pair<SpellRankEntry, SpellRankValue>(entry,value)); + + for (;;) + { + AbilityInfo=mSkillLineAbilityMap.lower_bound(spell_id)->second; + value.Id=spell_id; + value.Rank=SpellInfo->Rank[sWorld.GetDefaultDbcLocale()]; + RankMap.insert(std::pair<SpellRankEntry, SpellRankValue>(entry,value)); + spell_id=AbilityInfo->forward_spellid; + SpellInfo=sSpellStore.LookupEntry(spell_id); + if (!SpellInfo) + break; + } } barGoLink bar(RankMap.size()); @@ -1531,17 +1566,13 @@ void SpellMgr::LoadSpellChains() for (itr2 = RankErrorMap.lower_bound(err_entry);itr2!=RankErrorMap.upper_bound(err_entry);itr2++) { sLog.outDebug("There is a duplicate rank entry (%s) for spell: %u",itr2->first,itr2->second->second.Id); - if (itr2->second->second.Id!=21084) //only one exception to these rules (not needed in 3.0.3) - { - sLog.outDebug("Spell %u removed from chain data.",itr2->second->second.Id); - RankMap.erase(itr2->second); - itr=RankMap.lower_bound(entry); - } + sLog.outDebug("Spell %u removed from chain data.",itr2->second->second.Id); + RankMap.erase(itr2->second); + itr=RankMap.lower_bound(entry); } else itr2++; } - //do not proceed for spells with less than 2 ranks uint32 spell_max_rank=RankMap.count(entry); if (spell_max_rank<2) @@ -1619,6 +1650,10 @@ void SpellMgr::LoadSpellChains() } } +//uncomment these two lines to print yourself list of spell_chains on startup +// for (UNORDERED_MAP<uint32, SpellChainNode>::iterator itr=mSpellChains.begin();itr!=mSpellChains.end();itr++) +// sLog.outString( "Id: %u, Rank: %d , %s",itr->first,itr->second.rank, sSpellStore.LookupEntry(itr->first)->Rank[sWorld.GetDefaultDbcLocale()]); + sLog.outString(); sLog.outString( ">> Loaded %u spell chains",count); } @@ -2063,18 +2098,29 @@ void SpellMgr::LoadSpellCustomAttr() break; case 41376: // Spite case 39992: // Needle Spine + case 29576: //Multi-Shot + case 40816: //Saber Lash + case 37790: //Spread Shot spellInfo->MaxAffectedTargets = 3; break; + case 38310: //Multi-Shot + spellInfo->MaxAffectedTargets = 4; + break; case 42005: // Bloodboil + case 38296: //Spitfire Totem + case 37676: //Insidious Whisper spellInfo->MaxAffectedTargets = 5; break; + case 40827: //Sinful Beam + case 40859: //Sinister Beam + case 40860: //Vile Beam + case 40861: //Wicked Beam + spellInfo->MaxAffectedTargets = 10; + break; case 8122: case 8124: case 10888: case 10890: // Psychic Scream case 12494: // Frostbite spellInfo->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; break; - //case 5530: // Mace spec (this will not be needed in 303 - // spellInfo->rangeIndex = 13; //inf - // break; default: break; } diff --git a/src/game/TicketHandler.cpp b/src/game/TicketHandler.cpp index 2a0fa4760b6..f3374332f79 100644 --- a/src/game/TicketHandler.cpp +++ b/src/game/TicketHandler.cpp @@ -60,7 +60,7 @@ void WorldSession::HandleGMTicketCreateOpcode( WorldPacket & recv_data ) ticket->playerGuid = GetPlayer()->GetGUID(); ticket->message = ticketText; ticket->timestamp = time(NULL); - ticket->closed = false; + ticket->closed = 0; ticket->assignedToGM = 0; ticket->comment = ""; @@ -128,16 +128,20 @@ void WorldSession::HandleGMTicketDeleteOpcode( WorldPacket & /*recv_data*/) GM_Ticket* ticket = ticketmgr.GetGMTicketByPlayer(GetPlayer()->GetGUID()); - // Remove Tickets from Player - ticketmgr.RemoveGMTicketByPlayer(GetPlayer()->GetGUID()); - - // Response - no errors - WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4); - data << uint32(9); - // Send Packet - SendPacket(&data); + // CHeck for Ticket + if(ticket) + { + // Remove Tickets from Player + + // Response - no errors + WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4); + data << uint32(9); + // Send Packet + SendPacket(&data); - sWorld.SendGMText(LANG_COMMAND_TICKETPLAYERABANDON, GetPlayer()->GetName(), ticket->guid ); + sWorld.SendGMText(LANG_COMMAND_TICKETPLAYERABANDON, GetPlayer()->GetName(), ticket->guid ); + ticketmgr.RemoveGMTicketByPlayer(GetPlayer()->GetGUID()); + } } void WorldSession::HandleGMTicketGetTicketOpcode( WorldPacket & /*recv_data*/) @@ -164,7 +168,6 @@ void WorldSession::HandleGMTicketGetTicketOpcode( WorldPacket & /*recv_data*/) SendPacket(&data); - } void WorldSession::HandleGMTicketSystemStatusOpcode( WorldPacket & /*recv_data*/) diff --git a/src/game/TicketMgr.cpp b/src/game/TicketMgr.cpp index 212f9ff8059..0f1f7501e67 100644 --- a/src/game/TicketMgr.cpp +++ b/src/game/TicketMgr.cpp @@ -49,7 +49,7 @@ GM_Ticket* TicketMgr::GetGMTicketByPlayer(uint64 playerGuid) { for(GmTicketList::iterator i = GM_TicketList.begin(); i != GM_TicketList.end();) { - if((*i)->playerGuid == playerGuid && !(*i)->closed) + if((*i)->playerGuid == playerGuid && (*i)->closed == 0) { return (*i); } @@ -72,7 +72,7 @@ GM_Ticket* TicketMgr::GetGMTicketByName(const char* name) for(GmTicketList::iterator i = GM_TicketList.begin(); i != GM_TicketList.end();) { - if((*i)->playerGuid == playerGuid && !(*i)->closed) + if((*i)->playerGuid == playerGuid && (*i)->closed == 0) { return (*i); } @@ -147,9 +147,9 @@ void TicketMgr::RemoveGMTicket(uint64 ticketGuid) { for(GmTicketList::iterator i = GM_TicketList.begin(); i != GM_TicketList.end();) { - if((*i)->guid == ticketGuid && !(*i)->closed) + if((*i)->guid == ticketGuid && (*i)->closed == 0) { - (*i)->closed = true; + (*i)->closed = 1; SaveGMTicket((*i)); } ++i; @@ -161,7 +161,7 @@ void TicketMgr::RemoveGMTicketByPlayer(uint64 playerGuid) { for(GmTicketList::iterator i = GM_TicketList.begin(); i != GM_TicketList.end();) { - if((*i)->playerGuid == playerGuid && !(*i)->closed) + if((*i)->playerGuid == playerGuid && (*i)->closed == 0) { (*i)->closed = true; SaveGMTicket((*i)); diff --git a/src/game/TicketMgr.h b/src/game/TicketMgr.h index 150ca4d2eff..e41be9db5c3 100644 --- a/src/game/TicketMgr.h +++ b/src/game/TicketMgr.h @@ -34,7 +34,7 @@ struct GM_Ticket std::string name; std::string message; uint64 timestamp; - bool closed; + uint16 closed; uint64 assignedToGM; std::string comment; }; diff --git a/src/game/World.cpp b/src/game/World.cpp index 5e7240817ff..028ec804ab4 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -489,7 +489,7 @@ void World::LoadConfigSettings(bool reload) sLog.outError("Rate.Talent (%f) mustbe > 0. Using 1 instead.",rate_values[RATE_TALENT]); rate_values[RATE_TALENT] = 1.0f; } - rate_values[RATE_CORPSE_DECAY_LOOTED] = sConfig.GetFloatDefault("Rate.Corpse.Decay.Looted",0.1f); + rate_values[RATE_CORPSE_DECAY_LOOTED] = sConfig.GetFloatDefault("Rate.Corpse.Decay.Looted",0.5f); rate_values[RATE_TARGET_POS_RECALCULATION_RANGE] = sConfig.GetFloatDefault("TargetPosRecalculateRange",1.5f); if(rate_values[RATE_TARGET_POS_RECALCULATION_RANGE] < CONTACT_DISTANCE) @@ -902,7 +902,7 @@ void World::LoadConfigSettings(bool reload) m_configs[CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP] = sConfig.GetBoolDefault("Death.CorpseReclaimDelay.PvP", true); m_configs[CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE] = sConfig.GetBoolDefault("Death.CorpseReclaimDelay.PvE", true); - m_configs[CONFIG_THREAT_RADIUS] = sConfig.GetIntDefault("ThreatRadius", 100); + m_configs[CONFIG_THREAT_RADIUS] = sConfig.GetIntDefault("ThreatRadius", 60); // always use declined names in the russian client m_configs[CONFIG_DECLINED_NAMES_USED] = |