From d9ee1508a13521939187144065edf08e3ddd21c8 Mon Sep 17 00:00:00 2001
From: Volte6 <143822+Volte6@users.noreply.github.com>
Date: Mon, 5 May 2025 15:56:33 -0700
Subject: [PATCH 1/6] Sending a specially wrapped payload for GMCP over
websocket.
---
_datafiles/html/public/webclient-pure.html | 74 +++++++++++++++++++++-
modules/gmcp/gmcp.go | 39 +++++++++---
2 files changed, 101 insertions(+), 12 deletions(-)
diff --git a/_datafiles/html/public/webclient-pure.html b/_datafiles/html/public/webclient-pure.html
index 175d9857..79104014 100644
--- a/_datafiles/html/public/webclient-pure.html
+++ b/_datafiles/html/public/webclient-pure.html
@@ -197,6 +197,7 @@
Volume Controls
+
@@ -247,7 +248,59 @@ Volume Controls
//
/////////////////////////////////////////////
let GMCPStructs = {};
- let GMCPUpdateHandlers = {};
+ let GMCPUpdateHandlers = {
+ "Char":function() {
+
+ var obj = GMCPStructs["Char"];
+
+ if ( obj.Vitals ) {
+ GMCPUpdateHandlers['Char.Vitals']();
+ }
+ },
+ "Char.Vitals": function() {
+
+ var obj = GMCPStructs["Char"];
+ if ( !obj.Vitals ) {
+ return;
+ }
+
+ if ( !GMCPWindows['Char.Vitals'] && GMCPWindows['Char.Vitals'] !== false ) {
+
+ GMCPWindows['Char.Vitals'] = new WinBox({ title: "Vitals",
+ mount: document.getElementById("vitals-bars"),
+ background: "#1c6b60",
+ border: 1,
+ width:300,
+ height:20+120,
+ header: 20,
+ onclose: force => { GMCPWindows['Char.Vitals'] = false; return false; },
+ oncreate: opts => {
+ opts.width = document.getElementById('vitals-bars').style.width;
+ opts.height = "48px";
+ }
+
+ });
+ }
+
+ if ( GMCPWindows['Char.Vitals'] === false ) {
+ return;
+ }
+
+ var p = Math.max(0, Math.min(100, Math.floor(obj.Vitals.hp/obj.Vitals.hp_max*100))); // clamp 0–100
+ var fill = document.querySelector('#health-bar .health-fill');
+ var txt = document.querySelector('#health-bar .health-text');
+ fill.style.width = 100-p + '%';
+ txt.textContent = obj.Vitals.hp + '/' + obj.Vitals.hp_max + ' hp';
+
+ p = Math.max(0, Math.min(100, Math.floor(obj.Vitals.sp/obj.Vitals.sp_max*100))); // clamp 0–100
+ fill = document.querySelector('#mana-bar .mana-fill');
+ txt = document.querySelector('#mana-bar .mana-text');
+ fill.style.width = 100-p + '%';
+ txt.textContent = obj.Vitals.sp + '/' + obj.Vitals.sp_max + ' mp';
+
+ },
+ };
+ let GMCPWindows = {};
function handleGMCP(objNamespace, objBody) {
@@ -268,12 +321,11 @@ Volume Controls
}
cursor[lastProperty] = objBody;
-
nameParts = objNamespace.split(".");
for ( let i=nameParts.length-1; i>=0; i-- ) {
var path = nameParts.slice(0, i+1).join(".");
if ( GMCPUpdateHandlers[path] ) {
- GMCPUpdateHandlers[path](GMCPStructs[rootName]);
+ GMCPUpdateHandlers[path]();
return;
}
}
@@ -803,5 +855,101 @@ Volume Controls
}
}
+
+
+