The final Item Bank patch?

This commit is contained in:
Casey
2022-02-06 18:28:22 -05:00
committed by CHOMPStation2
parent fe6d93ab55
commit e6f02c05a6
3 changed files with 240 additions and 1 deletions

View File

@@ -42,6 +42,11 @@
var/atom/movable/product = instances[instances.len] // Remove the last added product
instances -= product
product.forceMove(product_location)
//VOREStation Addition Start
if(istype(product, /obj))
var/obj/item = product
item.persist_storable = FALSE
//VOREStation Addition End
return product
/datum/stored_item/proc/add_product(var/atom/movable/product)

View File

@@ -0,0 +1,231 @@
/obj/machinery/item_bank
name = "electronic lockbox"
desc = "A place to store things you might want later!"
icon = 'icons/obj/stationobjs_vr.dmi'
icon_state = "item_bank"
idle_power_usage = 1
active_power_usage = 5
anchored = TRUE
density = FALSE
var/busy_bank = FALSE
var/static/list/item_takers = list()
/obj/machinery/item_bank/proc/persist_item_savefile_path(mob/user)
return "data/player_saves/[copytext(user.ckey, 1, 2)]/[user.ckey]/persist_item.sav"
/obj/machinery/item_bank/proc/persist_item_savefile_save(mob/user, obj/item/O)
if(IsGuestKey(user.key))
return 0
var/savefile/F = new /savefile(src.persist_item_savefile_path(user))
F["persist item"] << O.type
F["persist name"] << initial(O.name)
return 1
/obj/machinery/item_bank/proc/persist_item_savefile_load(mob/user, thing)
if (IsGuestKey(user.key))
return 0
var/path = src.persist_item_savefile_path(user)
if (!fexists(path))
return 0
var/savefile/F = new /savefile(path)
if(!F) return 0
var/persist_item
F["persist item"] >> persist_item
if (isnull(persist_item) || !ispath(persist_item))
fdel(path)
tgui_alert_async(user, "An item could not be retrieved.")
return 0
if(thing == "type")
return persist_item
if(thing == "name")
var/persist_name
F["persist name"] >> persist_name
return persist_name
/obj/machinery/item_bank/Initialize()
. = ..()
/obj/machinery/item_bank/attack_hand(mob/living/user)
. = ..()
if(!ishuman(user))
return
if(istype(user) && Adjacent(user))
if(inoperable() || panel_open)
to_chat(user, "<span class='warning'>\The [src] seems to be nonfunctional...</span>")
else
start_using(user)
/obj/machinery/item_bank/proc/start_using(mob/living/user)
if(!ishuman(user))
return
if(busy_bank)
to_chat(user, "<span class='warning'>\The [src] is already in use.</span>")
return
busy_bank = TRUE
var/I = persist_item_savefile_load(user, "type")
var/Iname = persist_item_savefile_load(user, "name")
var/choice = tgui_alert(user, "What would you like to do [src]?", "[src]", list("Check contents", "Retrieve item", "Info", "Cancel"), timeout = 10 SECONDS)
if(!choice || choice == "Cancel" || !Adjacent(user) || inoperable() || panel_open)
busy_bank = FALSE
return
else if(choice == "Check contents" && I)
to_chat(user, "<span class='notice'>\The [src] has \the [Iname] for you!</span>")
busy_bank = FALSE
else if(choice == "Retrieve item" && I)
if(user.hands_are_full())
to_chat(user,"<span class='notice'>Your hands are full!</span>")
busy_bank = FALSE
return
if(user.ckey in item_takers)
to_chat(user, "<span class='warning'>You have already taken something out of \the [src] this shift.</span>")
busy_bank = FALSE
return
choice = tgui_alert(user, "If you remove this item from the bank, it will be unable to be stored again. Do you still want to remove it?", "[src]", list("No", "Yes"), timeout = 10 SECONDS)
icon_state = "item_bank_o"
if(!choice || choice == "No" || !Adjacent(user) || inoperable() || panel_open)
busy_bank = FALSE
icon_state = "item_bank"
return
else if(!do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) || inoperable())
busy_bank = FALSE
icon_state = "item_bank"
return
var/obj/N = new I(get_turf(src))
log_admin("[key_name_admin(user)] retrieved [N] from the item bank.")
visible_message("<span class='notice'>\The [src] dispenses the [N] to \the [user].</span>")
user.put_in_hands(N)
N.persist_storable = FALSE
var/path = src.persist_item_savefile_path(user)
var/savefile/F = new /savefile(src.persist_item_savefile_path(user))
F["persist item"] << null
F["persist name"] << null
fdel(path)
item_takers += user.ckey
busy_bank = FALSE
icon_state = "item_bank"
else if(choice == "Info")
to_chat(user, "<span class='notice'>\The [src] can store a single item for you between shifts! Anything that has been retrieved from the bank cannot be stored again in the same shift. Anyone can withdraw from the bank one time per shift. Some items are not able to be accepted by the bank.</span>")
busy_bank = FALSE
return
else if(!I)
to_chat(user, "<span class='warning'>\The [src] doesn't seem to have anything for you...</span>")
busy_bank = FALSE
/obj/machinery/item_bank/attackby(obj/item/O, mob/living/user)
if(!ishuman(user))
return
if(busy_bank)
to_chat(user, "<span class='warning'>\The [src] is already in use.</span>")
return
busy_bank = TRUE
var/I = persist_item_savefile_load(user, "type")
if(!istool(O) && O.persist_storable)
if(ispath(I))
to_chat(user, "<span class='warning'>You cannot store \the [O]. You already have something stored.</span>")
busy_bank = FALSE
return
var/choice = tgui_alert(user, "If you store \the [O], anything it contains may be lost to \the [src]. Are you sure?", "[src]", list("Store", "Cancel"), timeout = 10 SECONDS)
if(!choice || choice == "Cancel" || !Adjacent(user) || inoperable() || panel_open)
busy_bank = FALSE
return
for(var/obj/check in O.contents)
if(!check.persist_storable)
to_chat(user, "<span class='warning'>\The [src] buzzes. \The [O] contains [check], which cannot be stored. Please remove this item before attempting to store \the [O]. As a reminder, any contents of \the [O] will be lost if you store it with contents.</span>")
busy_bank = FALSE
return
user.visible_message("<span class='notice'>\The [user] begins storing \the [O] in \the [src].</span>","<span class='notice'>You begin storing \the [O] in \the [src].</span>")
icon_state = "item_bank_o"
if(!do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) || inoperable())
busy_bank = FALSE
icon_state = "item_bank"
return
src.persist_item_savefile_save(user, O)
user.visible_message("<span class='notice'>\The [user] stores \the [O] in \the [src].</span>","<span class='notice'>You stored \the [O] in \the [src].</span>")
log_admin("[key_name_admin(user)] stored [O] in the item bank.")
qdel(O)
busy_bank = FALSE
icon_state = "item_bank"
else
to_chat(user, "<span class='warning'>You cannot store \the [O]. \The [src] either does not accept that, or it has already been retrieved from storage this shift.</span>")
busy_bank = FALSE
/////STORABLE ITEMS AND ALL THAT JAZZ/////
//I am only really intending this to be used for single items. Mostly stuff you got right now, but can't/don't want to use right now.
//It is not at all intended to be a thing that just lets you hold on to stuff forever, but just until it's the right time to use it.
/obj
var/persist_storable = TRUE //If this is true, this item can be stored in the item bank.
//This is automatically set to false when an item is removed from storage
/////LIST OF STUFF WE DON'T WANT PEOPLE STORING/////
/obj/item/device/pda
persist_storable = FALSE
/obj/item/device/communicator
persist_storable = FALSE
/obj/item/weapon/card
persist_storable = FALSE
/obj/item/weapon/holder
persist_storable = FALSE
/obj/item/device/radio
persist_storable = FALSE
/obj/item/device/encryptionkey
persist_storable = FALSE
/obj/item/weapon/storage //There are lots of things that have stuff that we may not want people to just have. And this is mostly intended for a single thing.
persist_storable = FALSE //And it would be annoying to go through and consider all of them, so default to disabled.
/obj/item/weapon/storage/backpack //But we can enable some where it makes sense. Backpacks and their variants basically never start with anything in them, as an example.
persist_storable = TRUE
/obj/item/weapon/reagent_containers/hypospray/vial
persist_storable = FALSE
/obj/item/weapon/cmo_disk_holder
persist_storable = FALSE
/obj/item/device/defib_kit/compact/combat
persist_storable = FALSE
/obj/item/clothing/glasses/welding/superior
persist_storable = FALSE
/obj/item/clothing/shoes/magboots/adv
persist_storable = FALSE
/obj/item/weapon/rig
persist_storable = FALSE
/obj/item/clothing/head/helmet/space/void
persist_storable = FALSE
/obj/item/clothing/suit/space/void
persist_storable = FALSE
/obj/item/weapon/grab
persist_storable = FALSE
/obj/item/weapon/grenade
persist_storable = FALSE
/obj/item/weapon/hand_tele
persist_storable = FALSE
/obj/item/weapon/paper/dockingcodes
persist_storable = FALSE
/obj/item/weapon/backup_implanter
persist_storable = FALSE
/obj/item/weapon/disk/nuclear
persist_storable = FALSE
/obj/item/weapon/gun/energy/locked //These are guns with security measures on them, so let's say the box won't let you put them in there.
persist_storable = FALSE //(otherwise explo will just put their locker/vendor guns into it every round)
/obj/item/device/retail_scanner
persist_storable = FALSE
/obj/item/weapon/telecube
persist_storable = FALSE
/obj/item/weapon/reagent_containers/glass/bottle/adminordrazine
persist_storable = FALSE
/obj/item/weapon/gun/energy/sizegun/admin
persist_storable = FALSE
/obj/item/weapon/gun/energy/sizegun/abductor
persist_storable = FALSE
/obj/item/stack
persist_storable = FALSE

View File

@@ -242,7 +242,10 @@
return
remove_points(inserted_id, prize.cost)
new prize.equipment_path(loc)
//VOREStation Edit Start
var/obj/I = new prize.equipment_path(loc)
I.persist_storable = FALSE
//VOREStation Edit End
flick(icon_vend, src) //VOREStation Add
else
flick(icon_deny, src) //VOREStation Add