[C++] Egyedi tárgy aktivitás ellenőrzés (Quest-ben)

Indította udvatt108, 2018-01-16, 19:12:44

2018-01-16, 19:12:44 Utolsó szerkesztés: 2018-01-17, 11:20:15 Szerző: udvatt108
Sziasztok!

Felvetült itt a fórumon egy segítség kérőnél, hogy nem tudja Quest-ben ellenőrizni a Tolvaj kesztyű aktivitását, hogy az használatban van, vagy sem. Ezért ma írtam egy funkciót, ami nem csak a Tolvaj kesztyűt képes ellenőrizni, hanem sok mást is, amelyekről lentebb találsz információt.

A funkció be tétele:
#questlua_pc.cpp (Itt találod: /game/src/)
- Keresd meg ezt:
#include "stdafx.h"

- És helyezd közvetlen alá ezt:

#include <sstream>
#include "questlua.h"


- Keresd meg ezt:

int pc_is_dead(lua_State* L)
{
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();

if ( ch != NULL )
{
lua_pushboolean(L, ch->IsDead());
return 1;
}

lua_pushboolean(L, true);

return 1;
}


- És helyezd közvetlen alá ezt:

int pc_is_unique_item(lua_State * L) 
{
ostringstream s;
combine_lua_string(L, s);
std::string unique = s.str();

if(unique.empty())
{
lua_pushboolean(L, false);
return 1;
}

DWORD checkID = 0;
if(unique == "TEARDROP_OF_GODNESS") checkID = UNIQUE_ITEM_TEARDROP_OF_GODNESS;
else if(unique == "RING_OF_LANGUAGE") checkID = UNIQUE_ITEM_RING_OF_LANGUAGE;
else if(unique == "RING_OF_LANGUAGE_SAMPLE") checkID = UNIQUE_ITEM_RING_OF_LANGUAGE_SAMPLE;
else if(unique == "CAPE_OF_COURAGE") checkID = UNIQUE_ITEM_CAPE_OF_COURAGE;
else if(unique == "HALF_STAMINA") checkID = UNIQUE_ITEM_HALF_STAMINA;
else if(unique == "HIDE_ALIGNMENT_TITLE") checkID = UNIQUE_ITEM_HIDE_ALIGNMENT_TITLE;
else if(unique == "SKIP_ITEM_DROP_PENALTY") checkID = UNIQUE_ITEM_SKIP_ITEM_DROP_PENALTY;
else if(unique == "FASTER_ALIGNMENT_UP_BY_TIME") checkID = UNIQUE_ITEM_FASTER_ALIGNMENT_UP_BY_TIME;
else if(unique == "FASTER_ALIGNMENT_UP_BY_KILL") checkID = UNIQUE_ITEM_FASTER_ALIGNMENT_UP_BY_KILL;
else if(unique == "NO_BAD_LUCK_EFFECT") checkID = UNIQUE_ITEM_NO_BAD_LUCK_EFFECT;
else if(unique == "LARBOR_MEDAL") checkID = UNIQUE_ITEM_LARBOR_MEDAL;
else if(unique == "DOUBLE_EXP") checkID = UNIQUE_ITEM_DOUBLE_EXP;
else if(unique == "DOUBLE_ITEM") checkID = UNIQUE_ITEM_DOUBLE_ITEM;
else if(unique == "SAFEBOX_EXPAND") checkID = UNIQUE_ITEM_SAFEBOX_EXPAND;
else if(unique == "AUTOLOOT_GOLD") checkID = UNIQUE_ITEM_AUTOLOOT_GOLD;
else if(unique == "EMOTION_MASK") checkID = UNIQUE_ITEM_EMOTION_MASK;
else if(unique == "EMOTION_MASK2") checkID = UNIQUE_ITEM_EMOTION_MASK2;

if(checkID > 0){
LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
lua_pushboolean(L, ch->IsEquipUniqueItem(checkID) ? true : false);
}else{
lua_pushboolean(L, false);
}
return 1;
}


- Keresd meg ezt:
{ "is_dead", pc_is_dead },

- És helyezd közvetlen alá ezt:
{ "is_unique_item", pc_is_unique_item },

#quest_functions:
- Keresd meg ezt:
pc.warp

És helyezd közvetlen alá ezt:
pc.is_unique_item

Így tudod majd használni:
pc.is_unique_item("AZONOSÍTÓ")
(Egy true vagy false, az-az igaz vagy hamis értékkel fog visszatérni.)
Fontos, hogy az azonosítót tegyük mindig két idézőjel közé, akár csak ahogyan fentebb és a példában látjátok.

A funkció használatára egy példa a questben:

if pc.is_unique_item("DOUBLE_ITEM") then --Így ellenőrzöm, hogy a Tolvaj kesztyű aktív-e a játékosnál, ha igaz, akkor nyilván a "Aktív a tolvaj kesztyű." üzenet fog megjelenni és ellenkező esetben pedig a másik.
say("Aktív a tolvaj kesztyű.")
else
say("Nem aktív a tolvaj kesztyű.")
end


További ellenőrizhető tárgy aktivitás azonosítók és a vonatkoztatásuk:

#Azonosító - Vonatkoztatás

TEARDROP_OF_GODNESS - Istennői könny
RING_OF_LANGUAGE - Nyelv gyűrű
RING_OF_LANGUAGE_SAMPLE - Nyelv gyűrű (Minta)
CAPE_OF_COURAGE - Bátorság köpeny
HALF_STAMINA - Ork makacsság
HIDE_ALIGNMENT_TITLE - Menekült köpeny
SKIP_ITEM_DROP_PENALTY - Lucy gyűrűje
FASTER_ALIGNMENT_UP_BY_TIME - Bölcs császár szimbóluma
FASTER_ALIGNMENT_UP_BY_KILL - Bölcs császár kesztyűje
NO_BAD_LUCK_EFFECT - Karma varázslat
LARBOR_MEDAL - Szorgalom medálja
DOUBLE_EXP - Tapasztalat gyűrű
DOUBLE_ITEM - Tolvaj kesztyű
SAFEBOX_EXPAND - Raktár láda
AUTOLOOT_GOLD - Harmadik kéz
EMOTION_MASK - Érzelem maszk
EMOTION_MASK2 - Érzelem maszk (Kettő van belőle)


Nos az azonosítókat azért tettem szöveges alapúra és nem integer, az-az számbelire, mert így könnyeben átlátható és felismerhető a Questeken belül.

A funkciót teszteltem, és tökéletesen működik!

Ha hasznát tudtátok venni, akkor nyomjatok egy Thank you-t!  ;)
Ne másoljátok máshova, vagy legalább jelöljétek meg, hogy tőlem származik!

Pacsi!
Egy programozási nyelv akkor alacsony szintű, ha arra kényszeríti az embert, hogy az érdektelen dolgokra is odafigyeljen.