吾爱尚玩资源基地

标题: M端私服模拟器公会房间代码C++(TBC) [打印本页]

作者: admin    时间: 2016-4-20 22:57
标题: M端私服模拟器公会房间代码C++(TBC)
diff -Nuar oregoncore-current/sql/CMakeLists.txt oregoncore-pq/sql/CMakeLists.txt--- oregoncore-current/sql/CMakeLists.txt        2011-01-01 10:03:07.000000000 -0500
+++ oregoncore-pq/sql/CMakeLists.txt        2011-01-01 10:13:14.000000000 -0500
@@ -1,6 +1,7 @@
add_subdirectory(updates)
add_subdirectory(tools)
add_subdirectory(scripts)
+add_subdirectory(oc-patch)


########### install files ###############
diff -Nuar oregoncore-current/sql/oc-patch/CMakeLists.txt oregoncore-pq/sql/oc-patch/CMakeLists.txt
--- oregoncore-current/sql/oc-patch/CMakeLists.txt        1969-12-31 19:00:00.000000000 -0500
+++ oregoncore-pq/sql/oc-patch/CMakeLists.txt        2011-01-01 10:13:14.000000000 -0500
@@ -0,0 +1,6 @@
+
+########### install files ###############
+
+FILE(GLOB _SQL *.sql)
+
+install(FILES ${_SQL} DESTINATION share/oregon/sql/oc-patch)
diff -Nuar oregoncore-current/sql/oc-patch/world-guildhouse.sql oregoncore-pq/sql/oc-patch/world-guildhouse.sql
--- oregoncore-current/sql/oc-patch/world-guildhouse.sql        1969-12-31 19:00:00.000000000 -0500
+++ oregoncore-pq/sql/oc-patch/world-guildhouse.sql        2011-01-01 10:13:14.000000000 -0500
@@ -0,0 +1,28 @@
+--
+-- Table structure for table `guild_houses`
+--
+
+CREATE TABLE IF NOT EXISTS `guild_houses` (
+  `id` int(8) unsigned NOT NULL auto_increment,
+  `guildId` bigint(20) NOT NULL default '0',
+  `x` double NOT NULL,
+  `y` double NOT NULL,
+  `z` double NOT NULL,
+  `map` int(11) NOT NULL,
+  `comment` varchar(255) NOT NULL default '',
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=22 ;
+
+--
+-- Dumping data for table `guild_houses`
+--
+
+INSERT INTO `guild_houses` (`id`, `guildId`, `x`, `y`, `z`, `map`, `comment`) VALUES
+(1, 1, 16222, 16266, 14.2, 1, 'GM Island'),
+(2, 0, -10711, 2483, 8, 1, 'Village on the Veiled Sea (Silithus)'),
+(3, 0, -8323, -343, 146, 0, 'Elwynn Falls Camp (Elwynn Forest)'),
+(4, 0, -1840, -4233, 2.14, 0, 'Arathi Village (Arathi Highlands, Forbidding Sea)'),
+(5, 0, -6374, 1262, 7, 0, 'Harbor House (Elwynn Forest)'),
+(6, 0, 4303, -2760, 16.8, 0, 'Quel''Thalas Tower');
+
+
diff -Nuar oregoncore-current/src/game/ScriptLoader.cpp oregoncore-pq/src/game/ScriptLoader.cpp
--- oregoncore-current/src/game/ScriptLoader.cpp        2011-01-01 10:03:08.000000000 -0500
+++ oregoncore-pq/src/game/ScriptLoader.cpp        2011-01-01 10:13:14.000000000 -0500
@@ -11,6 +11,9 @@

#ifdef SCRIPTS

+//custom
+void AddSC_npc_guildmaster();
+
//examples
//void AddSC_custom_example();
//void AddSC_custom_gossip_codebox();
@@ -379,6 +382,10 @@
void AddScripts()
{
#ifdef SCRIPTS
+
+    //Custom
+    AddSC_npc_guildmaster();
+
//    AddSC_custom_example();
//    AddSC_custom_gossip_codebox();
//    AddSC_test();
diff -Nuar oregoncore-current/src/oregoncore/oregoncore.conf.dist oregoncore-pq/src/oregoncore/oregoncore.conf.dist
--- oregoncore-current/src/oregoncore/oregoncore.conf.dist        2011-01-01 10:03:08.000000000 -0500
+++ oregoncore-pq/src/oregoncore/oregoncore.conf.dist        2011-01-01 10:13:14.000000000 -0500
@@ -1891,6 +1891,32 @@
###############################################################################
# CUSTOM SERVER OPTIONS
#
+#    GuildMasterNPC.BuyEnabled
+#        Allow players to buy Guild Houses.
+#        Default: 1 (Yes)
+#                 0 (No)
+#
+#    GuildMasterNPC.BuyGossip
+#        Text for buy menu option (good idea to include price)
+#        Default: "Buy a Guild House for 500 Gold"
+#
+#    GuildMasterNPC.BuyPriceInGold
+#        Amount in gold needed to purchase a guild house.
+#        Default: 500 (Gold)
+#
+#    GuildMasterNPC.SellEnabled
+#        Allow players to sell Guild Houses.
+#        Default: 1 (Yes)
+#                 0 (No)
+#
+#    GuildMasterNPC.SellGossip
+#        Text for sell menu option (good idea to include price)
+#        Default: "Sell your Guild House for 400 Gold"
+#
+#    GuildMasterNPC.SellPriceInGold
+#        Amount of gold given to player when selling guild house.
+#        Default: 400 (Gold)
+#
#    PlayerStart.AllReputation
#        Players will start with most of the high level reputations that are
#         needed for items, mounts etc.
@@ -1983,6 +2009,12 @@
#
###############################################################################

+GuildMasterNPC.BuyEnabled = 1
+GuildMasterNPC.BuyGossip = "Buy a Guild House for 500 Gold"
+GuildMasterNPC.BuyPriceInGold = 500
+GuildMasterNPC.SellEnabled = 1
+GuildMasterNPC.SellGossip = "Sell your GuildHouse for 400 Gold"
+GuildMasterNPC.SellPriceInGold = 400
PlayerStart.AllReputation = 0
PlayerStart.AllSpells = 0
PlayerStart.MapsExplored = 0
diff -Nuar oregoncore-current/src/scripts/Custom/npc_guildmaster.cpp oregoncore-pq/src/scripts/Custom/npc_guildmaster.cpp
--- oregoncore-current/src/scripts/Custom/npc_guildmaster.cpp        1969-12-31 19:00:00.000000000 -0500
+++ oregoncore-pq/src/scripts/Custom/npc_guildmaster.cpp        2011-01-01 10:13:14.000000000 -0500
@@ -0,0 +1,338 @@
+/* ScriptData
+SDName: GuildMaster
+SD%Complete: 95
+SDComment: Guild House Master
+SDCategory: NPC
+EndScriptData */
+
+#include "ScriptPCH.h"
+#include "Config/Config.h"
+
+extern DatabaseType WorldDatabase;
+
+#define MSG_GOSSIP_TELE          "Teleport to Guild House"
+#define MSG_GOSSIP_NEXTPAGE      "Next -->"
+#define MSG_INCOMBAT             "You are in battle!"
+#define MSG_NOGUILDHOUSE         "Your guild does not have a Guild House."
+#define MSG_NOFREEGH             "Unfortunately, all the Guild Houses have been sold."
+#define MSG_ALREADYHAVEGH        "Sorry, but you already have a Guild House (%s)."
+#define MSG_NOTENOUGHMONEY       "You must have %u gold to buy a Guild House."
+#define MSG_GHOCCUPIED           "Unfortunately, this Guild House is already in use."
+#define MSG_CONGRATULATIONS      "Congratulations! You now own a Guild House."
+#define MSG_SOLD                 "You sold your Guild House. Here is %u in gold."
+#define MSG_NOTINGUILD           "You are not in a guild!"
+
+#define CODE_SELL                "SELL"
+#define MSG_CODEBOX_SELL         "Enter \"" CODE_SELL "\" to sell your Guild House."
+
+#define OFFSET_GH_ID_TO_ACTION   1500
+#define OFFSET_SHOWBUY_FROM      10000
+
+#define ACTION_TELE              1001
+#define ACTION_SHOW_BUYLIST      1002  //deprecated. Use (OFFSET_SHOWBUY_FROM + 0) instead
+#define ACTION_SELL_GUILDHOUSE   1003
+
+#define ICON_GOSSIP_BALOON       0
+#define ICON_GOSSIP_WING         2
+#define ICON_GOSSIP_BOOK         3
+#define ICON_GOSSIP_WHEEL1       4
+#define ICON_GOSSIP_WHEEL2       5
+#define ICON_GOSSIP_GOLD         6
+#define ICON_GOSSIP_BALOONDOTS   7
+#define ICON_GOSSIP_TABARD       8
+#define ICON_GOSSIP_XSWORDS      9
+
+#define GOSSIP_COUNT_MAX         10
+
+bool isPlayerGuildLeader(Player *player)
+{
+    return (player->GetRank() == 0) && (player->GetGuildId() != 0);
+}
+
+bool getGuildHouseCoords(uint32 guildId, float &x, float &y, float &z, uint32 &map)
+{
+    if (guildId == 0)
+    {
+        //if player has no guild
+        return false;
+    }
+
+    QueryResult_AutoPtr result = WorldDatabase.PQuery("SELECT `x`, `y`, `z`, `map` FROM `guild_houses` WHERE `guildId` = %u", guildId);
+    if(result)
+    {
+        Field *fields = result->Fetch();
+        x = fields[0].GetFloat();
+        y = fields[1].GetFloat();
+        z = fields[2].GetFloat();
+        map = fields[3].GetUInt32();
+        return true;
+    }
+    return false;
+}
+
+void teleportPlayerToGuildHouse(Player *player, Creature *_creature)
+{
+    if (player->GetGuildId() == 0)
+    {
+        //if player has no guild
+        _creature->MonsterWhisper(MSG_NOTINGUILD, player->GetGUID());
+        return;
+    }
+
+    if (!player->getAttackers().empty())
+    {
+        //if player in combat
+        _creature->MonsterSay(MSG_INCOMBAT, LANG_UNIVERSAL, player->GetGUID());
+        return;
+    }
+
+    float x, y, z;
+    uint32 map;
+
+    if (getGuildHouseCoords(player->GetGuildId(), x, y, z, map))
+    {
+        //teleport player to the specified location
+        player->TeleportTo(map, x, y, z, 0.0f);
+    }
+    else
+        _creature->MonsterWhisper(MSG_NOGUILDHOUSE, player->GetGUID());
+
+}
+
+bool showBuyList(Player *player, Creature *_creature, uint32 showFromId = 0)
+{
+    //show not occupied guildhouses
+
+    QueryResult_AutoPtr result = WorldDatabase.PQuery("SELECT `id`, `comment` FROM `guild_houses` WHERE `guildId` = 0 AND `id` > %u ORDER BY `id` ASC LIMIT %u",
+        showFromId, GOSSIP_COUNT_MAX);
+
+    if (result)
+    {
+        uint32 guildhouseId = 0;
+        std::string comment = "";
+        do
+        {
+
+            Field *fields = result->Fetch();
+
+            guildhouseId = fields[0].GetInt32();
+            comment = fields[1].GetString();
+            
+            //send comment as a gossip item
+            //transmit guildhouseId in Action variable
+            player->ADD_GOSSIP_ITEM(ICON_GOSSIP_TABARD, comment, GOSSIP_SENDER_MAIN,
+                guildhouseId + OFFSET_GH_ID_TO_ACTION);
+
+        } while (result->NextRow());
+
+        if (result->GetRowCount() == GOSSIP_COUNT_MAX)
+        {
+            //assume that we have additional page
+            //add link to next GOSSIP_COUNT_MAX items
+            player->ADD_GOSSIP_ITEM(ICON_GOSSIP_BALOONDOTS, MSG_GOSSIP_NEXTPAGE, GOSSIP_SENDER_MAIN,
+                guildhouseId + OFFSET_SHOWBUY_FROM);
+        }
+
+        player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, _creature->GetGUID());
+
+        return true;
+    } else
+    {
+        if (showFromId == 0)
+        {
+            //all guildhouses are occupied
+            _creature->MonsterWhisper(MSG_NOFREEGH, player->GetGUID());
+            player->CLOSE_GOSSIP_MENU();
+        } else
+        {
+            //this condition occurs when COUNT(guildhouses) % GOSSIP_COUNT_MAX == 0
+            //just show GHs from beginning
+            showBuyList(player, _creature, 0);
+        }
+    }
+
+    return false;
+}
+
+bool isPlayerHasGuildhouse(Player *player, Creature *_creature, bool whisper = false)
+{
+
+    QueryResult_AutoPtr result = WorldDatabase.PQuery("SELECT `comment` FROM `guild_houses` WHERE `guildId` = %u",
+        player->GetGuildId());
+
+    if (result)
+    {
+        if (whisper)
+        {
+            //whisper to player "already have etc..."
+            Field *fields = result->Fetch();
+            char msg[100];
+            sprintf(msg, MSG_ALREADYHAVEGH, fields[0].GetString());
+            _creature->MonsterWhisper(msg, player->GetGUID());
+        }
+
+        return true;
+    }
+    return false;
+
+}
+
+void buyGuildhouse(Player *player, Creature *_creature, uint32 guildhouseId)
+{
+    uint32 buyprice = (sConfig.GetIntDefault("GuildMasterNPC.BuyPriceInGold",500)*10000);
+    if (player->GetMoney() < buyprice)
+    {
+        //show how much money player need to buy GH (in gold)
+        char msg[100];
+        sprintf(msg, MSG_NOTENOUGHMONEY, buyprice / 10000);
+        _creature->MonsterWhisper(msg, player->GetGUID());
+        return;
+    }
+
+    if (isPlayerHasGuildhouse(player, _creature, true))
+    {
+        //player already have GH
+        return;
+    }
+
+    //check if somebody already occupied this GH
+    QueryResult_AutoPtr result = WorldDatabase.PQuery("SELECT `id` FROM `guild_houses` WHERE `id` = %u AND `guildId` <> 0",
+        guildhouseId);
+
+    if (result)
+    {
+        _creature->MonsterWhisper(MSG_GHOCCUPIED, player->GetGUID());
+        return;
+    }
+
+    //update DB
+    QueryResult_AutoPtr result_updt = WorldDatabase.PQuery("UPDATE `guild_houses` SET `guildId` = %u WHERE `id` = %u",
+        player->GetGuildId(), guildhouseId);
+   
+    player->ModifyMoney(-buyprice);
+    _creature->MonsterSay(MSG_CONGRATULATIONS, LANG_UNIVERSAL, player->GetGUID());
+   
+}
+
+void sellGuildhouse(Player *player, Creature *_creature)
+{
+    uint32 sellprice = (sConfig.GetIntDefault("GuildMasterNPC.SellPriceInGold",400)*10000);
+    if (isPlayerHasGuildhouse(player, _creature))
+    {
+        QueryResult_AutoPtr result = WorldDatabase.PQuery("UPDATE `guild_houses` SET `guildId` = 0 WHERE `guildId` = %u",
+        player->GetGuildId());
+        
+        player->ModifyMoney(sellprice);
+
+        //display message e.g. "here your money etc."
+        char msg[100];
+        sprintf(msg, MSG_SOLD, (sellprice/10000));
+        _creature->MonsterWhisper(msg, player->GetGUID());
+    }
+}
+
+bool GossipHello_npc_guildmaster(Player *player, Creature *_creature)
+{
+    player->ADD_GOSSIP_ITEM(ICON_GOSSIP_BALOON, MSG_GOSSIP_TELE,
+        GOSSIP_SENDER_MAIN, ACTION_TELE);
+
+    if (isPlayerGuildLeader(player))
+    {
+        uint8 buyEnabled = sConfig.GetIntDefault("GuildMasterNPC.BuyEnabled", 1);
+        if ( buyEnabled == 1 )
+        {
+            //show additional menu for guild leader
+            std::string buyGHGossip = sConfig.GetStringDefault("GuildMasterNPC.BuyGossip", "Buy a Guild House for 500 Gold");
+            player->ADD_GOSSIP_ITEM(ICON_GOSSIP_GOLD, buyGHGossip,
+                GOSSIP_SENDER_MAIN, ACTION_SHOW_BUYLIST);
+        }
+        if (isPlayerHasGuildhouse(player, _creature))
+        {
+            uint8 sellEnabled = sConfig.GetIntDefault("GuildMasterNPC.SellEnabled", 1);
+            if ( sellEnabled == 1 )
+            {
+                //and additional for guildhouse owner
+                std::string sellGHGossip = sConfig.GetStringDefault("GuildMasterNPC.SellGossip", "Sell your Guild House for 400 Gold");
+                player->PlayerTalkClass->GetGossipMenu().AddMenuItem(ICON_GOSSIP_GOLD, sellGHGossip, GOSSIP_SENDER_MAIN, ACTION_SELL_GUILDHOUSE, MSG_CODEBOX_SELL, 0, true);
+            }
+        }
+    }
+    player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, _creature->GetGUID());
+    return true;
+}
+
+
+bool GossipSelect_npc_guildmaster(Player *player, Creature *_creature, uint32 sender, uint32 action )
+{
+    if (sender != GOSSIP_SENDER_MAIN)
+        return false;
+
+    switch (action)
+    {
+        case ACTION_TELE:
+            //teleport player to GH
+            player->CLOSE_GOSSIP_MENU();
+            teleportPlayerToGuildHouse(player, _creature);
+            break;
+        case ACTION_SHOW_BUYLIST:
+            //show list of GHs which currently not occupied
+            showBuyList(player, _creature);
+            break;
+        default:
+            if (action > OFFSET_SHOWBUY_FROM)
+            {
+                showBuyList(player, _creature, action - OFFSET_SHOWBUY_FROM);
+            } else if (action > OFFSET_GH_ID_TO_ACTION)
+            {
+                //player clicked on buy list
+                player->CLOSE_GOSSIP_MENU();
+                //get guildhouseId from action
+                //guildhouseId = action - OFFSET_GH_ID_TO_ACTION
+                buyGuildhouse(player, _creature, action - OFFSET_GH_ID_TO_ACTION);
+            }
+            break;
+    }
+   
+    return true;
+}
+
+bool GossipSelectWithCode_npc_guildmaster( Player *player, Creature *_creature,
+                                      uint32 sender, uint32 action, const char* sCode )
+{
+    if(sender == GOSSIP_SENDER_MAIN)
+    {
+        if(action == ACTION_SELL_GUILDHOUSE)
+        {
+            int i = -1;
+            try
+            {
+                //compare code
+                if (strlen(sCode) + 1 == sizeof CODE_SELL)
+                    i = strcmp(CODE_SELL, sCode);
+
+            } catch(char *str) {error_db_log(str);}
+
+            if (i == 0)
+            {
+                //right code
+                sellGuildhouse(player, _creature);
+            }
+            player->CLOSE_GOSSIP_MENU();
+            return true;
+        }
+    }
+    return false;
+}
+
+
+void AddSC_npc_guildmaster()
+{
+    Script *newscript;
+    newscript = new Script;
+    newscript->Name = "npc_guildmaster";
+    newscript->pGossipHello = &GossipHello_npc_guildmaster;
+    newscript->pGossipSelect = &GossipSelect_npc_guildmaster;
+    newscript->pGossipSelectWithCode =  &GossipSelectWithCode_npc_guildmaster;
+    newscript->RegisterSelf();
+}
+


回复下载完整代码





作者: 无毒    时间: 2019-8-5 12:32
回复下载完整代码




欢迎光临 吾爱尚玩资源基地 (http://bbs.523play.com/) Powered by Discuz! X3.4