Главная | Форум | Статьи | Фaйлы| Картинки WoW | Профиль | Регистрация | Вход

[ Новые сообщения · Правила форума · Поиск · RSS ]

WoW-Info — информационный World of Warcraft портал

[patch] Guild House - Форум

  • Сторінка 1 з 1
  • 1
[patch] Guild House
INFЕRNOДата: Середа, 30.05.2012, 19:47 | Сообщение # 1



INFЕRNO
Linux ~ root User
Чемпион
Группа: Best of the Best user Wow-info
Сообщений: 515

Замечания:

Оффлайн
Выкладываю для Вас "ровный" патч, осуществляющий покупку Guild House (Дома для Гильдии)

И так, опишу для тех, кто в этом совершенно ничего не понимает:

После компиляции сервера с данным патчем, Вы ставите в игре продавца Guild House, и при разговоре с ним вы увидите

Покупка Guild House (1000 голда)
Продажа Guild House (500 голда)
Телепорт в Guild House

Есстесственно, если игрок не в гильдии, то его никуда не телепортирует. И NPC скажет ему: "You need to be in a guild before you can use a GuildHouse."

Вобщем, если что то этому посону не понравится, на всё у него найдётся отмаза

Вот собственно сам патч:

Code
#include "ScriptPCH.h"  
#include <cstring>  

extern WorldDatabaseWorkerPool WorldDatabase;  

#define MSG_GOSSIP_TELE          "Teleport to GuildHouse"  
#define MSG_GOSSIP_BUY           "Buy GuildHouse (1000 gold)"  
#define MSG_GOSSIP_SELL          "Sell GuildHouse (500 gold)"  
#define MSG_GOSSIP_NEXTPAGE      "Next -->"  
#define MSG_INCOMBAT             "You are in combat and cannot be teleported to your GuildHouse."  
#define MSG_NOGUILDHOUSE         "Your guild currently does not own a GuildHouse."  
#define MSG_NOFREEGH             "Unfortunately, all GuildHouses are in use."  
#define MSG_ALREADYHAVEGH        "Sorry, but you already own a GuildHouse (%s)."  
#define MSG_NOTENOUGHMONEY       "You do not have the %u gold required to purchase a GuildHouse."  
#define MSG_GHOCCUPIED           "This GuildHouse is unavailable for purchase as it is currently in use."  
#define MSG_CONGRATULATIONS      "Congratulations! You have successfully purchased a GuildHouse."  
#define MSG_SOLD                 "You have sold your GuildHouse, you may now buy a new house!"  
#define MSG_NOTINGUILD           "You need to be in a guild before you can use a GuildHouse."  
#define MSG_NO_TOKEN                 "You must have the Guildhouse Token to be able to view the buylist."  

#define CODE_SELL "SELL"  
#define MSG_CODEBOX_SELL "Type \"" CODE_SELL "\" into the field to confirm that you want to sell your GuildHouse."  

#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 ACTION_SELL_GUILDHOUSE_OPT 1004  
#define ACTION_SELL_GUILDHOUSE_YES 1005  
#define ACTION_SELL_GUILDHOUSE_NO 1006  

#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 COST_GH_BUY 10000000 //1000 g.  
#define COST_GH_SELL 5000000 //500 g.  

#define GOSSIP_COUNT_MAX 10  

char str[200];  

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 result;  
     result = WorldDatabase.PQuery("SELECT `x`, `y`, `z`, `map` FROM `guildhouses` 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());  
     sprintf(str,"I am sorry %u but you must be in a guild!", player->GetName());  
     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  
         
     if(player->HasItemCount(30, 1))  
     {  

     QueryResult result;  
     result = WorldDatabase.PQuery("SELECT `id`, `comment` FROM `guildhouses` 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);  
     }  
     }  
     } else {  
     _creature->MonsterSay(MSG_NO_TOKEN, LANG_UNIVERSAL, player->GetGUID());  
     sprintf(str,"You must have a GuildHouse Token to view the shop lists.");  
     player->CLOSE_GOSSIP_MENU();  
     }  

     return false;  
}  

