Modifikace MaNGOSe: Porovnání verzí
Z WoWResource Wiki
(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.
- 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);
- 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.
- 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; }