• Страница 1 из 1
  • 1
Модератор форума: Dimitro  
не работает скрипт
Mocosin
Капрал
Вот кусок скрипта
Код

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 = CharacterDatabase.PQuery("SELECT `id` FROM `guildhouses` WHERE `id` = %u AND `guildId` <> 0", guildhouseId);

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

    //update DB
    result = CharacterDatabase.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());
}

Именно
player->ModifyMoney(-COST_GH_BUY);
player->ModifyMoney(COST_GH_BUY);
не отнимает и не даёт голд, почему ?
Сообщение # 1 написано 01.11.2015 в 08:47
r0m1ntik
Центурион
enum Costs
{} у там стоит COST_GH_BUY ?
и
Цитата Mocosin ()
if (player->GetMoney() < COST_GH_BUY)

замените на if (player->GetMoney() >= COST_GH_BUY)
Сообщение # 2 написано 01.11.2015 в 12:00
Mocosin
Капрал
Цитата r0m1ntik ()
замените на if (player->GetMoney() >= COST_GH_BUY)

этот момент работает, проверяется отлично

Добавлено (01.11.2015, 12:27)
---------------------------------------------

Цитата Mocosin ()
enum Costs
{} у там стоит COST_GH_BUY ?

#define COST_GH_BUY 1000000000 //1000 g.
#define COST_GH_SELL 500000000 //500 g.
Сообщение # 3 написано 01.11.2015 в 12:27
r0m1ntik
Центурион
У вас ощибка не выходит так как вы используете 2 раза
Цитата
if (result)
? я бы 2ой заменил на if (result1) и
Цитата
result = CharacterDatabase.PQuery("UPDATE `guildhouses` SET `guildId` = %u WHERE `id` = %u",
player->GetGuildId(), guildhouseId);

на
result1 = CharacterDatabase.PQuery("UPDATE `guildhouses` SET `guildId` = %u WHERE `id` = %u",
player->GetGuildId(), guildhouseId);

Добавлено (01.11.2015, 12:52)
---------------------------------------------
Добавьтесь в скайп помогу, Skype: badanin.roman (франция бордо)

Сообщение # 4 написано 01.11.2015 в 12:52
p620
Маршал
Цитата r0m1ntik ()
У вас ощибка не выходит так как вы используете 2 раза

Чушь полная.

Цитата r0m1ntik ()
enum Costs{} у там стоит COST_GH_BUY ?

Еще одна. Программа бы не компилировалась в этом случае.

Цитата r0m1ntik ()
замените на if (player->GetMoney() >= COST_GH_BUY)

И еще одна. Вы проверяете, хватает ли у игрока денег на покупку, и, если да, говорите ему, что денег не хватает. Зато если на самом деле не хватает - он желанный клиент.

Цитата Mocosin ()
player->ModifyMoney(-COST_GH_BUY);player->ModifyMoney(COST_GH_BUY);

Потому что Вы эти инструкции засовываете под if(result), который является NULL'ом и интерпретируется как false, если запрос не возвращает никаких данных (не SELECT). Это абсолютно некорректно в данном случае.

Цитата Mocosin ()
Код
    QueryResult result;    //check if somebody already occupied this GH    result = CharacterDatabase.PQuery("SELECT `id` FROM `guildhouses` WHERE `id` = %u AND `guildId` <> 0", guildhouseId);    if (result)    {  _creature->MonsterWhisper(MSG_GHOCCUPIED, player->GetGUID());  return;    }

Запрос, улетающий при покупке, простить можно, но не запрос, улетающий при проверке. Лучше заставьте сервер читать все сведенья из базы на эту тему в оперативную память при его загрузке, писать туда же все изменения, сделанные за время работы (покупки/продажи), а при завершении его работы - накатывать UPDATE в базу со всеми этими изменениями. Ну и, само собой, для большей стабильности добавить в регулярное сохранение функционал по записи этих данных.

Цитата Mocosin ()
char msg[100]; sprintf(msg, MSG_NOTENOUGHMONEY, COST_GH_BUY / 10000); _creature->MonsterWhisper(msg, player->GetGUID());

И кстати, что это за фигня? =)
Сообщение # 5 отредактировано p620 - Воскресенье, 01.11.2015, 14:22
r0m1ntik
Центурион
Проблема уже решена, да и человек помощь просил а не коментарии о том о чем вы думаете.
Цитата

enum Costs
{
COST_GH_BUY = 1000000000, //1000 голды.
COST_GH_SELL = 500000000, //500 голды.
};
Еще одна. Программа бы не компилировалась в этом случае.


Вы уверены что не компилится ? Ошибаетесь
Сообщение # 6 написано 01.11.2015 в 18:38
p620
Маршал
Цитата r0m1ntik ()
Проблема уже решена, да и человек помощь просил а не коментарии о том о чем вы думаете.

Комментарий содержит не мои мысли, а факты, в частности, решение проблемы, было бы иначе - я бы заранее проинформировал. О том, что проблема была решена, нигде не написано. Просветите, как мне следовало догадаться об этом?
Цитата r0m1ntik ()
Вы уверены что не компилится ? Ошибаетесь

И не стоит искажать мои цитаты, я цитировал не определение перечисления, а Вашу совершенно неуместную догадку о возможной неопределенности используемого идентификатора, которая предположительно повлекла неправильную работу кода на этапе выполнения.
Сообщение # 7 написано 01.11.2015 в 19:09
  • Страница 1 из 1
  • 1
Поиск: