关灯
开启左侧

TRINITY的禁止技能的系统代码

  [复制链接]
admin实名认证 发表于 2016-4-18 22:37:29 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
1、TrinityHG_rev1175-禁止技能之宠物
# HG changeset patch# User KingPin
# Date 1236430022 18000
# Branch trunk
# Node ID 7910c3719e17c362c5de005dbeacfaed2a21ea2a
# Parent  72b8c4aff658370035b4bb5a64602295b96696a7
Extend the spell_disabled table to have a seperate flag for pet spells from player spells, Patch by Koani

diff -r 72b8c4aff658 -r 7910c3719e17 src/game/ObjectMgr.cpp
--- a/src/game/ObjectMgr.cpp        Sat Mar 07 09:04:27 2009 +0100
+++ b/src/game/ObjectMgr.cpp        Sat Mar 07 07:47:02 2009 -0500
@@ -6289,6 +6289,7 @@
{
     m_DisabledPlayerSpells.clear();                                // need for reload case
     m_DisabledCreatureSpells.clear();
+    m_DisabledPetSpells.clear();
     QueryResult *result = WorldDatabase.Query("SELECT entry, disable_mask FROM spell_disabled");

     uint32 total_count = 0;
@@ -6321,6 +6322,8 @@
             m_DisabledPlayerSpells.insert(spellid);
         if(disable_mask & SPELL_DISABLE_CREATURE)
             m_DisabledCreatureSpells.insert(spellid);
+        if(disable_mask & SPELL_DISABLE_PET)
+            m_DisabledPetSpells.insert(spellid);
         ++total_count;
    } while ( result->NextRow() );

diff -r 72b8c4aff658 -r 7910c3719e17 src/game/ObjectMgr.h
--- a/src/game/ObjectMgr.h        Sat Mar 07 09:04:27 2009 +0100
+++ b/src/game/ObjectMgr.h        Sat Mar 07 07:47:02 2009 -0500
@@ -712,6 +712,7 @@
         void LoadSpellDisabledEntrys();
         bool IsPlayerSpellDisabled(uint32 spellid) { return (m_DisabledPlayerSpells.count(spellid) != 0); }
         bool IsCreatureSpellDisabled(uint32 spellid) { return (m_DisabledCreatureSpells.count(spellid) != 0); }
+        bool IsPetSpellDisabled(uint32 spellid) { return (m_DisabledPetSpells.count(spellid) != 0); }

         int GetIndexForLocale(LocaleConstant loc);
         LocaleConstant GetLocaleForIndex(int i);
@@ -831,6 +832,7 @@

         std::set<uint32>    m_DisabledPlayerSpells;
         std::set<uint32>    m_DisabledCreatureSpells;
+        std::set<uint32>    m_DisabledPetSpells;

         GraveYardMap        mGraveYardMap;

diff -r 72b8c4aff658 -r 7910c3719e17 src/game/Spell.cpp
--- a/src/game/Spell.cpp        Sat Mar 07 09:04:27 2009 +0100
+++ b/src/game/Spell.cpp        Sat Mar 07 07:47:02 2009 -0500
@@ -2048,9 +2048,18 @@
         return;
     }

