Modifikace MaNGOSe: Porovnání verzí

Z WoWResource Wiki
Přejít na: navigace, hledání
(init page)
 
m (příkaz: připojení do bg)
Řádek 24: Řádek 24:
 
             me->SendNewItem(item,LOOT_ITEM_COUNT,false,false);
 
             me->SendNewItem(item,LOOT_ITEM_COUNT,false,false);
 
     }
 
     }
 +
}
 +
 +
== Příkaz: Připojení do fronty na battleground ==
 +
'''Pro MaNGOS bez Arena patche '''
 +
bool ChatHandler::HandleBgCommand(const char* args)
 +
{
 +
    if (!*args)
 +
        return false;
 +
 +
    uint8 bgTypeId = 0;
 +
 +
    if (stricmp(args, "wsg") == 0) bgTypeId = 2;
 +
    if (stricmp(args, "ab" ) == 0) bgTypeId = 3;
 +
    if (stricmp(args, "eye") == 0) bgTypeId = 7;
 +
 +
    if (bgTypeId >= MAX_BATTLEGROUND_TYPES || !bgTypeId)
 +
        return false;
 +
 +
    Player* me = m_session->GetPlayer();
 +
 +
    if (me->InBattleGround() || !me->CanJoinToBattleground())
 +
        return false;
 +
 +
    BattleGround *bg = sBattleGroundMgr.GetBattleGround(bgTypeId);
 +
    if (!bg)
 +
        return false;
 +
 +
    if (me->InBattleGroundQueueForBattleGroundType(bgTypeId))
 +
        return false;
 +
 +
    uint32 queueSlot = me->AddBattleGroundQueueId(bgTypeId);
 +
    if (queueSlot == PLAYER_MAX_BATTLEGROUND_QUEUES)
 +
        return false;
 +
 +
    me->SetBattleGroundEntryPoint(me->GetMapId(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
 +
 +
    WorldPacket data;
 +
    sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, me->GetTeam(), queueSlot, STATUS_WAIT_QUEUE, 0, 0);
 +
    m_session->SendPacket(&data);
 +
 +
    sBattleGroundMgr.m_BattleGroundQueues[bgTypeId].AddPlayer(me, bgTypeId);
 +
    return true;
 
  }
 
  }
  
 
[[Kategorie:Scripty]]
 
[[Kategorie:Scripty]]

Verze z 29. 8. 2008, 09:18

Vytvoření vlastního příkazu

Na vytvoření nového příkazu je nutné definovat ho na několika místech.

  1. Soubor Chat.h musí obsahovat jeho hlavičku ve třídě ChatHandler. Návratová hodnota každého příkazu je bool a vstupními argumenty je const char*. Jako šablonu lze tedy vždy použít: bool Handle<NázevPříkazu>Command(const char *args);
  2. Je nutné vytvořit kód příkazu, vzhledem ke struktuře přístupových práv v MaNGOSu (rozdělených na 0,1,2,3) se příkazy řadí do souborů Level<0-3>.cpp, případně debugcmds.cpp. Návratová hodnota je true pokud vše proběhlo v pořádku, při návratu false je oznámen Syntax error.
  3. Zbývá nastavit na jaký .příkaz bude ve hře tento kód vykonán. Toto se nastavuje v souboru Chat.cpp v poli commandTable (nebo jiném pokud chcete zařadit do nějaké podkategorie příkazů nebo vytvořit vlastní). Řádek pak obsahuje: { "příkazVeHře", SEC_<přístopová práva>, &ChatHandler::Handle<NázevPříkazu>Command, "", <NULL nebo název dalšího pole příkazů> }, Prázdný řetězec slouží jako pole pro nápovědu, která je načtena z databáze. Nový příkaz bude fungovat i bez záznamu v db v tabulce commands, ale nebude obsahovat nápovědu.

Když hráč zabije hráče

Pro možnost přidání peněz nebo předmětu za zabití hráče. Otevřete soubor Unit.cpp a najděte metodu DealDamage(). Poté nalezněte podmínku if (health <= damage) a blok pod touto podmínkou zpracovává zabití nepřítele. Pro ověření, že hráč zabil hráče stačí jednoduchá podmínka if(GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() == TYPEID_PLAYER). Pokud chcete ověřit i zda-li hráč byl z druhé frakce přidejte podmínku ((Player*)this)->GetTeam() != ((Player*)pVictim)->GetTeam(), případně přidat vlastní další podmínky (ověření levelu, opakovaného zabíjení,...)

  • Pro udělení pěnez stačí požít funkci Player::ModifyMoney(<o kolik>);
  • Pro přidání itemu lze použít:
#define LOOT_ITEM_ID 9014555 /* entry předmětu */
#define LOOT_ITEM_COUNT 1 /* počet předmětů, které obdrží */

if(GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() == TYPEID_PLAYER && ((Player*)this)->GetTeam() != ((Player*)pVictim)->GetTeam())
{
    Player *me = (Player*)this;
    ItemPosCountVec dest;
    uint8 msg = me->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, LOOT_ITEM_ID, LOOT_ITEM_COUNT);
    if( msg == EQUIP_ERR_OK )
    {
        Item* item = me->StoreNewItem( dest, LOOT_ITEM_ID, true, Item::GenerateItemRandomPropertyId(LOOT_ITEM_ID));
        if(item)
            me->SendNewItem(item,LOOT_ITEM_COUNT,false,false);
    }
}

Příkaz: Připojení do fronty na battleground

Pro MaNGOS bez Arena patche

bool ChatHandler::HandleBgCommand(const char* args)
{
    if (!*args)
        return false;

    uint8 bgTypeId = 0;

    if (stricmp(args, "wsg") == 0) bgTypeId = 2;
    if (stricmp(args, "ab" ) == 0) bgTypeId = 3;
    if (stricmp(args, "eye") == 0) bgTypeId = 7;

    if (bgTypeId >= MAX_BATTLEGROUND_TYPES || !bgTypeId)
        return false;

    Player* me = m_session->GetPlayer();

    if (me->InBattleGround() || !me->CanJoinToBattleground())
        return false;

    BattleGround *bg = sBattleGroundMgr.GetBattleGround(bgTypeId);
    if (!bg)
        return false;

    if (me->InBattleGroundQueueForBattleGroundType(bgTypeId))
        return false;

    uint32 queueSlot = me->AddBattleGroundQueueId(bgTypeId);
    if (queueSlot == PLAYER_MAX_BATTLEGROUND_QUEUES)
        return false;

    me->SetBattleGroundEntryPoint(me->GetMapId(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());

    WorldPacket data;
    sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, me->GetTeam(), queueSlot, STATUS_WAIT_QUEUE, 0, 0);
    m_session->SendPacket(&data);

    sBattleGroundMgr.m_BattleGroundQueues[bgTypeId].AddPlayer(me, bgTypeId);
    return true;
}