• Страница 1 из 1
  • 1
Архив - только для чтения
Модератор форума: andycrowz  
Форум » Корзина форума » Корзина » XP Giver (не дописал)
XP Giver
keonji
I ♥ S-PB
В общем скрипт не работает. Не правильно сделана проверка лвл и выдача XP.
Кто может поправьте и скиньте сюда.
Code
/* ScriptData
SDName: xp_giver
SD%Complete: 90%
SDComment: Give XP for Gold
SDCategory: NPC
SDAuthor: keonji
SDEditor: KiritoSS
EndScriptData */

#include "precompiled.h"

bool GossipHello_xp_giver(Player* pPlayer, Creature* pCreature)
{
     if (pPlayer->GetTeam() == ALLIANCE)
     {
             pPlayer->ADD_GOSSIP_ITEM( 9, "1,000 XP [1 gold]"        , GOSSIP_SENDER_MAIN, 1000);
             pPlayer->ADD_GOSSIP_ITEM( 9, "10,000 XP [10 gold]"        , GOSSIP_SENDER_MAIN, 2000);
             pPlayer->ADD_GOSSIP_ITEM( 9, "100,000 XP [100 gold]"        , GOSSIP_SENDER_MAIN, 3000);
    pPlayer->ADD_GOSSIP_ITEM( 9, "500,000 XP [500 gold]"        , GOSSIP_SENDER_MAIN, 4000);
    pPlayer->ADD_GOSSIP_ITEM( 9, "1,000,000 XP [1000 gold]"        , GOSSIP_SENDER_MAIN, 5000);
    pPlayer->ADD_GOSSIP_ITEM( 9, "5,000,000 XP [5000 gold]"        , GOSSIP_SENDER_MAIN, 6000);
     }
     else
     {
             pPlayer->ADD_GOSSIP_ITEM( 9, "1,000 XP [1 gold]"        , GOSSIP_SENDER_MAIN, 1000);
             pPlayer->ADD_GOSSIP_ITEM( 9, "10,000 XP [10 gold]"        , GOSSIP_SENDER_MAIN, 2000);
             pPlayer->ADD_GOSSIP_ITEM( 9, "100,000 XP [100 gold]"        , GOSSIP_SENDER_MAIN, 3000);
    pPlayer->ADD_GOSSIP_ITEM( 9, "500,000 XP [500 gold]"        , GOSSIP_SENDER_MAIN, 4000);
    pPlayer->ADD_GOSSIP_ITEM( 9, "1,000,000 XP [1000 gold]"        , GOSSIP_SENDER_MAIN, 5000);
    pPlayer->ADD_GOSSIP_ITEM( 9, "5,000,000 XP [5000 gold]"        , GOSSIP_SENDER_MAIN, 6000);
     }

     pPlayer->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE,pCreature->GetGUID());

     return true;
}

void SendDefaultMenu_xp_giver(Player* pPlayer, Creature* pCreature, uint32 uiAction)
{

     //Combat Check
     if (pPlayer->isInCombat())
     {
         pPlayer->CLOSE_GOSSIP_MENU();
         pCreature->MonsterWhisper("You are in combat!", pPlayer, NULL);
         return;
     }
          
     //Money Check
     if (pPlayer->GetMoney() <0)
     {
         pPlayer->CLOSE_GOSSIP_MENU();
         pCreature->MonsterWhisper("You don't have enough money.", pPlayer, false);
         return;
     }
   
  //LVL Check
     if (pPlayer->GetLevel() >= 80)
     {
         pPlayer->CLOSE_GOSSIP_MENU();
         pCreature->MonsterWhisper("You are already level 80!", pPlayer, false);
         return;
     }
   
      switch(uiAction)
     {
   case 1000: //1,000 XP
       {
             pPlayer->ModifyXPValue(+1000);
             pPlayer->ModifyMoney(-10000);
             pPlayer->CLOSE_GOSSIP_MENU();
             }
         break;
    
   case 2000: //10,000 XP
    {
             pPlayer->ModifyXPValue(+10000);
             pPlayer->ModifyMoney(-100000);
             pPlayer->CLOSE_GOSSIP_MENU();
             }
    break;
    
   case 3000: //100,000 XP
    {
             pPlayer->ModifyXPValue(+100000);
             pPlayer->ModifyMoney(-1000000);
             pPlayer->CLOSE_GOSSIP_MENU();
             }
    break;
    
   case 4000: //500,000 XP
    {
             pPlayer->ModifyXPValue(+500000);
             pPlayer->ModifyMoney(-5000000);
             pPlayer->CLOSE_GOSSIP_MENU();
             }
    break;
    
   case 5000: //1,000,000 XP
    {
             pPlayer->ModifyXPValue(+1000000);
             pPlayer->ModifyMoney(-1000000);
             pPlayer->CLOSE_GOSSIP_MENU();
             }
    break;
    
   case 6000: //5,000,000 XP
    {
             pPlayer->ModifyXPValue(+5000000);
             pPlayer->ModifyMoney(-50000000);
             pPlayer->CLOSE_GOSSIP_MENU();
             }
    break;
     
    pPlayer->CLOSE_GOSSIP_MENU();
     }
}

