diff --git a/data-canary/npc/king_canary.lua b/data-canary/npc/king_canary.lua new file mode 100644 index 00000000000..edaafc482cb --- /dev/null +++ b/data-canary/npc/king_canary.lua @@ -0,0 +1,174 @@ +local internalNpcName = "King Canary" +local npcType = Game.createNpcType(internalNpcName) +local npcConfig = {} + +npcConfig.name = internalNpcName +npcConfig.description = internalNpcName + +npcConfig.health = 100 +npcConfig.maxHealth = npcConfig.health +npcConfig.walkInterval = 2000 +npcConfig.walkRadius = 2 + +npcConfig.outfit = { + lookType = 332, +} + +npcConfig.flags = { + floorchange = false, +} + +local keywordHandler = KeywordHandler:new() +local npcHandler = NpcHandler:new(keywordHandler) + +npcType.onThink = function(npc, interval) + npcHandler:onThink(npc, interval) +end + +npcType.onAppear = function(npc, creature) + npcHandler:onAppear(npc, creature) +end + +npcType.onDisappear = function(npc, creature) + npcHandler:onDisappear(npc, creature) +end + +npcType.onMove = function(npc, creature, fromPosition, toPosition) + npcHandler:onMove(npc, creature, fromPosition, toPosition) +end + +npcType.onSay = function(npc, creature, type, message) + npcHandler:onSay(npc, creature, type, message) +end + +npcType.onCloseChannel = function(npc, creature) + npcHandler:onCloseChannel(npc, creature) +end + +local function creatureSayCallback(npc, creature, type, message) + local player = Player(creature) + local playerId = player:getId() + + if not npcHandler:checkInteraction(npc, creature) then + return false + end + + if (MsgContains(message, "outfit")) or (MsgContains(message, "addon")) then + npcHandler:say("In exchange for a truly generous donation, I will offer a special outfit. Do you want to make a donation?", npc, creature) + npcHandler:setTopic(playerId, 1) + elseif MsgContains(message, "yes") then + if npcHandler:getTopic(playerId) == 1 then + npcHandler:say({ + "Excellent! Now, let me explain. If you donate 1.000.000.000 gold pieces, you will be entitled to wear a unique outfit. ...", + "You will be entitled to wear the {armor} for 500.000.000 gold pieces, {helmet} for an additional 250.000.000 and the {boots} for another 250.000.000 gold pieces. ...", + "What will it be?", + }, npc, creature) + npcHandler:setTopic(playerId, 2) + elseif npcHandler:getTopic(playerId) == 2 then + npcHandler:say("In that case, return to me once you made up your mind.", npc, creature) + npcHandler:setTopic(playerId, 0) + elseif npcHandler:getTopic(playerId) == 3 then + if player:kv():get("golden-outfit-quest") < 1 then + if player:getMoney() + player:getBankBalance() >= 500000000 then + local inbox = player:getStoreInbox() + local inboxItems = inbox:getItems() + if inbox and #inboxItems <= inbox:getMaxCapacity() then + local decoKit = inbox:addItem(ITEM_DECORATION_KIT, 1) + local decoItemName = ItemType(31510):getName() + decoKit:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, "You bought this item in the Store.\nUnwrap it in your own house to create a " .. decoItemName .. ".") + decoKit:setCustomAttribute("unWrapId", 31510) + npcHandler:say("Take this armor as a token of great gratitude. Let us forever remember this day, my friend!", npc, creature) + player:removeMoneyBank(500000000) + player:addOutfit(1211) + player:addOutfit(1210) + player:getPosition():sendMagicEffect(CONST_ME_EARLY_THUNDERs) + player:kv():set("golden-outfit-quest", 1) + else + npcHandler:say("Please make sure you have free slots in your store inbox.", npc, creature) + end + else + npcHandler:say("You do not have enough money to donate that amount.", npc, creature) + end + else + npcHandler:say("You alread have that addon.", npc, creature) + end + npcHandler:setTopic(playerId, 2) + elseif npcHandler:getTopic(playerId) == 4 then + if player:kv():get("golden-outfit-quest") == 1 then + if player:kv():get("golden-outfit-quest") < 2 then + if player:getMoney() + player:getBankBalance() >= 250000000 then + npcHandler:say("Take this helmet as a token of great gratitude. Let us forever remember this day, my friend. ", npc, creature) + player:removeMoneyBank(250000000) + player:addOutfitAddon(1210, 1) + player:addOutfitAddon(1211, 1) + player:getPosition():sendMagicEffect(CONST_ME_EARLY_THUNDER) + player:kv():set("golden-outfit-quest", 2) + npcHandler:setTopic(playerId, 2) + else + npcHandler:say("You do not have enough money to donate that amount.", npc, creature) + npcHandler:setTopic(playerId, 2) + end + else + npcHandler:say("You alread have that outfit.", npc, creature) + npcHandler:setTopic(playerId, 2) + end + else + npcHandler:say("You need to donate {armor} outfit first.", npc, creature) + npcHandler:setTopic(playerId, 2) + end + npcHandler:setTopic(playerId, 2) + elseif npcHandler:getTopic(playerId) == 5 then + if player:kv():get("golden-outfit-quest") == 2 then + if player:kv():get("golden-outfit-quest") < 3 then + if player:getMoney() + player:getBankBalance() >= 250000000 then + npcHandler:say("Take this boots as a token of great gratitude. Let us forever remember this day, my friend. ", npc, creature) + player:removeMoneyBank(250000000) + player:addOutfitAddon(1210, 2) + player:addOutfitAddon(1211, 2) + player:getPosition():sendMagicEffect(CONST_ME_EARLY_THUNDER) + player:kv():set("golden-outfit-quest", 3) + npcHandler:setTopic(playerId, 2) + else + npcHandler:say("You do not have enough money to donate that amount.", npc, creature) + npcHandler:setTopic(playerId, 2) + end + else + npcHandler:say("You alread have that outfit.", npc, creature) + npcHandler:setTopic(playerId, 2) + end + else + npcHandler:say("You need to donate {helmet} addon first.", npc, creature) + npcHandler:setTopic(playerId, 2) + end + npcHandler:setTopic(playerId, 2) + end + elseif (MsgContains(message, "armor")) and npcHandler:getTopic(playerId) == 2 then + npcHandler:say("So you would like to donate 500.000.000 gold pieces which in return will entitle you to wear a unique armor?", npc, creature) + npcHandler:setTopic(playerId, 3) + elseif (MsgContains(message, "helmet")) and npcHandler:getTopic(playerId) == 2 then + npcHandler:say("So you would like to donate 250.000.000 gold pieces which in return will entitle you to wear unique helmet?", npc, creature) + npcHandler:setTopic(playerId, 4) + elseif (MsgContains(message, "boots")) and npcHandler:getTopic(playerId) == 2 then + npcHandler:say("So you would like to donate 250.000.000 gold pieces which in return will entitle you to wear a unique boots?", npc, creature) + npcHandler:setTopic(playerId, 5) + end +end + +-- Promotion +local node1 = keywordHandler:addKeyword({ "promot" }, StdModule.say, { npcHandler = npcHandler, onlyFocus = true, text = "I can promote you for 20000 gold coins. Do you want me to promote you?" }) +node1:addChildKeyword({ "yes" }, StdModule.promotePlayer, { npcHandler = npcHandler, cost = 20000, level = 20, text = "Congratulations! You are now promoted." }) +node1:addChildKeyword({ "no" }, StdModule.say, { npcHandler = npcHandler, onlyFocus = true, text = "Alright then, come back when you are ready.", reset = true }) + +-- Greeting message +keywordHandler:addGreetKeyword({ "hail king" }, { npcHandler = npcHandler, text = "Hiho, may fire and earth bless you, my child. Are you looking for a promotion?" }) +keywordHandler:addGreetKeyword({ "salutations king" }, { npcHandler = npcHandler, text = "Hiho, may fire and earth bless you, my child. Are you looking for a promotion?" }) + +npcHandler:setMessage(MESSAGE_WALKAWAY, "Farewell, |PLAYERNAME|, my child!") + +npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) +npcHandler:setCallback(CALLBACK_GREET, greetCallback) + +npcHandler:addModule(FocusModule:new(), npcConfig.name, true, true, true) + +-- npcType registering the npcConfig table +npcType:register(npcConfig)