diff --git a/scripts/globals/crafting/crafting_guild_master.lua b/scripts/globals/crafting/crafting_guild_master.lua index 4b8dc8eb2ce..9e97a6b19fe 100644 --- a/scripts/globals/crafting/crafting_guild_master.lua +++ b/scripts/globals/crafting/crafting_guild_master.lua @@ -41,15 +41,10 @@ local testItemTable = [xi.guild.COOKING ] = { 4355, 4416, 4489, 4381, 4413, 4558, 4546, 4440, 4561, 5930 }, } -local function giveNewRank(player, guildId, skillId, newRank) +local function giveNewRank(player, skillId, newRank) -- Raise rank. player:setSkillRank(skillId, newRank) - -- Reset guild points for the day. - if player:getCharVar('[GUILD]currentGuild') == guildId + 1 then - player:setCharVar('[GUILD]daily_points', 1) - end - -- Set local var to complete trade after event. player:setLocalVar('CompleteTrade', 1) end @@ -93,7 +88,7 @@ xi.crafting.guildMasterOnTrade = function(player, npc, trade) guildId == xi.guild.FISHING then player:setCharVar(npcTable[npcName][6], 0) - giveNewRank(player, guildId, skillId, newRank) + giveNewRank(player, skillId, newRank) player:startEvent(eventId, 0, 0, 0, 0, newRank, 1) else player:startEvent(eventId, 0, 0, 0, 0, newRank, 0) @@ -104,7 +99,7 @@ xi.crafting.guildMasterOnTrade = function(player, npc, trade) newRank > xi.craftRank.AMATEUR and newRank < lastRank then - giveNewRank(player, guildId, skillId, newRank) + giveNewRank(player, skillId, newRank) player:startEvent(eventId, 0, 0, 0, 0, newRank, 0) end end diff --git a/scripts/globals/crafting/crafting_guild_points.lua b/scripts/globals/crafting/crafting_guild_points.lua index 16359b2b378..cc31ac90ade 100644 --- a/scripts/globals/crafting/crafting_guild_points.lua +++ b/scripts/globals/crafting/crafting_guild_points.lua @@ -204,6 +204,20 @@ local guildItemTable = }, } +local function calculateKeyItemBitmask(player, rank, keyItemTable) + local keyItemBits = 0 + + for currentBit, keyItem in pairs(keyItemTable) do + if rank >= keyItem.rank then + if not player:hasKeyItem(keyItem.id) then + keyItemBits = bit.bor(keyItemBits, bit.lshift(1, currentBit)) + end + end + end + + return keyItemBits +end + ----------------------------------- -- NPC Events ----------------------------------- @@ -234,46 +248,27 @@ xi.crafting.guildPointOnTrade = function(player, npc, trade, csid, guildId) end xi.crafting.guildPointOnTrigger = function(player, csid, guildId) + local currency = xi.crafting.guildTable[guildId][2] local gpItem, remainingPoints = player:getCurrentGPItem(guildId) local rank = player:getSkillRank(xi.crafting.guildTable[guildId][1]) local skillCap = (rank + 1) * 10 - local keyItemBits = 0 - local currency = xi.crafting.guildTable[guildId][2] - local keyItems = guildKeyItemTable[guildId] + local keyItemBits = calculateKeyItemBitmask(player, rank, guildKeyItemTable[guildId]) - for currentBit, keyItem in pairs(keyItems) do - if rank >= keyItem.rank then - if not player:hasKeyItem(keyItem.id) then - keyItemBits = bit.bor(keyItemBits, bit.lshift(1, currentBit)) - end - end - end - - player:startEvent(csid, player:getCurrency(currency), player:getCharVar('[GUILD]currentGuild') - 1, gpItem, remainingPoints, skillCap, 0, keyItemBits) + player:startEvent(csid, player:getCurrency(currency), player:getCharVar('[GUILD]currentGuild') - 1, gpItem, remainingPoints, skillCap, 0, keyItemBits, 0) end -xi.crafting.guildPointOnEventFinish = function(player, option, target, guildId) - local ID = zones[player:getZoneID()] - local rank = player:getSkillRank(xi.crafting.guildTable[guildId][1]) - local category = bit.band(bit.rshift(option, 2), 3) - local currency = xi.crafting.guildTable[guildId][2] - local keyItems = guildKeyItemTable[guildId] - local items = guildItemTable[guildId] +xi.crafting.guildPointOnEventUpdate = function(player, option, target, guildId) + local category = bit.band(bit.rshift(option, 2), 3) - -- Contract Dialog. - if bit.tobit(option) == -1 and rank >= 3 then - local oldGuild = player:getCharVar('[GUILD]currentGuild') - 1 - player:setCharVar('[GUILD]currentGuild', guildId + 1) - - if oldGuild == -1 then - player:messageSpecial(ID.text.GUILD_NEW_CONTRACT, guildId) - else - player:messageSpecial(ID.text.GUILD_TERMINATE_CONTRACT, guildId, oldGuild) - player:setCharVar('[GUILD]daily_points', 1) - end + local ID = zones[player:getZoneID()] + local _, remainingPoints = player:getCurrentGPItem(guildId) + local rank = player:getSkillRank(xi.crafting.guildTable[guildId][1]) + local skillCap = (rank + 1) * 10 + local currency = xi.crafting.guildTable[guildId][2] + local keyItems = guildKeyItemTable[guildId] -- GP Key Item Option. - elseif category == 3 then + if category == 3 then local keyItem = keyItems[bit.band(bit.rshift(option, 5), 15) - 1] if keyItem and rank >= keyItem.rank then @@ -285,9 +280,12 @@ xi.crafting.guildPointOnEventFinish = function(player, option, target, guildId) end end + player:updateEvent(player:getCurrency(currency), player:getCharVar('[GUILD]currentGuild') - 1, keyItem.cost, remainingPoints, skillCap, 0, calculateKeyItemBitmask(player, rank, guildKeyItemTable[guildId]), 1) + -- GP Item Option. elseif category == 2 or category == 1 then local index = bit.band(option, 3) + local items = guildItemTable[guildId] local item = items[(category - 1) * 4 + index] local quantity = math.min(bit.rshift(option, 9), 12) local cost = quantity * item.cost @@ -312,6 +310,8 @@ xi.crafting.guildPointOnEventFinish = function(player, option, target, guildId) end end + player:updateEvent(player:getCurrency(currency), player:getCharVar('[GUILD]currentGuild') - 1, item.cost, remainingPoints, skillCap, 0, calculateKeyItemBitmask(player, rank, guildKeyItemTable[guildId]), 1) + -- HQ crystal Option. elseif category == 0 and @@ -331,5 +331,25 @@ xi.crafting.guildPointOnEventFinish = function(player, option, target, guildId) player:messageText(target, ID.text.NOT_HAVE_ENOUGH_GP, false, 6) end end + + player:updateEvent(player:getCurrency(currency), player:getCharVar('[GUILD]currentGuild') - 1, crystal.cost, remainingPoints, skillCap, 0, calculateKeyItemBitmask(player, rank, guildKeyItemTable[guildId]), 1) + end +end + +xi.crafting.guildPointOnEventFinish = function(player, option, guildId) + local ID = zones[player:getZoneID()] + local rank = player:getSkillRank(xi.crafting.guildTable[guildId][1]) + + -- Contract Dialog. + if bit.tobit(option) == -1 and rank >= 3 then + local oldGuild = player:getCharVar('[GUILD]currentGuild') - 1 + player:setCharVar('[GUILD]currentGuild', guildId + 1) + + if oldGuild == -1 then + player:messageSpecial(ID.text.GUILD_NEW_CONTRACT, guildId) + else + player:messageSpecial(ID.text.GUILD_TERMINATE_CONTRACT, guildId, oldGuild) + player:setCharVar('[GUILD]daily_points', 1) + end end end diff --git a/scripts/zones/Bastok_Markets/npcs/Ellard.lua b/scripts/zones/Bastok_Markets/npcs/Ellard.lua index ddc697d4b3c..003aaa49755 100644 --- a/scripts/zones/Bastok_Markets/npcs/Ellard.lua +++ b/scripts/zones/Bastok_Markets/npcs/Ellard.lua @@ -19,13 +19,13 @@ end entity.onEventUpdate = function(player, csid, option, npc) if csid == 340 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.GOLDSMITHING) + xi.crafting.guildPointOnEventUpdate(player, option, npc, xi.guild.GOLDSMITHING) end end entity.onEventFinish = function(player, csid, option, npc) if csid == 340 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.GOLDSMITHING) + xi.crafting.guildPointOnEventFinish(player, option, xi.guild.GOLDSMITHING) elseif csid == 341 then player:messageSpecial(ID.text.GP_OBTAINED, option) end diff --git a/scripts/zones/Bastok_Mines/npcs/Hemewmew.lua b/scripts/zones/Bastok_Mines/npcs/Hemewmew.lua index 61c3f7e96d2..1632ca3207a 100644 --- a/scripts/zones/Bastok_Mines/npcs/Hemewmew.lua +++ b/scripts/zones/Bastok_Mines/npcs/Hemewmew.lua @@ -19,13 +19,13 @@ end entity.onEventUpdate = function(player, csid, option, npc) if csid == 206 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.ALCHEMY) + xi.crafting.guildPointOnEventUpdate(player, option, npc, xi.guild.ALCHEMY) end end entity.onEventFinish = function(player, csid, option, npc) if csid == 206 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.ALCHEMY) + xi.crafting.guildPointOnEventFinish(player, option, xi.guild.ALCHEMY) elseif csid == 207 then player:messageSpecial(ID.text.GP_OBTAINED, option) end diff --git a/scripts/zones/Metalworks/npcs/Lorena.lua b/scripts/zones/Metalworks/npcs/Lorena.lua index 3671cdddae4..7112606cb5e 100644 --- a/scripts/zones/Metalworks/npcs/Lorena.lua +++ b/scripts/zones/Metalworks/npcs/Lorena.lua @@ -19,13 +19,13 @@ end entity.onEventUpdate = function(player, csid, option, npc) if csid == 800 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.SMITHING) + xi.crafting.guildPointOnEventUpdate(player, option, npc, xi.guild.SMITHING) end end entity.onEventFinish = function(player, csid, option, npc) if csid == 800 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.SMITHING) + xi.crafting.guildPointOnEventFinish(player, option, xi.guild.SMITHING) elseif csid == 801 then player:messageSpecial(ID.text.GP_OBTAINED, option) end diff --git a/scripts/zones/Northern_San_dOria/npcs/Andreas.lua b/scripts/zones/Northern_San_dOria/npcs/Andreas.lua index 4f756238053..6a0ba2b0173 100644 --- a/scripts/zones/Northern_San_dOria/npcs/Andreas.lua +++ b/scripts/zones/Northern_San_dOria/npcs/Andreas.lua @@ -19,13 +19,13 @@ end entity.onEventUpdate = function(player, csid, option, npc) if csid == 731 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.WOODWORKING) + xi.crafting.guildPointOnEventUpdate(player, option, npc, xi.guild.WOODWORKING) end end entity.onEventFinish = function(player, csid, option, npc) if csid == 731 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.WOODWORKING) + xi.crafting.guildPointOnEventFinish(player, option, xi.guild.WOODWORKING) elseif csid == 732 then player:messageSpecial(ID.text.GP_OBTAINED, option) end diff --git a/scripts/zones/Northern_San_dOria/npcs/Macuillie.lua b/scripts/zones/Northern_San_dOria/npcs/Macuillie.lua index ff527415ea7..091c9148450 100644 --- a/scripts/zones/Northern_San_dOria/npcs/Macuillie.lua +++ b/scripts/zones/Northern_San_dOria/npcs/Macuillie.lua @@ -19,13 +19,13 @@ end entity.onEventUpdate = function(player, csid, option, npc) if csid == 729 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.SMITHING) + xi.crafting.guildPointOnEventUpdate(player, option, npc, xi.guild.SMITHING) end end entity.onEventFinish = function(player, csid, option, npc) if csid == 729 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.SMITHING) + xi.crafting.guildPointOnEventFinish(player, option, xi.guild.SMITHING) elseif csid == 730 then player:messageSpecial(ID.text.GP_OBTAINED, option) end diff --git a/scripts/zones/Port_Windurst/npcs/Fennella.lua b/scripts/zones/Port_Windurst/npcs/Fennella.lua index 7d801d267e2..93e432bc198 100644 --- a/scripts/zones/Port_Windurst/npcs/Fennella.lua +++ b/scripts/zones/Port_Windurst/npcs/Fennella.lua @@ -19,13 +19,13 @@ end entity.onEventUpdate = function(player, csid, option, npc) if csid == 10020 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.FISHING) + xi.crafting.guildPointOnEventUpdate(player, option, npc, xi.guild.FISHING) end end entity.onEventFinish = function(player, csid, option, npc) if csid == 10020 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.FISHING) + xi.crafting.guildPointOnEventFinish(player, option, xi.guild.FISHING) elseif csid == 10021 then player:messageSpecial(ID.text.GP_OBTAINED, option) end diff --git a/scripts/zones/Southern_San_dOria/npcs/Alivatand.lua b/scripts/zones/Southern_San_dOria/npcs/Alivatand.lua index 5f26c59a2d6..d4af1adf4db 100644 --- a/scripts/zones/Southern_San_dOria/npcs/Alivatand.lua +++ b/scripts/zones/Southern_San_dOria/npcs/Alivatand.lua @@ -19,13 +19,13 @@ end entity.onEventUpdate = function(player, csid, option, npc) if csid == 690 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.LEATHERCRAFT) + xi.crafting.guildPointOnEventUpdate(player, option, npc, xi.guild.LEATHERCRAFT) end end entity.onEventFinish = function(player, csid, option, npc) if csid == 690 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.LEATHERCRAFT) + xi.crafting.guildPointOnEventFinish(player, option, xi.guild.LEATHERCRAFT) elseif csid == 691 then player:messageSpecial(ID.text.GP_OBTAINED, option) end diff --git a/scripts/zones/Windurst_Waters/npcs/Qhum_Knaidjn.lua b/scripts/zones/Windurst_Waters/npcs/Qhum_Knaidjn.lua index aba159d1b3f..b89e902a0bb 100644 --- a/scripts/zones/Windurst_Waters/npcs/Qhum_Knaidjn.lua +++ b/scripts/zones/Windurst_Waters/npcs/Qhum_Knaidjn.lua @@ -19,13 +19,13 @@ end entity.onEventUpdate = function(player, csid, option, npc) if csid == 10024 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.COOKING) + xi.crafting.guildPointOnEventUpdate(player, option, npc, xi.guild.COOKING) end end entity.onEventFinish = function(player, csid, option, npc) if csid == 10024 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.COOKING) + xi.crafting.guildPointOnEventFinish(player, option, xi.guild.COOKING) elseif csid == 10025 then player:messageSpecial(ID.text.GP_OBTAINED, option) end diff --git a/scripts/zones/Windurst_Woods/npcs/Hauh_Colphioh.lua b/scripts/zones/Windurst_Woods/npcs/Hauh_Colphioh.lua index 394498740d7..a84039fbe32 100644 --- a/scripts/zones/Windurst_Woods/npcs/Hauh_Colphioh.lua +++ b/scripts/zones/Windurst_Woods/npcs/Hauh_Colphioh.lua @@ -19,13 +19,13 @@ end entity.onEventUpdate = function(player, csid, option, npc) if csid == 10024 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.CLOTHCRAFT) + xi.crafting.guildPointOnEventUpdate(player, option, npc, xi.guild.CLOTHCRAFT) end end entity.onEventFinish = function(player, csid, option, npc) if csid == 10024 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.CLOTHCRAFT) + xi.crafting.guildPointOnEventFinish(player, option, xi.guild.CLOTHCRAFT) elseif csid == 10025 then player:messageSpecial(ID.text.GP_OBTAINED, option) end diff --git a/scripts/zones/Windurst_Woods/npcs/Samigo-Pormigo.lua b/scripts/zones/Windurst_Woods/npcs/Samigo-Pormigo.lua index e6139bec404..ad3673ec667 100644 --- a/scripts/zones/Windurst_Woods/npcs/Samigo-Pormigo.lua +++ b/scripts/zones/Windurst_Woods/npcs/Samigo-Pormigo.lua @@ -19,13 +19,13 @@ end entity.onEventUpdate = function(player, csid, option, npc) if csid == 10022 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.BONECRAFT) + xi.crafting.guildPointOnEventUpdate(player, option, npc, xi.guild.BONECRAFT) end end entity.onEventFinish = function(player, csid, option, npc) if csid == 10022 then - xi.crafting.guildPointOnEventFinish(player, option, npc, xi.guild.BONECRAFT) + xi.crafting.guildPointOnEventFinish(player, option, xi.guild.BONECRAFT) elseif csid == 10023 then player:messageSpecial(ID.text.GP_OBTAINED, option) end