Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Handin] Item handin overhaul #1403

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
217 changes: 54 additions & 163 deletions lua_modules/items.lua
Original file line number Diff line number Diff line change
@@ -1,175 +1,70 @@
local items = {}

function items.check_turn_in(trade, trade_check)
--create trade_return table == trade
--shallow copy
local trade_return = {};
for key, value in pairs(trade) do
trade_return[key] = value;
end
local handin_data = {};
local index = 1;
for key, value in pairs(trade) do
if (key:findi("item")) then
local item_id = value:GetID()
if item_id ~= nil and item_id ~= 0 then
if handin_data[item_id] ~= nil then
handin_data[item_id] = handin_data[item_id] + 1
else
handin_data[item_id] = 1
end
end
end
end

-- Handin table for source
local handin_data = {};
for x = 1, 4 do
local inst = trade["item" .. x];
if (inst.valid) then
local is_attuned = 0;
if inst:IsInstNoDrop() then
is_attuned = 1;
end
local item_data = {};
for x = 1, 4 do
local inst = trade["item" .. x];
if (inst.valid) then
item_data[x] = inst
end
end

handin_data[x] = string.format("%d|%d|%d", inst:GetID(), inst:GetCharges(), is_attuned);
else
handin_data[x] = "0|0|0";
end
end
local required_data = {}
for i = 1, 4 do
local key = "item" .. i;
local item_id = trade_check[key]

if item_id ~= nil and item_id ~= 0 then
if required_data[item_id] ~= nil then
required_data[item_id] = required_data[item_id] + 1
else
required_data[item_id] = 1
end
end
end

trade.other:SetEntityVariable("HANDIN_ITEMS", items.get_handin_items_serialized(handin_data))
local currencies = { "platinum", "gold", "silver", "copper" }

trade.other:SetEntityVariable("HANDIN_MONEY", string.format("%d|%d|%d|%d", trade.copper, trade.silver, trade.gold, trade.platinum))

--for every item in trade_check check trade_return
--if item exists in trade_return then
--remove that item from trade_return
--else
--failure
for i = 1, 4 do
local key = "item" .. i;
if(trade_check[key] ~= nil and trade_check[key] ~= 0) then
local found = false;
for j = 1, 4 do
local inst = trade_return["item" .. j];
if(inst.valid and trade_check[key] == inst:GetID()) then
trade_return["item" .. j] = ItemInst();
found = true;
break;
end
end

if(not found) then
return false;
end
-- Loop through each currency and check the corresponding key in trade_check
for _, currency in ipairs(currencies) do
if trade_check[currency] ~= nil and trade_check[currency] ~= 0 then
-- Process the currency value
local amount = trade_check[currency]
required_data[currency] = amount
-- You can perform your logic here, like adding to total or comparing values
end
end

--convert our money into copper then check that we have enough then convert change back
local trade_check_money = 0;
local return_money = 0;

if(trade_check["platinum"] ~= nil and trade_check["platinum"] ~= 0) then
trade_check_money = trade_check_money + (trade_check["platinum"] * 1000);
end

if(trade_check["gold"] ~= nil and trade_check["gold"] ~= 0) then
trade_check_money = trade_check_money + (trade_check["gold"] * 100);
end

if(trade_check["silver"] ~= nil and trade_check["silver"] ~= 0) then
trade_check_money = trade_check_money + (trade_check["silver"] * 10);
end

if(trade_check["copper"] ~= nil and trade_check["copper"] ~= 0) then
trade_check_money = trade_check_money + trade_check["copper"];
end

return_money = return_money + trade_return["platinum"] * 1000 + trade_return["gold"] * 100;
return_money = return_money + trade_return["silver"] * 10 + trade_return["copper"];

if(return_money < trade_check_money) then
return false;
else
return_money = return_money - trade_check_money;
end

--replace trade with trade_return
trade.item1 = trade_return.item1;
trade.item2 = trade_return.item2;
trade.item3 = trade_return.item3;
trade.item4 = trade_return.item4;

trade.platinum = math.floor(return_money / 1000);
return_money = return_money - (trade.platinum * 1000);

trade.gold = math.floor(return_money / 100);
return_money = return_money - (trade.gold * 100);

trade.silver = math.floor(return_money / 10);
return_money = return_money - (trade.silver * 10);

trade.copper = return_money;
return true;
end

function items.return_items(npc, client, trade, text)
text = text or true;
local returned = false;

-- Handin table for source
local return_data = {};
for i = 1, 4 do
local inst = trade["item" .. i];
if(inst.valid) then
local is_attuned = 0;
if inst:IsInstNoDrop() then
is_attuned = 1;
end

-- remove delivered task items from return for this slot
local return_count = inst:RemoveTaskDeliveredItems()

if(eq.is_disc_tome(inst:GetID()) and npc:GetClass() >= 19 and npc:GetClass() < 36) then
if(client:GetClass() == npc:GetClass() - 19) then
client:TrainDisc(inst:GetID());
else
return_data[#return_data+1] = string.format("%d|%d|%d", inst:GetID(), inst:GetCharges(), is_attuned);
npc:Say(string.format("You are not a member of my guild. I will not train you!"));
if return_count > 0 then
client:PushItemOnCursor(inst);
returned = true;
end
end
elseif return_count > 0 then
return_data[#return_data+1] = string.format("%d|%d|%d", inst:GetID(), inst:GetCharges(), is_attuned);
client:PushItemOnCursor(inst);
if text then
npc:Say(string.format("I have no need for this %s, you can have it back.", client:GetCleanName()));
end
returned = true;
end
end
for _, currency in ipairs(currencies) do
if trade[currency] ~= nil and trade[currency] ~= 0 then
handin_data[currency] = trade[currency]
end
end

client:SetEntityVariable("RETURN_ITEMS", items.get_handin_items_serialized(return_data))

local money = false;
if(trade.platinum ~= 0) then
returned = true;
money = true;
end

if(trade.gold ~= 0) then
returned = true;
money = true;
end

if(trade.silver ~= 0) then
returned = true;
money = true;
end

if(trade.copper ~= 0) then
returned = true;
money = true;
end

if money then
client:SetEntityVariable("RETURN_MONEY", string.format("%d|%d|%d|%d", trade.copper, trade.silver, trade.gold, trade.platinum));
client:AddMoneyToPP(trade.copper, trade.silver, trade.gold, trade.platinum, true);
end
if (trade.self) then
return trade.self:CheckHandin(trade.other, handin_data, required_data, item_data);
else
return false
end
end

eq.send_player_handin_event();

return returned;
function items.return_items(npc, client, trade, text)
npc:ReturnHandinItems(client);
end

function items.return_bot_items(bot, client, trade, text)
Expand Down Expand Up @@ -298,9 +193,5 @@ function items.check_bot_turn_in(trade, trade_check)
trade.copper = return_money;
return true;
end

function items.get_handin_items_serialized(handin_table)
return table.concat(handin_table, ",")
end

return items;
Loading