mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-24 05:23:22 +01:00
Merge pull request #3612 from Faerdan/dev
Added Nano UI Chemistry Dispenser plus misc Nano tweaks/fixes.
This commit is contained in:
@@ -249,6 +249,7 @@
|
||||
'nano/js/nano_base_helpers.js',
|
||||
'nano/css/shared.css',
|
||||
'nano/css/icons.css',
|
||||
'nano/templates/chem_dispenser.tmpl',
|
||||
'nano/templates/cryo.tmpl',
|
||||
'nano/images/uiBackground.png',
|
||||
'nano/images/uiIcons16.png',
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
for (var/ui_key in open_uis[src_object_key])
|
||||
for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
|
||||
if(ui && ui.src_object && ui.user)
|
||||
ui.process()
|
||||
ui.process(1)
|
||||
update_count++
|
||||
return update_count
|
||||
|
||||
|
||||
@@ -185,6 +185,7 @@
|
||||
/datum/nanoui/Topic(href, href_list)
|
||||
update_status(0) // update the status
|
||||
if (status != STATUS_INTERACTIVE || user != usr) // If UI is not interactive or usr calling Topic is not the UI user
|
||||
//usr << "Not interaction or wrong usr"
|
||||
return
|
||||
|
||||
if (src_object.Topic(href, href_list))
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#define GAS 3
|
||||
|
||||
/obj/machinery/chem_dispenser
|
||||
name = "chem dispenser"
|
||||
name = "Chem Dispenser"
|
||||
density = 1
|
||||
anchored = 1
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
@@ -65,74 +65,81 @@
|
||||
del(src)
|
||||
return
|
||||
|
||||
/obj/machinery/chem_dispenser/proc/updateWindow(mob/user as mob)
|
||||
winset(user, "chemdispenser.energy", "text=\"Energy: [src.energy]\"")
|
||||
winset(user, "chemdispenser.amount", "text=\"Amount: [src.amount]\"")
|
||||
/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main")
|
||||
if(stat & (BROKEN|NOPOWER)) return
|
||||
if(user.stat || user.restrained()) return
|
||||
|
||||
var/data[0]
|
||||
|
||||
data["amount"] = amount
|
||||
data["energy"] = energy
|
||||
|
||||
data["isBeakerLoaded"] = beaker ? 1 : 0
|
||||
|
||||
|
||||
var beakerContents[0]
|
||||
var beakerCurrentVolume = 0
|
||||
if(beaker && beaker:reagents && beaker:reagents.reagent_list.len)
|
||||
for(var/datum/reagent/R in beaker:reagents.reagent_list)
|
||||
beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list...
|
||||
beakerCurrentVolume += R.volume
|
||||
data["beakerContents"] = beakerContents
|
||||
|
||||
if (beaker)
|
||||
winset(user, "chemdispenser.eject", "text=\"Eject beaker\"")
|
||||
data["beakerCurrentVolume"] = beakerCurrentVolume
|
||||
data["beakerMaxVolume"] = beaker:volume
|
||||
else
|
||||
winset(user, "chemdispenser.eject", "text=\"\[Insert beaker\]\"")
|
||||
/obj/machinery/chem_dispenser/proc/initWindow(mob/user as mob)
|
||||
var/i = 0
|
||||
var/list/nameparams = params2list(winget(user, "chemdispenser_reagents.template_name", "pos;size;type;image;image-mode"))
|
||||
var/list/buttonparams = params2list(winget(user, "chemdispenser_reagents.template_dispense", "pos;size;type;image;image-mode;text;is-flat"))
|
||||
for(var/re in dispensable_reagents)
|
||||
data["beakerCurrentVolume"] = null
|
||||
data["beakerMaxVolume"] = null
|
||||
|
||||
var chemicals[0]
|
||||
for (var/re in dispensable_reagents)
|
||||
var/datum/reagent/temp = chemical_reagents_list[re]
|
||||
if(temp)
|
||||
var/list/newparams1 = nameparams.Copy()
|
||||
var/list/newparams2 = buttonparams.Copy()
|
||||
var/posy = 8 + 40 * i
|
||||
newparams1["pos"] = text("8,[posy]")
|
||||
newparams2["pos"] = text("248,[posy]")
|
||||
newparams1["parent"] = "chemdispenser_reagents"
|
||||
newparams2["parent"] = "chemdispenser_reagents"
|
||||
newparams1["text"] = temp.name
|
||||
newparams2["command"] = text("skincmd \"chemdispenser;[temp.id]\"")
|
||||
winset(user, "chemdispenser_reagent_name[i]", list2params(newparams1))
|
||||
winset(user, "chemdispenser_reagent_dispense[i]", list2params(newparams2))
|
||||
i++
|
||||
winset(user, "chemdispenser_reagents", "size=340x[8 + 40 * i]")
|
||||
chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list...
|
||||
data["chemicals"] = chemicals
|
||||
|
||||
/obj/machinery/chem_dispenser/SkinCmd(mob/user as mob, var/data as text)
|
||||
if(stat & (BROKEN|NOPOWER)) return
|
||||
if(usr.stat || usr.restrained()) return
|
||||
if(!in_range(src, usr)) return
|
||||
//user << list2json(data)
|
||||
|
||||
usr.set_machine(src)
|
||||
|
||||
if (data == "amountc")
|
||||
var/num = input("Enter desired output amount", "Amount", "30") as num
|
||||
if (num)
|
||||
amount = text2num(num)
|
||||
else if (data == "eject")
|
||||
if (src.beaker)
|
||||
var/obj/item/weapon/reagent_containers/glass/B = src.beaker
|
||||
B.loc = src.loc
|
||||
src.beaker = null
|
||||
else if (copytext(data, 1, 7) == "amount")
|
||||
if (text2num(copytext(data, 7)))
|
||||
amount = text2num(copytext(data, 7))
|
||||
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, ui_key)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "chem_dispenser.tmpl", "Chem Dispenser 5000", 370, 585)
|
||||
// When the UI is first opened this is the data it will use
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
else
|
||||
if (dispensable_reagents.Find(data) && beaker != null)
|
||||
// The UI is already open so push the new data to it
|
||||
ui.push_data(data)
|
||||
return
|
||||
|
||||
/obj/machinery/chem_dispenser/Topic(href, href_list)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return 0 // don't update UIs attached to this object
|
||||
|
||||
if(href_list["amount"])
|
||||
amount = round(text2num(href_list["amount"]), 5) // round to nearest 5
|
||||
if (amount < 0) // Since the user can actually type the commands himself, some sanity checking
|
||||
amount = 0
|
||||
if (amount > 100)
|
||||
amount = 100
|
||||
|
||||
if(href_list["dispense"])
|
||||
if (dispensable_reagents.Find(href_list["dispense"]) && beaker != null)
|
||||
var/obj/item/weapon/reagent_containers/glass/B = src.beaker
|
||||
var/datum/reagents/R = B.reagents
|
||||
var/space = R.maximum_volume - R.total_volume
|
||||
|
||||
R.add_reagent(data, min(amount, energy * 10, space))
|
||||
R.add_reagent(href_list["dispense"], min(amount, energy * 10, space))
|
||||
energy = max(energy - min(amount, energy * 10, space) / 10, 0)
|
||||
|
||||
amount = round(amount, 10) // Chem dispenser doesnt really have that much prescion
|
||||
if (amount < 0) // Since the user can actually type the commands himself, some sanity checking
|
||||
amount = 0
|
||||
if (amount > 100)
|
||||
amount = 100
|
||||
if(href_list["ejectBeaker"])
|
||||
if(beaker)
|
||||
var/obj/item/weapon/reagent_containers/glass/B = beaker
|
||||
B.loc = loc
|
||||
beaker = null
|
||||
|
||||
for(var/mob/player in player_list)
|
||||
if (player.machine == src && player.client)
|
||||
updateWindow(player)
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
return
|
||||
add_fingerprint(usr)
|
||||
return 1 // update UIs attached to this object
|
||||
|
||||
/obj/machinery/chem_dispenser/attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob)
|
||||
if(isrobot(user))
|
||||
@@ -149,9 +156,7 @@
|
||||
user.drop_item()
|
||||
B.loc = src
|
||||
user << "You add the beaker to the machine!"
|
||||
for(var/mob/player in player_list)
|
||||
if (player.machine == src && player.client)
|
||||
updateWindow(player)
|
||||
nanomanager.update_uis(src) // update all UIs attached to src
|
||||
|
||||
/obj/machinery/chem_dispenser/attack_ai(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
@@ -162,13 +167,8 @@
|
||||
/obj/machinery/chem_dispenser/attack_hand(mob/user as mob)
|
||||
if(stat & BROKEN)
|
||||
return
|
||||
user.set_machine(src)
|
||||
|
||||
initWindow(user)
|
||||
updateWindow(user)
|
||||
winshow(user, "chemdispenser", 1)
|
||||
user.skincmds["chemdispenser"] = src
|
||||
return
|
||||
ui_interact(user)
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -258,6 +258,7 @@ div.notice
|
||||
{
|
||||
float: left;
|
||||
width: 30%;
|
||||
color: #e9c183;
|
||||
}
|
||||
|
||||
.itemContent
|
||||
@@ -382,4 +383,15 @@ div.notice
|
||||
color: #ffffff;
|
||||
background: #999999;
|
||||
border-color: #666666;
|
||||
}
|
||||
|
||||
.fixedLeft
|
||||
{
|
||||
width: 110px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.floatRight
|
||||
{
|
||||
float: right;
|
||||
}
|
||||
@@ -15,20 +15,31 @@ NanoBaseHelpers = function ()
|
||||
{
|
||||
$.views.helpers({
|
||||
// Generate a Byond link
|
||||
link: function( text, icon, parameters, status ) {
|
||||
link: function( text, icon, parameters, status, elementClass, elementId) {
|
||||
|
||||
var iconHtml = '';
|
||||
if (typeof icon != 'undefined' && icon != null)
|
||||
if (typeof icon != 'undefined' && icon)
|
||||
{
|
||||
iconHtml = '<div class="uiLinkPendingIcon"></div><div class="uiIcon16 ' + icon + '"></div>';
|
||||
}
|
||||
|
||||
if (typeof status != 'undefined' && status != null)
|
||||
if (typeof elementClass == 'undefined' || !elementClass)
|
||||
{
|
||||
return '<div class="link ' + status + '">' + iconHtml + text + '</div>';
|
||||
elementClass = '';
|
||||
}
|
||||
|
||||
return '<div class="link linkActive" data-href="' + generateHref(parameters) + '">' + iconHtml + text + '</div>';
|
||||
var elementIdHtml = '';
|
||||
if (typeof elementId != 'undefined' && elementId)
|
||||
{
|
||||
elementIdHtml = 'id="' + elementId + '"';
|
||||
}
|
||||
|
||||
if (typeof status != 'undefined' && status)
|
||||
{
|
||||
return '<div class="link ' + elementClass + ' ' + status + '" ' + elementIdHtml + '>' + iconHtml + text + '</div>';
|
||||
}
|
||||
|
||||
return '<div class="link linkActive ' + elementClass + '" data-href="' + generateHref(parameters) + '" ' + elementIdHtml + '>' + iconHtml + text + '</div>';
|
||||
},
|
||||
// Round a number to the nearest integer
|
||||
round: function(number) {
|
||||
|
||||
+45
-40
@@ -13,6 +13,49 @@ NanoUpdate = function ()
|
||||
|
||||
var init = function ()
|
||||
{
|
||||
NanoUpdate.addAfterUpdateCallback(function (updateData) {
|
||||
var uiStatusClass;
|
||||
if (updateData['ui']['status'] == 2)
|
||||
{
|
||||
uiStatusClass = 'icon24 uiStatusGood';
|
||||
$('.linkActive').removeClass('inactive');
|
||||
}
|
||||
else if (updateData['ui']['status'] == 1)
|
||||
{
|
||||
uiStatusClass = 'icon24 uiStatusAverage';
|
||||
$('.linkActive').addClass('inactive');
|
||||
}
|
||||
else
|
||||
{
|
||||
uiStatusClass = 'icon24 uiStatusBad'
|
||||
$('.linkActive').addClass('inactive');
|
||||
}
|
||||
$('#uiStatusIcon').attr('class', uiStatusClass);
|
||||
|
||||
$('.linkActive').stopTime('linkPending');
|
||||
$('.linkActive').removeClass('linkPending');
|
||||
|
||||
$('.linkActive').off('click');
|
||||
$('.linkActive').on('click', function (event) {
|
||||
event.preventDefault();
|
||||
var href = $(this).data('href');
|
||||
if (href != null && _canClick)
|
||||
{
|
||||
_canClick = false;
|
||||
$('body').oneTime(300, 'enableClick', function () {
|
||||
_canClick = true;
|
||||
});
|
||||
if (updateData['ui']['status'] == 2)
|
||||
{
|
||||
$(this).oneTime(300, 'linkPending', function () {
|
||||
$(this).addClass('linkPending');
|
||||
});
|
||||
}
|
||||
window.location.href = href;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
var body = $('body'); // We store data in the body tag, it's as good a place as any
|
||||
|
||||
_data = body.data('initialData');
|
||||
@@ -57,6 +100,8 @@ NanoUpdate = function ()
|
||||
{
|
||||
observedDataUpdateRecursive(_earlyUpdateData, _data);
|
||||
}
|
||||
|
||||
executeCallbacks(_afterUpdateCallbacks, _data);
|
||||
|
||||
//alert($("#mainTemplate").html());
|
||||
}
|
||||
@@ -68,46 +113,6 @@ NanoUpdate = function ()
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
NanoUpdate.addAfterUpdateCallback(function (updateData) {
|
||||
var uiStatusClass;
|
||||
if (updateData['ui']['status'] == 2)
|
||||
{
|
||||
uiStatusClass = 'icon24 uiStatusGood';
|
||||
$('.linkActive').removeClass('inactive');
|
||||
}
|
||||
else if (updateData['ui']['status'] == 1)
|
||||
{
|
||||
uiStatusClass = 'icon24 uiStatusAverage';
|
||||
$('.linkActive').addClass('inactive');
|
||||
}
|
||||
else
|
||||
{
|
||||
uiStatusClass = 'icon24 uiStatusBad'
|
||||
$('.linkActive').addClass('inactive');
|
||||
}
|
||||
$('#uiStatusIcon').attr('class', uiStatusClass);
|
||||
|
||||
$('.linkActive').stopTime('linkPending');
|
||||
$('.linkActive').removeClass('linkPending');
|
||||
|
||||
$('.linkActive').off('click');
|
||||
$('.linkActive').on('click', function (event) {
|
||||
event.preventDefault();
|
||||
var href = $(this).data('href');
|
||||
if (href != null && _canClick)
|
||||
{
|
||||
_canClick = false;
|
||||
$('body').oneTime(300, 'enableClick', function () {
|
||||
_canClick = true;
|
||||
});
|
||||
$(this).oneTime(300, 'linkPending', function () {
|
||||
$(this).addClass('linkPending');
|
||||
});
|
||||
window.location.href = href;
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Receive update data from the server
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
Energy:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{^{:energy}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
Dispense:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{^{:~link('5', 'gear', {'amount' : 5}, (amount == 5) ? 'selected' : null)}}
|
||||
{^{:~link('10', 'gear', {'amount' : 10}, (amount == 10) ? 'selected' : null)}}
|
||||
{^{:~link('20', 'gear', {'amount' : 20}, (amount == 20) ? 'selected' : null)}}
|
||||
{^{:~link('30', 'gear', {'amount' : 30}, (amount == 30) ? 'selected' : null)}}
|
||||
{^{:~link('50', 'gear', {'amount' : 50}, (amount == 50) ? 'selected' : null)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item"> </div>
|
||||
<div class="item">
|
||||
<div class="itemLabel" style="width: 100%;">
|
||||
Chemical Dispenser
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="itemContent" style="width: 100%;">
|
||||
{^{for chemicals}}
|
||||
{^{:~link(title, 'circle-arrow-s', commands, null, 'fixedLeft')}}
|
||||
{{/for}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item"> </div>
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
Beaker Contents
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{^{:~link('Eject Beaker', 'eject', {'ejectBeaker' : 1}, isBeakerLoaded ? null : 'disabled', 'floatRight')}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="statusDisplay" style="height: 225px; overflow: auto;">
|
||||
<div class="item">
|
||||
<div class="itemContent" style="width: 100%;">
|
||||
{^{if isBeakerLoaded}}
|
||||
<b>Volume: {^{:beakerCurrentVolume}} / {^{:beakerMaxVolume}}</b><br>
|
||||
{^{for beakerContents}}
|
||||
<span class="highlight">{^{:volume}} units of {^{:name}}</span><br>
|
||||
{{else}}
|
||||
<span class="bad">Beaker is empty</span>
|
||||
{{/for}}
|
||||
{{else}}
|
||||
<span class="average"><i>No beaker loaded</i></span>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user