bool isPlayerHasGuildhouse(Player *player, Creature *_creature, bool whisper = false)  
{  
     QueryResult result;  
     result = WorldDatabase.PQuery("SELECT `comment` FROM `guildhouses` 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)  
{  
     if (player->GetMoney() < COST_GH_BUY)  
     {  
     //show how much money player need to buy GH (in gold)  
     char msg[100];  
     sprintf(msg, MSG_NOTENOUGHMONEY, COST_GH_BUY / 10000);  
     _creature->MonsterWhisper(msg, player->GetGUID());  
     return;  
     }  

     if (isPlayerHasGuildhouse(player, _creature, true))  
     {  
     //player already have GH  
     return;  
     }  

     QueryResult result;  

     //check if somebody already occupied this GH  
     result = WorldDatabase.PQuery("SELECT `id` FROM `guildhouses` WHERE `id` = %u AND `guildId` <> 0", guildhouseId);  

     if (result)  
     {  
     _creature->MonsterWhisper(MSG_GHOCCUPIED, player->GetGUID());  
     return;  
     }  

     //update DB  
     result = WorldDatabase.PQuery("UPDATE `guildhouses` SET `guildId` = %u WHERE `id` = %u",  
     player->GetGuildId(), guildhouseId);  

     if (result)  
     player->ModifyMoney(-COST_GH_BUY);  
     player->DestroyItemCount(30, 1, true, false);  
     _creature->MonsterSay(MSG_CONGRATULATIONS, LANG_UNIVERSAL, player->GetGUID());  
}  

void sellGuildhouse(Player *player, Creature *_creature)  
{  
     QueryResult result;  
     result = WorldDatabase.PQuery("UPDATE `guildhouses` SET `guildId` = 0 WHERE `guildId` = %u", player->GetGuildId());  

     if (result)  
     player->ModifyMoney(COST_GH_SELL);  
     _creature->MonsterSay(MSG_SOLD, LANG_UNIVERSAL, player->GetGUID());  
     player->CLOSE_GOSSIP_MENU();  
}  

class guildmaster : public CreatureScript  
{  
     public:  
     guildmaster() : CreatureScript("guildmaster") { }  

     bool GossipSelectWithCode(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) {sLog->outErrorDb(str);  
     }  

     if (i == 0)  
     {  
     //right code  
     sellGuildhouse(player, _creature);  
     }  

     player->CLOSE_GOSSIP_MENU();  
     return true;  
     }  
     }  
     return false;  
}  

     bool OnGossipSelect(Player *player, Creature *_creature, uint32 sender, uint32 action)  
     {  
     player->PlayerTalkClass->ClearMenus();  
     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;  

     case ACTION_SELL_GUILDHOUSE_OPT:  
     player->CLOSE_GOSSIP_MENU();  
     player->ADD_GOSSIP_ITEM(0, "Yes, Sell my guild", GOSSIP_SENDER_MAIN, ACTION_SELL_GUILDHOUSE_YES);  
     player->ADD_GOSSIP_ITEM(0, "No, Close this", GOSSIP_SENDER_MAIN, ACTION_SELL_GUILDHOUSE_NO);  
     player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, _creature->GetGUID());  
     break;  
         
     case ACTION_SELL_GUILDHOUSE_YES:  
     sellGuildhouse(player, _creature);  
     player->CLOSE_GOSSIP_MENU();  
     break;  
         
     case ACTION_SELL_GUILDHOUSE_NO:  
     player->CLOSE_GOSSIP_MENU();  
     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 OnGossipHello(Player *player, Creature *_creature)  
     {  
     player->ADD_GOSSIP_ITEM(ICON_GOSSIP_BALOON, MSG_GOSSIP_TELE,  
     GOSSIP_SENDER_MAIN, ACTION_TELE);  

     if (isPlayerGuildLeader(player))  
     {  
     if (isPlayerHasGuildhouse(player, _creature))  
     {  
     player->ADD_GOSSIP_ITEM(0, "Sell Guild House", GOSSIP_SENDER_MAIN, ACTION_SELL_GUILDHOUSE_OPT);  
     }  
     else  
     {  
     //show additional menu for guild leader  
     player->ADD_GOSSIP_ITEM(ICON_GOSSIP_GOLD, MSG_GOSSIP_BUY,  
     GOSSIP_SENDER_MAIN, ACTION_SHOW_BUYLIST);  
     }  
     }  

     player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, _creature->GetGUID());  
     return true;  
     }  

};  
void AddSC_guildmaster()  
{  
     new guildmaster();  
}


Источник: jp. smile
 
AirusДата: Субота, 29.09.2012, 23:14 | Сообщение # 2



Airus
Капрал
Группа: V.I.P
Сообщений: 63

Замечания:

Оффлайн
INFЕRNO, спс но ты уверен что он не крашит ядро?*
 
INFЕRNOДата: Субота, 29.09.2012, 23:33 | Сообщение # 3



INFЕRNO
Linux ~ root User
Чемпион
Группа: Best of the Best user Wow-info
Сообщений: 515