bool GossipSelect_xp_giver(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction)
{
     // Main menu
     if (uiSender == GOSSIP_SENDER_MAIN)
         SendDefaultMenu_xp_giver(pPlayer, pCreature, uiAction);

     return true;
}

void AddSC_xp_giver()
{
     Script *newscript;

     newscript                   = new Script;
     newscript->Name             = "xp_giver";
     newscript->pGossipHello     = &GossipHello_xp_giver;
     newscript->pGossipSelect    = &GossipSelect_xp_giver;
     newscript->RegisterSelf();
}
  
Сообщение # 1 написано 16.01.2011 в 21:12
lanc
The Hurt Locker
XP giver (test)

тестируйте)

Прикрепления: xp_giver_mangos.sql (2.1 Kb) · xp_giver_script.sql (1.6 Kb)
Сообщение # 2 написано 16.01.2011 в 23:23
keonji
I ♥ S-PB
lanc,
Но все равно проблема

Code
error C2039: ModifyXPValue: не является членом "Player"
Сообщение # 3 написано 17.01.2011 в 15:29
keonji
I ♥ S-PB
lanc, З.Ы.
Немного не правильно было, вот чуть-чуть переделанный вариант:
Code
/* Copyright (C) 2006 - 2010 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
   
/* ScriptData
SDName: xp_giver
SD%Complete:  
SDComment: Give XP for Gold
SDCategory: NPC
SDAuthor: orginal author: KiritoSS, keonji, restore work lanc <img src="http://s8.ucoz.net/sm/1/wink.gif" border="0" align="absmiddle" alt="wink">
EndScriptData */
   
#include "precompiled.h"
#include "sc_creature.h"
#include "sc_gossip.h"
long long int gold;
int costgold;
   
enum
{
     SAY_COMBAT             = -1960200,
     SAY_NOMONEY            = -1960201,
     SAY_FAILLEVEL          = -1960202,
   
     GOSSIP_XP01            = -3000060,
     GOSSIP_XP02            = -3000061,
     GOSSIP_XP03            = -3000062,
     GOSSIP_XP04            = -3000063,
     GOSSIP_XP05            = -3000064,
     GOSSIP_XP06            = -3000065,
     GOSSIP_MENU_XP_GIVER   = 11001,
};
   
bool GossipHello_xp_giver(Player* pPlayer, Creature* pCreature)
{
     pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_XP01, GOSSIP_SENDER_MAIN, 1000);
     pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_XP02, GOSSIP_SENDER_MAIN, 1001);
     pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_XP03, GOSSIP_SENDER_MAIN, 1002);
     pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_XP04, GOSSIP_SENDER_MAIN, 1003);
     pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_XP05, GOSSIP_SENDER_MAIN, 1004);
     pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_XP06, GOSSIP_SENDER_MAIN, 1005);  
     pPlayer->SEND_GOSSIP_MENU(GOSSIP_MENU_XP_GIVER, pCreature->GetGUID());  
     return true;
}
   
void SendDefaultMenu_xp_giver(Player* pPlayer, Creature* m_creature, uint32 uiAction)  
{
     if (!pPlayer->getAttackers().empty())
     {
         pPlayer->CLOSE_GOSSIP_MENU();
         DoScriptText(SAY_COMBAT, m_creature);
         return;
     }
   
     gold = pPlayer->GetMoney();
     costgold = 10000;
   
     if (gold < costgold)
     {
         pPlayer->CLOSE_GOSSIP_MENU();
         DoScriptText(SAY_NOMONEY, m_creature);
         return;
     }
   
     if (pPlayer->getLevel() >= 80)
     {
         pPlayer->CLOSE_GOSSIP_MENU();
         DoScriptText(SAY_FAILLEVEL, m_creature);
         return;
     }
   
     switch(uiAction)
     {
         case 1000:
             pPlayer->ModifyXPValue(+1000);
             pPlayer->ModifyMoney(-1*costgold);
             pPlayer->CLOSE_GOSSIP_MENU();
             break;
         case 1001:
             pPlayer->ModifyXPValue(+10000);
             pPlayer->ModifyMoney(-10*costgold);
             pPlayer->CLOSE_GOSSIP_MENU();
             break;
         case 1002:
             pPlayer->ModifyXPValue(+100000);
             pPlayer->ModifyMoney(-100*costgold);
             pPlayer->CLOSE_GOSSIP_MENU();
             break;
         case 1003:
             pPlayer->ModifyXPValue(+500000);
             pPlayer->ModifyMoney(-5000*costgold);
             pPlayer->CLOSE_GOSSIP_MENU();
             break;
         case 1004:
             pPlayer->ModifyXPValue(+1000000);
             pPlayer->ModifyMoney(-10000*costgold);
             pPlayer->CLOSE_GOSSIP_MENU();
             break;
         case 1005:
             pPlayer->ModifyXPValue(+5000000);
             pPlayer->ModifyMoney(-50000*costgold);
             pPlayer->CLOSE_GOSSIP_MENU();
             break;
     }
     pPlayer->CLOSE_GOSSIP_MENU();
}
   