-    if(m_caster->GetTypeId() == TYPEID_PLAYER || (m_caster->GetTypeId() == TYPEID_UNIT && ((Creature*)m_caster)->isPet()))
+    if(m_caster->GetTypeId() == TYPEID_PLAYER)
     {
         if(objmgr.IsPlayerSpellDisabled(m_spellInfo->Id))
+        {
+            SendCastResult(SPELL_FAILED_SPELL_UNAVAILABLE);
+            finish(false);
+            return;
+        }
+    }
+    else if (m_caster->GetTypeId() == TYPEID_UNIT && ((Creature*)m_caster)->isPet())
+    {
+        if(objmgr.IsPetSpellDisabled(m_spellInfo->Id))
         {
             SendCastResult(SPELL_FAILED_SPELL_UNAVAILABLE);
             finish(false);
diff -r 72b8c4aff658 -r 7910c3719e17 src/game/SpellMgr.h
--- a/src/game/SpellMgr.h        Sat Mar 07 09:04:27 2009 +0100
+++ b/src/game/SpellMgr.h        Sat Mar 07 07:47:02 2009 -0500
@@ -230,7 +230,8 @@
enum SpellDisableTypes
{
     SPELL_DISABLE_PLAYER = 1,
-    SPELL_DISABLE_CREATURE = 2
+    SPELL_DISABLE_CREATURE = 2,
+    SPELL_DISABLE_PET = 4
};

enum SpellEffectTargetTypes

禁止对生物释放的技能

diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 4ac76b6..2ef3a87 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -7368,6 +7368,7 @@ void ObjectMgr::LoadSpellDisabledEntrys() //
     m_DisabledPlayerSpells.clear();                                // need for reload case
     m_DisabledCreatureSpells.clear();
     m_DisabledPetSpells.clear();
+        m_DisabledToCreature.clear();
     QueryResult *result = WorldDatabase.Query("SELECT entry, disable_mask FROM spell_disabled");

     uint32 total_count = 0;
@@ -7402,6 +7403,8 @@ void ObjectMgr::LoadSpellDisabledEntrys() //
             m_DisabledCreatureSpells.insert(spellid);
         if(disable_mask & SPELL_DISABLE_PET)
             m_DisabledPetSpells.insert(spellid);
+                if(disable_mask & SPELL_DISABLE_TOCREATURE)
+                        m_DisabledToCreature.insert(spellid);
         ++total_count;
    } while ( result->NextRow() );

diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index f8a0e55..593daab 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -1175,6 +1175,7 @@ class ObjectMgr
         bool IsPlayerSpellDisabled(uint32 spellid) { return (m_DisabledPlayerSpells.count(spellid) != 0); }
         bool IsCreatureSpellDisabled(uint32 spellid) { return (m_DisabledCreatureSpells.count(spellid) != 0); }
         bool IsPetSpellDisabled(uint32 spellid) { return (m_DisabledPetSpells.count(spellid) != 0); }
+                bool IsPlayerSpellDisabledToCreature(uint32 spellid) { return (m_DisabledToCreature.count(spellid) != 0); }

         void LoadPlayerLootTemplate(); //重载玩家掉率
         uint32 PlayerLootItemid(uint32 entry)//获得物品ID号(要掉落的物品player_loot_template)
@@ -1394,6 +1395,7 @@ class ObjectMgr
         std::set<uint32>    m_DisabledPlayerSpells; //数据库中禁止某个技能
         std::set<uint32>    m_DisabledCreatureSpells; //数据库中禁止某个技能
         std::set<uint32>    m_DisabledPetSpells;//数据库中禁止某个技能
+                std::set<uint32>    m_DisabledToCreature;//禁止对生物释放的技能

         typedef UNORDERED_MAP<uint32, PlayerLootTemplate> PlayerLootTemplateMap;//玩家掉率系统的内存地图定义
                PlayerLootTemplateMap  m_Player_Loot_Template;
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 161991c..c43b874 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -4236,6 +4236,21 @@ void Spell::HandleEffects(Unit *pUnitTarget,Item *pItemTarget,GameObject *pGOTar

     DEBUG_FILTER_LOG(LOG_FILTER_SPELL_CAST, "Spell %u Effect%d : %u", m_spellInfo->Id, i, eff);

+        if (sObjectMgr.IsPlayerSpellDisabledToCreature(m_spellInfo->Id) && unitTarget->GetTypeId() == TYPEID_UNIT)
+        {//禁止对生物释放的技能
+                sLog.outDebug("MgCore::Here is Crash IsPlayerSpellDisabledToCreature?");
+                uint32 TargetEntry = unitTarget->GetEntry();
+                if (TargetEntry != 0)
+                {
+                    if (((Creature*)unitTarget)->isWorldBoss())
+                    {
+                            SendCastResult(SPELL_FAILED_BAD_TARGETS);
+                finish(false);
+                return;
+                    }
+                }
+        }
+
     if(eff < TOTAL_SPELL_EFFECTS)
     {
         (*this.*SpellEffects[eff])(i);
diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h
index b652013..29cd447 100644
--- a/src/game/SpellMgr.h
+++ b/src/game/SpellMgr.h
@@ -70,7 +70,8 @@ enum SpellDisableTypes  //
{
     SPELL_DISABLE_PLAYER = 1,
     SPELL_DISABLE_CREATURE = 2,
-    SPELL_DISABLE_PET = 4
+    SPELL_DISABLE_PET = 4,
+        SPELL_DISABLE_TOCREATURE = 8
};

//Some SpellFamilyFlags


数据库中禁止某个技能

Index: src/game/Chat.cpp
===================================================================
--- src/game/Chat.cpp        (revision 81)
+++ src/game/Chat.cpp        (working copy)
@@ -310,6 +310,7 @@
         { "spell_scripts",               SEC_ADMINISTRATOR, true,  &ChatHandler::HandleReloadSpellScriptsCommand,            "", NULL },
         { "spell_target_position",       SEC_ADMINISTRATOR, true,  &ChatHandler::HandleReloadSpellTargetPositionCommand,     "", NULL },
         { "spell_threats",               SEC_ADMINISTRATOR, true,  &ChatHandler::HandleReloadSpellThreatsCommand,            "", NULL },
+        { "spell_disabled",              SEC_ADMINISTRATOR, true,  &ChatHandler::HandleReloadSpellDisabledCommand,           "", NULL }, //禁止某个技能,数据库重载
         { "locales_creature",            SEC_ADMINISTRATOR, true,  &ChatHandler::HandleReloadLocalesCreatureCommand,         "", NULL },
         { "locales_gameobject",          SEC_ADMINISTRATOR, true,  &ChatHandler::HandleReloadLocalesGameobjectCommand,       "", NULL },
         { "locales_item",                SEC_ADMINISTRATOR, true,  &ChatHandler::HandleReloadLocalesItemCommand,             "", NULL },
Index: src/game/Chat.h
===================================================================
--- src/game/Chat.h        (revision 81)
+++ src/game/Chat.h        (working copy)
@@ -260,6 +260,7 @@
         bool HandleReloadSpellTargetPositionCommand(const char* args);
         bool HandleReloadSpellThreatsCommand(const char* args);
         bool HandleReloadSpellPetAurasCommand(const char* args);
+        bool HandleReloadSpellDisabledCommand(const char* args); //禁止某个技能数据库从载
         bool HandleReloadPageTextsCommand(const char* args);
         bool HandleReloadItemEnchantementsCommand(const char* args);
         bool HandleReloadLocalesCreatureCommand(const char* args);
Index: src/game/Level3.cpp
===================================================================
--- src/game/Level3.cpp        (revision 81)
+++ src/game/Level3.cpp        (working copy)
@@ -142,6 +142,7 @@
     HandleReloadSpellTargetPositionCommand("a");
     HandleReloadSpellThreatsCommand("a");
     HandleReloadSpellPetAurasCommand("a");
+    HandleReloadSpellDisabledCommand("a"); //禁止某个技能数据库重载
     return true;
}

@@ -652,6 +653,17 @@
     return true;
}

+bool ChatHandler::HandleReloadSpellDisabledCommand(const char* /*arg*/) //禁止某个技能数据库重载
+{
+    sLog.outString( "Re-Loading spell disabled table...");
+
+    objmgr.LoadSpellDisabledEntrys();
+
+    SendGlobalSysMessage("DB table `spell_disabled` reloaded.");
+
+    return true;
+}
+
bool ChatHandler::HandleReloadLocalesCreatureCommand(const char* /*arg*/)
{
     sLog.outString( "Re-Loading Locales Creature ...");
Index: src/game/ObjectMgr.cpp
===================================================================
--- src/game/ObjectMgr.cpp        (revision 81)
+++ src/game/ObjectMgr.cpp        (working copy)
@@ -6754,6 +6754,51 @@
     return "<error>";
}

+void ObjectMgr::LoadSpellDisabledEntrys() //数据库中禁止某个技能
+{
+    m_DisabledPlayerSpells.clear();                                // need for reload case
+    m_DisabledCreatureSpells.clear();
+    QueryResult *result = WorldDatabase.Query("SELECT entry, disable_mask FROM spell_disabled");
+
+    uint32 total_count = 0;
+
+    if( !result )
+    {
+        barGoLink bar( 1 );
+        bar.step();
+
+        sLog.outString();
+        sLog.outString( ">> Loaded %u disabled spells", total_count );
+        return;
+    }
+
+    barGoLink bar( result->GetRowCount() );
+
+    Field* fields;
+    do
+    {
+        bar.step();
+        fields = result->Fetch();
+        uint32 spellid = fields[0].GetUInt32();
+        if(!sSpellStore.LookupEntry(spellid))
+        {
+            sLog.outErrorDb("Spell entry %u from `spell_disabled` doesn't exist in dbc, ignoring.",spellid);
+            continue;
+        }
+        uint32 disable_mask = fields[1].GetUInt32();
+        if(disable_mask & SPELL_DISABLE_PLAYER)
+            m_DisabledPlayerSpells.insert(spellid);
+        if(disable_mask & SPELL_DISABLE_CREATURE)
+            m_DisabledCreatureSpells.insert(spellid);
+        ++total_count;
+   } while ( result->NextRow() );
+
+    delete result;
+
+    sLog.outString();
+    sLog.outString( ">> Loaded %u disabled spells from `spell_disabled`", total_count);
+}//数据库中禁止某个技能
+
void ObjectMgr::LoadFishingBaseSkillLevel()
{
     mFishingBaseForArea.clear();                            // for reload case
Index: src/game/ObjectMgr.h
===================================================================
--- src/game/ObjectMgr.h        (revision 81)
+++ src/game/ObjectMgr.h        (working copy)
@@ -711,6 +711,10 @@

         static bool CheckDeclinedNames(std::wstring mainpart, DeclinedName const& names);

+        void LoadSpellDisabledEntrys(); //数据库中禁止某个技能
+        bool IsPlayerSpellDisabled(uint32 spellid) { return (m_DisabledPlayerSpells.count(spellid) != 0); }
+        bool IsCreatureSpellDisabled(uint32 spellid) { return (m_DisabledCreatureSpells.count(spellid) != 0); }
+
         int GetIndexForLocale(LocaleConstant loc);
         LocaleConstant GetLocaleForIndex(int i);
         // guild bank tabs
@@ -834,6 +838,9 @@
         typedef std::set<std::wstring> ReservedNamesMap;
         ReservedNamesMap    m_ReservedNames;

+        std::set<uint32>    m_DisabledPlayerSpells; //数据库中禁止某个技能
+        std::set<uint32>    m_DisabledCreatureSpells; //数据库中禁止某个技能
+
         GraveYardMap        mGraveYardMap;

         GameTeleMap         m_GameTeleMap;
Index: src/game/Spell.cpp
===================================================================
--- src/game/Spell.cpp        (revision 81)
+++ src/game/Spell.cpp        (working copy)
@@ -2131,6 +2131,24 @@
         finish(false);
         return;
     }
+    //数据库中禁止某个技能
+    if(m_caster->GetTypeId() == TYPEID_PLAYER || (m_caster->GetTypeId() == TYPEID_UNIT && ((Creature*)m_caster)->isPet()))
+    {
+        if(objmgr.IsPlayerSpellDisabled(m_spellInfo->Id))
+        {
+            SendCastResult(SPELL_FAILED_SPELL_UNAVAILABLE);
+            finish(false);
+            return;
+        }
+    }
+    else
+    {
+        if(objmgr.IsCreatureSpellDisabled(m_spellInfo->Id))
+        {
+            finish(false);
+            return;
+        }
+    }

     // Fill cost data
     m_powerCost = CalculatePowerCost();
Index: src/game/SpellMgr.h
===================================================================
--- src/game/SpellMgr.h        (revision 81)
+++ src/game/SpellMgr.h        (working copy)
@@ -245,6 +245,12 @@
     SPELLFAMILY_PET         = 17
};

