mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-12 01:43:40 +00:00
Adds crew monitor to the asset cache system Adds paper to the asset cache system Added a way to send files to the client slowly without clogging up the queue. (This isn't technically "safe", but the client would only have issues if they didn't have that file already (rare), and only if they used a window that needed that asset (currently only nanoui windows) within the first 15 to 90 seconds of connecting (depending on ping)) Makes NanoUI use this slow send system to blindly send it's asset files. (Once bay's nanoui is ported, i'll improve this so that nanoui fully implements asset cache checking) Makes asset cache use this system to send all registered asset files, so that ui windows don't have to wait for them if the client's been connected a while.
207 lines
6.8 KiB
Plaintext
207 lines
6.8 KiB
Plaintext
#define ASSET_CACHE_SEND_TIMEOUT 25 // Amount of time MAX to send an asset, if this get exceeded we cancel the sleeping.
|
|
|
|
//List of ALL assets for the above, format is list(filename = asset).
|
|
/var/global/list/asset_cache = list()
|
|
|
|
/client
|
|
var/list/cache = list() // List of all assets sent to this client by the asset cache.
|
|
var/list/completed_asset_jobs = list() // List of all completed jobs, awaiting acknowledgement.
|
|
var/list/sending = list()
|
|
var/last_asset_job = 0 // Last job done.
|
|
|
|
//This proc sends the asset to the client, but only if it needs it.
|
|
/proc/send_asset(var/client/client, var/asset_name, var/verify = TRUE)
|
|
if(!istype(client))
|
|
if(ismob(client))
|
|
var/mob/M = client
|
|
if(M.client)
|
|
client = M.client
|
|
|
|
else
|
|
return 0
|
|
|
|
else
|
|
return 0
|
|
|
|
if(client.cache.Find(asset_name) || client.sending.Find(asset_name))
|
|
return 0
|
|
|
|
client << browse_rsc(asset_cache[asset_name], asset_name)
|
|
if(!verify || !winexists(client, "asset_cache_browser")) // Can't access the asset cache browser, rip.
|
|
client.cache += asset_name
|
|
return 1
|
|
|
|
client.sending |= asset_name
|
|
var/job = ++client.last_asset_job
|
|
|
|
client << browse({"
|
|
<script>
|
|
window.location.href="?asset_cache_confirm_arrival=[job]"
|
|
</script>
|
|
"}, "window=asset_cache_browser")
|
|
|
|
var/t = 0
|
|
var/timeout_time = ASSET_CACHE_SEND_TIMEOUT * client.sending.len
|
|
while(client && !client.completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic()
|
|
sleep(1) // Lock up the caller until this is received.
|
|
t++
|
|
|
|
if(client)
|
|
client.sending -= asset_name
|
|
client.cache |= asset_name
|
|
client.completed_asset_jobs -= job
|
|
|
|
return 1
|
|
|
|
/proc/send_asset_list(var/client/client, var/list/asset_list, var/verify = TRUE)
|
|
if(!istype(client))
|
|
if(ismob(client))
|
|
var/mob/M = client
|
|
if(M.client)
|
|
client = M.client
|
|
|
|
else
|
|
return 0
|
|
|
|
else
|
|
return 0
|
|
|
|
var/list/unreceived = asset_list - (client.cache + client.sending)
|
|
if(!unreceived || !unreceived.len)
|
|
return 0
|
|
|
|
for(var/asset in unreceived)
|
|
if (asset in asset_cache)
|
|
client << browse_rsc(asset_cache[asset], asset)
|
|
|
|
if(!verify || !winexists(client, "asset_cache_browser")) // Can't access the asset cache browser, rip.
|
|
client.cache += unreceived
|
|
return 1
|
|
|
|
client.sending |= unreceived
|
|
var/job = ++client.last_asset_job
|
|
|
|
client << browse({"
|
|
<script>
|
|
window.location.href="?asset_cache_confirm_arrival=[job]"
|
|
</script>
|
|
"}, "window=asset_cache_browser")
|
|
|
|
var/t = 0
|
|
var/timeout_time = ASSET_CACHE_SEND_TIMEOUT * client.sending.len
|
|
while(client && !client.completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic()
|
|
sleep(1) // Lock up the caller until this is received.
|
|
t++
|
|
|
|
if(client)
|
|
client.sending -= unreceived
|
|
client.cache |= unreceived
|
|
client.completed_asset_jobs -= job
|
|
|
|
return 1
|
|
|
|
//This proc will download the files without clogging up the browse() queue, used for passively sending files on connection start.
|
|
proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
|
|
for(var/file in files)
|
|
if (register_asset)
|
|
register_asset(file,files[file])
|
|
send_asset(client,file)
|
|
|
|
//This proc "registers" an asset, it adds it to the cache for further use, you cannot touch it from this point on or you'll fuck things up.
|
|
//if it's an icon or something be careful, you'll have to copy it before further use.
|
|
/proc/register_asset(var/asset_name, var/asset)
|
|
asset_cache[asset_name] = asset
|
|
|
|
//From here on out it's populating the asset cache.
|
|
/proc/populate_asset_cache()
|
|
for(var/type in typesof(/datum/asset) - list(/datum/asset, /datum/asset/simple))
|
|
var/datum/asset/A = new type()
|
|
A.register()
|
|
|
|
//These datums are used to populate the asset cache, the proc "register()" does this.
|
|
|
|
//all of our asset datums, used for referring to these later
|
|
/var/global/list/asset_datums = list()
|
|
|
|
//get a assetdatum or make a new one
|
|
/proc/get_asset_datum(var/type)
|
|
if (!(type in asset_datums))
|
|
return new type()
|
|
return asset_datums[type]
|
|
|
|
/datum/asset/New()
|
|
asset_datums[type] = src
|
|
|
|
/datum/asset/proc/register()
|
|
return
|
|
|
|
/datum/asset/proc/send(client)
|
|
return
|
|
|
|
//If you don't need anything complicated.
|
|
/datum/asset/simple
|
|
var/assets = list()
|
|
var/verify = FALSE
|
|
|
|
/datum/asset/simple/register()
|
|
for(var/asset_name in assets)
|
|
register_asset(asset_name, assets[asset_name])
|
|
/datum/asset/simple/send(client)
|
|
send_asset_list(client,assets,verify)
|
|
|
|
|
|
//DEFINITIONS FOR ASSET DATUMS START HERE.
|
|
|
|
|
|
/datum/asset/simple/pda
|
|
assets = list(
|
|
"pda_atmos.png" = 'icons/pda_icons/pda_atmos.png',
|
|
"pda_back.png" = 'icons/pda_icons/pda_back.png',
|
|
"pda_bell.png" = 'icons/pda_icons/pda_bell.png',
|
|
"pda_blank.png" = 'icons/pda_icons/pda_blank.png',
|
|
"pda_boom.png" = 'icons/pda_icons/pda_boom.png',
|
|
"pda_bucket.png" = 'icons/pda_icons/pda_bucket.png',
|
|
"pda_medbot.png" = 'icons/pda_icons/pda_medbot.png',
|
|
"pda_floorbot.png" = 'icons/pda_icons/pda_floorbot.png',
|
|
"pda_cleanbot.png" = 'icons/pda_icons/pda_cleanbot.png',
|
|
"pda_crate.png" = 'icons/pda_icons/pda_crate.png',
|
|
"pda_cuffs.png" = 'icons/pda_icons/pda_cuffs.png',
|
|
"pda_eject.png" = 'icons/pda_icons/pda_eject.png',
|
|
"pda_exit.png" = 'icons/pda_icons/pda_exit.png',
|
|
"pda_flashlight.png" = 'icons/pda_icons/pda_flashlight.png',
|
|
"pda_honk.png" = 'icons/pda_icons/pda_honk.png',
|
|
"pda_mail.png" = 'icons/pda_icons/pda_mail.png',
|
|
"pda_medical.png" = 'icons/pda_icons/pda_medical.png',
|
|
"pda_menu.png" = 'icons/pda_icons/pda_menu.png',
|
|
"pda_mule.png" = 'icons/pda_icons/pda_mule.png',
|
|
"pda_notes.png" = 'icons/pda_icons/pda_notes.png',
|
|
"pda_power.png" = 'icons/pda_icons/pda_power.png',
|
|
"pda_rdoor.png" = 'icons/pda_icons/pda_rdoor.png',
|
|
"pda_reagent.png" = 'icons/pda_icons/pda_reagent.png',
|
|
"pda_refresh.png" = 'icons/pda_icons/pda_refresh.png',
|
|
"pda_scanner.png" = 'icons/pda_icons/pda_scanner.png',
|
|
"pda_signaler.png" = 'icons/pda_icons/pda_signaler.png',
|
|
"pda_status.png" = 'icons/pda_icons/pda_status.png'
|
|
)
|
|
|
|
/datum/asset/simple/paper
|
|
assets = list(
|
|
"large_stamp-clown.png" = 'icons/stamp_icons/large_stamp-clown.png',
|
|
"large_stamp-deny.png" = 'icons/stamp_icons/large_stamp-deny.png',
|
|
"large_stamp-ok.png" = 'icons/stamp_icons/large_stamp-ok.png',
|
|
"large_stamp-hop.png" = 'icons/stamp_icons/large_stamp-hop.png',
|
|
"large_stamp-cmo.png" = 'icons/stamp_icons/large_stamp-cmo.png',
|
|
"large_stamp-ce.png" = 'icons/stamp_icons/large_stamp-ce.png',
|
|
"large_stamp-hos.png" = 'icons/stamp_icons/large_stamp-hos.png',
|
|
"large_stamp-rd.png" = 'icons/stamp_icons/large_stamp-rd.png',
|
|
"large_stamp-cap.png" = 'icons/stamp_icons/large_stamp-cap.png',
|
|
"large_stamp-qm.png" = 'icons/stamp_icons/large_stamp-qm.png',
|
|
"large_stamp-law.png" = 'icons/stamp_icons/large_stamp-law.png'
|
|
)
|
|
|
|
//Registers HTML Interface assets.
|
|
/datum/asset/HTML_interface/register()
|
|
for(var/path in typesof(/datum/html_interface))
|
|
var/datum/html_interface/hi = new path()
|
|
hi.registerResources()
|