e4s-sdk/gamedata/scripts/trade_manager.script
2026-06-17 23:06:51 +03:00

231 lines
No EOL
7 KiB
Text

local trade_manager = {
}
function trade_init(npc, cfg)
--' printf("TRADE INIT[%s]", npc:name())
--' if trade_manager[npc:id()] == nil then
trade_manager[npc:id()] = {}
--' end
trade_manager[npc:id()].cfg_ltx = cfg
trade_manager[npc:id()].config = ini_file(cfg)
-- êîýôèöèåíòû ïîêóïêè
local str = utils.cfg_get_string(trade_manager[npc:id()].config, "trader", "buy_condition", npc, true, "")
if str == nil then
abort("Incorrect trader settings. Cannot find buy_condition. [%s]->[%s]", npc:name(), cfg)
end
trade_manager[npc:id()].buy_condition = xr_logic.parse_condlist(npc, "trade_manager", "buy_condition", str)
-- êîýôèöèåíòû ïðîäàæè
str = utils.cfg_get_string(trade_manager[npc:id()].config, "trader", "sell_condition", npc, true, "")
if str == nil then
abort("Incorrect trader settings. Cannot find sell_condition. [%s]->[%s]", npc:name(), cfg)
end
trade_manager[npc:id()].sell_condition = xr_logic.parse_condlist(npc, "trade_manager", "sell_condition", str)
-- ñïèñîê çàêóïêè
str = utils.cfg_get_string(trade_manager[npc:id()].config, "trader", "buy_supplies", npc, false, "")
if str ~= nil then
trade_manager[npc:id()].buy_supplies = xr_logic.parse_condlist(npc, "trade_manager", "buy_supplies", str)
end
-- buy_item_condition_factor
str = utils.cfg_get_string(trade_manager[npc:id()].config, "trader", "buy_item_condition_factor", npc, false, "", "0.7")
if str ~= nil then
trade_manager[npc:id()].buy_item_condition_factor = xr_logic.parse_condlist(npc, "trade_manager", "buy_item_condition_factor", str)
end
end
function update(npc)
local tt = trade_manager[npc:id()]
if tt == nil then
printf("TRADE [%s]: tt is nil", npc:name())
return
end
if tt.update_time ~= nil and tt.update_time < time_global() then
return
end
tt.update_time = time_global() + 3600000
local str = xr_logic.pick_section_from_condlist(db.actor, npc, tt.buy_condition)
if(str=="" or str==nil) then
abort("Wrong section in buy_condition condlist for npc [%s]!", npc:name())
end
if tt.current_buy_condition ~= str then
--'printf("TRADE [%s]: buy condition = %s", npc:name(), str)
npc:buy_condition(tt.config, str)
tt.current_buy_condition = str
end
str = xr_logic.pick_section_from_condlist(db.actor, npc, tt.sell_condition)
if(str=="" or str==nil) then
abort("Wrong section in buy_condition condlist for npc [%s]!", npc:name())
end
if tt.current_sell_condition ~= str then
printf("TRADE [%s]: sell condition = %s", npc:name(), str)
npc:sell_condition(tt.config, str)
tt.current_sell_condition = str
else
printf("TRADE [%s]: current = %s sell = %s", npc:name(), tostring(tt.current_sell_condition), tostring(str))
end
str = tonumber(xr_logic.pick_section_from_condlist(db.actor, npc, tt.buy_item_condition_factor))
if tt.current_buy_item_condition_factor ~= str then
npc:buy_item_condition_factor(str)
tt.current_buy_item_condition_factor = str
end
if tt.buy_supplies == nil then
return
end
str = xr_logic.pick_section_from_condlist(db.actor, npc, tt.buy_supplies)
if(str=="" or str==nil) then
abort("Wrong section in buy_condition condlist for npc [%s]!", npc:name())
end
if tt.current_buy_supplies ~= str then
if tt.resuply_time ~= nil and tt.resuply_time < time_global() then
return
end
--'printf("TRADE [%s]: buy_supplies = %s", npc:name(), str)
npc:buy_supplies(tt.config, str)
tt.current_buy_supplies = str
tt.resuply_time = time_global() + 24*3600000
end
end
function save(obj, packet)
local tt = trade_manager[obj:id()]
set_save_marker(packet, "save", false, "trade_manager")
--' Ñîõðàíÿåì ïðèñóòñòâóåò ëè èíèöèàëèçèðîâàííàÿ òîðãîâëÿ â ïðèíöèïå.
if tt == nil then
printf("TRADE SAVE [%s]: ignored", obj:name())
packet:w_bool(false)
return
else
packet:w_bool(true)
end
packet:w_stringZ(tt.cfg_ltx)
printf("TRADE SAVE [%s]: current_buy_condition = %s", obj:name(), tostring(tt.current_buy_condition))
if tt.current_buy_condition == nil then
packet:w_stringZ("")
else
packet:w_stringZ(tt.current_buy_condition)
end
printf("TRADE SAVE [%s]: current_sell_condition = %s", obj:name(), tostring(tt.current_sell_condition))
if tt.current_sell_condition == nil then
packet:w_stringZ("")
else
packet:w_stringZ(tt.current_sell_condition)
end
printf("TRADE SAVE [%s]: current_buy_supplies = %s", obj:name(), tostring(tt.current_buy_supplies))
if tt.current_buy_supplies == nil then
packet:w_stringZ("")
else
packet:w_stringZ(tt.current_buy_supplies)
end
local cur_tm = time_global()
if tt.update_time == nil then
packet:w_s32(-1)
else
packet:w_s32(tt.update_time - cur_tm)
end
if tt.resuply_time == nil then
packet:w_s32(-1)
else
packet:w_s32(tt.resuply_time - cur_tm)
end
set_save_marker(packet, "save", true, "trade_manager")
end
function load(obj, packet)
set_save_marker(packet, "load", false, "trade_manager")
local a = packet:r_bool()
if a == false then
printf("TRADE LOAD [%s]: ignored", obj:name())
return
end
trade_manager[obj:id()] = {}
local tt = trade_manager[obj:id()]
tt.cfg_ltx = packet:r_stringZ()
printf("TRADE LOAD [%s]: cfg_ltx = %s", obj:name(), tostring(tt.cfg_ltx))
tt.config = ini_file(tt.cfg_ltx)
a = packet:r_stringZ()
printf("TRADE LOAD [%s]: current_buy_condition = %s", obj:name(), tostring(a))
if a ~= "" then
tt.current_buy_condition = a
obj:buy_condition(tt.config, a)
end
a = packet:r_stringZ()
printf("TRADE LOAD [%s]: current_sell_condition = %s", obj:name(), tostring(a))
if a ~= "" then
tt.current_sell_condition = a
obj:sell_condition(tt.config, a)
end
a = packet:r_stringZ()
printf("TRADE LOAD [%s]: current_buy_supplies = %s", obj:name(), tostring(a))
if a ~= "" then
tt.current_buy_supplies = a
end
local cur_tm = time_global()
a = packet:r_s32()
if a ~= -1 then
tt.update_time = cur_tm + a
end
a = packet:r_s32()
if a ~= -1 then
tt.resuply_time = cur_tm + a
end
set_save_marker(packet, "load", true, "trade_manager")
end
----------- NOT TO DELETE!!!!!!!!! called from engine
function get_buy_discount(npc_id)
local str = utils.cfg_get_string(trade_manager[npc_id].config, "trader", "discounts", nil, false, "", "")
if(str=="") then
return 1
end
local sect = xr_logic.pick_section_from_condlist(db.actor, nil, xr_logic.parse_condlist(nil, "trade_manager", "discounts", str))
str = utils.cfg_get_number(trade_manager[npc_id].config, sect, "buy", nil, false, 1)
return str
end
----------- NOT TO DELETE!!!!!!!!! called from engine
function get_sell_discount(npc_id)
local str = utils.cfg_get_string(trade_manager[npc_id].config, "trader", "discounts", nil, false, "", "")
if(str=="") then
return 1
end
local sect = xr_logic.pick_section_from_condlist(db.actor, nil, xr_logic.parse_condlist(npc, "trade_manager", "discounts", str))
str = utils.cfg_get_number(trade_manager[npc_id].config, sect, "sell", nil, false, 1)
return str
end