Замечания:

Оффлайн
Quote (Airus)
INFЕRNO, спс но ты уверен что он не крашит ядро?*

Я не ванга. Его не использовал
 
AirusДата: Неділя, 30.09.2012, 02:48 | Сообщение # 4



Airus
Капрал
Группа: V.I.P
Сообщений: 63

Замечания:

Оффлайн
INFЕRNO, я знаю что не ванга я проверил когда у моба жмёш чтобы купить местность он крашит ядро
но всеравно спасибо за развитие разделов TC
 
pivasДата: Неділя, 30.09.2012, 21:27 | Сообщение # 5



pivas
Капрал
Группа: Пользователи
Сообщений: 62

Замечания:

Оффлайн
INFЕRNO, эм... какие строки добавляются и куда, отпишите подробней
Ибо есть люди которые не понимают как и что

Добавлено (30.09.2012, 21:27)
---------------------------------------------
Airus, лог краша в студию



Рипаю сайты качественно.
Цена рипа в зависимости от сложности сайта.
Skype: slavicbu
ICQ: 646600913
Cлава.
 
INFЕRNOДата: Неділя, 30.09.2012, 22:47 | Сообщение # 6



INFЕRNO
Linux ~ root User
Чемпион
Группа: Best of the Best user Wow-info
Сообщений: 515

Замечания:

Оффлайн
Quote (pivas)
INFЕRNO, эм... какие строки добавляются и куда, отпишите подробней
Ибо есть люди которые не понимают как и что

Без знания С++ правил...
 
AirusДата: Понеділок, 01.10.2012, 01:16 | Сообщение # 7



Airus
Капрал
Группа: V.I.P
Сообщений: 63

Замечания:

Оффлайн
pivas, что его добавлять , создал новый текстовый документ вставил туда скрипт сохранил как guildmaster.cpp
кинул в src/server/game/scripts/custom
Объявил в cmakelist и в scriptloader(src/server/game/Scripting)
и всё ну если ошибки будут при компиляции то поправил потом в truice создаёш моба любого но в scriptname пишеш guildmaster
 
INFЕRNOДата: Понеділок, 01.10.2012, 15:53 | Сообщение # 8



INFЕRNO
Linux ~ root User
Чемпион
Группа: Best of the Best user Wow-info
Сообщений: 515

Замечания:

Оффлайн
pivas, руки решают. up
 
  • Сторінка 1 з 1
  • 1
Пошук:

Новые сообщения в темах
Сдам в аренду сервер и хостинг · (Хост Предложения)
Автор: redlaine
Последнее сообщение в 23:53
хаха :D · (Приколы)
Автор: [N1ke]Medved
Последнее сообщение в 18:40
Autobattle - новый боевой бот ... · (Боты для WoW)
Автор: terrikon
Последнее сообщение в 18:39
PvE руководство для Чернокнижн... · (Чернокнижник)
Автор: Darkensand
Последнее сообщение в 18:38
Пустой свиток (Часть 11) · (Истории WoW)
Автор: R_a_Z_o_R
Последнее сообщение в 18:37
Друиды в Катаклизме: Официальн... · (Друид)
Автор: Darkensand
Последнее сообщение в 18:37
[Баг 3.3.5] Фарм ледяных бадже... · (Читы для WoW)
Автор: Darkensand
Последнее сообщение в 18:35
FarmBot (Бот для фарма руды и ... · (Боты для WoW)
Автор: homma
Последнее сообщение в 18:34
Почему мы сражаемся: ролевая и... · (Воин)
Автор: Darkensand
Последнее сообщение в 18:34
Книги по Wold of Warcraft · (Истории WoW)
Автор: R_a_Z_o_R
Последнее сообщение в 18:33
Маг огня в Cataclysm · (Маг)
Автор: Darkensand
Последнее сообщение в 18:33
Как начать играть в World of W... · (Полезно знать)
Автор: Belkmondesh
Последнее сообщение в 18:32
Характеризация профессий · (Профессии)
Автор: Darkensand
Последнее сообщение в 18:31
Что значит для арканов бета те... · (Маг)
Автор: Darkensand
Последнее сообщение в 18:31

Контакты Контакты Copyright WoW-Info — World of Warcraft портал © 2026 | Условия и правила использования ресурса | Реклама / Услуги
WoW-Info портал.World of Warcraft портал — готовые сервера, сайты, картинки, аддоны, патчи, читы, баги, mangos, ArcEmu, TrinityCore, Warcraft 3, новости, Cataclysm...
Яндекс.Метрика Хостинг від uCoz