bool GossipSelect_xp_giver(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction)
{
     // Main menu
     if (uiSender == GOSSIP_SENDER_MAIN)  
         SendDefaultMenu_xp_giver(pPlayer, pCreature, uiAction);
   
     return true;
}
   
void AddSC_xp_giver()  
{  
     Script* pNewScript;
   
     pNewScript = new Script;
     pNewScript->Name = "xp_giver";
     pNewScript->pGossipHello = &GossipHello_xp_giver;
     pNewScript->pGossipSelect = &GossipSelect_xp_giver;
     pNewScript->RegisterSelf();
}
Сообщение # 4 написано 17.01.2011 в 15:30
lanc
The Hurt Locker
Quote (keonji)
Немного не правильно было, вот чуть-чуть переделанный вариант:

чем же он отличается от моего варианта?
заменив:

Code

- if (pPlayer->getLevel() > 80) && (pPlayer->getLevel() = 80)
+if (pPlayer->getLevel() >= 80)

получите warning'и в компиляторе только, а сути условия оно не изменит, можна и так и так...

проверка на левел = 80 вабще не нужна, > 80 вполне достаточно, на 80 уровне чару уже опыт не нужен!

Quote (keonji)
error C2039: ModifyXPValue: не является членом "Player"

нету) хоть вариант переписан из тринити я там тоже нечего подобного не видел
возможно нужно добавить чтото вроде вот такой функции:

Code

void Player::ModifyXPValue( int32 value )
{
       if(value < 0)
       {
           if (GetXPForLevel() > sWorld.getConfig(CONFIG_FLOAT_RATE_XP_KILL))
               SetUInt32Value(PLAYER_NEXT_LEVEL_XP, sWorld.getConfig(CONFIG_FLOAT_RATE_XP_KILL) + value);
           else
               SetUInt32Value(PLAYER_NEXT_LEVEL_XP, GetXPForLevel() > uint32(-value) ? GetXPForLevel() + value : 0);
       }
       else
           SetUInt32Value(PLAYER_NEXT_LEVEL_XP, GetXPForLevel() < sWorld.getConfig(CONFIG_FLOAT_RATE_XP_KILL) - value ? GetXPForLevel() + value : sWorld.getConfig(CONFIG_FLOAT_RATE_XP_KILL));
}

в Player и обьявить ее

Сообщение # 5 отредактировано lanc - Понедельник, 17.01.2011, 16:16
keonji
I ♥ S-PB
lanc,
Quote (lanc)
получите warning'и в компиляторе только, а сути условия оно не изменит, можна и так и так...

У меня ерроры были из-зы этого (На отсутствие ; ругался в тех местах, где она не нужна.)
Quote (lanc)
возможно нужно добавить чтото вроде вот такой функции

Я тоже об этом подумывал. Можно её даже custom командой сделать. Если к примеру не нужно добавлять лвл, а некоторое количество XP
Сообщение # 6 написано 17.01.2011 в 16:19
lanc
The Hurt Locker
хотите, делайте)

если соберетесь делать в ядре новую функцию и команду загляните в то место где происходит награда опыта за квест и при убийстве, чемто да поможет

Сообщение # 7 отредактировано lanc - Понедельник, 17.01.2011, 16:44
keonji
I ♥ S-PB
lanc, + error был при
pPlayer->CLOSE_GOSSIP_MENU();
return true;

Я убрал return true;

Сообщение # 8 написано 17.01.2011 в 16:27
lanc
The Hurt Locker
keonji, вай) это да, это ошибка))) протупил я, уберите Player->CLOSE_GOSSIP_MENU(); из конца функции она там не нужна, она есть в GossipSelect, просто я перепутал функции и автоматом влепил в дефолтное меню закрывачку)
Сообщение # 9 написано 17.01.2011 в 16:43
ph3n
Developer
Данная тема была перемещена из раздела Патчи в ядро MaNGOS.
Причина перемещения: устарело

Переместил: ph3n.
Сообщение # 10 написано 15.10.2012 в 16:37
Форум » Корзина форума » Корзина » XP Giver (не дописал)
  • Страница 1 из 1
  • 1
Поиск: