finish rookgard addon quests and fix stages for rookslayers

This commit is contained in:
ErikasKontenis
2019-12-11 12:24:42 +02:00
parent bff1f93560
commit dd0b032c9f
9 changed files with 191 additions and 4 deletions

View File

@@ -303,6 +303,9 @@ bool BehaviourDatabase::loadActions(ScriptReader& script, NpcBehaviour* behaviou
} else if (identifier == "delete") {
action->type = BEHAVIOUR_TYPE_DELETE;
searchType = BEHAVIOUR_PARAMETER_ONE;
} else if (identifier == "deleteamount") {
action->type = BEHAVIOUR_TYPE_DELETEAMOUNT;
searchType = BEHAVIOUR_PARAMETER_TWO;
} else if (identifier == "teachspell") {
action->type = BEHAVIOUR_TYPE_TEACHSPELL;
searchType = BEHAVIOUR_PARAMETER_ONE;
@@ -327,6 +330,12 @@ bool BehaviourDatabase::loadActions(ScriptReader& script, NpcBehaviour* behaviou
} else if (identifier == "setquestvalue") {
action->type = BEHAVIOUR_TYPE_QUESTVALUE;
searchType = BEHAVIOUR_PARAMETER_TWO;
} else if (identifier == "setexpiringquestvalue") {
action->type = BEHAVIOUR_TYPE_EXPIRINGQUESTVALUE;
searchType = BEHAVIOUR_PARAMETER_TWO;
} else if (identifier == "addoutfitaddon") {
action->type = BEHAVIOUR_TYPE_ADDOUTFITADDON;
searchType = BEHAVIOUR_PARAMETER_TWO;
} else if (identifier == "poison") {
action->type = BEHAVIOUR_TYPE_POISON;
searchType = BEHAVIOUR_PARAMETER_TWO;
@@ -523,6 +532,10 @@ NpcBehaviourNode* BehaviourDatabase::readValue(ScriptReader& script)
node = new NpcBehaviourNode();
node->type = BEHAVIOUR_TYPE_QUESTVALUE;
searchType = BEHAVIOUR_PARAMETER_ONE;
} else if (identifier == "expiringquestvalue") {
node = new NpcBehaviourNode();
node->type = BEHAVIOUR_TYPE_EXPIRINGQUESTVALUE;
searchType = BEHAVIOUR_PARAMETER_ONE;
} else if (identifier == "count") {
node = new NpcBehaviourNode();
node->type = BEHAVIOUR_TYPE_COUNT;
@@ -854,6 +867,19 @@ void BehaviourDatabase::checkAction(const NpcBehaviourAction* action, Player* pl
}
break;
}
case BEHAVIOUR_TYPE_DELETEAMOUNT: {
type = evaluate(action->expression, player, message);
int32_t amount = evaluate(action->expression2, player, message);
const ItemType& itemType = Item::items[type];
if (itemType.stackable || !itemType.hasSubType()) {
data = -1;
}
if (!player->removeItemOfType(type, amount, data, true)) {
player->removeItemOfType(type, amount, data, false);
}
break;
}
case BEHAVIOUR_TYPE_EFFECTME:
g_game.addMagicEffect(npc->getPosition(), evaluate(action->expression, player, message));
break;
@@ -904,6 +930,18 @@ void BehaviourDatabase::checkAction(const NpcBehaviourAction* action, Player* pl
player->addStorageValue(questNumber, questValue);
break;
}
case BEHAVIOUR_TYPE_EXPIRINGQUESTVALUE: {
int32_t questNumber = evaluate(action->expression, player, message);
int32_t ticks = evaluate(action->expression2, player, message);
player->addStorageValue(questNumber, OTSYS_TIME() + ticks);
break;
}
case BEHAVIOUR_TYPE_ADDOUTFITADDON: {
int32_t lookType = evaluate(action->expression, player, message);
int32_t addon = evaluate(action->expression2, player, message);
player->addOutfit(lookType, addon);
break;
}
case BEHAVIOUR_TYPE_TELEPORT: {
Position pos;
pos.x = evaluate(action->expression, player, message);
@@ -1072,6 +1110,12 @@ int32_t BehaviourDatabase::evaluate(NpcBehaviourNode* node, Player* player, cons
player->getStorageValue(questNumber, questValue);
return questValue;
}
case BEHAVIOUR_TYPE_EXPIRINGQUESTVALUE: {
int32_t questNumber = evaluate(node->left, player, message);
int32_t questValue;
player->getStorageValue(questNumber, questValue);
return questValue - OTSYS_TIME();
}
case BEHAVIOUR_TYPE_MESSAGE_COUNT: {
int32_t value = searchDigit(message);
if (value < node->number) {

View File

@@ -86,6 +86,9 @@ enum NpcBehaviourType_t
BEHAVIOUR_TYPE_CREATECONTAINER, // create a container of an item in particular
BEHAVIOUR_TYPE_TOWN, // change player town
BEHAVIOUR_TYPE_DRUNK, // get/set drunk (set not done)
BEHAVIOUR_TYPE_ADDOUTFITADDON, // Add Outfit Addon
BEHAVIOUR_TYPE_DELETEAMOUNT, // deletes an item according specified amount
BEHAVIOUR_TYPE_EXPIRINGQUESTVALUE, // get/set expiring quest value
};
enum NpcBehaviourOperator_t

View File

@@ -2052,6 +2052,11 @@ void LuaScriptInterface::registerFunctions()
registerMethod("Player", "getParty", LuaScriptInterface::luaPlayerGetParty);
registerMethod("Player", "addOutfit", LuaScriptInterface::luaPlayerAddOutfit);
registerMethod("Player", "addOutfitAddon", LuaScriptInterface::luaPlayerAddOutfitAddon);
registerMethod("Player", "removeOutfit", LuaScriptInterface::luaPlayerRemoveOutfit);
registerMethod("Player", "removeOutfitAddon", LuaScriptInterface::luaPlayerRemoveOutfitAddon);
registerMethod("Player", "hasOutfit", LuaScriptInterface::luaPlayerHasOutfit);
registerMethod("Player", "sendOutfitWindow", LuaScriptInterface::luaPlayerSendOutfitWindow);
registerMethod("Player", "getPremiumDays", LuaScriptInterface::luaPlayerGetPremiumDays);
@@ -8259,6 +8264,80 @@ int LuaScriptInterface::luaPlayerGetParty(lua_State* L)
return 1;
}
int LuaScriptInterface::luaPlayerAddOutfit(lua_State* L)
{
// player:addOutfit(lookType)
Player* player = getUserdata<Player>(L, 1);
if (player) {
player->addOutfit(getNumber<uint16_t>(L, 2), 0);
pushBoolean(L, true);
}
else {
lua_pushnil(L);
}
return 1;
}
int LuaScriptInterface::luaPlayerAddOutfitAddon(lua_State* L)
{
// player:addOutfitAddon(lookType, addon)
Player* player = getUserdata<Player>(L, 1);
if (player) {
uint16_t lookType = getNumber<uint16_t>(L, 2);
uint8_t addon = getNumber<uint8_t>(L, 3);
player->addOutfit(lookType, addon);
pushBoolean(L, true);
}
else {
lua_pushnil(L);
}
return 1;
}
int LuaScriptInterface::luaPlayerRemoveOutfit(lua_State* L)
{
// player:removeOutfit(lookType)
Player* player = getUserdata<Player>(L, 1);
if (player) {
uint16_t lookType = getNumber<uint16_t>(L, 2);
pushBoolean(L, player->removeOutfit(lookType));
}
else {
lua_pushnil(L);
}
return 1;
}
int LuaScriptInterface::luaPlayerRemoveOutfitAddon(lua_State* L)
{
// player:removeOutfitAddon(lookType, addon)
Player* player = getUserdata<Player>(L, 1);
if (player) {
uint16_t lookType = getNumber<uint16_t>(L, 2);
uint8_t addon = getNumber<uint8_t>(L, 3);
pushBoolean(L, player->removeOutfitAddon(lookType, addon));
}
else {
lua_pushnil(L);
}
return 1;
}
int LuaScriptInterface::luaPlayerHasOutfit(lua_State* L)
{
// player:hasOutfit(lookType[, addon = 0])
Player* player = getUserdata<Player>(L, 1);
if (player) {
uint16_t lookType = getNumber<uint16_t>(L, 2);
uint8_t addon = getNumber<uint8_t>(L, 3, 0);
pushBoolean(L, player->canWear(lookType, addon));
}
else {
lua_pushnil(L);
}
return 1;
}
int LuaScriptInterface::luaPlayerSendOutfitWindow(lua_State* L)
{
// player:sendOutfitWindow()

View File

@@ -882,6 +882,11 @@ class LuaScriptInterface
static int luaPlayerGetParty(lua_State* L);
static int luaPlayerAddOutfit(lua_State* L);
static int luaPlayerAddOutfitAddon(lua_State* L);
static int luaPlayerRemoveOutfit(lua_State* L);
static int luaPlayerRemoveOutfitAddon(lua_State* L);
static int luaPlayerHasOutfit(lua_State* L);
static int luaPlayerSendOutfitWindow(lua_State* L);
static int luaPlayerGetPremiumDays(lua_State* L);