From 40ad1d8a29a5d1e99af3427f2deaf805db91000f Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sat, 9 Sep 2017 10:56:11 -0400 Subject: [PATCH] Figured out and implemented the Retainer scripts. --- .../chara/npc/object/RetainerFurniture.lua | 40 ++++++++++++--- .../chara/npc/retainer/OrdinaryRetainer.lua | 29 ++++++++--- data/scripts/retainer.lua | 51 +++++++++++++++++++ 3 files changed, 105 insertions(+), 15 deletions(-) create mode 100644 data/scripts/retainer.lua diff --git a/data/scripts/base/chara/npc/object/RetainerFurniture.lua b/data/scripts/base/chara/npc/object/RetainerFurniture.lua index 559e42bc..1e82cbd6 100644 --- a/data/scripts/base/chara/npc/object/RetainerFurniture.lua +++ b/data/scripts/base/chara/npc/object/RetainerFurniture.lua @@ -10,23 +10,47 @@ eventPushRetainerCallCaution() - Shows warning that a open bazaar will be closed eventTalkRetainerMenu(hasPossessions, showDispatchChoice) - Opens retainer menu. eventTalkRetainerDismissal(hasPossessions) - Show dismiss confirmation. eventTalkRetainerMannequin(0:Enable/1:Disable) - Shows dialog to enable/disable modeling. -eventTalkRetainerItemTrade(?) - ??Opens retainer storage?? -eventTalkRetainerItemList(?) - ??Opens bazaar?? -eventReturnResult(?, ?) - ??Trade related?? +eventTalkRetainerItemTrade(operationCode) - Operate RetainerTradeWidget. Codes: 1 - Open, 2 - Select Mode, 3 - Close. +eventTalkRetainerItemList(operationCode) - Operate Bazaar Widget. Codes: 1 - Open, 2 - Select Mode, 3 - Close. +eventReturnResult(resultCode, ?) - Redraws the RetainerTrade UI. eventTalkSelectBazaarStreet(limitsWardChoices) - Shows the dialog to send a retainer to a street. Set to 20. eventTalkFinish() - Finishs the talk with retainer eventPlayerTurn(rotation) - Turns the player --]] require ("global") +require ("retainer") function init(npc) return false, false, 0, 0; end function onEventStarted(player, npc, triggerName) - retainerNumber = callClientFunction(player, "eventPushRetainerCallCaution", true, false); - --player:SpawnMyRetainer(npc, retainerNumber); - --callClientFunction(player, "eventRingBell"); - player:EndEvent(); -end \ No newline at end of file + retainerNumber = callClientFunction(player, "eventPushStepOpenRetainerMenu"); + + if (retainerNumber == nil or retainerNumber == 0) then + player:EndEvent(); + return; + end + + callClientFunction(player, "eventRingBell"); + retainer = player:SpawnMyRetainer(npc, retainerNumber); + + while (true) do + choice = callClientFunction(player, "eventTalkRetainerMenu", false, true); + if (choice == 1) then + doItemTrade(player, npc); + elseif (choice == 2) then + doBazaar(player, npc); + elseif (choice == 7) then + callClientFunction(player, "eventTalkRetainerMannequin", 0); + elseif (choice == 8) then + callClientFunction(player, "eventTalkSelectBazaarStreet", 20); + else + break; + end + end + + player:DespawnMyRetainer(); + player:EndEvent(); +end diff --git a/data/scripts/base/chara/npc/retainer/OrdinaryRetainer.lua b/data/scripts/base/chara/npc/retainer/OrdinaryRetainer.lua index b98603da..69f13f70 100644 --- a/data/scripts/base/chara/npc/retainer/OrdinaryRetainer.lua +++ b/data/scripts/base/chara/npc/retainer/OrdinaryRetainer.lua @@ -8,9 +8,9 @@ eventTalkRetainerOther() - eventTalkRetainerMenu(mode, hasPossessions) - Opens the main menu. If mode == 2, hide dismiss option. eventTalkRetainerDismissal(hasPossessions) - Show dismiss confirmation. eventTalkRetainerMannequin(0:enable/1:disable confirm) - Show bazaar modeling confirmation. -eventTalkRetainerItemTrade(?) - ??Opens retainer storage?? -eventTalkRetainerItemList(?) - ??Opens bazaar?? -eventReturnResult(?, ?) - ??Trade related?? +eventTalkRetainerItemTrade(operationCode) - Operate RetainerTradeWidget. Codes: 1 - Open, 2 - Select Mode, 3 - Close. +eventTalkRetainerItemList(operationCode) - Operate Bazaar Widget. Codes: 1 - Open, 2 - Select Mode, 3 - Close. +eventReturnResult(resultCode, ?) - Redraws the RetainerTrade UI. sayToPlayer(actorClassId, messageType, argument) - Makes the retainer say a phrase to the player. eventTalkFinish() - Stops npc from looking at player. eventPlayerTurn(angle) - Turns player to angle. @@ -18,14 +18,29 @@ eventPlayerTurn(angle) - Turns player to angle. --]] require ("global") +require ("retainer") function init(npc) return false, false, 0, 0; end -function onEventStarted(player, npc, triggerName) +function onEventStarted(player, retainer, triggerName) + + while (true) do + choice = callClientFunction(player, "eventTalkRetainerMenu", 1); + if (choice == 1) then + doItemTrade(player, retainer); + elseif (choice == 2) then + doBazaar(player, retainer); + elseif (choice == 7) then + callClientFunction(player, "eventTalkRetainerMannequin", 0); + elseif (choice == 5) then + player:DespawnMyRetainer(); + else + break; + end + end - callClientFunction(player, "eventTalkRetainerItemList", 1); - --callClientFunction(player, "eventTalkRetainerDismissal", 0, false); player:EndEvent(); -end \ No newline at end of file + +end diff --git a/data/scripts/retainer.lua b/data/scripts/retainer.lua new file mode 100644 index 00000000..e142d95e --- /dev/null +++ b/data/scripts/retainer.lua @@ -0,0 +1,51 @@ +--[[ + +Common Retainer Stuff + +Retainer Say Codes: + +1: Hired +2: When called +3: Error when cannot call retainer +4: Dismissed +5: ?? +6: Sold X items report. +7: Nothing got sold. +8: Retainer payed??? +9: Retainer dismissed due to not paid. +10: Retainer dismissed by player. + + +--]] + +function doItemTrade(player, retainer) + callClientFunction(player, "eventTalkRetainerItemTrade", 1); + + while (true) do + resultCode, type7Param, un1, quantity, itemId, unk2 = callClientFunction(player, "eventTalkRetainerItemTrade", 2); + + --Retreieve + if (resultCode == 31) then + --UpdatePlayer + --UpdateRetainer + --Entrust + elseif (resultCode == 32) then + --UpdatePlayer + --UpdateRetainer + end + + callClientFunction(player, "eventReturnResult", resultCode, false); + + if (resultCode == 100) then + break + end + end + + callClientFunction(player, "eventTalkRetainerItemTrade", 3); +end + +function doBazaar(player, retainer) + callClientFunction(player, "eventTalkRetainerItemList", 1); + callClientFunction(player, "eventTalkRetainerItemList", 2); + callClientFunction(player, "eventTalkRetainerItemList", 3); +end \ No newline at end of file