Files
Cody Brittain 3f62424312 [MDB Ignore] [IDB Ignore] Kills off /obj/item/device (#21774)
This has zero reason to exist in our code base. We have no procs or
variables tied to this. I removed it to make future modifications
cleaner.

---------

Signed-off-by: Cody Brittain <1779662+Generalcamo@users.noreply.github.com>
2026-02-01 05:14:26 +00:00

687 lines
24 KiB
Plaintext

// Config Defines
#define SUPPLY_DOCKZ 1 // Z-level of the dock.
#define SUPPLY_STATIONZ 6 // Z-level of the main map.
#define SUPPLY_STATION_AREATYPE /area/supply/station // Type of the cargo elevator area for station.
#define SUPPLY_DOCK_AREATYPE /area/supply/dock // Type of the cargo elevator area for dock.
SUBSYSTEM_DEF(cargo)
name = "Cargo"
wait = 30 SECONDS
flags = SS_NO_FIRE
init_order = SS_INIT_CARGO
// Shipment Variables and Lists
var/shipmentnum
var/list/cargo_shipments = list() // List of the shipments to the main map.
var/datum/cargo_shipment/current_shipment = null // The current cargo shipment.
var/list/queued_mining_equipment = list()
// Order Variables and Lists
var/ordernum
var/list/cargo_items = list() // The list of items.
var/list/cargo_categories = list() // The list of categories.
var/list/cargo_suppliers = list() // The list of suppliers.
var/list/all_orders = list() // All orders.
// Fee Variables
var/credits_per_crate = 30 // "Cost / Payment" per crate shipped from or to centcomm.
var/credits_per_platinum = 140 // Per sheet.
var/credits_per_phoron = 100 // Per sheet.
var/cargo_handlingfee = 20 // The handling fee cargo takes per crate.
var/cargo_handlingfee_min = 0 // The minimum handling fee.
var/cargo_handlingfee_max = 500 // The maximum handling fee.
var/cargo_handlingfee_change = 1 // If the handling fee can be changed -> for a random event.
var/datum/money_account/supply_account
// Elevator Movement Variables
var/movetime = 300
var/min_movetime = 300
var/max_movetime = 2400
var/datum/shuttle/autodock/ferry/supply/shuttle
// Item Variables
var/last_item_id = 0 // The ID of the last item that has been added.
/// Indicates if orders have been dumped.
var/dumped_orders = FALSE
// Exports and Bounties
var/list/exports_list = list()
var/list/bounties_list = list()
/datum/controller/subsystem/cargo/Recover()
src.shuttle = SScargo.shuttle
src.cargo_items = SScargo.cargo_items
src.cargo_categories = SScargo.cargo_categories
src.cargo_shipments = SScargo.cargo_shipments
src.all_orders = SScargo.all_orders
src.cargo_handlingfee = SScargo.cargo_handlingfee
src.cargo_handlingfee_change = SScargo.cargo_handlingfee_change
src.supply_account = SScargo.supply_account
src.last_item_id = SScargo.last_item_id
src.exports_list = SScargo.exports_list
src.bounties_list = SScargo.bounties_list
/datum/controller/subsystem/cargo/Initialize(timeofday)
// Generate the order number and shipment number to start with.
ordernum = rand(1, 8000)
shipmentnum = rand(500, 700)
supply_account = SSeconomy.get_department_account("Operations")
// Load in the cargo items config.
load_cargo_files()
setupExports()
setupBounties()
// Spawn in the warehouse objects and items.
var/datum/cargospawner/spawner = new
spawner.start()
qdel(spawner)
return SS_INIT_SUCCESS
/*
Loading Data
*/
// Reset cargo to prep for loading in new items.
/datum/controller/subsystem/cargo/proc/reset_cargo()
cargo_shipments = list() // List of the shipments to the main map.
current_shipment = null // The current cargo shipment.
all_orders = list() // All orders.
last_item_id = 0
// Load Categories
/datum/controller/subsystem/cargo/proc/load_cargo_categories()
for(var/singleton/cargo_category/C as anything in (GET_SINGLETON_SUBTYPE_LIST(/singleton/cargo_category)))
log_subsystem_cargo("Loading category '[C.name]'.")
SScargo.cargo_categories[C.name] = C
// Load Suppliers
/datum/controller/subsystem/cargo/proc/load_cargo_suppliers()
for(var/singleton/cargo_supplier/S as anything in (GET_SINGLETON_SUBTYPE_LIST(/singleton/cargo_supplier)))
log_subsystem_cargo("Loading supplier '[S.name]', with short name '[S.short_name]'.")
S.price_modifier = S.get_total_price_coefficient()
SScargo.cargo_suppliers[S.short_name] = S
/datum/controller/subsystem/cargo/proc/load_cargo_items()
log_subsystem_cargo("Loading cargo items.")
var/id = 1
reset_cargo()
// Get the list of all valid cargo items.
for(var/singleton/cargo_item/I as anything in (GET_SINGLETON_SUBTYPE_LIST(/singleton/cargo_item)))
cargo_items[I.name] = I
I.id = id++
I.get_adjusted_price()
// Check if the category exists in "SScargo.cargo_categories".
if(!(I.category || SScargo.cargo_categories[I.category]))
log_subsystem_cargo("Error: Unable to find category '[I.category]' for item '[I.name]. Skipping.")
continue
else
var/singleton/cargo_category/item_category = SScargo.cargo_categories[I.category]
if(!item_category.items)
item_category.items = list()
item_category.items += I
log_subsystem_cargo("Inserted item '[I.name]' into category '[I.category]' with ID '[I.id]'.")
if(!(I.supplier || SScargo.cargo_suppliers[I.supplier]))
log_subsystem_cargo("Error: Unable to find supplier '[I.supplier]' for item '[I.name]. Skipping.")
continue
else
var/singleton/cargo_supplier/item_supplier = SScargo.cargo_suppliers[I.supplier]
if(!item_supplier.items)
item_supplier.items = list()
item_supplier.items += I
I.supplier_data = item_supplier
log_subsystem_cargo("Finished loading cargo items.")
// Load cargo data from "cargo_items.dm".
/datum/controller/subsystem/cargo/proc/load_cargo_files()
log_subsystem_cargo("Starting to load cargo data from files.")
// Reset the loaded cargo data.
reset_cargo()
// Add categories.
load_cargo_categories()
// Load suppliers.
load_cargo_suppliers()
// Load cargo items.
load_cargo_items()
log_subsystem_cargo("Finished loading cargo data from files.")
/*
Getting Items, Categories, Suppliers, and Shipments
*/
/datum/controller/subsystem/cargo/proc/get_order_count()
return all_orders.len
// Returns the order ID and increments it.
/datum/controller/subsystem/cargo/proc/get_next_order_id()
. = ordernum
ordernum++
return .
// Increments the item ID and returns it.
/datum/controller/subsystem/cargo/proc/get_next_item_id()
last_item_id++
return last_item_id
/// Returns a default cargo_category for usage in situations where one is needed.
/datum/controller/subsystem/cargo/proc/get_default_category()
var/list/categories = GET_SINGLETON_SUBTYPE_LIST(/singleton/cargo_category)
var/singleton/cargo_category/default_cat = categories[1]
log_subsystem_cargo("Default category set to '[initial(default_cat.name)]'.")
return initial(default_cat.name)
/// Returns a string-formatted list of data for all suppliers and their information for use in TGUI.
/datum/controller/subsystem/cargo/proc/get_supplier_data(var/supplier_short_name)
var/list/supplier_data = list()
var/singleton/cargo_supplier/S = cargo_suppliers[supplier_short_name]
if(!S)
log_subsystem_cargo("Error: Unable to find supplier '[supplier_short_name]'.")
return
supplier_data += list(
"short_name" = S.short_name,
"name" = S.name,
"description" = S.description,
"tag_line" = S.tag_line,
"shuttle_time" = S.shuttle_time,
"shuttle_price" = S.shuttle_price,
"available" = S.available,
"price_modifier" = S.price_modifier,
)
return supplier_data
/// Returns a string-formatted list of every item in each category and their information for use in TGUI.
/datum/controller/subsystem/cargo/proc/get_items_for_category(var/category_name)
var/list/item_list = list()
var/singleton/cargo_category/C = cargo_categories[category_name]
if(!C)
log_subsystem_cargo("Error: get_items_for_category() was unable to find category '[category_name]'.")
return
for(var/singleton/cargo_item/ci as anything in C.items)
item_list += list(list(
"name" = ci.name,
"description" = ci.description,
"price" = ci.price,
"id" = ci.id,
"price_adjusted" = ci.adjusted_price,
"supplier" = ci.supplier,
"supplier_data" = get_supplier_data(ci.supplier),
"access" = ci.access != 0 ? get_access_desc(ci.access) : "none",
))
return item_list
/// Returns a string-formatted list of categories for use in TGUI.
/datum/controller/subsystem/cargo/proc/get_category_list()
var/list/category_list = list()
for (var/cat_name in cargo_categories)
// Get the singleton instance for the current category.
var/singleton/cargo_category/cc = cargo_categories[cat_name]
category_list += list(list(
"name" = cc.name,
"display_name" = cc.display_name,
"description" = cc.description,
"icon" = cc.icon,
"price_modifier" = cc.price_modifier,
))
return category_list
// Get category names.
/datum/controller/subsystem/cargo/proc/get_category_by_name(var/name)
// Check if the category exists in cargo_categories.
if(!cargo_categories[name])
log_subsystem_cargo("Error: Requested category '[name]' does not exist.")
return
// Return the category if it exists.
return cargo_categories[name]
// Gets a order by order ID.
/datum/controller/subsystem/cargo/proc/get_order_by_id(var/id)
for (var/datum/cargo_order/co in all_orders)
if(co.order_id == id)
return co
return null
// Gets a supplier by name.
/datum/controller/subsystem/cargo/proc/get_supplier_by_name(var/name)
return cargo_suppliers[name]
// Gets all the shipments sent to or from the main map.
/datum/controller/subsystem/cargo/proc/get_shipment_list()
var/list/shipment_list = list()
for(var/datum/cargo_shipment/cs in cargo_shipments)
if(cs.get_list() != null)
shipment_list.Add(list(cs.get_list()))
return shipment_list
// Get a shipment by shipment ID.
/datum/controller/subsystem/cargo/proc/get_shipment_by_id(var/id)
for(var/datum/cargo_shipment/cs in cargo_shipments)
if(cs.shipment_num == id)
return cs
return null
/*
Submitting, Approving, Rejecting and Shipping Orders
*/
// Gets the orders based on their status (submitted, approved, shipped).
/datum/controller/subsystem/cargo/proc/get_orders_by_status(var/status, var/data_list=0)
if(!status)
log_subsystem_cargo("get_orders_by_status has been called with a invalid status")
return list()
var/list/orders = list()
for (var/datum/cargo_order/co in all_orders)
if(co.status == status)
if(data_list)
orders.Add(list(co.get_list()))
else
orders.Add(co)
return orders
// Gets the value of orders based on their status, type is passed on to co.get_value.
/datum/controller/subsystem/cargo/proc/get_orders_value_by_status(var/status, var/type=0)
if(!status)
log_subsystem_cargo("get_orders_value_by_status has been called with a invalid status")
return 0
var/value = 0
for (var/datum/cargo_order/co in all_orders)
if(co.status == status)
value += co.get_value(type)
return value
// Gets the suppliers of the orders of a specific type.
/datum/controller/subsystem/cargo/proc/get_order_suppliers_by_status(var/status, var/pretty_names=0)
if(!status)
log_subsystem_cargo("get_order_suppliers_by_status has been called with a invalid status")
return list()
var/list/suppliers = list()
for(var/datum/cargo_order/co in all_orders)
if(co.status == status)
// Get the list of supplirs and add it to the suppliers list.
for(var/supplier in co.get_supplier_list())
if(pretty_names)
var/singleton/cargo_supplier/cs = SScargo.cargo_suppliers[supplier]
suppliers[cs.short_name] = cs.name
else
suppliers[supplier] = supplier
return suppliers
// Checks if theorder can be shipped and marks it as shipped if possible.
/datum/controller/subsystem/cargo/proc/ship_order(var/datum/cargo_order/co)
// Get the price cargo has to pay for the order.
var/item_price = co.get_value(1)
// Get the maximum shipment costs for the order.
var/shipment_cost = co.get_shipment_cost()
// Check if cargo has enough money to pay for the shipment of the item and the maximum shipment cost.
if(item_price + shipment_cost > get_cargo_money())
log_subsystem_cargo("Order could not be shipped. Insufficient money. [item_price] + [shipment_cost] > [get_cargo_money()].")
return 0
co.set_shipped()
current_shipment.shipment_cost_purchase += item_price // Increase the price of the shipment.
current_shipment.orders.Add(co) // Add the order to the order list.
return 1
// Generate a new cargo shipment.
/datum/controller/subsystem/cargo/proc/new_shipment()
current_shipment = new()
shipmentnum ++
cargo_shipments.Add(current_shipment)
current_shipment.shipment_num = shipmentnum
/*
Changing Settings
*/
// Gets the current handlingfee.
/datum/controller/subsystem/cargo/proc/get_handlingfee()
return cargo_handlingfee
// Sets the handling fee and returns a status message.
/datum/controller/subsystem/cargo/proc/set_handlingfee(var/fee)
if(!fee)
return "Unable to set handlingfee - Can not be NULL"
if(fee < cargo_handlingfee_min)
return "Unable to set handlingfee - Smaller than minimum: [cargo_handlingfee_min]"
if(fee > cargo_handlingfee_max)
return "Unable to set handlingfee - Higher than maximum: [cargo_handlingfee_max]"
if(cargo_handlingfee_change != 1)
return "Unable to set handlingfee - Changing the handlingfee is currently not possible"
cargo_handlingfee = fee
return
//Gets the current crate fee
/datum/controller/subsystem/cargo/proc/get_cratefee()
return credits_per_crate
/*
Money Stuff
*/
//Gets the current money on the cargo account
/datum/controller/subsystem/cargo/proc/get_cargo_money()
return supply_account.money
//Charges cargo. Accepts a text that should appear as charge and the numer of credits to charge
/datum/controller/subsystem/cargo/proc/charge_cargo(var/charge_text, var/charge_credits)
if(!supply_account)
log_subsystem_cargo("Warning: Tried to charge supply account but supply acount doesnt exist")
return 0
return SSeconomy.charge_to_account(supply_account.account_number, "[commstation_name()] - Operations", "[charge_text]", "[commstation_name()] - Banking System", -charge_credits)
//Gets the pending shipment costs for the items that are about to be shipped to the station
/datum/controller/subsystem/cargo/proc/get_pending_shipment_cost(var/status="approved")
//Loop through all the orders marked as shipped and get the suppliers into a list of involved suppliers
var/list/suppliers = get_order_suppliers_by_status(status)
var/price = 0
for(var/supplier in suppliers)
var/singleton/cargo_supplier/cs = SScargo.cargo_suppliers[supplier]
if(cs)
price += cs.shuttle_price
return price
//Gets the pending shipment time for the items that are about to be shipped to the station
/datum/controller/subsystem/cargo/proc/get_pending_shipment_time(var/status="approved")
//Loop through all the orders marked as shipped and get the suppliers into a list of involved suppliers
var/list/suppliers = get_order_suppliers_by_status(status)
var/time = 0
for(var/supplier in suppliers)
var/singleton/cargo_supplier/cs = SScargo.cargo_suppliers[supplier]
if(cs)
time += cs.shuttle_time
return time
/*
Shuttle Operations - Calling, Forcing, Canceling, Buying / Selling
*/
// Calls the shuttle and returns a status message.
/datum/controller/subsystem/cargo/proc/shuttle_call(var/requester_name)
if(shuttle.at_station())
if(shuttle.forbidden_atoms_check())
. = "For safety reasons the cargo elevator cannot transport live organisms, classified nuclear weaponry, nor homing beacons."
else
movetime = min_movetime // It always takes two minutes to get to centcomm.
shuttle.launch(src)
. = "Initiating cargo elevator."
current_shipment.shuttle_recalled_by = requester_name
else
// Check if there is enough money in the cargo account for the current shipment.
var/shipment_cost = get_pending_shipment_cost()
if(shipment_cost > get_cargo_money())
. = "The cargo elevator could not be called due to insufficient funds. [shipment_cost] credits required."
else
// Create a new shipment if one does not exist already.
if(!current_shipment)
new_shipment()
// Set the elevator movement time.
current_shipment.shuttle_time = get_pending_shipment_time()
current_shipment.shuttle_fee = shipment_cost
if(current_shipment.shuttle_time < min_movetime)
log_subsystem_cargo("Cargo elevator time less than [min_movetime]: [current_shipment.shuttle_time]. Setting to [min_movetime].")
current_shipment.shuttle_time = min_movetime
if(current_shipment.shuttle_time > max_movetime)
log_subsystem_cargo("Cargo elevator time larger than [max_movetime]: [current_shipment.shuttle_time]. Setting to [max_movetime].")
current_shipment.shuttle_time = max_movetime
movetime = current_shipment.shuttle_time
//Launch it
shuttle.launch(src)
. = "The cargo elevator has been called and will arrive in approximately [round(SScargo.movetime/600, 2)] minutes."
current_shipment.shuttle_called_by = requester_name
// Cancels the elevator. Can return a status message.
/datum/controller/subsystem/cargo/proc/shuttle_cancel()
shuttle.cancel_launch(src)
// Forces the eleavtor. Can return a status message.
/datum/controller/subsystem/cargo/proc/shuttle_force()
shuttle.force_launch(src)
// To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types.
/datum/controller/subsystem/cargo/proc/forbidden_atoms_check(atom/A)
if(istype(A, /mob/living))
var/mob/living/mob_to_send = A
var/mob_is_for_bounty = FALSE
if(!mob_to_send.mind)
for(var/bounty in bounties_list)
var/datum/bounty/B = bounty
if(B.applies_to(mob_to_send))
mob_is_for_bounty = TRUE
if(!mob_is_for_bounty)
return 1
if(istype(A, /obj/item/disk/nuclear))
return 1
if(istype(A, /obj/machinery/nuclearbomb))
return 1
if(istype(A, /obj/item/radio/beacon))
return 1
for(var/i=1, i<=A.contents.len, i++)
var/atom/B = A.contents[i]
if(.(B))
return 1
// Sells stuff on the elevator to centcomm.
/datum/controller/subsystem/cargo/proc/sell()
if(!shuttle.shuttle_area)
return
var/msg = ""
var/matched_bounty = FALSE
var/sold_atoms = ""
for(var/area/subarea in shuttle.shuttle_area)
for(var/atom/movable/AM in subarea)
if(bounty_ship_item_and_contents(AM, dry_run = FALSE))
matched_bounty = TRUE
if(!AM.anchored)
sold_atoms += export_item_and_contents(AM, FALSE, FALSE, dry_run = FALSE)
if(sold_atoms)
sold_atoms += "."
if(matched_bounty)
msg += "Bounty items received. An update has been sent to all bounty consoles.\n"
for(var/a in exports_list)
var/datum/export/E = a
var/export_text = E.total_printout()
if(!export_text)
continue
msg += export_text + "\n"
current_shipment.shipment_cost_sell += E.total_cost
E.export_end()
charge_cargo("Shipment #[current_shipment.shipment_num] - Income", -current_shipment.shipment_cost_sell)
current_shipment.message = msg
current_shipment.generate_invoice()
current_shipment = null // Null the current shipment because it is completed.
/datum/controller/subsystem/cargo/proc/order_mining(var/equip_path)
if(!ispath(equip_path))
return FALSE
queued_mining_equipment += equip_path
return TRUE
// Buys the item and places them on the elevator.
// Returns 0 if unsuccessful and returns 1 if the elevator can be sent.
/datum/controller/subsystem/cargo/proc/buy()
if(!current_shipment)
new_shipment()
var/list/approved_orders = get_orders_by_status("approved", 0)
if(!shuttle.shuttle_area)
return
var/list/clear_turfs = list()
for(var/area/subarea in shuttle.shuttle_area)
for(var/turf/T in subarea)
if(T.density)
continue
var/contcount
for(var/atom/A in T.contents)
if(!A.simulated)
continue
contcount++
if(contcount)
continue
clear_turfs += T
for(var/E in queued_mining_equipment)
if(!ispath(E))
continue
var/i = rand(1,clear_turfs.len)
var/turf/pickedloc = clear_turfs[i]
clear_turfs.Cut(i,i+1)
if(isturf(pickedloc))
new E(pickedloc)
queued_mining_equipment -= E
for(var/datum/cargo_order/co in approved_orders)
if(!co)
continue
// Check if theres space to place the order.
if(!clear_turfs.len)
log_subsystem_cargo("Order [co.order_id] could not be placed on the cargo elevator because it is full.")
break
// Check if the supplier is still available.
for(var/datum/cargo_order_item/coi in co.items)
if(!coi.ci.supplier_data.available)
log_subsystem_cargo("Order [co.order_id] could not be placed on the cargo elevator because supplier [coi.ci.supplier_data.name] for item [coi.ci.name] is unavailable.")
continue
// Check if there is enough money to ship the order.
if(!ship_order(co))
continue
var/i = rand(1,clear_turfs.len)
var/turf/pickedloc = clear_turfs[i]
clear_turfs.Cut(i,i+1)
// Spawn the crate.
var/containertype = co.get_container_type()
var/obj/crate = new containertype(pickedloc)
// Label the crate.
crate.name_unlabel = crate.name
crate.name = "[crate.name] ([co.order_id] - [co.ordered_by])"
crate.verbs += /atom/proc/remove_label
// Set the access requirement.
if(co.required_access.len > 0)
crate.req_access = co.required_access.Copy()
// Loop through the items and spawn them.
for(var/datum/cargo_order_item/coi in co.items)
if(!coi)
continue
for(var/_ in 1 to coi.ci.spawn_amount)
for(var/item_typepath in coi.ci.items)
new item_typepath(crate)
// Spawn the paper inside.
var/obj/item/paper/P = new(crate)
P.set_content_unsafe("[co.order_id] - [co.ordered_by]", co.get_report_delivery_order())
// Shuttle is loaded now, charge operations for it.
charge_cargo("Shipment #[current_shipment.shipment_num] - Expense", current_shipment.shipment_cost_purchase)
return 1
/// Dumps the cargo orders to the database when the round ends.
/datum/controller/subsystem/cargo/Shutdown()
if(dumped_orders)
log_subsystem_cargo("SQL: Orders already dumped. Cargo data dump has been aborted.")
return
if(!SSdbcore.Connect())
log_subsystem_cargo("SQL: Unable to connect to SQL database. Cargo data dump has been aborted.")
return
dumped_orders = TRUE
// Loop through all the orders and dump them all.
for(var/datum/cargo_order/co in all_orders)
// Iterate over the items in the order and build the a list with the item count.
var/list/itemcount = list()
var/list/itemnames = list()
for(var/datum/cargo_order_item/coi in co.items)
if(!isnull(itemcount["[coi.ci.id]"]))
itemcount["[coi.ci.id]"] = itemcount["[coi.ci.id]"] + 1
else
itemcount["[coi.ci.id]"] = 1
itemnames["[coi.ci.id]"] = coi.ci.name
var/datum/db_query/dump_query = SSdbcore.NewQuery("INSERT INTO `ss13_cargo_orderlog` (`game_id`, `order_id`, `status`, `price`, `ordered_by_id`, `ordered_by`, `authorized_by_id`, `authorized_by`, `received_by_id`, `received_by`, `paid_by_id`, `paid_by`, `time_submitted`, `time_approved`, `time_shipped`, `time_delivered`, `time_paid`, `reason`) \
VALUES (:game_id, :order_id, :status, :price, :ordered_by_id, :ordered_by, :authorized_by_id, :authorized_by, :received_by_id, :received_by, :paid_by_id, :paid_by, :time_submitted, :time_approved, :time_shipped, :time_delivered, :time_paid, :reason)",
list(
"game_id"=GLOB.round_id,
"order_id"=co.order_id,
"status"=co.status,
"price"=co.price,
"ordered_by_id"=co.ordered_by_id,
"ordered_by"=co.ordered_by,
"authorized_by_id"=co.authorized_by_id,
"authorized_by"=co.authorized_by,
"received_by_id"=co.received_by_id,
"received_by"=co.received_by,
"paid_by_id"=co.paid_by_id,
"paid_by"=co.paid_by,
"time_submitted"=co.time_submitted,
"time_approved"=co.time_approved,
"time_shipped"=co.time_shipped,
"time_delivered"=co.time_delivered,
"time_paid"=co.time_paid,
"reason"=co.reason
), TRUE)
if(!dump_query.Execute())
log_subsystem_cargo("SQL: Could not write order to database. Cargo data dump has been aborted.")
continue
if(dump_query.last_insert_id)
for(var/item_id in itemcount)
var/datum/db_query/dump_item_query = SSdbcore.NewQuery("INSERT INTO `ss13_cargo_item_orderlog` (`cargo_orderlog_id`, `item_name`, `amount`) \
VALUES (:cargo_orderlog_id, :item_name, :amount)",
list(
"cargo_orderlog_id" = dump_query.last_insert_id,
"item_name"= itemnames[item_id],
"amount" = itemcount[item_id]
),
TRUE)
if(!dump_item_query.Execute())
log_subsystem_cargo("SQL: Cound not write details of a cargo order.")
qdel(dump_item_query)
continue
qdel(dump_query)
log_subsystem_cargo("SQL: Saved cargo order log to database.")