+enum SpellDisableTypes  //数据库中禁止某个技能
+{
+    SPELL_DISABLE_PLAYER = 1,
+    SPELL_DISABLE_CREATURE = 2
+};
+
//Some SpellFamilyFlags
#define SPELLFAMILYFLAG_ROGUE_VANISH            0x000000800LL
#define SPELLFAMILYFLAG_ROGUE_STEALTH           0x000400000LL
Index: src/game/World.cpp
===================================================================
--- src/game/World.cpp        (revision 81)
+++ src/game/World.cpp        (working copy)
@@ -1238,6 +1238,9 @@
     sLog.outString( "Loading Player Corpses..." );
     objmgr.LoadCorpses();

+    sLog.outString( "Loading Disabled Spells..." );//数据库中禁止某个技能
+    objmgr.LoadSpellDisabledEntrys();
+
     sLog.outString( "Loading Loot Tables..." );
     sLog.outString();
     LoadLootTables();


标签:技能
 

精彩评论2

倒序浏览
你懂的 发表于 2016-11-30 04:50:37 | 显示全部楼层
 
小白一个 顶一下,吾爱尚玩免费服务端下载!
 
微信 发表于 2016-11-9 17:20:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
 
VIP介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 最佳新人

    注册账号后积极发帖的会员
  • 活跃会员

    经常参与各类话题的讨论,发帖内容较有主见
  • 热心会员

    经常帮助其他会员答疑
  • 推广达人

    积极宣传本站,为本站带来更多注册会员
  • 宣传达人

    积极宣传本站,为本站带来更多的用户访问量
  • 灌水之王

    经常在论坛发帖,且发帖量较大
  • 突出贡献

    长期对论坛的繁荣而不断努力,或多次提出建设性意见
  • 优秀版主

    活跃且尽责职守的版主
  • 荣誉管理

    曾经为论坛做出突出贡献目前已离职的版主
  • 论坛元老

    为论坛做出突出贡献的会员

0关注

5粉丝

3421帖子

排行榜
作者专栏

QQ交流群&&微信订阅号

QQ交流群

微信订阅号

吾爱尚玩资源基地永久域名:

Www.523Play.Com

在线管理员QQ:1589479632

邮箱:Email@523play.com

QQ交流群:558936238

Copyright   ©2015-2116  吾爱尚玩资源基地|523play.comPowered by©523Pplay.Com技术支持:吾爱尚玩资源基地