From 6f678c7d907d7140672e4d2debbe9fb95161cbaa Mon Sep 17 00:00:00 2001 From: HT Cesta <58153179+htc16@users.noreply.github.com> Date: Thu, 25 Jul 2024 14:16:16 -0300 Subject: [PATCH 1/2] fix: the paradox quest (#2719) --- ...lever.lua => action_fifth_floor_lever.lua} | 0 ..._lever.lua => action_four_floor_lever.lua} | 0 ...ever.lua => action_second_floor_lever.lua} | 0 ...lever.lua => action_third_floor_lever.lua} | 0 .../the_paradox_tower/move_let_the _quest.lua | 37 ++++++++++++++++ .../the_paradox_tower/movement-poison.lua | 32 -------------- .../movement-sacrifice_skulls.lua | 42 ------------------- ...air.lua => movement_first_floor_stair.lua} | 0 ...ard.lua => movement_last_floor_reward.lua} | 0 .../movement_sacrifice_skulls.lua | 41 ++++++++++++++++++ ...ent_strange_carvings_in _the_southeast.lua | 30 +++++++++++++ ...oul.lua => movement_third_floor_ghoul.lua} | 0 .../the_paradox_tower/trap_in_the_tree.lua | 23 ++++++++++ data-otservbr-global/startup/tables/tile.lua | 29 ++++++++++++- 14 files changed, 158 insertions(+), 76 deletions(-) rename data-otservbr-global/scripts/quests/the_paradox_tower/{action-fifth_floor_lever.lua => action_fifth_floor_lever.lua} (100%) rename data-otservbr-global/scripts/quests/the_paradox_tower/{action-four_floor_lever.lua => action_four_floor_lever.lua} (100%) rename data-otservbr-global/scripts/quests/the_paradox_tower/{action-second_floor_lever.lua => action_second_floor_lever.lua} (100%) rename data-otservbr-global/scripts/quests/the_paradox_tower/{action-third_floor_lever.lua => action_third_floor_lever.lua} (100%) create mode 100644 data-otservbr-global/scripts/quests/the_paradox_tower/move_let_the _quest.lua delete mode 100644 data-otservbr-global/scripts/quests/the_paradox_tower/movement-poison.lua delete mode 100644 data-otservbr-global/scripts/quests/the_paradox_tower/movement-sacrifice_skulls.lua rename data-otservbr-global/scripts/quests/the_paradox_tower/{movement-first_floor_stair.lua => movement_first_floor_stair.lua} (100%) rename data-otservbr-global/scripts/quests/the_paradox_tower/{movement-last_floor_reward.lua => movement_last_floor_reward.lua} (100%) create mode 100644 data-otservbr-global/scripts/quests/the_paradox_tower/movement_sacrifice_skulls.lua create mode 100644 data-otservbr-global/scripts/quests/the_paradox_tower/movement_strange_carvings_in _the_southeast.lua rename data-otservbr-global/scripts/quests/the_paradox_tower/{movement-third_floor_ghoul.lua => movement_third_floor_ghoul.lua} (100%) create mode 100644 data-otservbr-global/scripts/quests/the_paradox_tower/trap_in_the_tree.lua diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/action-fifth_floor_lever.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/action_fifth_floor_lever.lua similarity index 100% rename from data-otservbr-global/scripts/quests/the_paradox_tower/action-fifth_floor_lever.lua rename to data-otservbr-global/scripts/quests/the_paradox_tower/action_fifth_floor_lever.lua diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/action-four_floor_lever.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/action_four_floor_lever.lua similarity index 100% rename from data-otservbr-global/scripts/quests/the_paradox_tower/action-four_floor_lever.lua rename to data-otservbr-global/scripts/quests/the_paradox_tower/action_four_floor_lever.lua diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/action-second_floor_lever.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/action_second_floor_lever.lua similarity index 100% rename from data-otservbr-global/scripts/quests/the_paradox_tower/action-second_floor_lever.lua rename to data-otservbr-global/scripts/quests/the_paradox_tower/action_second_floor_lever.lua diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/action-third_floor_lever.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/action_third_floor_lever.lua similarity index 100% rename from data-otservbr-global/scripts/quests/the_paradox_tower/action-third_floor_lever.lua rename to data-otservbr-global/scripts/quests/the_paradox_tower/action_third_floor_lever.lua diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/move_let_the _quest.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/move_let_the _quest.lua new file mode 100644 index 00000000000..a20f503a9f8 --- /dev/null +++ b/data-otservbr-global/scripts/quests/the_paradox_tower/move_let_the _quest.lua @@ -0,0 +1,37 @@ +local teleportTileBack = MoveEvent() + +function teleportTileBack.onStepIn(creature, item, position, fromPosition) + local player = creature:getPlayer() + if not player then + return true + end + + -- UIDs específicos do tile + local specificUIDs = { 25034, 25035, 25036, 25037 } + + -- Posições específicas + local specificPositions = { + { x = 32486, y = 31927, z = 7 }, + { x = 32487, y = 31927, z = 7 }, + { x = 32486, y = 31928, z = 7 }, + { x = 32487, y = 31928, z = 7 }, + } + + -- Posição de teletransporte + local teleportPosition = { x = 32566, y = 31959, z = 1 } + + -- Verifica se a posição, o UID e o itemID coincidem + for _, pos in ipairs(specificPositions) do + if position.x == pos.x and position.y == pos.y and position.z == pos.z and item:getId() == 599 and table.contains(specificUIDs, item.uid) then + player:teleportTo(teleportPosition) + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + break + end + end + + return true +end + +-- Registra o evento para os UIDs específicos +teleportTileBack:uid(25034, 25035, 25036, 25037) +teleportTileBack:register() diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/movement-poison.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/movement-poison.lua deleted file mode 100644 index 565762fa480..00000000000 --- a/data-otservbr-global/scripts/quests/the_paradox_tower/movement-poison.lua +++ /dev/null @@ -1,32 +0,0 @@ -local positions = { - { x = 32497, y = 31889, z = 7 }, - { x = 32497, y = 31890, z = 7 }, - { x = 32498, y = 31890, z = 7 }, - { x = 32499, y = 31890, z = 7 }, - { x = 32502, y = 31890, z = 7 }, - { x = 32494, y = 31888, z = 7 }, -} - -local poison = MoveEvent() - -function poison.onStepOut(creature, item, position, fromPosition) - local player = creature:getPlayer() - if not player then - return true - end - - local removeHealth = Tile({ x = 32497, y = 31889, z = 7 }):getFieldItem() - if not removeHealth then - player:addHealth(-200, COMBAT_EARTHDAMAGE) - for i = 1, #positions do - local tile = Tile(positions[i]):getFieldItem() - if not tile then - Game.createItem(105, 1, Position(positions[i])) - end - end - end - return true -end - -poison:uid(25011) -poison:register() diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/movement-sacrifice_skulls.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/movement-sacrifice_skulls.lua deleted file mode 100644 index c351bde5c46..00000000000 --- a/data-otservbr-global/scripts/quests/the_paradox_tower/movement-sacrifice_skulls.lua +++ /dev/null @@ -1,42 +0,0 @@ -local positions = { - { x = 32563, y = 31957, z = 1 }, - { x = 32565, y = 31957, z = 1 }, - { x = 32567, y = 31957, z = 1 }, - { x = 32569, y = 31957, z = 1 }, -} - -local sacrificeSkulls = MoveEvent() - -function sacrificeSkulls.onStepIn(creature, item, position, fromPosition) - local player = creature:getPlayer() - if not player then - return true - end - - for i = 4, #positions do - -- Check if have skulls in all positions - local tile = Tile(positions[i]):getItemById(3114) - if tile then - -- Message, only send in the first acess of the paradox tower - if player:getStorageValue(FirstParadoxAcess) < 1 then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "One of the toxic salt seas in Krailos carries fresh and clean water again. The ogres' water supply is ensured for now") - player:setStorageValue(FirstParadoxAcess, 1) - end - -- Remove skulls - for skulls = 1, #positions do - local skull = Tile(positions[skulls]):getItemById(3114) - if skull then - -- Create poison fields from the positions - Game.createItem(105, 1, Position(positions[skulls])) - -- Remove skulls from the positions - skull:remove(1) - end - end - player:teleportTo({ x = 32479, y = 31923, z = 7 }) - end - end - return true -end - -sacrificeSkulls:uid(25012) -sacrificeSkulls:register() diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/movement-first_floor_stair.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/movement_first_floor_stair.lua similarity index 100% rename from data-otservbr-global/scripts/quests/the_paradox_tower/movement-first_floor_stair.lua rename to data-otservbr-global/scripts/quests/the_paradox_tower/movement_first_floor_stair.lua diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/movement-last_floor_reward.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/movement_last_floor_reward.lua similarity index 100% rename from data-otservbr-global/scripts/quests/the_paradox_tower/movement-last_floor_reward.lua rename to data-otservbr-global/scripts/quests/the_paradox_tower/movement_last_floor_reward.lua diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/movement_sacrifice_skulls.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/movement_sacrifice_skulls.lua new file mode 100644 index 00000000000..cefc303ae07 --- /dev/null +++ b/data-otservbr-global/scripts/quests/the_paradox_tower/movement_sacrifice_skulls.lua @@ -0,0 +1,41 @@ +local positions = { + { x = 32563, y = 31957, z = 1 }, + { x = 32565, y = 31957, z = 1 }, + { x = 32567, y = 31957, z = 1 }, + { x = 32569, y = 31957, z = 1 }, +} + +local sacrificeSkulls = MoveEvent() + +function sacrificeSkulls.onStepIn(creature, item, position, fromPosition) + local player = creature:getPlayer() + if not player then + return true + end + + for i = 1, #positions do + local tile = Tile(positions[i]) + if not tile or not tile:getItemById(3114) then + return true + end + end + + if player:getStorageValue(FirstParadoxAcess) < 1 then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "One of the toxic salt seas in Krailos carries fresh and clean water again. The ogres' water supply is ensured for now") + player:setStorageValue(FirstParadoxAcess, 1) + end + + for i = 1, #positions do + local skull = Tile(positions[i]):getItemById(3114) + if skull then + Game.createItem(105, 1, positions[i]) + skull:remove(1) + end + end + + player:teleportTo({ x = 32479, y = 31923, z = 7 }) + return true +end + +sacrificeSkulls:uid(25012) +sacrificeSkulls:register() diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/movement_strange_carvings_in _the_southeast.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/movement_strange_carvings_in _the_southeast.lua new file mode 100644 index 00000000000..f4316250888 --- /dev/null +++ b/data-otservbr-global/scripts/quests/the_paradox_tower/movement_strange_carvings_in _the_southeast.lua @@ -0,0 +1,30 @@ +local teleportTile = MoveEvent() + +function teleportTile.onStepIn(creature, item, position, fromPosition) + local player = creature:getPlayer() + if not player then + return true + end + + local specificUIDs = { 25031, 25032 } + + local specificPositions = { + { x = 32477, y = 31905, z = 7 }, + { x = 32476, y = 31906, z = 7 }, + } + + local teleportPosition = { x = 32478, y = 31908, z = 7 } + + for _, pos in ipairs(specificPositions) do + if position.x == pos.x and position.y == pos.y and position.z == pos.z and item:getId() == 599 and table.contains(specificUIDs, item.uid) then + player:teleportTo(teleportPosition) + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + break + end + end + + return true +end + +teleportTile:uid(25031, 25032) +teleportTile:register() diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/movement-third_floor_ghoul.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/movement_third_floor_ghoul.lua similarity index 100% rename from data-otservbr-global/scripts/quests/the_paradox_tower/movement-third_floor_ghoul.lua rename to data-otservbr-global/scripts/quests/the_paradox_tower/movement_third_floor_ghoul.lua diff --git a/data-otservbr-global/scripts/quests/the_paradox_tower/trap_in_the_tree.lua b/data-otservbr-global/scripts/quests/the_paradox_tower/trap_in_the_tree.lua new file mode 100644 index 00000000000..2e7342c7800 --- /dev/null +++ b/data-otservbr-global/scripts/quests/the_paradox_tower/trap_in_the_tree.lua @@ -0,0 +1,23 @@ +local trap_in_the_tree = MoveEvent() + +local trapPositions = { + { x = 32497, y = 31889, z = 07 }, + { x = 32499, y = 31890, z = 07 }, + { x = 32497, y = 31890, z = 07 }, + { x = 32498, y = 31890, z = 07 }, + { x = 32496, y = 31890, z = 07 }, + { x = 32494, y = 31888, z = 07 }, + { x = 32502, y = 31890, z = 07 }, +} + +function trap_in_the_tree.onStepIn(creature, item, toPosition, fromPosition) + if creature:isPlayer() and Tile({ x = 32502, y = 31890, z = 07 }):getThingCount() == 2 then + doTargetCombatHealth(0, creature, COMBAT_EARTHDAMAGE, -200, -200) + for _, pos in ipairs(trapPositions) do + Game.createItem(2121, 1, pos) + end + end +end + +trap_in_the_tree:uid(25011) +trap_in_the_tree:register() diff --git a/data-otservbr-global/startup/tables/tile.lua b/data-otservbr-global/startup/tables/tile.lua index ccb8a6f8d2f..e2bec126315 100644 --- a/data-otservbr-global/startup/tables/tile.lua +++ b/data-otservbr-global/startup/tables/tile.lua @@ -1099,8 +1099,8 @@ TileUnique = { }, -- The paradox tower quest [25011] = { - itemId = 354, - itemPos = { x = 32497, y = 31889, z = 7 }, + itemId = 353, + itemPos = { x = 32497, y = 31888, z = 7 }, }, [25012] = { itemId = 10145, @@ -1196,6 +1196,31 @@ TileUnique = { itemId = 431, itemPos = { x = 32468, y = 32119, z = 14 }, }, + -- The Paradox Tower Quest + [25031] = { + itemId = 599, + itemPos = { x = 32477, y = 31905, z = 7 }, + }, + [25032] = { + itemId = 599, + itemPos = { x = 32476, y = 31906, z = 7 }, + }, + [25034] = { + itemId = 599, + itemPos = { x = 32486, y = 31927, z = 7 }, + }, + [25035] = { + itemId = 599, + itemPos = { x = 32487, y = 31927, z = 7 }, + }, + [25036] = { + itemId = 599, + itemPos = { x = 32486, y = 31928, z = 7 }, + }, + [25037] = { + itemId = 599, + itemPos = { x = 32487, y = 31928, z = 7 }, + }, -- Remove/create item on stepIn -- Reserved uniques range from 29001/30000 From e30b0af0518fd11abe14afe992dccaa93e8e8c3c Mon Sep 17 00:00:00 2001 From: HT Cesta <58153179+htc16@users.noreply.github.com> Date: Thu, 25 Jul 2024 15:10:20 -0300 Subject: [PATCH 2/2] fix: quests from version 7.24 revised (#2724) --- data-otservbr-global/lib/core/quests.lua | 6 +++--- data-otservbr-global/npc/kevin.lua | 8 ++++---- data-otservbr-global/npc/kroox.lua | 4 ++-- data-otservbr-global/npc/lokur.lua | 8 ++++++++ data-otservbr-global/npc/markwin.lua | 1 + data-otservbr-global/npc/talphion.lua | 2 +- 6 files changed, 19 insertions(+), 10 deletions(-) diff --git a/data-otservbr-global/lib/core/quests.lua b/data-otservbr-global/lib/core/quests.lua index 042897f9369..2d60761bf92 100644 --- a/data-otservbr-global/lib/core/quests.lua +++ b/data-otservbr-global/lib/core/quests.lua @@ -3561,7 +3561,7 @@ if not Quests then storageId = Storage.Postman.Mission07, missionId = 10258, startValue = 1, - endValue = 8, + endValue = 9, states = { [1] = "Kevin wants you to bring him the measurements of Benjamin, Lokur, Dove, Liane, Chrystal and Olrik.", [2] = "You have received the measurements from 1 of 6 post officers.", @@ -3569,8 +3569,8 @@ if not Quests then [4] = "You have received the measurements from 3 of 6 post officers.", [5] = "You have received the measurements from 4 of 6 post officers.", [6] = "You have received the measurements from 5 of 6 post officers.", - [7] = "You have received all measurements, report back to Kevin!", - [8] = "You have reported back that you have completed the mission.", + [8] = "You have received all measurements, report back to Kevin!", + [9] = "You have reported back that you have completed the mission.", }, }, [8] = { diff --git a/data-otservbr-global/npc/kevin.lua b/data-otservbr-global/npc/kevin.lua index c8108e547aa..41686524673 100644 --- a/data-otservbr-global/npc/kevin.lua +++ b/data-otservbr-global/npc/kevin.lua @@ -88,7 +88,7 @@ local function creatureSayCallback(npc, creature, type, message) elseif player:getStorageValue(Storage.Postman.Mission05) == 3 then npcHandler:say("Splendid, I knew we could trust you. I would like to ask for your help in another matter. Are you interested?", npc, creature) npcHandler:setTopic(playerId, 16) - elseif player:getStorageValue(Storage.Postman.Mission07) == 7 then + elseif player:getStorageValue(Storage.Postman.Mission07) == 8 then npcHandler:say("Once more you have impressed me! Are you willing to do another job?", npc, creature) npcHandler:setTopic(playerId, 21) elseif player:getStorageValue(Storage.Postman.Mission06) >= 1 and player:getStorageValue(Storage.Postman.Mission06) < 10 then @@ -127,10 +127,10 @@ local function creatureSayCallback(npc, creature, type, message) elseif player:getStorageValue(Storage.Postman.Rank) == 4 or player:getStorageValue(Storage.Postman.Rank) == 3 and player:getStorageValue(Storage.Postman.Mission09) == 0 then npcHandler:say("So are you ready for another mission?", npc, creature) npcHandler:setTopic(playerId, 25) - elseif player:getStorageValue(Storage.Postman.Mission06) == 13 and player:getStorageValue(Storage.Postman.Rank) == 3 then + elseif player:getStorageValue(Storage.Postman.Mission07) < 1 and player:getStorageValue(Storage.Postman.Mission06) == 13 and player:getStorageValue(Storage.Postman.Rank) == 3 then npcHandler:say("Excellent! Another job well done! Would you accept another mission?", npc, creature) npcHandler:setTopic(playerId, 19) - elseif player:getStorageValue(Storage.Postman.Mission06) == 13 and player:getStorageValue(Storage.Postman.Rank) == 2 then + elseif player:getStorageValue(Storage.Postman.Mission07) >= 1 and player:getStorageValue(Storage.Postman.Mission06) == 13 and player:getStorageValue(Storage.Postman.Rank) == 2 then npcHandler:say("Excellent! Another job well done! Would you accept another mission?", npc, creature) npcHandler:setTopic(playerId, 28) elseif player:getStorageValue(Storage.Postman.Mission04) == 2 and player:getStorageValue(Storage.Postman.Rank) == 2 then @@ -263,7 +263,7 @@ local function creatureSayCallback(npc, creature, type, message) npcHandler:setTopic(playerId, 22) elseif npcHandler:getTopic(playerId) == 22 then npcHandler:say("Find out about his whereabouts and retrieve him or at least his posthorn. He was looking for a new underground passage that is rumoured to be found underneath the troll-infested Mountain east of Thais.", npc, creature) - player:setStorageValue(Storage.Postman.Mission07, 8) + player:setStorageValue(Storage.Postman.Mission07, 9) player:setStorageValue(Storage.Postman.Mission08, 1) npcHandler:setTopic(playerId, 0) elseif npcHandler:getTopic(playerId) == 23 then diff --git a/data-otservbr-global/npc/kroox.lua b/data-otservbr-global/npc/kroox.lua index 020153a27bf..6f237ad1d87 100644 --- a/data-otservbr-global/npc/kroox.lua +++ b/data-otservbr-global/npc/kroox.lua @@ -66,8 +66,8 @@ local function creatureSayCallback(npc, creature, type, message) player:setStorageValue(Storage.SamsOldBackpack, 2) player:setStorageValue(Storage.SamsOldBackpackDoor, 1) end - elseif MsgContains(message, "measurements") then - if player:getStorageValue(Storage.Postman.Mission07) >= 1 and player:getStorageValue(Storage.Postman.MeasurementsKroox) ~= 1 then + elseif message == "lokurs measurements" then + if player:getStorageValue(Storage.Postman.Mission07) >= 7 and player:getStorageValue(Storage.Postman.MeasurementsKroox) ~= 1 then npcHandler:say("Hm, well I guess its ok to tell you ... ", npc, creature) player:setStorageValue(Storage.Postman.Mission07, player:getStorageValue(Storage.Postman.Mission07) + 1) player:setStorageValue(Storage.Postman.MeasurementsKroox, 1) diff --git a/data-otservbr-global/npc/lokur.lua b/data-otservbr-global/npc/lokur.lua index 62fb5a50864..59fc7ed0f7c 100644 --- a/data-otservbr-global/npc/lokur.lua +++ b/data-otservbr-global/npc/lokur.lua @@ -94,6 +94,14 @@ local function creatureSayCallback(npc, creature, type, message) elseif MsgContains(message, "no") and npcHandler:getTopic(playerId) > 0 then npcHandler:say("No then.", npc, creature) npcHandler:setTopic(playerId, 0) + elseif MsgContains(message, "measurements") then + if player:getStorageValue(Storage.Postman.Mission07) >= 6 and player:getStorageValue(Storage.Postman.MeasurementsKroox) ~= 1 then + npcHandler:say("Come on, I have no clue what they are. Better ask my armorer Kroox for such nonsense.Go and ask him for good ol' Lokurs measurements, he'll know.", npc, creature) + player:setStorageValue(Storage.Postman.Mission07, player:getStorageValue(Storage.Postman.Mission07) + 1) + else + npcHandler:say("...", npc, creature) + npcHandler:setTopic(playerId, 0) + end end return true diff --git a/data-otservbr-global/npc/markwin.lua b/data-otservbr-global/npc/markwin.lua index b70437dddae..f0b2e055f5f 100644 --- a/data-otservbr-global/npc/markwin.lua +++ b/data-otservbr-global/npc/markwin.lua @@ -66,6 +66,7 @@ local function greetCallback(npc, creature) position:sendMagicEffect(CONST_ME_TELEPORT) end end + npcHandler:say("No! The hornless have reached my city! BODYGUARDS TO ME!", npc, creature) return false elseif player:getStorageValue(Storage.MarkwinGreeting) == 1 then npcHandler:setMessage(MESSAGE_GREET, "Well ... you defeated my guards! Now everything is over! I guess I will have to answer your questions now.") diff --git a/data-otservbr-global/npc/talphion.lua b/data-otservbr-global/npc/talphion.lua index 9a7ec7ae7e6..362dea22509 100644 --- a/data-otservbr-global/npc/talphion.lua +++ b/data-otservbr-global/npc/talphion.lua @@ -69,7 +69,7 @@ local function creatureSayCallback(npc, creature, type, message) npcHandler:say("CHESS? I DONT PLAY CHESS!", npc, creature) npcHandler:setTopic(playerId, 3) elseif npcHandler:getTopic(playerId) == 3 then - npcHandler:say("A PATTERN IN THIS MESS?? HEY DON'T INSULT MY MACHINEHALL!", npc, creature) + npcHandler:say("A PATTERN IN THIS MESS?? HEY DON'T INSULT MY MACHINE HALL!", npc, creature) npcHandler:setTopic(playerId, 4) elseif npcHandler:getTopic(playerId) == 4 then npcHandler:say("AH YES! I WORKED ON THE DRESS PATTERN FOR THOSE UNIFORMS. STAINLESS TROUSERES, STEAM DRIVEN BOOTS! ANOTHERMARVEL TO BEHOLD! I'LL SENT A COPY TO KEVIN IMEDIATELY!", npc, creature)