add score screen

This commit is contained in:
Brian Beck 2026-03-14 17:12:37 -07:00
parent 9c64e59971
commit d9c18334b2
56 changed files with 1660 additions and 817 deletions

View file

@ -1 +1 @@
import{r as e}from"./chunk-DECur_0Z.js";import{r as t,t as n}from"./jsx-runtime-BpGWiA-R.js";import{i as r,o as i}from"./react-three-fiber.esm-1xQMUSXT.js";import"./Html-BD9DC-n9.js";import{a,i as o}from"./SettingsProvider-BFWzoiK1.js";import{t as s}from"./logger-DeDFhQmp.js";import"./traditional-DPdbI9gv.js";import{Ht as c,c as l,yt as u}from"./three.module-Bu2Gkdne.js";import"./mission-BDFwr4ou.js";import{r as d}from"./engineStore-Clbs91WD.js";import{B as f,M as p,T as m}from"./index-swyLT7qk.js";var h=e(t(),1),g=n(),_=s(`AudioEmitter`),v=new Map,y=new Map;function b(e,t=1){y.set(e,t)}function x(e){y.delete(e)}var S=0;function C(){return S}function w(){S++;for(let[e]of y){try{e.stop()}catch{}try{e.disconnect()}catch{}}y.clear()}d.subscribe(e=>e.playback.rate,e=>{for(let[t,n]of y)try{t.setPlaybackRate(n*e)}catch{}});function T(e,t){let n=t(e),r=n?.filename;if(!r)return null;let i=r.endsWith(`.wav`)?r:`${r}.wav`,a=n.description,o=a==null?void 0:t(a);return{filename:i,is3D:o?.is3D??!0,isLooping:o?.isLooping??!1,refDist:o?.referenceDistance??20,maxDist:o?.maxDistance??100,volume:o?.volume??1}}function E(e,t,n,r,i){let a;try{a=p(e.filename)}catch{return}let o=d.getState().playback.rate,s=S;D(a,n,n=>{if(s===S)try{if(e.is3D&&i){let a=new u(t);a.setBuffer(n),a.setDistanceModel(`inverse`),a.setRefDistance(e.refDist),a.setMaxDistance(e.maxDist),a.setRolloffFactor(1),a.setVolume(e.volume),a.setPlaybackRate(o),r&&a.position.copy(r),i.add(a),y.set(a,1),a.play(),a.source.onended=()=>{y.delete(a);try{a.disconnect()}catch{}i.remove(a)}}else{let r=new l(t);r.setBuffer(n),r.setVolume(e.volume),r.setPlaybackRate(o),y.set(r,1),r.play(),r.source.onended=()=>{y.delete(r);try{r.disconnect()}catch{}}}}catch{}})}function D(e,t,n){v.has(e)?n(v.get(e)):t.load(e,t=>{v.set(e,t),n(t)},void 0,t=>{_.error(`Audio load error %s: %o`,e,t)})}var O=(0,h.memo)(function({entity:e}){let{debugMode:t}=o(),n=e.audioFileName??``,s=e.audioVolume??1,d=e.audioMinDistance??1,_=e.audioMaxDistance??1,v=e.audioMinLoopGap??0,y=e.audioMaxLoopGap??0,b=e.audioIs3D??!0?1:0,x=e.audioIsLooping??!0,[S,C,w]=e.position??[0,0,0],T=i(e=>e.scene),E=i(e=>e.camera),{audioLoader:O,audioListener:k}=f(),{audioEnabled:A}=a(),j=(0,h.useRef)(null),M=(0,h.useRef)(null),N=(0,h.useRef)(null),P=(0,h.useRef)(!1),F=(0,h.useRef)(!1),I=(0,h.useRef)(new c(S,C,w)),L=(0,h.useRef)(0),R=()=>{M.current!=null&&(clearTimeout(M.current),M.current=null),N.current!=null&&(clearTimeout(N.current),N.current=null)},[z]=(0,h.useState)(()=>Math.random());(0,h.useEffect)(()=>{if(!O||!k)return;L.current++;let e;if(b){let t=new u(k);t.position.copy(I.current),t.setDistanceModel(`inverse`),t.setRefDistance(d),t.setMaxDistance(_),t.setRolloffFactor(1),t.setVolume(s),e=t,T.add(e)}else e=new l(k),e.setVolume(s);return j.current=e,()=>{R();try{e.stop()}catch{}try{e.disconnect()}catch{}b&&T.remove(e),j.current=null,P.current=!1,F.current=!1}},[O,k,b,d,_,s,T]);let B=(e,t)=>{if(x)if(v>0||y>0){let n=Math.max(0,v),r=Math.max(n,y),i=n===r?n:z*(r-n)+n;e.loop=!1;let a=()=>{t===L.current&&(e.isPlaying===!1?M.current=setTimeout(()=>{if(t===L.current)try{e.play(),B(e,t)}catch{}},i):N.current=setTimeout(a,100))};N.current=setTimeout(a,100)}else e.setLoop(!0)},V=(0,h.useEffectEvent)(e=>{if(!O)return;let t=L.current;if(P.current)try{e.isPlaying||(e.play(),B(e,t))}catch{}else{let r;try{r=p(n)}catch{return}D(r,O,n=>{if(t===L.current&&!e.buffer){e.setBuffer(n),P.current=!0;try{e.play(),B(e,t)}catch{}}})}});return(0,h.useEffect)(()=>{let e=j.current;!e||b||!A||!n||V(e)},[A,b,n,O,k]),r(()=>{let e=j.current;if(!e||!b||!A||!n)return;let t=E.position.distanceTo(I.current),r=F.current,i=t<=_;if(i&&!r)F.current=!0,V(e);else if(!i&&r){F.current=!1,R();try{e.stop()}catch{}}}),(0,h.useEffect)(()=>{let e=j.current;if(e&&!A){R();try{e.stop()}catch{}F.current=!1}},[A]),t?(0,g.jsxs)(`mesh`,{position:I.current,children:[(0,g.jsx)(`sphereGeometry`,{args:[d,12,12]}),(0,g.jsx)(`meshBasicMaterial`,{color:`#00ff00`,wireframe:!0,opacity:.05,transparent:!0,toneMapped:!1}),(0,g.jsx)(m,{color:`#00ff00`,position:[0,d+1,0],children:n})]}):null});export{O as AudioEmitter,v as audioBufferCache,D as getCachedAudioBuffer,C as getSoundGeneration,E as playOneShotSound,T as resolveAudioProfile,w as stopAllTrackedSounds,b as trackSound,x as untrackSound};
import{r as e}from"./chunk-DECur_0Z.js";import{r as t,t as n}from"./jsx-runtime-BpGWiA-R.js";import{i as r,o as i}from"./react-three-fiber.esm-CFJ5mGMW.js";import"./Html-CIkmciH6.js";import{a,i as o}from"./SettingsProvider-CZgYJ4FU.js";import{t as s}from"./logger-CiAJCFpz.js";import"./traditional-CVpSAKe0.js";import{Ht as c,c as l,yt as u}from"./three.module-CqFTqVus.js";import"./mission-BLbEDC74.js";import{r as d}from"./engineStore-CLELjjpY.js";import{B as f,M as p,T as m}from"./index-BBAkb8y-.js";var h=e(t(),1),g=n(),_=s(`AudioEmitter`),v=new Map,y=new Map;function b(e,t=1){y.set(e,t)}function x(e){y.delete(e)}var S=0;function C(){return S}function w(){S++;for(let[e]of y){try{e.stop()}catch{}try{e.disconnect()}catch{}}y.clear()}d.subscribe(e=>e.playback.rate,e=>{for(let[t,n]of y)try{t.setPlaybackRate(n*e)}catch{}});function T(e,t){let n=t(e),r=n?.filename;if(!r)return null;let i=r.endsWith(`.wav`)?r:`${r}.wav`,a=n.description,o=a==null?void 0:t(a);return{filename:i,is3D:o?.is3D??!0,isLooping:o?.isLooping??!1,refDist:o?.referenceDistance??20,maxDist:o?.maxDistance??100,volume:o?.volume??1}}function E(e,t,n,r,i){let a;try{a=p(e.filename)}catch{return}let o=d.getState().playback.rate,s=S;D(a,n,n=>{if(s===S)try{if(e.is3D&&i){let a=new u(t);a.setBuffer(n),a.setDistanceModel(`inverse`),a.setRefDistance(e.refDist),a.setMaxDistance(e.maxDist),a.setRolloffFactor(1),a.setVolume(e.volume),a.setPlaybackRate(o),r&&a.position.copy(r),i.add(a),y.set(a,1),a.play(),a.source.onended=()=>{y.delete(a);try{a.disconnect()}catch{}i.remove(a)}}else{let r=new l(t);r.setBuffer(n),r.setVolume(e.volume),r.setPlaybackRate(o),y.set(r,1),r.play(),r.source.onended=()=>{y.delete(r);try{r.disconnect()}catch{}}}}catch{}})}function D(e,t,n){v.has(e)?n(v.get(e)):t.load(e,t=>{v.set(e,t),n(t)},void 0,t=>{_.error(`Audio load error %s: %o`,e,t)})}var O=(0,h.memo)(function({entity:e}){let{debugMode:t}=o(),n=e.audioFileName??``,s=e.audioVolume??1,d=e.audioMinDistance??1,_=e.audioMaxDistance??1,v=e.audioMinLoopGap??0,y=e.audioMaxLoopGap??0,b=e.audioIs3D??!0?1:0,x=e.audioIsLooping??!0,[S,C,w]=e.position??[0,0,0],T=i(e=>e.scene),E=i(e=>e.camera),{audioLoader:O,audioListener:k}=f(),{audioEnabled:A}=a(),j=(0,h.useRef)(null),M=(0,h.useRef)(null),N=(0,h.useRef)(null),P=(0,h.useRef)(!1),F=(0,h.useRef)(!1),I=(0,h.useRef)(new c(S,C,w)),L=(0,h.useRef)(0),R=()=>{M.current!=null&&(clearTimeout(M.current),M.current=null),N.current!=null&&(clearTimeout(N.current),N.current=null)},[z]=(0,h.useState)(()=>Math.random());(0,h.useEffect)(()=>{if(!O||!k)return;L.current++;let e;if(b){let t=new u(k);t.position.copy(I.current),t.setDistanceModel(`inverse`),t.setRefDistance(d),t.setMaxDistance(_),t.setRolloffFactor(1),t.setVolume(s),e=t,T.add(e)}else e=new l(k),e.setVolume(s);return j.current=e,()=>{R();try{e.stop()}catch{}try{e.disconnect()}catch{}b&&T.remove(e),j.current=null,P.current=!1,F.current=!1}},[O,k,b,d,_,s,T]);let B=(e,t)=>{if(x)if(v>0||y>0){let n=Math.max(0,v),r=Math.max(n,y),i=n===r?n:z*(r-n)+n;e.loop=!1;let a=()=>{t===L.current&&(e.isPlaying===!1?M.current=setTimeout(()=>{if(t===L.current)try{e.play(),B(e,t)}catch{}},i):N.current=setTimeout(a,100))};N.current=setTimeout(a,100)}else e.setLoop(!0)},V=(0,h.useEffectEvent)(e=>{if(!O)return;let t=L.current;if(P.current)try{e.isPlaying||(e.play(),B(e,t))}catch{}else{let r;try{r=p(n)}catch{return}D(r,O,n=>{if(t===L.current&&!e.buffer){e.setBuffer(n),P.current=!0;try{e.play(),B(e,t)}catch{}}})}});return(0,h.useEffect)(()=>{let e=j.current;!e||b||!A||!n||V(e)},[A,b,n,O,k]),r(()=>{let e=j.current;if(!e||!b||!A||!n)return;let t=E.position.distanceTo(I.current),r=F.current,i=t<=_;if(i&&!r)F.current=!0,V(e);else if(!i&&r){F.current=!1,R();try{e.stop()}catch{}}}),(0,h.useEffect)(()=>{let e=j.current;if(e&&!A){R();try{e.stop()}catch{}F.current=!1}},[A]),t?(0,g.jsxs)(`mesh`,{position:I.current,children:[(0,g.jsx)(`sphereGeometry`,{args:[d,12,12]}),(0,g.jsx)(`meshBasicMaterial`,{color:`#00ff00`,wireframe:!0,opacity:.05,transparent:!0,toneMapped:!1}),(0,g.jsx)(m,{color:`#00ff00`,position:[0,d+1,0],children:n})]}):null});export{O as AudioEmitter,v as audioBufferCache,D as getCachedAudioBuffer,C as getSoundGeneration,E as playOneShotSound,T as resolveAudioProfile,w as stopAllTrackedSounds,b as trackSound,x as untrackSound};

View file

@ -1 +1 @@
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import"./logger-DeDFhQmp.js";import"./traditional-DPdbI9gv.js";import"./mission-BDFwr4ou.js";import{X as i}from"./index-swyLT7qk.js";var a=t(),o=e(n(),1),s={InputForm:`_InputForm_18kom_1`,Input:`_Input_18kom_1`},c=r();function l(){let e=(0,a.c)(8),[t,n]=(0,o.useState)(``),r;e[0]===t?r=e[1]:(r=e=>{e.preventDefault();let r=t.trim();r&&(i.getState().sendCommand(`messageSent`,r),n(``))},e[0]=t,e[1]=r);let l=r,f;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(f=e=>n(e.target.value),e[2]=f):f=e[2];let p;e[3]===t?p=e[4]:(p=(0,c.jsx)(`input`,{className:s.Input,type:`text`,placeholder:`Say something…`,value:t,onChange:f,onKeyDown:d,onKeyUp:u,maxLength:255}),e[3]=t,e[4]=p);let m;return e[5]!==l||e[6]!==p?(m=(0,c.jsx)(`form`,{className:s.InputForm,onSubmit:l,children:p}),e[5]=l,e[6]=p,e[7]=m):m=e[7],m}function u(e){return e.stopPropagation()}function d(e){return e.stopPropagation()}export{l as ChatInput};
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import"./logger-CiAJCFpz.js";import"./traditional-CVpSAKe0.js";import"./mission-BLbEDC74.js";import{X as i}from"./index-BBAkb8y-.js";var a=t(),o=e(n(),1),s={InputForm:`_InputForm_18kom_1`,Input:`_Input_18kom_1`},c=r();function l(){let e=(0,a.c)(8),[t,n]=(0,o.useState)(``),r;e[0]===t?r=e[1]:(r=e=>{e.preventDefault();let r=t.trim();r&&(i.getState().sendCommand(`messageSent`,r),n(``))},e[0]=t,e[1]=r);let l=r,f;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(f=e=>n(e.target.value),e[2]=f):f=e[2];let p;e[3]===t?p=e[4]:(p=(0,c.jsx)(`input`,{className:s.Input,type:`text`,placeholder:`Say something…`,value:t,onChange:f,onKeyDown:d,onKeyUp:u,maxLength:255}),e[3]=t,e[4]=p);let m;return e[5]!==l||e[6]!==p?(m=(0,c.jsx)(`form`,{className:s.InputForm,onSubmit:l,children:p}),e[5]=l,e[6]=p,e[7]=m):m=e[7],m}function u(e){return e.stopPropagation()}function d(e){return e.stopPropagation()}export{l as ChatInput};

View file

@ -1 +1 @@
import{r as e}from"./chunk-DECur_0Z.js";import{r as t}from"./jsx-runtime-BpGWiA-R.js";import"./react-three-fiber.esm-1xQMUSXT.js";import"./Html-BD9DC-n9.js";import{a as n}from"./SettingsProvider-BFWzoiK1.js";import"./logger-DeDFhQmp.js";import"./traditional-DPdbI9gv.js";import{c as r}from"./three.module-Bu2Gkdne.js";import"./mission-BDFwr4ou.js";import{i,r as a}from"./engineStore-Clbs91WD.js";import{B as o,M as s}from"./index-swyLT7qk.js";import{getCachedAudioBuffer as c,getSoundGeneration as l,trackSound as u,untrackSound as d}from"./AudioEmitter-kZZc6bPe.js";var f=e(t(),1);function p(){let{audioLoader:e,audioListener:t}=o(),{audioEnabled:p}=n(),m=i(e=>e.playback.streamSnapshot?.chatMessages),h=i(e=>e.playback.streamSnapshot?.timeSec),g=(0,f.useRef)(new WeakSet),_=(0,f.useRef)(new Map);return(0,f.useEffect)(()=>{if(!p||!e||!t||!m?.length||h==null)return;let n=g.current,i=_.current;for(let o of m)if(!n.has(o)&&(n.add(o),o.soundPath&&!(Math.abs(h-o.timeSec)>2)))try{let n=s(o.soundPath),f=o.soundPitch??1,p=a.getState().playback.rate,m=o.sender,h=l();c(n,e,e=>{if(h!==l())return;if(m){let e=i.get(m);if(e){try{e.stop()}catch{}d(e);try{e.disconnect()}catch{}i.delete(m)}}let n=new r(t);n.setBuffer(e),n.setPlaybackRate(f*p),u(n,f),m&&i.set(m,n),n.play(),n.source.onended=()=>{d(n);try{n.disconnect()}catch{}m&&i.get(m)===n&&i.delete(m)}})}catch{}},[p,e,t,m,h]),null}export{p as ChatSoundPlayer};
import{r as e}from"./chunk-DECur_0Z.js";import{r as t}from"./jsx-runtime-BpGWiA-R.js";import"./react-three-fiber.esm-CFJ5mGMW.js";import"./Html-CIkmciH6.js";import{a as n}from"./SettingsProvider-CZgYJ4FU.js";import"./logger-CiAJCFpz.js";import"./traditional-CVpSAKe0.js";import{c as r}from"./three.module-CqFTqVus.js";import"./mission-BLbEDC74.js";import{i,r as a}from"./engineStore-CLELjjpY.js";import{B as o,M as s}from"./index-BBAkb8y-.js";import{getCachedAudioBuffer as c,getSoundGeneration as l,trackSound as u,untrackSound as d}from"./AudioEmitter-Bz60WP6Z.js";var f=e(t(),1);function p(){let{audioLoader:e,audioListener:t}=o(),{audioEnabled:p}=n(),m=i(e=>e.playback.streamSnapshot?.chatMessages),h=i(e=>e.playback.streamSnapshot?.timeSec),g=(0,f.useRef)(new WeakSet),_=(0,f.useRef)(new Map);return(0,f.useEffect)(()=>{if(!p||!e||!t||!m?.length||h==null)return;let n=g.current,i=_.current;for(let o of m)if(!n.has(o)&&(n.add(o),o.soundPath&&!(Math.abs(h-o.timeSec)>2)))try{let n=s(o.soundPath),f=o.soundPitch??1,p=a.getState().playback.rate,m=o.sender,h=l();c(n,e,e=>{if(h!==l())return;if(m){let e=i.get(m);if(e){try{e.stop()}catch{}d(e);try{e.disconnect()}catch{}i.delete(m)}}let n=new r(t);n.setBuffer(e),n.setPlaybackRate(f*p),u(n,f),m&&i.set(m,n),n.play(),n.source.onended=()=>{d(n);try{n.disconnect()}catch{}m&&i.get(m)===n&&i.delete(m)}})}catch{}},[p,e,t,m,h]),null}export{p as ChatSoundPlayer};

View file

@ -1 +1 @@
import{r as e,t}from"./chunk-DECur_0Z.js";import{n,r,t as i}from"./jsx-runtime-BpGWiA-R.js";import{n as a,r as o}from"./react-three-fiber.esm-1xQMUSXT.js";import{t as s}from"./Html-BD9DC-n9.js";import"./traditional-DPdbI9gv.js";var c=t(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):n.Stats=r()})(e,function(){var e=function(){function t(e){return i.appendChild(e.dom),e}function n(e){for(var t=0;t<i.children.length;t++)i.children[t].style.display=t===e?`block`:`none`;r=e}var r=0,i=document.createElement(`div`);i.style.cssText=`position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000`,i.addEventListener(`click`,function(e){e.preventDefault(),n(++r%i.children.length)},!1);var a=(performance||Date).now(),o=a,s=0,c=t(new e.Panel(`FPS`,`#0ff`,`#002`)),l=t(new e.Panel(`MS`,`#0f0`,`#020`));if(self.performance&&self.performance.memory)var u=t(new e.Panel(`MB`,`#f08`,`#201`));return n(0),{REVISION:16,dom:i,addPanel:t,showPanel:n,begin:function(){a=(performance||Date).now()},end:function(){s++;var e=(performance||Date).now();if(l.update(e-a,200),e>o+1e3&&(c.update(1e3*s/(e-o),100),o=e,s=0,u)){var t=performance.memory;u.update(t.usedJSHeapSize/1048576,t.jsHeapSizeLimit/1048576)}return e},update:function(){a=this.end()},domElement:i,setMode:n}};return e.Panel=function(e,t,n){var r=1/0,i=0,a=Math.round,o=a(window.devicePixelRatio||1),s=80*o,c=48*o,l=3*o,u=2*o,d=3*o,f=15*o,p=74*o,m=30*o,h=document.createElement(`canvas`);h.width=s,h.height=c,h.style.cssText=`width:80px;height:48px`;var g=h.getContext(`2d`);return g.font=`bold `+9*o+`px Helvetica,Arial,sans-serif`,g.textBaseline=`top`,g.fillStyle=n,g.fillRect(0,0,s,c),g.fillStyle=t,g.fillText(e,l,u),g.fillRect(d,f,p,m),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(d,f,p,m),{dom:h,update:function(c,_){r=Math.min(r,c),i=Math.max(i,c),g.fillStyle=n,g.globalAlpha=1,g.fillRect(0,0,s,f),g.fillStyle=t,g.fillText(a(c)+` `+e+` (`+a(r)+`-`+a(i)+`)`,l,u),g.drawImage(h,d+o,f,p-o,m,d,f,p-o,m),g.fillRect(d+p-o,f,o,m),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(d+p-o,f,o,a((1-c/_)*m))}}},e})})),l=e(r());function u(e,t){typeof e==`function`?e(t):e!=null&&(e.current=t)}function d(e,t=[],n){let[r,i]=l.useState();return l.useLayoutEffect(()=>{let t=e();return i(t),u(n,t),()=>u(n,null)},t),r}var f=e(c());function p({showPanel:e=0,className:t,parent:n}){let r=d(()=>new f.default,[]);return l.useEffect(()=>{if(r){let i=n&&n.current||document.body;r.showPanel(e),i?.appendChild(r.dom);let s=(t??``).split(` `).filter(e=>e);s.length&&r.dom.classList.add(...s);let c=o(()=>r.begin()),l=a(()=>r.end());return()=>{s.length&&r.dom.classList.remove(...s),i?.removeChild(r.dom),c(),l()}}},[n,r,t,e]),null}var m=n(),h={StatsPanel:`_StatsPanel_10m5i_1`,AxisLabel:`_AxisLabel_10m5i_8`},g=i();function _(){let e=(0,m.c)(10),t=(0,l.useRef)(null),n;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(n=()=>{let e=t.current;e&&e.setColors(`rgb(153, 255, 0)`,`rgb(0, 153, 255)`,`rgb(255, 153, 0)`)},e[0]=n):n=e[0],(0,l.useEffect)(n);let r;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(r=(0,g.jsx)(p,{className:h.StatsPanel}),e[1]=r):r=e[1];let i;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(i=[70],e[2]=i):i=e[2];let a;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,g.jsx)(`axesHelper`,{ref:t,args:i,renderOrder:999,children:(0,g.jsx)(`lineBasicMaterial`,{depthTest:!1,depthWrite:!1,fog:!1,vertexColors:!0})}),e[3]=a):a=e[3];let o;e[4]===Symbol.for(`react.memo_cache_sentinel`)?(o=[80,0,0],e[4]=o):o=e[4];let c;e[5]===Symbol.for(`react.memo_cache_sentinel`)?(c=(0,g.jsx)(s,{position:o,center:!0,children:(0,g.jsx)(`span`,{className:h.AxisLabel,"data-axis":`y`,children:`Y`})}),e[5]=c):c=e[5];let u;e[6]===Symbol.for(`react.memo_cache_sentinel`)?(u=[0,80,0],e[6]=u):u=e[6];let d;e[7]===Symbol.for(`react.memo_cache_sentinel`)?(d=(0,g.jsx)(s,{position:u,center:!0,children:(0,g.jsx)(`span`,{className:h.AxisLabel,"data-axis":`z`,children:`Z`})}),e[7]=d):d=e[7];let f;e[8]===Symbol.for(`react.memo_cache_sentinel`)?(f=[0,0,80],e[8]=f):f=e[8];let _;return e[9]===Symbol.for(`react.memo_cache_sentinel`)?(_=(0,g.jsxs)(g.Fragment,{children:[r,a,c,d,(0,g.jsx)(s,{position:f,center:!0,children:(0,g.jsx)(`span`,{className:h.AxisLabel,"data-axis":`x`,children:`X`})})]}),e[9]=_):_=e[9],_}export{_ as DebugElements};
import{r as e,t}from"./chunk-DECur_0Z.js";import{n,r,t as i}from"./jsx-runtime-BpGWiA-R.js";import{n as a,r as o}from"./react-three-fiber.esm-CFJ5mGMW.js";import{t as s}from"./Html-CIkmciH6.js";import"./traditional-CVpSAKe0.js";var c=t(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):n.Stats=r()})(e,function(){var e=function(){function t(e){return i.appendChild(e.dom),e}function n(e){for(var t=0;t<i.children.length;t++)i.children[t].style.display=t===e?`block`:`none`;r=e}var r=0,i=document.createElement(`div`);i.style.cssText=`position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000`,i.addEventListener(`click`,function(e){e.preventDefault(),n(++r%i.children.length)},!1);var a=(performance||Date).now(),o=a,s=0,c=t(new e.Panel(`FPS`,`#0ff`,`#002`)),l=t(new e.Panel(`MS`,`#0f0`,`#020`));if(self.performance&&self.performance.memory)var u=t(new e.Panel(`MB`,`#f08`,`#201`));return n(0),{REVISION:16,dom:i,addPanel:t,showPanel:n,begin:function(){a=(performance||Date).now()},end:function(){s++;var e=(performance||Date).now();if(l.update(e-a,200),e>o+1e3&&(c.update(1e3*s/(e-o),100),o=e,s=0,u)){var t=performance.memory;u.update(t.usedJSHeapSize/1048576,t.jsHeapSizeLimit/1048576)}return e},update:function(){a=this.end()},domElement:i,setMode:n}};return e.Panel=function(e,t,n){var r=1/0,i=0,a=Math.round,o=a(window.devicePixelRatio||1),s=80*o,c=48*o,l=3*o,u=2*o,d=3*o,f=15*o,p=74*o,m=30*o,h=document.createElement(`canvas`);h.width=s,h.height=c,h.style.cssText=`width:80px;height:48px`;var g=h.getContext(`2d`);return g.font=`bold `+9*o+`px Helvetica,Arial,sans-serif`,g.textBaseline=`top`,g.fillStyle=n,g.fillRect(0,0,s,c),g.fillStyle=t,g.fillText(e,l,u),g.fillRect(d,f,p,m),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(d,f,p,m),{dom:h,update:function(c,_){r=Math.min(r,c),i=Math.max(i,c),g.fillStyle=n,g.globalAlpha=1,g.fillRect(0,0,s,f),g.fillStyle=t,g.fillText(a(c)+` `+e+` (`+a(r)+`-`+a(i)+`)`,l,u),g.drawImage(h,d+o,f,p-o,m,d,f,p-o,m),g.fillRect(d+p-o,f,o,m),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(d+p-o,f,o,a((1-c/_)*m))}}},e})})),l=e(r());function u(e,t){typeof e==`function`?e(t):e!=null&&(e.current=t)}function d(e,t=[],n){let[r,i]=l.useState();return l.useLayoutEffect(()=>{let t=e();return i(t),u(n,t),()=>u(n,null)},t),r}var f=e(c());function p({showPanel:e=0,className:t,parent:n}){let r=d(()=>new f.default,[]);return l.useEffect(()=>{if(r){let i=n&&n.current||document.body;r.showPanel(e),i?.appendChild(r.dom);let s=(t??``).split(` `).filter(e=>e);s.length&&r.dom.classList.add(...s);let c=o(()=>r.begin()),l=a(()=>r.end());return()=>{s.length&&r.dom.classList.remove(...s),i?.removeChild(r.dom),c(),l()}}},[n,r,t,e]),null}var m=n(),h={StatsPanel:`_StatsPanel_10m5i_1`,AxisLabel:`_AxisLabel_10m5i_8`},g=i();function _(){let e=(0,m.c)(10),t=(0,l.useRef)(null),n;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(n=()=>{let e=t.current;e&&e.setColors(`rgb(153, 255, 0)`,`rgb(0, 153, 255)`,`rgb(255, 153, 0)`)},e[0]=n):n=e[0],(0,l.useEffect)(n);let r;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(r=(0,g.jsx)(p,{className:h.StatsPanel}),e[1]=r):r=e[1];let i;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(i=[70],e[2]=i):i=e[2];let a;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,g.jsx)(`axesHelper`,{ref:t,args:i,renderOrder:999,children:(0,g.jsx)(`lineBasicMaterial`,{depthTest:!1,depthWrite:!1,fog:!1,vertexColors:!0})}),e[3]=a):a=e[3];let o;e[4]===Symbol.for(`react.memo_cache_sentinel`)?(o=[80,0,0],e[4]=o):o=e[4];let c;e[5]===Symbol.for(`react.memo_cache_sentinel`)?(c=(0,g.jsx)(s,{position:o,center:!0,children:(0,g.jsx)(`span`,{className:h.AxisLabel,"data-axis":`y`,children:`Y`})}),e[5]=c):c=e[5];let u;e[6]===Symbol.for(`react.memo_cache_sentinel`)?(u=[0,80,0],e[6]=u):u=e[6];let d;e[7]===Symbol.for(`react.memo_cache_sentinel`)?(d=(0,g.jsx)(s,{position:u,center:!0,children:(0,g.jsx)(`span`,{className:h.AxisLabel,"data-axis":`z`,children:`Z`})}),e[7]=d):d=e[7];let f;e[8]===Symbol.for(`react.memo_cache_sentinel`)?(f=[0,0,80],e[8]=f):f=e[8];let _;return e[9]===Symbol.for(`react.memo_cache_sentinel`)?(_=(0,g.jsxs)(g.Fragment,{children:[r,a,c,d,(0,g.jsx)(s,{position:f,center:!0,children:(0,g.jsx)(`span`,{className:h.AxisLabel,"data-axis":`x`,children:`X`})})]}),e[9]=_):_=e[9],_}export{_ as DebugElements};

View file

@ -1 +1 @@
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import"./traditional-DPdbI9gv.js";import"./engineStore-Clbs91WD.js";import{G as i,J as a,K as o,W as s,Y as c,q as l}from"./index-swyLT7qk.js";var u=t(),d=e(n(),1),f={Root:`_Root_16j0q_1`,PlayPause:`_PlayPause_16j0q_10`,Time:`_Time_16j0q_32`,Seek:`_Seek_16j0q_38`,Speed:`_Speed_16j0q_44`},p=r(),m=[.25,.5,1,2,4];function h(e){return`${Math.floor(e/60)}:${Math.floor(e%60).toString().padStart(2,`0`)}`}function g(){let e=(0,u.c)(33),t=a(),n=o(),r=s(),g=i(),x=c(),{play:S,pause:C,seek:w,setSpeed:T}=l(),E,D;e[0]!==n||e[1]!==C||e[2]!==S||e[3]!==t?(E=()=>{if(!t)return;let e=e=>{if(e.code!==`Space`)return;let t=e.target;t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.tagName===`SELECT`||t.tagName===`BUTTON`||t.isContentEditable||(e.preventDefault(),n?C():S())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},D=[t,n,S,C],e[0]=n,e[1]=C,e[2]=S,e[3]=t,e[4]=E,e[5]=D):(E=e[4],D=e[5]),(0,d.useEffect)(E,D);let O;e[6]===w?O=e[7]:(O=e=>{w(parseFloat(e.target.value))},e[6]=w,e[7]=O);let k=O,A;e[8]===T?A=e[9]:(A=e=>{T(parseFloat(e.target.value))},e[8]=T,e[9]=A);let j=A;if(!t||!Number.isFinite(t.duration))return null;let M=n?C:S,N=n?`Pause`:`Play`,P=n?`❚❚`:``,F;e[10]!==M||e[11]!==N||e[12]!==P?(F=(0,p.jsx)(`button`,{className:f.PlayPause,onClick:M,"aria-label":N,autoFocus:!0,children:P}),e[10]=M,e[11]=N,e[12]=P,e[13]=F):F=e[13];let I;e[14]===r?I=e[15]:(I=h(r),e[14]=r,e[15]=I);let L;e[16]===g?L=e[17]:(L=h(g),e[16]=g,e[17]=L);let R=`${I} / ${L}`,z;e[18]===R?z=e[19]:(z=(0,p.jsx)(`span`,{className:f.Time,children:R}),e[18]=R,e[19]=z);let B;e[20]!==r||e[21]!==g||e[22]!==k?(B=(0,p.jsx)(`input`,{className:f.Seek,type:`range`,min:0,max:g,step:.01,value:r,onChange:k}),e[20]=r,e[21]=g,e[22]=k,e[23]=B):B=e[23];let V;e[24]===Symbol.for(`react.memo_cache_sentinel`)?(V=m.map(_),e[24]=V):V=e[24];let H;e[25]!==j||e[26]!==x?(H=(0,p.jsx)(`select`,{className:f.Speed,value:x,onChange:j,children:V}),e[25]=j,e[26]=x,e[27]=H):H=e[27];let U;return e[28]!==z||e[29]!==B||e[30]!==H||e[31]!==F?(U=(0,p.jsxs)(`div`,{className:f.Root,onKeyDown:b,onPointerDown:y,onClick:v,children:[F,z,B,H]}),e[28]=z,e[29]=B,e[30]=H,e[31]=F,e[32]=U):U=e[32],U}function _(e){return(0,p.jsxs)(`option`,{value:e,children:[e,`x`]},e)}function v(e){return e.stopPropagation()}function y(e){return e.stopPropagation()}function b(e){return e.stopPropagation()}export{g as DemoPlaybackControls};
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import"./traditional-CVpSAKe0.js";import"./engineStore-CLELjjpY.js";import{G as i,J as a,K as o,W as s,Y as c,q as l}from"./index-BBAkb8y-.js";var u=t(),d=e(n(),1),f={Root:`_Root_16j0q_1`,PlayPause:`_PlayPause_16j0q_10`,Time:`_Time_16j0q_32`,Seek:`_Seek_16j0q_38`,Speed:`_Speed_16j0q_44`},p=r(),m=[.25,.5,1,2,4];function h(e){return`${Math.floor(e/60)}:${Math.floor(e%60).toString().padStart(2,`0`)}`}function g(){let e=(0,u.c)(33),t=a(),n=o(),r=s(),g=i(),x=c(),{play:S,pause:C,seek:w,setSpeed:T}=l(),E,D;e[0]!==n||e[1]!==C||e[2]!==S||e[3]!==t?(E=()=>{if(!t)return;let e=e=>{if(e.code!==`Space`)return;let t=e.target;t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.tagName===`SELECT`||t.tagName===`BUTTON`||t.isContentEditable||(e.preventDefault(),n?C():S())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},D=[t,n,S,C],e[0]=n,e[1]=C,e[2]=S,e[3]=t,e[4]=E,e[5]=D):(E=e[4],D=e[5]),(0,d.useEffect)(E,D);let O;e[6]===w?O=e[7]:(O=e=>{w(parseFloat(e.target.value))},e[6]=w,e[7]=O);let k=O,A;e[8]===T?A=e[9]:(A=e=>{T(parseFloat(e.target.value))},e[8]=T,e[9]=A);let j=A;if(!t||!Number.isFinite(t.duration))return null;let M=n?C:S,N=n?`Pause`:`Play`,P=n?`❚❚`:``,F;e[10]!==M||e[11]!==N||e[12]!==P?(F=(0,p.jsx)(`button`,{className:f.PlayPause,onClick:M,"aria-label":N,autoFocus:!0,children:P}),e[10]=M,e[11]=N,e[12]=P,e[13]=F):F=e[13];let I;e[14]===r?I=e[15]:(I=h(r),e[14]=r,e[15]=I);let L;e[16]===g?L=e[17]:(L=h(g),e[16]=g,e[17]=L);let R=`${I} / ${L}`,z;e[18]===R?z=e[19]:(z=(0,p.jsx)(`span`,{className:f.Time,children:R}),e[18]=R,e[19]=z);let B;e[20]!==r||e[21]!==g||e[22]!==k?(B=(0,p.jsx)(`input`,{className:f.Seek,type:`range`,min:0,max:g,step:.01,value:r,onChange:k}),e[20]=r,e[21]=g,e[22]=k,e[23]=B):B=e[23];let V;e[24]===Symbol.for(`react.memo_cache_sentinel`)?(V=m.map(_),e[24]=V):V=e[24];let H;e[25]!==j||e[26]!==x?(H=(0,p.jsx)(`select`,{className:f.Speed,value:x,onChange:j,children:V}),e[25]=j,e[26]=x,e[27]=H):H=e[27];let U;return e[28]!==z||e[29]!==B||e[30]!==H||e[31]!==F?(U=(0,p.jsxs)(`div`,{className:f.Root,onKeyDown:b,onPointerDown:y,onClick:v,children:[F,z,B,H]}),e[28]=z,e[29]=B,e[30]=H,e[31]=F,e[32]=U):U=e[32],U}function _(e){return(0,p.jsxs)(`option`,{value:e,children:[e,`x`]},e)}function v(e){return e.stopPropagation()}function y(e){return e.stopPropagation()}function b(e){return e.stopPropagation()}export{g as DemoPlaybackControls};

View file

@ -1,4 +1,4 @@
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i}from"./react-three-fiber.esm-1xQMUSXT.js";import{a}from"./SettingsProvider-BFWzoiK1.js";import"./logger-DeDFhQmp.js";import"./traditional-DPdbI9gv.js";import{Et as o,Vt as s,kt as c,p as l,y as u}from"./three.module-Bu2Gkdne.js";import"./mission-BDFwr4ou.js";import{F as d,V as f,r as p}from"./index-swyLT7qk.js";var m=t(),h=e(n(),1),g=`
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i}from"./react-three-fiber.esm-CFJ5mGMW.js";import{a}from"./SettingsProvider-CZgYJ4FU.js";import"./logger-CiAJCFpz.js";import"./traditional-CVpSAKe0.js";import{Et as o,Vt as s,kt as c,p as l,y as u}from"./three.module-CqFTqVus.js";import"./mission-BLbEDC74.js";import{F as d,V as f,r as p}from"./index-BBAkb8y-.js";var m=t(),h=e(n(),1),g=`
#include <fog_pars_vertex>
varying vec2 vUv;

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
import{n as e,t}from"./jsx-runtime-BpGWiA-R.js";import"./traditional-DPdbI9gv.js";import"./engineStore-Clbs91WD.js";import{H as n,J as r}from"./index-swyLT7qk.js";var i=e(),a={Root:`_Root_uktvs_1`,Column:`_Column_uktvs_13`,Row:`_Row_uktvs_20`,Spacer:`_Spacer_uktvs_26`,Key:`_Key_uktvs_30`,Arrow:`_Arrow_uktvs_53`},o=t();function s(){let e=(0,i.c)(51),t=r(),s=n(_),v=n(g),y=n(h),b=n(m),x=n(p),S=n(f),C=n(d),w=n(u),T=n(l),E=n(c);if(t&&t.source!==`live`)return null;let D;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(D=(0,o.jsx)(`div`,{className:a.Spacer}),e[0]=D):D=e[0];let O;e[1]===s?O=e[2]:(O=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":s,children:`W`}),e[1]=s,e[2]=O);let k;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(k=(0,o.jsx)(`div`,{className:a.Spacer}),e[3]=k):k=e[3];let A;e[4]===O?A=e[5]:(A=(0,o.jsxs)(`div`,{className:a.Row,children:[D,O,k]}),e[4]=O,e[5]=A);let j;e[6]===y?j=e[7]:(j=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":y,children:`A`}),e[6]=y,e[7]=j);let M;e[8]===v?M=e[9]:(M=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":v,children:`S`}),e[8]=v,e[9]=M);let N;e[10]===b?N=e[11]:(N=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":b,children:`D`}),e[10]=b,e[11]=N);let P;e[12]!==j||e[13]!==M||e[14]!==N?(P=(0,o.jsxs)(`div`,{className:a.Row,children:[j,M,N]}),e[12]=j,e[13]=M,e[14]=N,e[15]=P):P=e[15];let F;e[16]!==A||e[17]!==P?(F=(0,o.jsxs)(`div`,{className:a.Column,children:[A,P]}),e[16]=A,e[17]=P,e[18]=F):F=e[18];let I;e[19]===Symbol.for(`react.memo_cache_sentinel`)?(I=(0,o.jsx)(`span`,{className:a.Arrow,children:``}),e[19]=I):I=e[19];let L;e[20]===x?L=e[21]:(L=(0,o.jsx)(`div`,{className:a.Row,children:(0,o.jsxs)(`div`,{className:a.Key,"data-pressed":x,children:[I,` Space`]})}),e[20]=x,e[21]=L);let R;e[22]===Symbol.for(`react.memo_cache_sentinel`)?(R=(0,o.jsx)(`span`,{className:a.Arrow,children:``}),e[22]=R):R=e[22];let z;e[23]===S?z=e[24]:(z=(0,o.jsx)(`div`,{className:a.Row,children:(0,o.jsxs)(`div`,{className:a.Key,"data-pressed":S,children:[R,` Shift`]})}),e[23]=S,e[24]=z);let B;e[25]!==L||e[26]!==z?(B=(0,o.jsxs)(`div`,{className:a.Column,children:[L,z]}),e[25]=L,e[26]=z,e[27]=B):B=e[27];let V;e[28]===Symbol.for(`react.memo_cache_sentinel`)?(V=(0,o.jsx)(`div`,{className:a.Spacer}),e[28]=V):V=e[28];let H;e[29]===C?H=e[30]:(H=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":C,children:``}),e[29]=C,e[30]=H);let U;e[31]===Symbol.for(`react.memo_cache_sentinel`)?(U=(0,o.jsx)(`div`,{className:a.Spacer}),e[31]=U):U=e[31];let W;e[32]===H?W=e[33]:(W=(0,o.jsxs)(`div`,{className:a.Row,children:[V,H,U]}),e[32]=H,e[33]=W);let G;e[34]===T?G=e[35]:(G=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":T,children:``}),e[34]=T,e[35]=G);let K;e[36]===w?K=e[37]:(K=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":w,children:``}),e[36]=w,e[37]=K);let q;e[38]===E?q=e[39]:(q=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":E,children:``}),e[38]=E,e[39]=q);let J;e[40]!==G||e[41]!==K||e[42]!==q?(J=(0,o.jsxs)(`div`,{className:a.Row,children:[G,K,q]}),e[40]=G,e[41]=K,e[42]=q,e[43]=J):J=e[43];let Y;e[44]!==W||e[45]!==J?(Y=(0,o.jsxs)(`div`,{className:a.Column,children:[W,J]}),e[44]=W,e[45]=J,e[46]=Y):Y=e[46];let X;return e[47]!==B||e[48]!==Y||e[49]!==F?(X=(0,o.jsxs)(`div`,{className:a.Root,children:[F,B,Y]}),e[47]=B,e[48]=Y,e[49]=F,e[50]=X):X=e[50],X}function c(e){return e.lookRight}function l(e){return e.lookLeft}function u(e){return e.lookDown}function d(e){return e.lookUp}function f(e){return e.down}function p(e){return e.up}function m(e){return e.right}function h(e){return e.left}function g(e){return e.backward}function _(e){return e.forward}export{s as KeyboardOverlay};
import{n as e,t}from"./jsx-runtime-BpGWiA-R.js";import"./traditional-CVpSAKe0.js";import"./engineStore-CLELjjpY.js";import{H as n,J as r}from"./index-BBAkb8y-.js";var i=e(),a={Root:`_Root_uktvs_1`,Column:`_Column_uktvs_13`,Row:`_Row_uktvs_20`,Spacer:`_Spacer_uktvs_26`,Key:`_Key_uktvs_30`,Arrow:`_Arrow_uktvs_53`},o=t();function s(){let e=(0,i.c)(51),t=r(),s=n(_),v=n(g),y=n(h),b=n(m),x=n(p),S=n(f),C=n(d),w=n(u),T=n(l),E=n(c);if(t&&t.source!==`live`)return null;let D;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(D=(0,o.jsx)(`div`,{className:a.Spacer}),e[0]=D):D=e[0];let O;e[1]===s?O=e[2]:(O=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":s,children:`W`}),e[1]=s,e[2]=O);let k;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(k=(0,o.jsx)(`div`,{className:a.Spacer}),e[3]=k):k=e[3];let A;e[4]===O?A=e[5]:(A=(0,o.jsxs)(`div`,{className:a.Row,children:[D,O,k]}),e[4]=O,e[5]=A);let j;e[6]===y?j=e[7]:(j=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":y,children:`A`}),e[6]=y,e[7]=j);let M;e[8]===v?M=e[9]:(M=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":v,children:`S`}),e[8]=v,e[9]=M);let N;e[10]===b?N=e[11]:(N=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":b,children:`D`}),e[10]=b,e[11]=N);let P;e[12]!==j||e[13]!==M||e[14]!==N?(P=(0,o.jsxs)(`div`,{className:a.Row,children:[j,M,N]}),e[12]=j,e[13]=M,e[14]=N,e[15]=P):P=e[15];let F;e[16]!==A||e[17]!==P?(F=(0,o.jsxs)(`div`,{className:a.Column,children:[A,P]}),e[16]=A,e[17]=P,e[18]=F):F=e[18];let I;e[19]===Symbol.for(`react.memo_cache_sentinel`)?(I=(0,o.jsx)(`span`,{className:a.Arrow,children:``}),e[19]=I):I=e[19];let L;e[20]===x?L=e[21]:(L=(0,o.jsx)(`div`,{className:a.Row,children:(0,o.jsxs)(`div`,{className:a.Key,"data-pressed":x,children:[I,` Space`]})}),e[20]=x,e[21]=L);let R;e[22]===Symbol.for(`react.memo_cache_sentinel`)?(R=(0,o.jsx)(`span`,{className:a.Arrow,children:``}),e[22]=R):R=e[22];let z;e[23]===S?z=e[24]:(z=(0,o.jsx)(`div`,{className:a.Row,children:(0,o.jsxs)(`div`,{className:a.Key,"data-pressed":S,children:[R,` Shift`]})}),e[23]=S,e[24]=z);let B;e[25]!==L||e[26]!==z?(B=(0,o.jsxs)(`div`,{className:a.Column,children:[L,z]}),e[25]=L,e[26]=z,e[27]=B):B=e[27];let V;e[28]===Symbol.for(`react.memo_cache_sentinel`)?(V=(0,o.jsx)(`div`,{className:a.Spacer}),e[28]=V):V=e[28];let H;e[29]===C?H=e[30]:(H=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":C,children:``}),e[29]=C,e[30]=H);let U;e[31]===Symbol.for(`react.memo_cache_sentinel`)?(U=(0,o.jsx)(`div`,{className:a.Spacer}),e[31]=U):U=e[31];let W;e[32]===H?W=e[33]:(W=(0,o.jsxs)(`div`,{className:a.Row,children:[V,H,U]}),e[32]=H,e[33]=W);let G;e[34]===T?G=e[35]:(G=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":T,children:``}),e[34]=T,e[35]=G);let K;e[36]===w?K=e[37]:(K=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":w,children:``}),e[36]=w,e[37]=K);let q;e[38]===E?q=e[39]:(q=(0,o.jsx)(`div`,{className:a.Key,"data-pressed":E,children:``}),e[38]=E,e[39]=q);let J;e[40]!==G||e[41]!==K||e[42]!==q?(J=(0,o.jsxs)(`div`,{className:a.Row,children:[G,K,q]}),e[40]=G,e[41]=K,e[42]=q,e[43]=J):J=e[43];let Y;e[44]!==W||e[45]!==J?(Y=(0,o.jsxs)(`div`,{className:a.Column,children:[W,J]}),e[44]=W,e[45]=J,e[46]=Y):Y=e[46];let X;return e[47]!==B||e[48]!==Y||e[49]!==F?(X=(0,o.jsxs)(`div`,{className:a.Root,children:[F,B,Y]}),e[47]=B,e[48]=Y,e[49]=F,e[50]=X):X=e[50],X}function c(e){return e.lookRight}function l(e){return e.lookLeft}function u(e){return e.lookDown}function d(e){return e.lookUp}function f(e){return e.down}function p(e){return e.up}function m(e){return e.right}function h(e){return e.left}function g(e){return e.backward}function _(e){return e.forward}export{s as KeyboardOverlay};

View file

@ -1,5 +1,5 @@
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{c as i}from"./manifest-jQsIRiPo.js";import"./logger-DeDFhQmp.js";import"./mission-BDFwr4ou.js";import{Ct as a,N as o,P as s,Tt as c,j as l,wt as u}from"./index-swyLT7qk.js";var d=t(),f=e(n(),1),p={GuiMarkup:`_GuiMarkup_jg4va_1`,Bullet:`_Bullet_jg4va_12`},m=r(),h=new Set([`spop`,`spush`,`lmargin`,`font`,`color`,`bitmap`,`a`,`/a`]);function g(e){return e.split(/<([^><]+)>/g).map((e,t)=>{if(t%2==0)return e?{type:`text`,value:e}:null;{let[t,...n]=e.split(`:`);return h.has(t.toLowerCase())?{type:`tag`,name:t,args:n}:{type:`text`,value:`<${e}>`}}}).filter(e=>e!=null)}function _(e){let[t,n]=e;return{fontDescription:t,fontSize:n?Math.max(11,Math.min(parseInt(n.trim(),10),16)):void 0}}function v(e){let t=g(e),n={type:`span`,source:`root`,style:{},children:[]},r=n,i=[r],a=e=>e.children!=null&&e.children.some(e=>typeof e==`string`||a(e));for(let e of t)switch(e.type){case`text`:r.children.push(e.value);break;case`tag`:switch(e.name){case`spush`:{let e={type:`span`,source:`spush`,style:{},children:[]};r.children.push(e),r=e,i.push(r);break}case`spop`:if(r.source!==`root`){let e=i.pop();for(;e.source!==`spush`;)e=i.pop();r=i[i.length-1]}break;case`lmargin`:break;case`font`:{let t=_(e.args).fontSize;if(!a(r))r.style.fontSize=t;else{let e={type:`span`,source:`spush`,style:{fontSize:t},children:[]};r.children.push(e),r=e,i.push(r)}break}case`color`:if(!a(r))r.style.color=`#${e.args[0].trim()}`;else{let t={type:`span`,source:`spush`,style:{color:`#${e.args[0].trim()}`},children:[]};r.children.push(t),r=t,i.push(r)}break;case`bitmap`:{let t={type:`bitmap`,value:e.args[0]};r.children.push(t);break}case`a`:{let t=e.args[0].trim().split(` `),n={type:`a`,source:`a`,value:`http://${t.length===2&&t[0]===`wwwlink`?t[1]:t[0]}`,style:{},children:[]};r.children.push(n),r=n,i.push(r);break}case`/a`:{let e=i.pop();for(;e.source!==`a`;)e=i.pop();r=i[i.length-1];break}}}return y(n)}function y(e){switch(e.type){case`span`:return f.createElement(`span`,{style:Object.keys(e.style).length===0?void 0:e.style},...e.children.map(e=>typeof e==`string`?e:y(e)));case`a`:return f.createElement(`a`,{href:e.value,style:Object.keys(e.style).length===0?void 0:e.style,rel:`noopener noreferrer`,target:`_blank`},...e.children.map(e=>typeof e==`string`?e:y(e)));case`bitmap`:return(0,m.jsx)(S,{name:e.value})}}var b=new Map;function x(e){if(b.has(e))return b.get(e);let t;try{t=o(i(`textures/gui/${e}`))}catch{t=null}return b.set(e,t),t}function S(e){let t=(0,d.c)(5),{name:n}=e,r;t[0]===n?r=t[1]:(r=x(n),t[0]=n,t[1]=r);let i=r;if(i){let e;return t[2]===i?e=t[3]:(e=(0,m.jsx)(`img`,{src:i,alt:``,className:p.Bitmap}),t[2]=i,t[3]=e),e}if(/bullet/i.test(n)){let e;return t[4]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,m.jsx)(`span`,{className:p.Bullet,children:``}),t[4]=e):e=t[4],e}return null}var C=/<(?:font|color|bitmap|just|lmargin|a):/i;function w(e){return C.test(e)}function T(e,t){let n=t.toUpperCase();return e.split(`
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{c as i}from"./manifest-CnxBQu_n.js";import"./logger-CiAJCFpz.js";import"./mission-BLbEDC74.js";import{Dt as a,N as o,P as s,Tt as c,j as l,wt as u}from"./index-BBAkb8y-.js";var d=t(),f=e(n(),1),p={GuiMarkup:`_GuiMarkup_jg4va_1`,Bullet:`_Bullet_jg4va_12`},m=r(),h=new Set([`spop`,`spush`,`lmargin`,`font`,`color`,`bitmap`,`a`,`/a`]);function g(e){return e.split(/<([^><]+)>/g).map((e,t)=>{if(t%2==0)return e?{type:`text`,value:e}:null;{let[t,...n]=e.split(`:`);return h.has(t.toLowerCase())?{type:`tag`,name:t,args:n}:{type:`text`,value:`<${e}>`}}}).filter(e=>e!=null)}function _(e){let[t,n]=e;return{fontDescription:t,fontSize:n?Math.max(11,Math.min(parseInt(n.trim(),10),16)):void 0}}function v(e){let t=g(e),n={type:`span`,source:`root`,style:{},children:[]},r=n,i=[r],a=e=>e.children!=null&&e.children.some(e=>typeof e==`string`||a(e));for(let e of t)switch(e.type){case`text`:r.children.push(e.value);break;case`tag`:switch(e.name){case`spush`:{let e={type:`span`,source:`spush`,style:{},children:[]};r.children.push(e),r=e,i.push(r);break}case`spop`:if(r.source!==`root`){let e=i.pop();for(;e.source!==`spush`;)e=i.pop();r=i[i.length-1]}break;case`lmargin`:break;case`font`:{let t=_(e.args).fontSize;if(!a(r))r.style.fontSize=t;else{let e={type:`span`,source:`spush`,style:{fontSize:t},children:[]};r.children.push(e),r=e,i.push(r)}break}case`color`:if(!a(r))r.style.color=`#${e.args[0].trim()}`;else{let t={type:`span`,source:`spush`,style:{color:`#${e.args[0].trim()}`},children:[]};r.children.push(t),r=t,i.push(r)}break;case`bitmap`:{let t={type:`bitmap`,value:e.args[0]};r.children.push(t);break}case`a`:{let t=e.args[0].trim().split(` `),n={type:`a`,source:`a`,value:`http://${t.length===2&&t[0]===`wwwlink`?t[1]:t[0]}`,style:{},children:[]};r.children.push(n),r=n,i.push(r);break}case`/a`:{let e=i.pop();for(;e.source!==`a`;)e=i.pop();r=i[i.length-1];break}}}return y(n)}function y(e){switch(e.type){case`span`:return f.createElement(`span`,{style:Object.keys(e.style).length===0?void 0:e.style},...e.children.map(e=>typeof e==`string`?e:y(e)));case`a`:return f.createElement(`a`,{href:e.value,style:Object.keys(e.style).length===0?void 0:e.style,rel:`noopener noreferrer`,target:`_blank`},...e.children.map(e=>typeof e==`string`?e:y(e)));case`bitmap`:return(0,m.jsx)(S,{name:e.value})}}var b=new Map;function x(e){if(b.has(e))return b.get(e);let t;try{t=o(i(`textures/gui/${e}`))}catch{t=null}return b.set(e,t),t}function S(e){let t=(0,d.c)(5),{name:n}=e,r;t[0]===n?r=t[1]:(r=x(n),t[0]=n,t[1]=r);let i=r;if(i){let e;return t[2]===i?e=t[3]:(e=(0,m.jsx)(`img`,{src:i,alt:``,className:p.Bitmap}),t[2]=i,t[3]=e),e}if(/bullet/i.test(n)){let e;return t[4]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,m.jsx)(`span`,{className:p.Bullet,children:``}),t[4]=e):e=t[4],e}return null}var C=/<(?:font|color|bitmap|just|lmargin|a):/i;function w(e){return C.test(e)}function T(e,t){let n=t.toUpperCase();return e.split(`
`).flatMap(e=>{let t=e.match(/^\[([^\]]+)\]/);return t&&!t[1].toUpperCase().split(/\s+/).includes(n)?[]:[e.replace(/^\[[^\]]+\]/,``)]}).join(`
`)}function E(e){let t=(0,d.c)(4),{markup:n}=e,r;t[0]===n?r=t[1]:(r=v(n),t[0]=n,t[1]=r);let i=r,a;return t[2]===i?a=t[3]:(a=(0,m.jsx)(`div`,{className:p.GuiMarkup,children:i}),t[2]=i,t[3]=a),a}var D={Dialog:`_Dialog_1kbms_1 _Dialog_6c89x_1`,Overlay:`_Overlay_1kbms_10 _Overlay_6c89x_20`,Body:`_Body_1kbms_14`,Left:`_Left_1kbms_22`,PreviewImage:`_PreviewImage_1kbms_27`,PreviewImageFloating:`_PreviewImageFloating_1kbms_33`,Title:`_Title_1kbms_43`,MapMeta:`_MapMeta_1kbms_51`,MapPlanet:`_MapPlanet_1kbms_61`,MapQuote:`_MapQuote_1kbms_65`,MapBlurb:`_MapBlurb_1kbms_84`,Section:`_Section_1kbms_89`,SectionTitle:`_SectionTitle_1kbms_93`,MusicTrack:`_MusicTrack_1kbms_103`,MusicButton:`_MusicButton_1kbms_117`,Footer:`_Footer_1kbms_144`,CloseButton:`_CloseButton_1kbms_154 _DialogButton_6c89x_31`,Hint:`_Hint_1kbms_158`,MusicTrackName:`_MusicTrackName_1kbms_164`};function ee(e){let t=(0,d.c)(2),n;return t[0]===e?n=t[1]:(n={queryKey:[`parsedMission`,e],queryFn:()=>s(e)},t[0]=e,t[1]=n),c(n)}function te(e){for(let t of e.body){if(t.type!==`ObjectDeclaration`)continue;let{instanceName:e,body:n}=t;if(e&&e.type===`Identifier`&&e.name.toLowerCase()===`missiongroup`){let e={};for(let t of n){if(t.type!==`Assignment`)continue;let{target:n,value:r}=t;n.type===`Identifier`&&r.type===`StringLiteral`&&(e[n.name.toLowerCase()]=r.value)}return e}}return{}}function ne(e,t){if(e)try{return o(i(`textures/gui/${e}`))}catch{}try{return o(i(`textures/gui/Load_${t}`))}catch{}return null}function re(e){let t=(0,d.c)(7),{src:n,alt:r,className:i}=e,a=i===void 0?D.PreviewImage:i,[o,s]=(0,f.useState)(null),c,l;if(t[0]===n?(c=t[1],l=t[2]):(c=()=>{let e=!1,t;return fetch(n).then(j).then(A).then(k).then(n=>{e||!n||(t=URL.createObjectURL(n),s(t))}).catch(O),()=>{e=!0,t&&URL.revokeObjectURL(t)}},l=[n],t[0]=n,t[1]=c,t[2]=l),(0,f.useEffect)(c,l),!o)return null;let u;return t[3]!==r||t[4]!==a||t[5]!==o?(u=(0,m.jsx)(`img`,{src:o,alt:r,className:a}),t[3]=r,t[4]=a,t[5]=o,t[6]=u):u=t[6],u}function O(){}function k(e){return new Promise(t=>{let n=document.createElement(`canvas`);n.width=e.width,n.height=e.height,n.getContext(`2d`)?.drawImage(e,0,0),e.close(),n.toBlob(t)})}function A(e){return createImageBitmap(e,{colorSpaceConversion:`none`})}function j(e){return e.blob()}function ie(e){let t=(0,d.c)(22),{track:n}=e,[r,i]=(0,f.useState)(!1),[o,s]=(0,f.useState)(!0),c=(0,f.useRef)(null),p;t[0]===n?p=t[1]:(p=n.toLowerCase(),t[0]=n,t[1]=p);let h=`${l}music/${p}.mp3`,g,_;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(g=()=>{let e=c.current;if(e)return()=>{e.pause()}},_=[],t[2]=g,t[3]=_):(g=t[2],_=t[3]),(0,f.useEffect)(g,_);let v;t[4]===r?v=t[5]:(v=()=>{let e=c.current;e&&(r?e.pause():e.play().catch(()=>s(!1)))},t[4]=r,t[5]=v);let y=v,b,x,S;t[6]===Symbol.for(`react.memo_cache_sentinel`)?(b=()=>i(!0),x=()=>i(!1),S=()=>s(!1),t[6]=b,t[7]=x,t[8]=S):(b=t[6],x=t[7],S=t[8]);let C;t[9]===h?C=t[10]:(C=(0,m.jsx)(`audio`,{ref:c,src:h,loop:!0,onPlay:b,onPause:x,onError:S}),t[9]=h,t[10]=C);let w;t[11]===n?w=t[12]:(w=(0,m.jsx)(`span`,{className:D.MusicTrackName,children:n}),t[11]=n,t[12]=w);let T;t[13]!==o||t[14]!==r||t[15]!==y?(T=o&&(0,m.jsx)(`button`,{className:D.MusicButton,onClick:y,"aria-label":r?`Pause music`:`Play music`,children:r?(0,m.jsx)(u,{}):(0,m.jsx)(a,{})}),t[13]=o,t[14]=r,t[15]=y,t[16]=T):T=t[16];let E;return t[17]!==r||t[18]!==T||t[19]!==C||t[20]!==w?(E=(0,m.jsxs)(`div`,{className:D.MusicTrack,"data-playing":r,children:[C,w,T]}),t[17]=r,t[18]=T,t[19]=C,t[20]=w,t[21]=E):E=t[21],E}function M(e){let t=(0,d.c)(100),{onClose:n,missionName:r,missionType:i}=e,{data:a}=ee(r),o=(0,f.useRef)(null),s,c;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(s=()=>{o.current?.focus();try{document.exitPointerLock()}catch{}},c=[],t[0]=s,t[1]=c):(s=t[0],c=t[1]),(0,f.useEffect)(s,c);let l,u;t[2]===n?(l=t[3],u=t[4]):(l=()=>{let e=e=>{if(e.key===`Escape`)n();else if(e.key===`k`&&(e.metaKey||e.ctrlKey)){n();return}e.stopImmediatePropagation()},t=se;return window.addEventListener(`keydown`,e,{capture:!0}),window.addEventListener(`keyup`,t,{capture:!0}),()=>{window.removeEventListener(`keydown`,e,{capture:!0}),window.removeEventListener(`keyup`,t,{capture:!0})}},u=[n],t[2]=n,t[3]=l,t[4]=u),(0,f.useEffect)(l,u);let p;t[5]===a?p=t[6]:(p=a?te(a.ast):{},t[5]=a,t[6]=p);let h=p,g;t[7]!==r||t[8]!==a?(g=a?ne(a.bitmap,r):null,t[7]=r,t[8]=a,t[9]=g):g=t[9];let _=g,v=a?.displayName??r,y;t[10]===i?y=t[11]:(y=i.toLowerCase(),t[10]=i,t[11]=y);let b=y===`singleplayer`,x=h.musictrack,S,C,O,k,A,j,M,N,P,F,I,L,R,z,B,V,H,U;if(t[12]!==_||t[13]!==v||t[14]!==b||t[15]!==i||t[16]!==n||t[17]!==a){let e=a?.missionString?T(a.missionString,i):null,r,s,c,l;if(t[36]!==a?.missionQuote){if(l=a?.missionQuote?.trim()??``,s=w(l),c=``,r=``,!s)for(let e of l.split(`
`)}function E(e){let t=(0,d.c)(4),{markup:n}=e,r;t[0]===n?r=t[1]:(r=v(n),t[0]=n,t[1]=r);let i=r,a;return t[2]===i?a=t[3]:(a=(0,m.jsx)(`div`,{className:p.GuiMarkup,children:i}),t[2]=i,t[3]=a),a}var D={Dialog:`_Dialog_1kbms_1 _Dialog_6c89x_1`,Overlay:`_Overlay_1kbms_10 _Overlay_6c89x_20`,Body:`_Body_1kbms_14`,Left:`_Left_1kbms_22`,PreviewImage:`_PreviewImage_1kbms_27`,PreviewImageFloating:`_PreviewImageFloating_1kbms_33`,Title:`_Title_1kbms_43`,MapMeta:`_MapMeta_1kbms_51`,MapPlanet:`_MapPlanet_1kbms_61`,MapQuote:`_MapQuote_1kbms_65`,MapBlurb:`_MapBlurb_1kbms_84`,Section:`_Section_1kbms_89`,SectionTitle:`_SectionTitle_1kbms_93`,MusicTrack:`_MusicTrack_1kbms_103`,MusicButton:`_MusicButton_1kbms_117`,Footer:`_Footer_1kbms_144`,CloseButton:`_CloseButton_1kbms_154 _DialogButton_6c89x_31`,Hint:`_Hint_1kbms_158`,MusicTrackName:`_MusicTrackName_1kbms_164`};function ee(e){let t=(0,d.c)(2),n;return t[0]===e?n=t[1]:(n={queryKey:[`parsedMission`,e],queryFn:()=>s(e)},t[0]=e,t[1]=n),a(n)}function te(e){for(let t of e.body){if(t.type!==`ObjectDeclaration`)continue;let{instanceName:e,body:n}=t;if(e&&e.type===`Identifier`&&e.name.toLowerCase()===`missiongroup`){let e={};for(let t of n){if(t.type!==`Assignment`)continue;let{target:n,value:r}=t;n.type===`Identifier`&&r.type===`StringLiteral`&&(e[n.name.toLowerCase()]=r.value)}return e}}return{}}function ne(e,t){if(e)try{return o(i(`textures/gui/${e}`))}catch{}try{return o(i(`textures/gui/Load_${t}`))}catch{}return null}function re(e){let t=(0,d.c)(7),{src:n,alt:r,className:i}=e,a=i===void 0?D.PreviewImage:i,[o,s]=(0,f.useState)(null),c,l;if(t[0]===n?(c=t[1],l=t[2]):(c=()=>{let e=!1,t;return fetch(n).then(j).then(A).then(k).then(n=>{e||!n||(t=URL.createObjectURL(n),s(t))}).catch(O),()=>{e=!0,t&&URL.revokeObjectURL(t)}},l=[n],t[0]=n,t[1]=c,t[2]=l),(0,f.useEffect)(c,l),!o)return null;let u;return t[3]!==r||t[4]!==a||t[5]!==o?(u=(0,m.jsx)(`img`,{src:o,alt:r,className:a}),t[3]=r,t[4]=a,t[5]=o,t[6]=u):u=t[6],u}function O(){}function k(e){return new Promise(t=>{let n=document.createElement(`canvas`);n.width=e.width,n.height=e.height,n.getContext(`2d`)?.drawImage(e,0,0),e.close(),n.toBlob(t)})}function A(e){return createImageBitmap(e,{colorSpaceConversion:`none`})}function j(e){return e.blob()}function ie(e){let t=(0,d.c)(22),{track:n}=e,[r,i]=(0,f.useState)(!1),[a,o]=(0,f.useState)(!0),s=(0,f.useRef)(null),p;t[0]===n?p=t[1]:(p=n.toLowerCase(),t[0]=n,t[1]=p);let h=`${l}music/${p}.mp3`,g,_;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(g=()=>{let e=s.current;if(e)return()=>{e.pause()}},_=[],t[2]=g,t[3]=_):(g=t[2],_=t[3]),(0,f.useEffect)(g,_);let v;t[4]===r?v=t[5]:(v=()=>{let e=s.current;e&&(r?e.pause():e.play().catch(()=>o(!1)))},t[4]=r,t[5]=v);let y=v,b,x,S;t[6]===Symbol.for(`react.memo_cache_sentinel`)?(b=()=>i(!0),x=()=>i(!1),S=()=>o(!1),t[6]=b,t[7]=x,t[8]=S):(b=t[6],x=t[7],S=t[8]);let C;t[9]===h?C=t[10]:(C=(0,m.jsx)(`audio`,{ref:s,src:h,loop:!0,onPlay:b,onPause:x,onError:S}),t[9]=h,t[10]=C);let w;t[11]===n?w=t[12]:(w=(0,m.jsx)(`span`,{className:D.MusicTrackName,children:n}),t[11]=n,t[12]=w);let T;t[13]!==a||t[14]!==r||t[15]!==y?(T=a&&(0,m.jsx)(`button`,{className:D.MusicButton,onClick:y,"aria-label":r?`Pause music`:`Play music`,children:r?(0,m.jsx)(c,{}):(0,m.jsx)(u,{})}),t[13]=a,t[14]=r,t[15]=y,t[16]=T):T=t[16];let E;return t[17]!==r||t[18]!==T||t[19]!==C||t[20]!==w?(E=(0,m.jsxs)(`div`,{className:D.MusicTrack,"data-playing":r,children:[C,w,T]}),t[17]=r,t[18]=T,t[19]=C,t[20]=w,t[21]=E):E=t[21],E}function M(e){let t=(0,d.c)(100),{onClose:n,missionName:r,missionType:i}=e,{data:a}=ee(r),o=(0,f.useRef)(null),s,c;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(s=()=>{o.current?.focus();try{document.exitPointerLock()}catch{}},c=[],t[0]=s,t[1]=c):(s=t[0],c=t[1]),(0,f.useEffect)(s,c);let l,u;t[2]===n?(l=t[3],u=t[4]):(l=()=>{let e=e=>{if(e.key===`Escape`)n();else if(e.key===`k`&&(e.metaKey||e.ctrlKey)){n();return}e.stopImmediatePropagation()},t=se;return window.addEventListener(`keydown`,e,{capture:!0}),window.addEventListener(`keyup`,t,{capture:!0}),()=>{window.removeEventListener(`keydown`,e,{capture:!0}),window.removeEventListener(`keyup`,t,{capture:!0})}},u=[n],t[2]=n,t[3]=l,t[4]=u),(0,f.useEffect)(l,u);let p;t[5]===a?p=t[6]:(p=a?te(a.ast):{},t[5]=a,t[6]=p);let h=p,g;t[7]!==r||t[8]!==a?(g=a?ne(a.bitmap,r):null,t[7]=r,t[8]=a,t[9]=g):g=t[9];let _=g,v=a?.displayName??r,y;t[10]===i?y=t[11]:(y=i.toLowerCase(),t[10]=i,t[11]=y);let b=y===`singleplayer`,x=h.musictrack,S,C,O,k,A,j,M,N,P,F,I,L,R,z,B,V,H,U;if(t[12]!==_||t[13]!==v||t[14]!==b||t[15]!==i||t[16]!==n||t[17]!==a){let e=a?.missionString?T(a.missionString,i):null,r,s,c,l;if(t[36]!==a?.missionQuote){if(l=a?.missionQuote?.trim()??``,s=w(l),c=``,r=``,!s)for(let e of l.split(`
`)){let t=e.trim();t.match(/^--[^-]/)?r=t.replace(/^-+\s*/,``).trim():t&&(c+=(c?`
`:``)+t)}t[36]=a?.missionQuote,t[37]=r,t[38]=s,t[39]=c,t[40]=l}else r=t[37],s=t[38],c=t[39],l=t[40];B=D.Overlay,V=n,M=o,N=D.Dialog,P=oe,F=ae,I=`dialog`,L=`true`,R=`Map Information`,z=-1,j=D.Body,H=D.Left,t[41]!==_||t[42]!==v||t[43]!==b?(U=_&&b&&(0,m.jsx)(re,{className:D.PreviewImageFloating,src:_,alt:`${v} preview`},_),t[41]=_,t[42]=v,t[43]=b,t[44]=U):U=t[44],t[45]===v?S=t[46]:(S=(0,m.jsx)(`h1`,{className:D.Title,children:v}),t[45]=v,t[46]=S);let u;t[47]===a?u=t[48]:(u=a?.planetName&&(0,m.jsx)(`span`,{className:D.MapPlanet,children:a.planetName}),t[47]=a,t[48]=u),t[49]===u?C=t[50]:(C=(0,m.jsx)(`div`,{className:D.MapMeta,children:u}),t[49]=u,t[50]=C),t[51]!==r||t[52]!==s||t[53]!==c||t[54]!==l?(O=s?(0,m.jsx)(`blockquote`,{className:D.MapQuote,children:(0,m.jsx)(E,{markup:l})}):c?(0,m.jsxs)(`blockquote`,{className:D.MapQuote,children:[(0,m.jsx)(`p`,{children:c}),r&&(0,m.jsxs)(`cite`,{children:[` `,r]})]}):null,t[51]=r,t[52]=s,t[53]=c,t[54]=l,t[55]=O):O=t[55],t[56]===a?k=t[57]:(k=a?.missionBlurb&&(0,m.jsx)(`div`,{className:D.MapBlurb,children:w(a.missionBlurb)?(0,m.jsx)(E,{markup:a.missionBlurb.trim()}):a.missionBlurb.trim()}),t[56]=a,t[57]=k),A=e&&e.trim()&&(0,m.jsx)(`div`,{className:D.Section,children:(0,m.jsx)(E,{markup:e})}),t[12]=_,t[13]=v,t[14]=b,t[15]=i,t[16]=n,t[17]=a,t[18]=S,t[19]=C,t[20]=O,t[21]=k,t[22]=A,t[23]=j,t[24]=M,t[25]=N,t[26]=P,t[27]=F,t[28]=I,t[29]=L,t[30]=R,t[31]=z,t[32]=B,t[33]=V,t[34]=H,t[35]=U}else S=t[18],C=t[19],O=t[20],k=t[21],A=t[22],j=t[23],M=t[24],N=t[25],P=t[26],F=t[27],I=t[28],L=t[29],R=t[30],z=t[31],B=t[32],V=t[33],H=t[34],U=t[35];let W;t[58]===a?W=t[59]:(W=a?.missionBriefing&&(0,m.jsxs)(`div`,{className:D.Section,children:[(0,m.jsx)(`h2`,{className:D.SectionTitle,children:`Mission Briefing`}),(0,m.jsx)(E,{markup:a.missionBriefing})]}),t[58]=a,t[59]=W);let G;t[60]===x?G=t[61]:(G=x&&(0,m.jsx)(ie,{track:x}),t[60]=x,t[61]=G);let K;t[62]!==S||t[63]!==C||t[64]!==O||t[65]!==k||t[66]!==A||t[67]!==W||t[68]!==G||t[69]!==H||t[70]!==U?(K=(0,m.jsxs)(`div`,{className:H,children:[U,S,C,O,k,A,W,G]}),t[62]=S,t[63]=C,t[64]=O,t[65]=k,t[66]=A,t[67]=W,t[68]=G,t[69]=H,t[70]=U,t[71]=K):K=t[71];let q;t[72]!==_||t[73]!==v||t[74]!==b?(q=_&&!b&&(0,m.jsx)(re,{src:_,alt:`${v} preview`},_),t[72]=_,t[73]=v,t[74]=b,t[75]=q):q=t[75];let J;t[76]!==j||t[77]!==K||t[78]!==q?(J=(0,m.jsxs)(`div`,{className:j,children:[K,q]}),t[76]=j,t[77]=K,t[78]=q,t[79]=J):J=t[79];let Y;t[80]===n?Y=t[81]:(Y=(0,m.jsx)(`button`,{className:D.CloseButton,onClick:n,children:`Close`}),t[80]=n,t[81]=Y);let X;t[82]===Symbol.for(`react.memo_cache_sentinel`)?(X=(0,m.jsx)(`span`,{className:D.Hint,children:`Esc to close`}),t[82]=X):X=t[82];let Z;t[83]===Y?Z=t[84]:(Z=(0,m.jsxs)(`div`,{className:D.Footer,children:[Y,X]}),t[83]=Y,t[84]=Z);let Q;t[85]!==M||t[86]!==N||t[87]!==P||t[88]!==F||t[89]!==I||t[90]!==L||t[91]!==R||t[92]!==z||t[93]!==J||t[94]!==Z?(Q=(0,m.jsxs)(`div`,{ref:M,className:N,onClick:P,onKeyDown:F,role:I,"aria-modal":L,"aria-label":R,tabIndex:z,children:[J,Z]}),t[85]=M,t[86]=N,t[87]=P,t[88]=F,t[89]=I,t[90]=L,t[91]=R,t[92]=z,t[93]=J,t[94]=Z,t[95]=Q):Q=t[95];let $;return t[96]!==B||t[97]!==V||t[98]!==Q?($=(0,m.jsx)(`div`,{className:B,onClick:V,children:Q}),t[96]=B,t[97]=V,t[98]=Q,t[99]=$):$=t[99],$}function ae(e){return e.stopPropagation()}function oe(e){return e.stopPropagation()}function se(e){e.stopImmediatePropagation()}export{M as MapInfoDialog};

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
._PlayerHUD_odcau_1{z-index:1;pointer-events:none;position:absolute;inset:0}._TopRight_odcau_11{align-items:flex-start;gap:6px;display:flex;position:absolute;top:10px;right:10px}._Compass_odcau_20{flex-shrink:0;width:64px;height:64px;position:relative}._CompassRing_odcau_27{image-rendering:auto;width:100%;height:100%;position:absolute;top:0;left:0}._CompassNSEW_odcau_36{width:100%;height:100%;image-rendering:pixelated;position:absolute;top:0;left:0}._CompassClock_odcau_45{font-variant-numeric:tabular-nums;color:#c8f0e6e6;text-shadow:0 0 4px #000c;pointer-events:none;white-space:nowrap;font-size:10px;font-weight:600;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}._Bars_odcau_59{flex-direction:column;gap:3px;padding-top:10px;display:flex}._BarTrack_odcau_66{background:#00000080;border:1px solid #ffffff26;width:120px;height:10px;overflow:hidden}._BarFillHealth_odcau_74{background:#2ecc40;height:100%;transition:width .15s ease-out}._BarFillEnergy_odcau_80{background:#0af;height:100%;transition:width .15s ease-out}._WeaponHUD_odcau_88{flex-direction:column;gap:2px;display:flex;position:absolute;top:50%;right:6px;transform:translateY(-50%)}._WeaponSeparator_odcau_98{height:6px}._TeamScores_odcau_104{border-collapse:collapse;border:1px solid #80ffc826;font-size:12px;position:absolute;bottom:6px;left:6px}._ObserverCount_odcau_113{color:#c1e4d8;text-shadow:0 0 2px #0009;padding:4px 6px;font-size:10px;display:block;position:absolute;bottom:100%}._TeamRow_odcau_123{background:#00323ca6;flex:1 0 auto}._TeamRow_odcau_123+._TeamRow_odcau_123{border-top:1px solid #80ffc826}._TeamName_odcau_132{min-width:6em;padding:5px 6px;font-size:12px;font-weight:500}._TeamNameFriendly_odcau_139{color:#2de46a}._TeamNameEnemy_odcau_144{color:#79cbd4}._TeamScore_odcau_104{color:#fff;text-align:right;border-left:1px solid #80ffc826;padding:0 10px;font-weight:500}._TeamCount_odcau_157{color:#7d9b96;padding:0 6px;font-size:11px}._PackInventoryHUD_odcau_165{align-items:center;gap:4px;display:flex;position:absolute;bottom:6px;right:6px}._PackInvItem_odcau_174{background:#00323ca6;border:1px solid #80ffc826;flex-direction:column;justify-content:center;align-items:center;gap:1px;padding:4px;display:flex}._PackInvItemActive_odcau_185{border-color:#80ffc880;box-shadow:0 0 6px #80ffc84d}._PackInvItemDim_odcau_190{opacity:.5}._PackInvIcon_odcau_194{image-rendering:pixelated;display:block}._PackInvCount_odcau_199{color:#bfe;text-align:center;min-width:12px;font-size:11px}._PackInvInfinity_odcau_206{image-rendering:pixelated;opacity:.8;display:block}._Reticle_odcau_214{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}._ReticleImage_odcau_221{opacity:.85;width:64px;height:64px;image-rendering:pixelated}._ReticleDot_odcau_228{background:#2ecc40b3;border-radius:50%;width:4px;height:4px;box-shadow:0 0 4px #2ecc4080}._ChatContainer_1rpo2_1{pointer-events:auto;border:1px solid #2cacb566;flex-direction:column;width:400px;max-width:50%;display:flex;position:absolute;top:6px;left:6px}._ChatWindow_1rpo2_13{-webkit-user-select:text;user-select:text;scrollbar-width:thin;scrollbar-color:#2cacb566 transparent;background:#00323ca6;min-height:4em;max-height:12.5em;padding:6px;font-size:12px;line-height:1.25;overflow-y:auto}._ChatMessage_1rpo2_27{color:#2cacb5;padding:2px 0}._ChatColor0_1rpo2_34{color:#2cacb5}._ChatColor1_1rpo2_37{color:#04eb69}._ChatColor2_1rpo2_40{color:#dbc880}._ChatColor3_1rpo2_43{color:#4dfd5f}._ChatColor4_1rpo2_46{color:#28e7f0}._ChatColor5_1rpo2_49{color:#c8c832}._ChatColor6_1rpo2_52{color:#c8c8c8}._ChatColor7_1rpo2_55{color:#dcdc14}._ChatColor8_1rpo2_58{color:#9696fa}._ChatColor9_1rpo2_61{color:#3cdc96}

View file

@ -1 +0,0 @@
._PlayerHUD_snsba_1{z-index:1;pointer-events:none;position:absolute;inset:0}._TopRight_snsba_11{align-items:flex-start;gap:6px;display:flex;position:absolute;top:10px;right:10px}._Compass_snsba_20{flex-shrink:0;width:64px;height:64px;position:relative}._CompassRing_snsba_27{image-rendering:auto;width:100%;height:100%;position:absolute;top:0;left:0}._CompassNSEW_snsba_36{width:100%;height:100%;image-rendering:pixelated;position:absolute;top:0;left:0}._Bars_snsba_45{flex-direction:column;gap:3px;padding-top:10px;display:flex}._BarTrack_snsba_52{background:#00000080;border:1px solid #ffffff26;width:120px;height:10px;overflow:hidden}._BarFillHealth_snsba_60{background:#2ecc40;height:100%;transition:width .15s ease-out}._BarFillEnergy_snsba_66{background:#0af;height:100%;transition:width .15s ease-out}._WeaponHUD_snsba_74{flex-direction:column;gap:2px;display:flex;position:absolute;top:50%;right:6px;transform:translateY(-50%)}._WeaponSeparator_snsba_84{height:6px}._TeamInfo_snsba_90{flex-direction:column;gap:2px;display:flex}._TeamScores_snsba_96{border:1px solid #80ffc826;font-size:12px;position:absolute;bottom:6px;left:6px}._TeamRow_snsba_104{background:#00323ca6;flex:1 0 auto;justify-content:space-between;align-items:center;gap:6px;padding:4px 8px 4px 6px;display:flex}._TeamRow_snsba_104+._TeamRow_snsba_104{border-top:1px solid #80ffc826}._TeamName_snsba_118{min-width:6em;font-size:12px;font-weight:500}._TeamNameFriendly_snsba_124{color:#2de46a}._TeamNameEnemy_snsba_129{color:#79cbd4}._TeamScore_snsba_96{color:#fff;text-align:right;font-weight:500}._TeamCount_snsba_140{color:#9ba;font-size:9px}._PackInventoryHUD_snsba_147{align-items:center;gap:4px;display:flex;position:absolute;bottom:6px;right:6px}._PackInvItem_snsba_156{background:#00323ca6;border:1px solid #80ffc826;flex-direction:column;justify-content:center;align-items:center;gap:1px;padding:4px;display:flex}._PackInvItemActive_snsba_167{border-color:#80ffc880;box-shadow:0 0 6px #80ffc84d}._PackInvItemDim_snsba_172{opacity:.5}._PackInvIcon_snsba_176{image-rendering:pixelated;display:block}._PackInvCount_snsba_181{color:#bfe;text-align:center;min-width:12px;font-size:11px}._PackInvInfinity_snsba_188{image-rendering:pixelated;opacity:.8;display:block}._Reticle_snsba_196{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}._ReticleImage_snsba_203{opacity:.85;width:64px;height:64px;image-rendering:pixelated}._ReticleDot_snsba_210{background:#2ecc40b3;border-radius:50%;width:4px;height:4px;box-shadow:0 0 4px #2ecc4080}._ChatContainer_1rpo2_1{pointer-events:auto;border:1px solid #2cacb566;flex-direction:column;width:400px;max-width:50%;display:flex;position:absolute;top:6px;left:6px}._ChatWindow_1rpo2_13{-webkit-user-select:text;user-select:text;scrollbar-width:thin;scrollbar-color:#2cacb566 transparent;background:#00323ca6;min-height:4em;max-height:12.5em;padding:6px;font-size:12px;line-height:1.25;overflow-y:auto}._ChatMessage_1rpo2_27{color:#2cacb5;padding:2px 0}._ChatColor0_1rpo2_34{color:#2cacb5}._ChatColor1_1rpo2_37{color:#04eb69}._ChatColor2_1rpo2_40{color:#dbc880}._ChatColor3_1rpo2_43{color:#4dfd5f}._ChatColor4_1rpo2_46{color:#28e7f0}._ChatColor5_1rpo2_49{color:#c8c832}._ChatColor6_1rpo2_52{color:#c8c8c8}._ChatColor7_1rpo2_55{color:#dcdc14}._ChatColor8_1rpo2_58{color:#9696fa}._ChatColor9_1rpo2_61{color:#3cdc96}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i}from"./react-three-fiber.esm-1xQMUSXT.js";import"./Html-BD9DC-n9.js";import"./SettingsProvider-BFWzoiK1.js";import"./logger-DeDFhQmp.js";import"./traditional-DPdbI9gv.js";import{Dt as a,Ht as o,xt as s,y as c}from"./three.module-Bu2Gkdne.js";import"./mission-BDFwr4ou.js";import"./engineStore-Clbs91WD.js";import{F as l,V as u,_ as d,g as f,y as p}from"./index-swyLT7qk.js";var m=t(),h=e(n(),1),g=r(),_=new o,v=new o,y=new o,b=new o,x=new o,S=new o,C=new o(0,1,0);function w(e){let t=(0,m.c)(14),{entity:n}=e,{visual:r}=n,i;t[0]===r.texture?i=t[1]:(i=l(r.texture),t[0]=r.texture,t[1]=i);let o=u(i,T),s=Array.isArray(o)?o[0]:o,d;t[2]!==r.color.b||t[3]!==r.color.g||t[4]!==r.color.r?(d=new c().setRGB(r.color.r,r.color.g,r.color.b,a),t[2]=r.color.b,t[3]=r.color.g,t[4]=r.color.r,t[5]=d):d=t[5];let f=d,p;t[6]===r.size?p=t[7]:(p=[r.size,r.size,1],t[6]=r.size,t[7]=p);let h;t[8]!==f||t[9]!==s?(h=(0,g.jsx)(`spriteMaterial`,{map:s,color:f,transparent:!0,blending:2,depthWrite:!1,toneMapped:!1}),t[8]=f,t[9]=s,t[10]=h):h=t[10];let _;return t[11]!==p||t[12]!==h?(_=(0,g.jsx)(`sprite`,{scale:p,children:h}),t[11]=p,t[12]=h,t[13]=_):_=t[13],_}function T(e){d(Array.isArray(e)?e[0]:e)}function E(e){let t=(0,m.c)(29),{entity:n}=e,{visual:r}=n,a=(0,h.useRef)(null),o=(0,h.useRef)(null),c=(0,h.useRef)(null),d;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(d=new s,t[0]=d):d=t[0];let w=(0,h.useRef)(d),T;t[1]===r.texture?T=t[2]:(T=l(r.texture),t[1]=r.texture,t[2]=T);let E=r.crossTexture??r.texture,O;t[3]===E?O=t[4]:(O=l(E),t[3]=E,t[4]=O);let k;t[5]!==T||t[6]!==O?(k=[T,O],t[5]=T,t[6]=O,t[7]=k):k=t[7];let A=u(k,D),j;t[8]===A?j=t[9]:(j=Array.isArray(A)?A:[A,A],t[8]=A,t[9]=j);let[M,N]=j,P;t[10]!==n.direction||t[11]!==n.keyframes?.[0]||t[12]!==r.crossSize||t[13]!==r.crossViewAng||t[14]!==r.renderCross||t[15]!==r.tracerLength||t[16]!==r.tracerWidth?(P=e=>{let{camera:t}=e,i=a.current,s=o.current;if(!i||!s)return;let l=n.keyframes?.[0],u=l?.position,d=n.direction??l?.velocity;if(!u||!d){i.visible=!1,c.current&&(c.current.visible=!1);return}if(p(d,_),_.lengthSq()<1e-8){i.visible=!1,c.current&&(c.current.visible=!1);return}_.normalize(),i.visible=!0,p(u,S),v.copy(S).sub(t.position),y.crossVectors(v,_),y.lengthSq()<1e-8&&(y.crossVectors(C,_),y.lengthSq()<1e-8&&y.set(1,0,0)),y.normalize().multiplyScalar(r.tracerWidth);let m=r.tracerLength*.5;b.copy(_).multiplyScalar(-m),x.copy(_).multiplyScalar(m);let h=s.array;h[0]=b.x+y.x,h[1]=b.y+y.y,h[2]=b.z+y.z,h[3]=b.x-y.x,h[4]=b.y-y.y,h[5]=b.z-y.z,h[6]=x.x-y.x,h[7]=x.y-y.y,h[8]=x.z-y.z,h[9]=x.x+y.x,h[10]=x.y+y.y,h[11]=x.z+y.z,s.needsUpdate=!0;let g=c.current;if(!g)return;if(!r.renderCross){g.visible=!1;return}v.normalize();let T=_.dot(v);if(T>-r.crossViewAng&&T<r.crossViewAng){g.visible=!1;return}g.visible=!0,f(_,w.current),g.quaternion.copy(w.current),g.scale.setScalar(r.crossSize)},t[10]=n.direction,t[11]=n.keyframes?.[0],t[12]=r.crossSize,t[13]=r.crossViewAng,t[14]=r.renderCross,t[15]=r.tracerLength,t[16]=r.tracerWidth,t[17]=P):P=t[17],i(P);let F;t[18]===Symbol.for(`react.memo_cache_sentinel`)?(F=(0,g.jsx)(`bufferAttribute`,{ref:o,attach:`attributes-position`,args:[new Float32Array(12),3]}),t[18]=F):F=t[18];let I;t[19]===Symbol.for(`react.memo_cache_sentinel`)?(I=(0,g.jsx)(`bufferAttribute`,{attach:`attributes-uv`,args:[new Float32Array([0,0,0,1,1,1,1,0]),2]}),t[19]=I):I=t[19];let L;t[20]===Symbol.for(`react.memo_cache_sentinel`)?(L=(0,g.jsxs)(`bufferGeometry`,{children:[F,I,(0,g.jsx)(`bufferAttribute`,{attach:`index`,args:[new Uint16Array([0,1,2,0,2,3]),1]})]}),t[20]=L):L=t[20];let R;t[21]===M?R=t[22]:(R=(0,g.jsxs)(`mesh`,{ref:a,children:[L,(0,g.jsx)(`meshBasicMaterial`,{map:M,transparent:!0,blending:2,side:2,depthWrite:!1,toneMapped:!1})]}),t[21]=M,t[22]=R);let z;t[23]!==N||t[24]!==r.renderCross?(z=r.renderCross?(0,g.jsxs)(`mesh`,{ref:c,children:[(0,g.jsxs)(`bufferGeometry`,{children:[(0,g.jsx)(`bufferAttribute`,{attach:`attributes-position`,args:[new Float32Array([-.5,0,-.5,.5,0,-.5,.5,0,.5,-.5,0,.5]),3]}),(0,g.jsx)(`bufferAttribute`,{attach:`attributes-uv`,args:[new Float32Array([0,0,0,1,1,1,1,0]),2]}),(0,g.jsx)(`bufferAttribute`,{attach:`index`,args:[new Uint16Array([0,1,2,0,2,3]),1]})]}),(0,g.jsx)(`meshBasicMaterial`,{map:N,transparent:!0,blending:2,side:2,depthWrite:!1,toneMapped:!1})]}):null,t[23]=N,t[24]=r.renderCross,t[25]=z):z=t[25];let B;return t[26]!==R||t[27]!==z?(B=(0,g.jsxs)(g.Fragment,{children:[R,z]}),t[26]=R,t[27]=z,t[28]=B):B=t[28],B}function D(e){let t=Array.isArray(e)?e:[e];for(let e of t)d(e)}export{w as SpriteProjectile,E as TracerProjectile};
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i}from"./react-three-fiber.esm-CFJ5mGMW.js";import"./Html-CIkmciH6.js";import"./SettingsProvider-CZgYJ4FU.js";import"./logger-CiAJCFpz.js";import"./traditional-CVpSAKe0.js";import{Dt as a,Ht as o,xt as s,y as c}from"./three.module-CqFTqVus.js";import"./mission-BLbEDC74.js";import"./engineStore-CLELjjpY.js";import{F as l,V as u,_ as d,g as f,y as p}from"./index-BBAkb8y-.js";var m=t(),h=e(n(),1),g=r(),_=new o,v=new o,y=new o,b=new o,x=new o,S=new o,C=new o(0,1,0);function w(e){let t=(0,m.c)(14),{entity:n}=e,{visual:r}=n,i;t[0]===r.texture?i=t[1]:(i=l(r.texture),t[0]=r.texture,t[1]=i);let o=u(i,T),s=Array.isArray(o)?o[0]:o,d;t[2]!==r.color.b||t[3]!==r.color.g||t[4]!==r.color.r?(d=new c().setRGB(r.color.r,r.color.g,r.color.b,a),t[2]=r.color.b,t[3]=r.color.g,t[4]=r.color.r,t[5]=d):d=t[5];let f=d,p;t[6]===r.size?p=t[7]:(p=[r.size,r.size,1],t[6]=r.size,t[7]=p);let h;t[8]!==f||t[9]!==s?(h=(0,g.jsx)(`spriteMaterial`,{map:s,color:f,transparent:!0,blending:2,depthWrite:!1,toneMapped:!1}),t[8]=f,t[9]=s,t[10]=h):h=t[10];let _;return t[11]!==p||t[12]!==h?(_=(0,g.jsx)(`sprite`,{scale:p,children:h}),t[11]=p,t[12]=h,t[13]=_):_=t[13],_}function T(e){d(Array.isArray(e)?e[0]:e)}function E(e){let t=(0,m.c)(29),{entity:n}=e,{visual:r}=n,a=(0,h.useRef)(null),o=(0,h.useRef)(null),c=(0,h.useRef)(null),d;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(d=new s,t[0]=d):d=t[0];let w=(0,h.useRef)(d),T;t[1]===r.texture?T=t[2]:(T=l(r.texture),t[1]=r.texture,t[2]=T);let E=r.crossTexture??r.texture,O;t[3]===E?O=t[4]:(O=l(E),t[3]=E,t[4]=O);let k;t[5]!==T||t[6]!==O?(k=[T,O],t[5]=T,t[6]=O,t[7]=k):k=t[7];let A=u(k,D),j;t[8]===A?j=t[9]:(j=Array.isArray(A)?A:[A,A],t[8]=A,t[9]=j);let[M,N]=j,P;t[10]!==n.direction||t[11]!==n.keyframes?.[0]||t[12]!==r.crossSize||t[13]!==r.crossViewAng||t[14]!==r.renderCross||t[15]!==r.tracerLength||t[16]!==r.tracerWidth?(P=e=>{let{camera:t}=e,i=a.current,s=o.current;if(!i||!s)return;let l=n.keyframes?.[0],u=l?.position,d=n.direction??l?.velocity;if(!u||!d){i.visible=!1,c.current&&(c.current.visible=!1);return}if(p(d,_),_.lengthSq()<1e-8){i.visible=!1,c.current&&(c.current.visible=!1);return}_.normalize(),i.visible=!0,p(u,S),v.copy(S).sub(t.position),y.crossVectors(v,_),y.lengthSq()<1e-8&&(y.crossVectors(C,_),y.lengthSq()<1e-8&&y.set(1,0,0)),y.normalize().multiplyScalar(r.tracerWidth);let m=r.tracerLength*.5;b.copy(_).multiplyScalar(-m),x.copy(_).multiplyScalar(m);let h=s.array;h[0]=b.x+y.x,h[1]=b.y+y.y,h[2]=b.z+y.z,h[3]=b.x-y.x,h[4]=b.y-y.y,h[5]=b.z-y.z,h[6]=x.x-y.x,h[7]=x.y-y.y,h[8]=x.z-y.z,h[9]=x.x+y.x,h[10]=x.y+y.y,h[11]=x.z+y.z,s.needsUpdate=!0;let g=c.current;if(!g)return;if(!r.renderCross){g.visible=!1;return}v.normalize();let T=_.dot(v);if(T>-r.crossViewAng&&T<r.crossViewAng){g.visible=!1;return}g.visible=!0,f(_,w.current),g.quaternion.copy(w.current),g.scale.setScalar(r.crossSize)},t[10]=n.direction,t[11]=n.keyframes?.[0],t[12]=r.crossSize,t[13]=r.crossViewAng,t[14]=r.renderCross,t[15]=r.tracerLength,t[16]=r.tracerWidth,t[17]=P):P=t[17],i(P);let F;t[18]===Symbol.for(`react.memo_cache_sentinel`)?(F=(0,g.jsx)(`bufferAttribute`,{ref:o,attach:`attributes-position`,args:[new Float32Array(12),3]}),t[18]=F):F=t[18];let I;t[19]===Symbol.for(`react.memo_cache_sentinel`)?(I=(0,g.jsx)(`bufferAttribute`,{attach:`attributes-uv`,args:[new Float32Array([0,0,0,1,1,1,1,0]),2]}),t[19]=I):I=t[19];let L;t[20]===Symbol.for(`react.memo_cache_sentinel`)?(L=(0,g.jsxs)(`bufferGeometry`,{children:[F,I,(0,g.jsx)(`bufferAttribute`,{attach:`index`,args:[new Uint16Array([0,1,2,0,2,3]),1]})]}),t[20]=L):L=t[20];let R;t[21]===M?R=t[22]:(R=(0,g.jsxs)(`mesh`,{ref:a,children:[L,(0,g.jsx)(`meshBasicMaterial`,{map:M,transparent:!0,blending:2,side:2,depthWrite:!1,toneMapped:!1})]}),t[21]=M,t[22]=R);let z;t[23]!==N||t[24]!==r.renderCross?(z=r.renderCross?(0,g.jsxs)(`mesh`,{ref:c,children:[(0,g.jsxs)(`bufferGeometry`,{children:[(0,g.jsx)(`bufferAttribute`,{attach:`attributes-position`,args:[new Float32Array([-.5,0,-.5,.5,0,-.5,.5,0,.5,-.5,0,.5]),3]}),(0,g.jsx)(`bufferAttribute`,{attach:`attributes-uv`,args:[new Float32Array([0,0,0,1,1,1,1,0]),2]}),(0,g.jsx)(`bufferAttribute`,{attach:`index`,args:[new Uint16Array([0,1,2,0,2,3]),1]})]}),(0,g.jsx)(`meshBasicMaterial`,{map:N,transparent:!0,blending:2,side:2,depthWrite:!1,toneMapped:!1})]}):null,t[23]=N,t[24]=r.renderCross,t[25]=z):z=t[25];let B;return t[26]!==R||t[27]!==z?(B=(0,g.jsxs)(g.Fragment,{children:[R,z]}),t[26]=R,t[27]=z,t[28]=B):B=t[28],B}function D(e){let t=Array.isArray(e)?e:[e];for(let e of t)d(e)}export{w as SpriteProjectile,E as TracerProjectile};

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
._Dialog_6c89x_1{color:#b0d5c9;-webkit-user-select:text;user-select:text;-webkit-touch-callout:default;background:#142526cc;border:1px solid #41838b99;border-radius:4px;outline:none;max-width:calc(100dvw - 40px);max-height:calc(100dvh - 40px);font-size:14px;line-height:1.5;position:relative;overflow:hidden;box-shadow:0 0 50px #0006,inset 0 0 60px #01070d99}._Overlay_6c89x_20{z-index:10;background:#000000b3;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}._DialogButton_6c89x_31{color:#99fff1;text-shadow:0 -1px 1px #0006;cursor:pointer;background:linear-gradient(#30a497cc,#1f9688cc 33%,#218377cc 67%,#046564cc);border:1px solid #387c74cc;border-top-color:#57b7b9cc;border-radius:4px;padding:4px 18px;font-family:inherit;font-size:14px;font-weight:500;box-shadow:inset 0 0 4px #02808e80}._DialogButton_6c89x_31:hover:not(:disabled){color:#b1fff5;border:1px solid #409188e6;border-top-color:#5ac6c2e6;box-shadow:inset 0 0 4px #02808e80,0 0 5px #3effbf80}._DialogButton_6c89x_31:active:not(:disabled){transform:translateY(1px)}._DialogButton_6c89x_31:disabled{opacity:.4;cursor:not-allowed}._Secondary_6c89x_70{box-shadow:none;color:#a2e2cfcc;text-shadow:none;background:0 0;border:1px solid #387c74cc}._Secondary_6c89x_70:hover:not(:disabled){color:#a9ffe5cc;border:1px solid #3f9087e6}._Actions_6c89x_84{align-items:center;gap:10px;display:flex}@media (width<=719px){._Dialog_6c89x_1{border-radius:0;max-width:calc(100dvw - 20px);max-height:calc(100dvh - 20px)}}@media (width<=639px){._Overlay_6c89x_20{padding:10px}}._Dialog_2r1di_1{grid-template-rows:auto 1fr auto;grid-template-columns:100%;width:600px;min-height:360px;display:grid}._TitleBar_2r1di_14{color:#85ffdee6;background:#205355cc;border-bottom:1px solid #00bedc40;align-items:center;padding:7px 15px 6px 16px;display:flex;box-shadow:inset 0 2px 4px #72fff633,inset 0 -2px 5px #141e1f80}._PlayerTotal_2r1di_26{color:#8ddbd6cc;align-items:center;gap:8px;margin:0 0 0 auto;font-size:12px;font-weight:500;display:flex}._Title_2r1di_14{text-transform:uppercase;text-shadow:0 -1px #0a191a99;margin:0;font-size:14px;font-weight:500;line-height:1.5}._MatchClock_2r1di_45{font-variant-numeric:tabular-nums;align-items:center;gap:7px;margin:0 0 0 16px;font-size:12px;font-weight:500;display:flex}._Time_2r1di_55{color:#85ffdee6}._PlayersIcon_2r1di_59,._ClockIcon_2r1di_63{font-size:16px}._TableWrapper_2r1di_68{min-height:0;overflow:hidden auto}._Table_2r1di_68{border-collapse:separate;border-spacing:0;width:100%;padding-bottom:8px;font-size:13px}._Table_2r1di_68 thead{z-index:1;position:sticky;top:0}._TeamHeaderRow_2r1di_90 th{background:#142526f2;padding:8px 16px;font-weight:500;box-shadow:inset 0 -1px #00bedc33}._TeamName_2r1di_97{color:#7dffff;text-align:left;width:50%;font-size:18px;font-weight:500}._TeamScore_2r1di_105{color:#7dffff;text-align:right;font-size:22px;font-weight:500}._ColumnHeaderRow_2r1di_113 th{color:#7dffffb3;text-transform:uppercase;text-align:left;background:#0a191af2;padding:6px 15px 7px;font-size:12px;font-weight:500;box-shadow:inset 0 -1px #00bedc26}._ColumnHeaderScore_2r1di_127{text-align:right!important}._ColumnPing_2r1di_131{color:#7dffff66;text-transform:none;margin:0 0 0 8px;font-size:10px;font-weight:500}._PlayerBody_2r1di_140 td{border-bottom:1px solid #ffffff08;padding:3px 16px;line-height:1.23077}._PlayerBody_2r1di_140 tr:last-child td{border-bottom:none}._PlayerBody_2r1di_140 tr:hover{background:#41838b14}._PlayerName_2r1di_154{text-overflow:ellipsis;white-space:nowrap;width:50%;font-weight:500;overflow:hidden}._PlayerNameLocal_2r1di_162{color:#5dff8a}._PlayerScore_2r1di_167{text-align:right;white-space:nowrap;color:#b0d5c9cc;font-weight:500}._PlayerScoreLocal_2r1di_174{color:#5dff8a}._TeamHeaderRow_2r1di_90 th:nth-child(2),._ColumnHeaderRow_2r1di_113 th:nth-child(2),._PlayerBody_2r1di_140 td:nth-child(2),._ObserverBody_2r1di_183 td:nth-child(2){border-right:1px solid #00bedc26}._ObserverBody_2r1di_183 tr:first-child th{box-shadow:inset 0 1px #00bedc26,inset 0 -1px #00bedc26}._ObserverBody_2r1di_183 td{border-bottom:1px solid #ffffff08;padding:2px 16px}._ObserverBody_2r1di_183 tr:hover{background:#41838b14}._Footer_2r1di_204{background:#021415b3;border-top:1px solid #00bedc40;flex-shrink:0;align-items:center;gap:16px;padding:10px 12px;display:flex}._Hint_2r1di_218{color:#c9dcd84d;margin-left:auto;font-size:12px}._Empty_2r1di_224{text-align:center;color:#c9dcd84d;padding:32px 16px;font-style:italic}@media (width<=719px){._Hint_2r1di_218,._ColumnPing_2r1di_131{display:none}}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
._Dialog_6c89x_1{color:#b0d5c9;-webkit-user-select:text;user-select:text;-webkit-touch-callout:default;background:#142526cc;border:1px solid #41838b99;border-radius:4px;outline:none;max-width:calc(100dvw - 40px);max-height:calc(100dvh - 40px);font-size:14px;line-height:1.5;position:relative;overflow:hidden;box-shadow:0 0 50px #0006,inset 0 0 60px #01070d99}._Overlay_6c89x_20{z-index:10;background:#000000b3;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}._DialogButton_6c89x_31{color:#99fff1;text-shadow:0 -1px 1px #0006;cursor:pointer;background:linear-gradient(#30a497cc,#1f9688cc 33%,#218377cc 67%,#046564cc);border:1px solid #387c74cc;border-top-color:#57b7b9cc;border-radius:4px;padding:4px 18px;font-family:inherit;font-size:14px;font-weight:500;box-shadow:inset 0 0 4px #02808e80}._DialogButton_6c89x_31:hover:not(:disabled){color:#b1fff5;border:1px solid #409188e6;border-top-color:#5ac6c2e6;box-shadow:inset 0 0 4px #02808e80,0 0 5px #3effbf80}._DialogButton_6c89x_31:active:not(:disabled){transform:translateY(1px)}._DialogButton_6c89x_31:disabled{opacity:.4;cursor:not-allowed}._Secondary_6c89x_70{box-shadow:none;color:#a2e2cfcc;text-shadow:none;background:0 0;border:1px solid #387c74cc}._Secondary_6c89x_70:hover:not(:disabled){color:#a9ffe5cc;border:1px solid #3f9087e6}._Actions_6c89x_84{align-items:center;gap:10px;display:flex}@media (width<=719px){._Dialog_6c89x_1{border-radius:0;max-width:calc(100dvw - 20px);max-height:calc(100dvh - 20px)}}@media (width<=639px){._Overlay_6c89x_20{padding:10px}}._Dialog_4agrm_1{grid-template-rows:auto 1fr auto;grid-template-columns:100%;width:860px;height:560px;display:grid}._Header_4agrm_14{border-bottom:1px solid #00bedc40;align-items:center;gap:12px;padding:12px 16px 10px;display:flex}._Title_4agrm_22{color:#7dffff;text-shadow:0 1px 6px #0006;flex:1;margin:0;font-size:18px;font-weight:500}._HiddenRadio_4agrm_31{opacity:0;z-index:-1;pointer-events:none;width:0;height:0;position:absolute;overflow:hidden}._RefreshButton_4agrm_41{padding:3px 14px;font-size:12px}._ServerCount_4agrm_47{color:#c9dcd866;font-size:12px}._TableWrapper_4agrm_52{min-height:0;overflow-y:auto}._Table_4agrm_52{border-collapse:collapse;-webkit-user-select:none;user-select:none;width:100%;min-height:0;font-size:13px}._Table_4agrm_52 th{z-index:1;text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none;letter-spacing:.04em;text-transform:uppercase;color:#7dffff99;background:#0a191af2;border-bottom:1px solid #00bedc33;padding:6px 12px;font-size:11px;font-weight:500;position:sticky;top:0}._Table_4agrm_52 th:hover{color:#7dffff}._Table_4agrm_52 th:nth-child(2),._Table_4agrm_52 td:nth-child(2),._Table_4agrm_52 th:nth-child(3),._Table_4agrm_52 td:nth-child(3){text-align:right}._Table_4agrm_52 td{z-index:0;white-space:nowrap;text-overflow:ellipsis;border-bottom:1px solid #ffffff0a;max-width:340px;padding:3px 12px;font-weight:500;position:relative;overflow:hidden}._Table_4agrm_52 td._EmptyServer_4agrm_105{opacity:.4}._Table_4agrm_52 tbody tr:not(._Empty_4agrm_105){cursor:pointer}._Table_4agrm_52 tbody tr:not(._Empty_4agrm_105):hover{background:#41838b1f}._Table_4agrm_52 tbody tr:has(input:checked){color:#1e2828;background:#5dffe1e6!important}._PasswordIcon_4agrm_122{color:#ffc83c99;margin-right:4px;font-size:11px}._Empty_4agrm_105 td{text-align:center;color:#c9dcd84d;font-style:italic;padding:32px 12px!important}._Footer_4agrm_135{background:#021415b3;border-top:1px solid #00bedc40;flex-shrink:0;justify-content:space-between;align-items:center;gap:16px;padding:10px 12px;display:flex}._JoinButton_4agrm_146{min-width:100px}._WarriorField_4agrm_155{align-items:center;gap:8px;display:flex}._WarriorLabel_4agrm_161{color:#7dffff99;font-size:12px;font-weight:500}._WarriorInput_4agrm_167{color:#b0d5c9;background:#00323ccc;border:1px solid #41838b80;border-radius:2px;outline:none;width:130px;padding:4px 6px;font-family:inherit;font-size:13px}._WarriorInput_4agrm_167:focus{border-color:#7dffff99}._WarriorInput_4agrm_167::placeholder{color:#c9dcd84d}._Hint_4agrm_187{color:#c9dcd84d;margin:0 auto;font-size:12px}@media (width<=719px){._Hint_4agrm_187{display:none}._Table_4agrm_52 td{max-width:200px}._CloseButton_4agrm_151{margin-left:auto}}@media (width<=539px){._Footer_4agrm_135{flex-direction:column;gap:8px}._Actions_4agrm_193{width:100%}._WarriorLabel_4agrm_161{font-size:14px}._WarriorInput_4agrm_167{min-width:12em;font-size:16px}._JoinButton_4agrm_146,._CloseButton_4agrm_151{flex:1 0 auto;height:32px}}

View file

@ -1 +0,0 @@
._Dialog_6c89x_1{color:#b0d5c9;-webkit-user-select:text;user-select:text;-webkit-touch-callout:default;background:#142526cc;border:1px solid #41838b99;border-radius:4px;outline:none;max-width:calc(100dvw - 40px);max-height:calc(100dvh - 40px);font-size:14px;line-height:1.5;position:relative;overflow:hidden;box-shadow:0 0 50px #0006,inset 0 0 60px #01070d99}._Overlay_6c89x_20{z-index:10;background:#000000b3;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}._DialogButton_6c89x_31{color:#99fff1;text-shadow:0 -1px 1px #0006;cursor:pointer;background:linear-gradient(#30a497cc,#1f9688cc 33%,#218377cc 67%,#046564cc);border:1px solid #387c74cc;border-top-color:#57b7b9cc;border-radius:4px;padding:4px 18px;font-family:inherit;font-size:14px;font-weight:500;box-shadow:inset 0 0 4px #02808e80}._DialogButton_6c89x_31:hover:not(:disabled){color:#b1fff5;border:1px solid #409188e6;border-top-color:#5ac6c2e6;box-shadow:inset 0 0 4px #02808e80,0 0 5px #3effbf80}._DialogButton_6c89x_31:active:not(:disabled){transform:translateY(1px)}._DialogButton_6c89x_31:disabled{opacity:.4;cursor:not-allowed}._Secondary_6c89x_70{box-shadow:none;color:#a2e2cfcc;text-shadow:none;background:0 0;border:1px solid #387c74cc}._Secondary_6c89x_70:hover:not(:disabled){color:#a9ffe5cc;border:1px solid #3f9087e6}._Actions_6c89x_84{align-items:center;gap:10px;display:flex}@media (width<=719px){._Dialog_6c89x_1{border-radius:0;max-width:calc(100dvw - 20px);max-height:calc(100dvh - 20px)}}@media (width<=639px){._Overlay_6c89x_20{padding:10px}}._Dialog_tsmc0_1{grid-template-rows:auto 1fr auto;grid-template-columns:100%;width:860px;height:560px;display:grid}._Header_tsmc0_14{border-bottom:1px solid #00bedc40;align-items:center;gap:12px;padding:12px 16px 10px;display:flex}._Title_tsmc0_22{color:#7dffff;text-shadow:0 1px 6px #0006;flex:1;margin:0;font-size:18px;font-weight:500}._HiddenRadio_tsmc0_31{opacity:0;z-index:-1;pointer-events:none;width:0;height:0;position:absolute;overflow:hidden}._RefreshButton_tsmc0_41{padding:3px 14px;font-size:12px}._ServerCount_tsmc0_47{color:#c9dcd866;font-size:12px}._TableWrapper_tsmc0_52{min-height:0;overflow-y:auto}._Table_tsmc0_52{border-collapse:collapse;width:100%;min-height:0;font-size:13px}._Table_tsmc0_52 th{z-index:1;text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none;letter-spacing:.04em;text-transform:uppercase;color:#7dffff99;background:#0a191af2;border-bottom:1px solid #00bedc33;padding:6px 12px;font-size:11px;font-weight:500;position:sticky;top:0}._Table_tsmc0_52 th:hover{color:#7dffff}._Table_tsmc0_52 th:nth-child(2),._Table_tsmc0_52 td:nth-child(2),._Table_tsmc0_52 th:nth-child(3),._Table_tsmc0_52 td:nth-child(3){text-align:right}._Table_tsmc0_52 td{z-index:0;white-space:nowrap;text-overflow:ellipsis;border-bottom:1px solid #ffffff0a;max-width:340px;padding:3px 12px;font-weight:500;position:relative;overflow:hidden}._Table_tsmc0_52 td._EmptyServer_tsmc0_104{opacity:.4}._Table_tsmc0_52 tbody tr:not(._Empty_tsmc0_104){cursor:pointer}._Table_tsmc0_52 tbody tr:not(._Empty_tsmc0_104):hover{background:#41838b1f}._Table_tsmc0_52 tbody tr:has(input:checked){color:#1e2828;background:#5dffe1e6!important}._PasswordIcon_tsmc0_121{color:#ffc83c99;margin-right:4px;font-size:11px}._Empty_tsmc0_104 td{text-align:center;color:#c9dcd84d;font-style:italic;padding:32px 12px!important}._Footer_tsmc0_134{background:#021415b3;border-top:1px solid #00bedc40;flex-shrink:0;justify-content:space-between;align-items:center;gap:16px;padding:10px 12px;display:flex}._JoinButton_tsmc0_145{min-width:100px}._WarriorField_tsmc0_154{align-items:center;gap:8px;display:flex}._WarriorLabel_tsmc0_160{color:#7dffff99;font-size:12px;font-weight:500}._WarriorInput_tsmc0_166{color:#b0d5c9;background:#00323ccc;border:1px solid #41838b80;border-radius:2px;outline:none;width:130px;padding:4px 6px;font-family:inherit;font-size:13px}._WarriorInput_tsmc0_166:focus{border-color:#7dffff99}._WarriorInput_tsmc0_166::placeholder{color:#c9dcd84d}._Hint_tsmc0_186{color:#c9dcd84d;margin:0 auto;font-size:12px}@media (width<=719px){._Hint_tsmc0_186{display:none}._Table_tsmc0_52 td{max-width:200px}._CloseButton_tsmc0_150{margin-left:auto}}@media (width<=539px){._Footer_tsmc0_134{flex-direction:column;gap:8px}._Actions_tsmc0_192{width:100%}._WarriorLabel_tsmc0_160{font-size:14px}._WarriorInput_tsmc0_166{min-width:12em;font-size:16px}._JoinButton_tsmc0_145,._CloseButton_tsmc0_150{flex:1 0 auto;height:32px}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n}from"./jsx-runtime-BpGWiA-R.js";import{i as r,o as i}from"./react-three-fiber.esm-1xQMUSXT.js";import{r as a}from"./SettingsProvider-BFWzoiK1.js";import"./traditional-DPdbI9gv.js";import{L as o,t as s}from"./index-swyLT7qk.js";var c=t(),l=e(n(),1),u=.004,d=2.5,f=.08,p=.15,m=.15;function h(){let e=(0,c.c)(17),{speedMultiplier:t,touchMode:n,invertDrag:h,invertJoystick:_}=a(),v=i(g),{moveState:y,lookState:b}=s(),x=o(),S=(0,l.useRef)(null),C;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(C={x:0,y:0},e[0]=C):C=e[0];let w=(0,l.useRef)(C),T;e[1]===h?T=e[2]:(T=()=>h,e[1]=h,e[2]=T);let E=(0,l.useEffectEvent)(T),D=(0,l.useRef)(0),O=(0,l.useRef)(0),k;e[3]!==E||e[4]!==v.domElement||e[5]!==n?(k=()=>{if(n!==`moveLookStick`)return;let e=v.domElement,t=e=>{if(S.current===null)for(;0<e.changedTouches.length;){let t=e.changedTouches[0];S.current=t.identifier,w.current={x:t.clientX,y:t.clientY};break}},r=e=>{if(S.current!==null)for(let t=0;t<e.changedTouches.length;t++){let n=e.changedTouches[t];if(n.identifier===S.current){let e=n.clientX-w.current.x,t=n.clientY-w.current.y;w.current={x:n.clientX,y:n.clientY};let r=E()?-1:1;D.current+=r*e*u,O.current+=r*t*u;break}}},i=e=>{for(let t=0;t<e.changedTouches.length;t++)if(e.changedTouches[t].identifier===S.current){S.current=null;break}};return e.addEventListener(`touchstart`,t,{passive:!0}),e.addEventListener(`touchmove`,r,{passive:!0}),e.addEventListener(`touchend`,i,{passive:!0}),e.addEventListener(`touchcancel`,i,{passive:!0}),()=>{e.removeEventListener(`touchstart`,t),e.removeEventListener(`touchmove`,r),e.removeEventListener(`touchend`,i),e.removeEventListener(`touchcancel`,i),S.current=null}},e[3]=E,e[4]=v.domElement,e[5]=n,e[6]=k):k=e[6];let A;e[7]!==v.domElement||e[8]!==n?(A=[v.domElement,n],e[7]=v.domElement,e[8]=n,e[9]=A):A=e[9],(0,l.useEffect)(k,A);let j;return e[10]!==_||e[11]!==b.current||e[12]!==y.current||e[13]!==x||e[14]!==t||e[15]!==n?(j=(e,r)=>{let{force:i,angle:a}=y.current,{force:o,angle:s}=b.current,c=D.current,l=O.current;D.current=0,O.current=0;let u=0,h=0;if(n===`dualStick`){if(o>p){let e=(o-p)/(1-p),t=Math.cos(s),n=Math.sin(s),i=_?-1:1;c-=i*t*e*d*r,l+=i*n*e*d*r}if(i>f){let e=(i-f)/(1-f),n=Math.cos(a),r=Math.sin(a);u=Math.max(-1,Math.min(1,-n*e*t)),h=Math.max(-1,Math.min(1,r*e*t))}}else if(n===`moveLookStick`&&i>0&&(h=Math.max(-1,Math.min(1,.5*t)),i>=m)){let e=Math.cos(a),t=Math.sin(a),n=(i-m)/(1-m),o=_?-1:1;c-=o*e*n*d*.5*r,l+=o*t*n*d*.5*r}!(c!==0||l!==0)&&!(u!==0||h!==0)||x({deltaYaw:c,deltaPitch:l,x:u,y:h,z:0,triggers:[],delta:r})},e[10]=_,e[11]=b.current,e[12]=y.current,e[13]=x,e[14]=t,e[15]=n,e[16]=j):j=e[16],r(j),null}function g(e){return e.gl}export{h as TouchHandler};
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n}from"./jsx-runtime-BpGWiA-R.js";import{i as r,o as i}from"./react-three-fiber.esm-CFJ5mGMW.js";import{r as a}from"./SettingsProvider-CZgYJ4FU.js";import"./traditional-CVpSAKe0.js";import{L as o,t as s}from"./index-BBAkb8y-.js";var c=t(),l=e(n(),1),u=.004,d=2.5,f=.08,p=.15,m=.15;function h(){let e=(0,c.c)(17),{speedMultiplier:t,touchMode:n,invertDrag:h,invertJoystick:_}=a(),v=i(g),{moveState:y,lookState:b}=s(),x=o(),S=(0,l.useRef)(null),C;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(C={x:0,y:0},e[0]=C):C=e[0];let w=(0,l.useRef)(C),T;e[1]===h?T=e[2]:(T=()=>h,e[1]=h,e[2]=T);let E=(0,l.useEffectEvent)(T),D=(0,l.useRef)(0),O=(0,l.useRef)(0),k;e[3]!==E||e[4]!==v.domElement||e[5]!==n?(k=()=>{if(n!==`moveLookStick`)return;let e=v.domElement,t=e=>{if(S.current===null)for(;0<e.changedTouches.length;){let t=e.changedTouches[0];S.current=t.identifier,w.current={x:t.clientX,y:t.clientY};break}},r=e=>{if(S.current!==null)for(let t=0;t<e.changedTouches.length;t++){let n=e.changedTouches[t];if(n.identifier===S.current){let e=n.clientX-w.current.x,t=n.clientY-w.current.y;w.current={x:n.clientX,y:n.clientY};let r=E()?-1:1;D.current+=r*e*u,O.current+=r*t*u;break}}},i=e=>{for(let t=0;t<e.changedTouches.length;t++)if(e.changedTouches[t].identifier===S.current){S.current=null;break}};return e.addEventListener(`touchstart`,t,{passive:!0}),e.addEventListener(`touchmove`,r,{passive:!0}),e.addEventListener(`touchend`,i,{passive:!0}),e.addEventListener(`touchcancel`,i,{passive:!0}),()=>{e.removeEventListener(`touchstart`,t),e.removeEventListener(`touchmove`,r),e.removeEventListener(`touchend`,i),e.removeEventListener(`touchcancel`,i),S.current=null}},e[3]=E,e[4]=v.domElement,e[5]=n,e[6]=k):k=e[6];let A;e[7]!==v.domElement||e[8]!==n?(A=[v.domElement,n],e[7]=v.domElement,e[8]=n,e[9]=A):A=e[9],(0,l.useEffect)(k,A);let j;return e[10]!==_||e[11]!==b.current||e[12]!==y.current||e[13]!==x||e[14]!==t||e[15]!==n?(j=(e,r)=>{let{force:i,angle:a}=y.current,{force:o,angle:s}=b.current,c=D.current,l=O.current;D.current=0,O.current=0;let u=0,h=0;if(n===`dualStick`){if(o>p){let e=(o-p)/(1-p),t=Math.cos(s),n=Math.sin(s),i=_?-1:1;c-=i*t*e*d*r,l+=i*n*e*d*r}if(i>f){let e=(i-f)/(1-f),n=Math.cos(a),r=Math.sin(a);u=Math.max(-1,Math.min(1,-n*e*t)),h=Math.max(-1,Math.min(1,r*e*t))}}else if(n===`moveLookStick`&&i>0&&(h=Math.max(-1,Math.min(1,.5*t)),i>=m)){let e=Math.cos(a),t=Math.sin(a),n=(i-m)/(1-m),o=_?-1:1;c-=o*e*n*d*.5*r,l+=o*t*n*d*.5*r}!(c!==0||l!==0)&&!(u!==0||h!==0)||x({deltaYaw:c,deltaPitch:l,x:u,y:h,z:0,triggers:[],delta:r})},e[10]=_,e[11]=b.current,e[12]=y.current,e[13]=x,e[14]=t,e[15]=n,e[16]=j):j=e[16],r(j),null}function g(e){return e.gl}export{h as TouchHandler};

View file

@ -1,2 +1,2 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/nipplejs-ub19og8W.js","assets/chunk-DECur_0Z.js"])))=>i.map(i=>d[i]);
import{r as e}from"./chunk-DECur_0Z.js";import{r as t,t as n}from"./jsx-runtime-BpGWiA-R.js";import{r}from"./SettingsProvider-BFWzoiK1.js";import{U as i,t as a}from"./index-swyLT7qk.js";var o=e(t(),1),s={Joystick:`_Joystick_155b9_1`,Left:`_Left_155b9_11 _Joystick_155b9_1`,Right:`_Right_155b9_17 _Joystick_155b9_1`},c=n();function l(e){let t=e.querySelector(`.back`);t&&(t.style.background=`rgba(3, 79, 76, 0.6)`,t.style.border=`1px solid rgba(0, 219, 223, 0.5)`,t.style.boxShadow=`inset 0 0 10px rgba(0, 0, 0, 0.7)`);let n=e.querySelector(`.front`);n&&(n.style.background=`radial-gradient(circle at 50% 50%, rgba(23, 247, 198, 0.9) 0%, rgba(9, 184, 170, 0.95) 100%)`,n.style.border=`2px solid rgba(255, 255, 255, 0.4)`,n.style.boxShadow=`0 2px 4px rgba(0, 0, 0, 0.5), 0 1px 1px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15), inset 0 -1px 2px rgba(0, 0, 0, 0.3)`)}function u(){let{touchMode:t}=r(),[n,u]=(0,o.useState)(null),[d,f]=(0,o.useState)(null),{moveState:p,lookState:m,setMoveState:h,setLookState:g}=a();(0,o.useEffect)(()=>{if(!n)return;let t=null,r=!1;return i(()=>import(`./nipplejs-ub19og8W.js`).then(t=>e(t.default,1)).then(e=>{r||(t=e.default.create({zone:n,mode:`static`,position:{left:`70px`,bottom:`70px`},size:120,restOpacity:.9}),l(n),t.on(`move`,(e,t)=>{h({angle:t.angle.radian,force:Math.min(1,t.force)})}),t.on(`end`,()=>{h({force:0})}))}),__vite__mapDeps([0,1])),()=>{r=!0,t?.destroy()}},[p,n,h]),(0,o.useEffect)(()=>{if(!d)return;let t=null,n=!1;return i(()=>import(`./nipplejs-ub19og8W.js`).then(t=>e(t.default,1)).then(e=>{n||(t=e.default.create({zone:d,mode:`static`,position:{right:`70px`,bottom:`70px`},size:120,restOpacity:.9}),l(d),t.on(`move`,(e,t)=>{g({angle:t.angle.radian,force:Math.min(1,t.force)})}),t.on(`end`,()=>{g({force:0})}))}),__vite__mapDeps([0,1])),()=>{n=!0,t?.destroy()}},[m,d,g]);let _=()=>{document.activeElement instanceof HTMLElement&&document.activeElement.blur()};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(`div`,{ref:u,className:t===`dualStick`?s.Left:s.Joystick,onContextMenu:e=>e.preventDefault(),onTouchStart:_},t),t===`dualStick`?(0,c.jsx)(`div`,{ref:f,className:s.Right,onContextMenu:e=>e.preventDefault(),onTouchStart:_}):null]})}export{u as TouchJoystick};
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/nipplejs-CwanlYdg.js","assets/chunk-DECur_0Z.js"])))=>i.map(i=>d[i]);
import{r as e}from"./chunk-DECur_0Z.js";import{r as t,t as n}from"./jsx-runtime-BpGWiA-R.js";import{r}from"./SettingsProvider-CZgYJ4FU.js";import{U as i,t as a}from"./index-BBAkb8y-.js";var o=e(t(),1),s={Joystick:`_Joystick_155b9_1`,Left:`_Left_155b9_11 _Joystick_155b9_1`,Right:`_Right_155b9_17 _Joystick_155b9_1`},c=n();function l(e){let t=e.querySelector(`.back`);t&&(t.style.background=`rgba(3, 79, 76, 0.6)`,t.style.border=`1px solid rgba(0, 219, 223, 0.5)`,t.style.boxShadow=`inset 0 0 10px rgba(0, 0, 0, 0.7)`);let n=e.querySelector(`.front`);n&&(n.style.background=`radial-gradient(circle at 50% 50%, rgba(23, 247, 198, 0.9) 0%, rgba(9, 184, 170, 0.95) 100%)`,n.style.border=`2px solid rgba(255, 255, 255, 0.4)`,n.style.boxShadow=`0 2px 4px rgba(0, 0, 0, 0.5), 0 1px 1px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15), inset 0 -1px 2px rgba(0, 0, 0, 0.3)`)}function u(){let{touchMode:t}=r(),[n,u]=(0,o.useState)(null),[d,f]=(0,o.useState)(null),{moveState:p,lookState:m,setMoveState:h,setLookState:g}=a();(0,o.useEffect)(()=>{if(!n)return;let t=null,r=!1;return i(()=>import(`./nipplejs-CwanlYdg.js`).then(t=>e(t.default,1)).then(e=>{r||(t=e.default.create({zone:n,mode:`static`,position:{left:`70px`,bottom:`70px`},size:120,restOpacity:.9}),l(n),t.on(`move`,(e,t)=>{h({angle:t.angle.radian,force:Math.min(1,t.force)})}),t.on(`end`,()=>{h({force:0})}))}),__vite__mapDeps([0,1])),()=>{r=!0,t?.destroy()}},[p,n,h]),(0,o.useEffect)(()=>{if(!d)return;let t=null,n=!1;return i(()=>import(`./nipplejs-CwanlYdg.js`).then(t=>e(t.default,1)).then(e=>{n||(t=e.default.create({zone:d,mode:`static`,position:{right:`70px`,bottom:`70px`},size:120,restOpacity:.9}),l(d),t.on(`move`,(e,t)=>{g({angle:t.angle.radian,force:Math.min(1,t.force)})}),t.on(`end`,()=>{g({force:0})}))}),__vite__mapDeps([0,1])),()=>{n=!0,t?.destroy()}},[m,d,g]);let _=()=>{document.activeElement instanceof HTMLElement&&document.activeElement.blur()};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(`div`,{ref:u,className:t===`dualStick`?s.Left:s.Joystick,onContextMenu:e=>e.preventDefault(),onTouchStart:_},t),t===`dualStick`?(0,c.jsx)(`div`,{ref:f,className:s.Right,onContextMenu:e=>e.preventDefault(),onTouchStart:_}):null]})}export{u as TouchJoystick};

View file

@ -1,4 +1,4 @@
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i,o as a}from"./react-three-fiber.esm-1xQMUSXT.js";import{a as o,i as s}from"./SettingsProvider-BFWzoiK1.js";import"./logger-DeDFhQmp.js";import"./traditional-DPdbI9gv.js";import{Et as c,ht as l,kt as u,y as d}from"./three.module-Bu2Gkdne.js";import"./mission-BDFwr4ou.js";import{t as f}from"./extends-BbWS2LU5.js";import{D as p,F as m,V as h,b as g,et as _,k as v,nt as ee,tt as te,x as y}from"./index-swyLT7qk.js";var b=e(n());function x(e,t){let n=e+`Geometry`;return b.forwardRef(({args:e,children:r,...i},a)=>{let o=b.useRef(null);return b.useImperativeHandle(a,()=>o.current),b.useLayoutEffect(()=>void t?.(o.current)),b.createElement(`mesh`,f({ref:o},i),b.createElement(n,{attach:`geometry`,args:e}),r)})}var ne=x(`box`),S=t(),C=`
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i,o as a}from"./react-three-fiber.esm-CFJ5mGMW.js";import{a as o,i as s}from"./SettingsProvider-CZgYJ4FU.js";import"./logger-CiAJCFpz.js";import"./traditional-CVpSAKe0.js";import{Et as c,ht as l,kt as u,y as d}from"./three.module-CqFTqVus.js";import"./mission-BLbEDC74.js";import{t as f}from"./extends-CNSZZ44D.js";import{D as p,F as m,V as h,b as g,k as _,nt as v,rt as ee,tt as te,x as y}from"./index-BBAkb8y-.js";var b=e(n());function x(e,t){let n=e+`Geometry`;return b.forwardRef(({args:e,children:r,...i},a)=>{let o=b.useRef(null);return b.useImperativeHandle(a,()=>o.current),b.useLayoutEffect(()=>void t?.(o.current)),b.createElement(`mesh`,f({ref:o},i),b.createElement(n,{attach:`geometry`,args:e}),r)})}var ne=x(`box`),S=t(),C=`
#include <fog_pars_vertex>
#ifdef USE_FOG
@ -163,4 +163,4 @@ import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-r
// Apply volumetric fog using shared Torque-style fog shader
${y}
}
`;function w(e){return new u({uniforms:{uTime:{value:0},uOpacity:{value:e?.opacity??.75},uWaveMagnitude:{value:e?.waveMagnitude??1},uEnvMapIntensity:{value:e?.envMapIntensity??1},uBaseTexture:{value:e?.baseTexture??null},uEnvMapTexture:{value:e?.envMapTexture??null},fogColor:{value:new d},fogNear:{value:1},fogFar:{value:2e3},fogVolumeData:g.fogVolumeData,cameraHeight:g.cameraHeight,fogEnabled:g.fogEnabled},vertexShader:C,fragmentShader:re,transparent:!0,side:2,depthWrite:!0,fog:!0})}function ie(){let e=(0,S.c)(1),t=(0,b.useRef)(null),n;return e[0]===Symbol.for(`react.memo_cache_sentinel`)?(n=e=>{if(!t.current)return t.current=e.clone(),!0;let n=t.current.x===e.x&&t.current.y===e.y&&t.current.z===e.z;return n||t.current.copy(e),n},e[0]=n):n=e[0],n}var T=r(),E=2048,D=1024;function ae(e,t){let n=e<=1024&&t<=1024?8:16;return[Math.max(4,Math.ceil(e/n)),Math.max(4,Math.ceil(t/n))]}function oe(e){let t=(0,S.c)(7),{surfaceTexture:n,attach:r}=e,i;t[0]===n?i=t[1]:(i=m(n),t[0]=n,t[1]=i);let a=i,o=p(),s;t[2]===o?s=t[3]:(s=e=>v(e,{anisotropy:o}),t[2]=o,t[3]=s);let c=h(a,s),l;return t[4]!==r||t[5]!==c?(l=(0,T.jsx)(`meshStandardMaterial`,{attach:r,map:c,transparent:!0,opacity:.8,side:2}),t[4]=r,t[5]=c,t[6]=l):l=t[6],l}var O=(0,b.memo)(function(e){let t=(0,S.c)(59),{entity:n}=e,r=n.waterData,{debugMode:o}=s(),c;t[0]===r.transform?c=t[1]:(c=_(r.transform),t[0]=r.transform,t[1]=c);let u=c,d;t[2]===r.transform.position?d=t[3]:(d=ee(r.transform.position),t[2]=r.transform.position,t[3]=d);let f=d,p;t[4]===r.scale?p=t[5]:(p=te(r.scale),t[4]=r.scale,t[5]=p);let m=p,[h,g,v]=m,y=a(ce),x=ie(),C=r.waveMagnitude,[re,w,oe]=f,O=re+D,k=oe+D,A;t[6]===O?A=t[7]:(A=Math.round(O/8),t[6]=O,t[7]=A);let j=A,M;t[8]===k?M=t[9]:(M=Math.round(k/8),t[8]=k,t[9]=M);let N=M;j=Math.max(0,Math.min(2040,j)),N=Math.max(0,Math.min(2040,N));let P=j*8,F=N*8,I;t[10]!==P||t[11]!==F||t[12]!==w?(I=[P,w,F],t[10]=P,t[11]=F,t[12]=w,t[13]=I):I=t[13];let L=I,ue=le,R;t[14]!==y.position.x||t[15]!==y.position.z?(R=()=>ue(y.position.x,y.position.z),t[14]=y.position.x,t[15]=y.position.z,t[16]=R):R=t[16];let[z,de]=(0,b.useState)(R),B;t[17]!==y.position||t[18]!==x?(B=()=>{if(!x(y.position))return;let e=ue(y.position.x,y.position.z);de(t=>JSON.stringify(t)===JSON.stringify(e)?t:e)},t[17]=y.position,t[18]=x,t[19]=B):B=t[19],i(B);let V=r.surfaceName||`liquidTiles/BlueWater`,H=r.envMapName||void 0,U=r.surfaceOpacity,W=r.envMapIntensity,G;if(t[20]!==h||t[21]!==g||t[22]!==v){let[e,n]=ae(h,v);G=new l(h,v,e,n),G.rotateX(-Math.PI/2),G.translate(h/2,g,v/2),t[20]=h,t[21]=g,t[22]=v,t[23]=G}else G=t[23];let K=G,q,J;t[24]===K?(q=t[25],J=t[26]):(J=()=>()=>{K.dispose()},q=[K],t[24]=K,t[25]=q,t[26]=J),(0,b.useEffect)(J,q);let Y;t[27]!==o||t[28]!==f[0]||t[29]!==f[1]||t[30]!==f[2]||t[31]!==m||t[32]!==h||t[33]!==g||t[34]!==v?(Y=o&&(0,T.jsx)(ne,{args:m,position:[f[0]+h/2,f[1]+g/2,f[2]+v/2],children:(0,T.jsx)(`meshBasicMaterial`,{color:`#00fbff`,wireframe:!0})}),t[27]=o,t[28]=f[0],t[29]=f[1],t[30]=f[2],t[31]=m,t[32]=h,t[33]=g,t[34]=v,t[35]=Y):Y=t[35];let X;if(t[36]!==L||t[37]!==z||t[38]!==K){let e;t[40]!==L||t[41]!==K?(e=e=>{let[t,n]=e,r=L[0]+t*E-D,i=L[2]+n*E-D;return(0,T.jsx)(`mesh`,{geometry:K,position:[r,L[1],i],children:(0,T.jsx)(`meshStandardMaterial`,{color:`#00fbff`,transparent:!0,opacity:.4,wireframe:!0,side:2})},`${t},${n}`)},t[40]=L,t[41]=K,t[42]=e):e=t[42],X=z.map(e),t[36]=L,t[37]=z,t[38]=K,t[39]=X}else X=t[39];let Z;t[43]!==L||t[44]!==W||t[45]!==H||t[46]!==U||t[47]!==z||t[48]!==K||t[49]!==V||t[50]!==C?(Z=(0,T.jsx)(se,{reps:z,basePosition:L,surfaceGeometry:K,surfaceTexture:V,envMapTexture:H,opacity:U,waveMagnitude:C,envMapIntensity:W}),t[43]=L,t[44]=W,t[45]=H,t[46]=U,t[47]=z,t[48]=K,t[49]=V,t[50]=C,t[51]=Z):Z=t[51];let Q;t[52]!==X||t[53]!==Z?(Q=(0,T.jsx)(b.Suspense,{fallback:X,children:Z}),t[52]=X,t[53]=Z,t[54]=Q):Q=t[54];let $;return t[55]!==u||t[56]!==Y||t[57]!==Q?($=(0,T.jsxs)(`group`,{quaternion:u,children:[Y,Q]}),t[55]=u,t[56]=Y,t[57]=Q,t[58]=$):$=t[58],$}),se=(0,b.memo)(function({reps:e,basePosition:t,surfaceGeometry:n,surfaceTexture:r,envMapTexture:a,opacity:s,waveMagnitude:l,envMapIntensity:u}){let d=m(r),f=m(a??`special/lush_env`),g=p(),[_,ee]=h([d,f],e=>{(Array.isArray(e)?e:[e]).forEach(e=>{v(e,{anisotropy:g}),e.colorSpace=``,e.wrapS=c,e.wrapT=c})}),{animationEnabled:te}=o(),y=(0,b.useMemo)(()=>w({opacity:s,waveMagnitude:l,envMapIntensity:u,baseTexture:_,envMapTexture:ee}),[s,l,u,_,ee]),x=(0,b.useRef)(0);return i((e,t)=>{te?(x.current+=t,y.uniforms.uTime.value=x.current):(x.current=0,y.uniforms.uTime.value=0)}),(0,b.useEffect)(()=>()=>{y.dispose()},[y]),(0,T.jsx)(T.Fragment,{children:e.map(([e,r])=>{let i=t[0]+e*E-D,a=t[2]+r*E-D;return(0,T.jsx)(`mesh`,{geometry:n,material:y,position:[i,t[1],a]},`${e},${r}`)})})});function ce(e){return e.camera}function le(e,t){let n=e+D,r=t+D,i=Math.trunc(n/E),a=Math.trunc(r/E);n<0&&i--,r<0&&a--;let o=[];for(let e=a-1;e<=a+1;e++)for(let t=i-1;t<=i+1;t++)o.push([t,e]);return o}export{O as WaterBlock,oe as WaterMaterial};
`;function w(e){return new u({uniforms:{uTime:{value:0},uOpacity:{value:e?.opacity??.75},uWaveMagnitude:{value:e?.waveMagnitude??1},uEnvMapIntensity:{value:e?.envMapIntensity??1},uBaseTexture:{value:e?.baseTexture??null},uEnvMapTexture:{value:e?.envMapTexture??null},fogColor:{value:new d},fogNear:{value:1},fogFar:{value:2e3},fogVolumeData:g.fogVolumeData,cameraHeight:g.cameraHeight,fogEnabled:g.fogEnabled},vertexShader:C,fragmentShader:re,transparent:!0,side:2,depthWrite:!0,fog:!0})}function ie(){let e=(0,S.c)(1),t=(0,b.useRef)(null),n;return e[0]===Symbol.for(`react.memo_cache_sentinel`)?(n=e=>{if(!t.current)return t.current=e.clone(),!0;let n=t.current.x===e.x&&t.current.y===e.y&&t.current.z===e.z;return n||t.current.copy(e),n},e[0]=n):n=e[0],n}var T=r(),E=2048,D=1024;function ae(e,t){let n=e<=1024&&t<=1024?8:16;return[Math.max(4,Math.ceil(e/n)),Math.max(4,Math.ceil(t/n))]}function oe(e){let t=(0,S.c)(7),{surfaceTexture:n,attach:r}=e,i;t[0]===n?i=t[1]:(i=m(n),t[0]=n,t[1]=i);let a=i,o=p(),s;t[2]===o?s=t[3]:(s=e=>_(e,{anisotropy:o}),t[2]=o,t[3]=s);let c=h(a,s),l;return t[4]!==r||t[5]!==c?(l=(0,T.jsx)(`meshStandardMaterial`,{attach:r,map:c,transparent:!0,opacity:.8,side:2}),t[4]=r,t[5]=c,t[6]=l):l=t[6],l}var O=(0,b.memo)(function(e){let t=(0,S.c)(59),{entity:n}=e,r=n.waterData,{debugMode:o}=s(),c;t[0]===r.transform?c=t[1]:(c=te(r.transform),t[0]=r.transform,t[1]=c);let u=c,d;t[2]===r.transform.position?d=t[3]:(d=ee(r.transform.position),t[2]=r.transform.position,t[3]=d);let f=d,p;t[4]===r.scale?p=t[5]:(p=v(r.scale),t[4]=r.scale,t[5]=p);let m=p,[h,g,_]=m,y=a(ce),x=ie(),C=r.waveMagnitude,[re,w,oe]=f,O=re+D,k=oe+D,A;t[6]===O?A=t[7]:(A=Math.round(O/8),t[6]=O,t[7]=A);let j=A,M;t[8]===k?M=t[9]:(M=Math.round(k/8),t[8]=k,t[9]=M);let N=M;j=Math.max(0,Math.min(2040,j)),N=Math.max(0,Math.min(2040,N));let P=j*8,F=N*8,I;t[10]!==P||t[11]!==F||t[12]!==w?(I=[P,w,F],t[10]=P,t[11]=F,t[12]=w,t[13]=I):I=t[13];let L=I,ue=le,R;t[14]!==y.position.x||t[15]!==y.position.z?(R=()=>ue(y.position.x,y.position.z),t[14]=y.position.x,t[15]=y.position.z,t[16]=R):R=t[16];let[z,de]=(0,b.useState)(R),B;t[17]!==y.position||t[18]!==x?(B=()=>{if(!x(y.position))return;let e=ue(y.position.x,y.position.z);de(t=>JSON.stringify(t)===JSON.stringify(e)?t:e)},t[17]=y.position,t[18]=x,t[19]=B):B=t[19],i(B);let V=r.surfaceName||`liquidTiles/BlueWater`,H=r.envMapName||void 0,U=r.surfaceOpacity,W=r.envMapIntensity,G;if(t[20]!==h||t[21]!==g||t[22]!==_){let[e,n]=ae(h,_);G=new l(h,_,e,n),G.rotateX(-Math.PI/2),G.translate(h/2,g,_/2),t[20]=h,t[21]=g,t[22]=_,t[23]=G}else G=t[23];let K=G,q,J;t[24]===K?(q=t[25],J=t[26]):(J=()=>()=>{K.dispose()},q=[K],t[24]=K,t[25]=q,t[26]=J),(0,b.useEffect)(J,q);let Y;t[27]!==o||t[28]!==f[0]||t[29]!==f[1]||t[30]!==f[2]||t[31]!==m||t[32]!==h||t[33]!==g||t[34]!==_?(Y=o&&(0,T.jsx)(ne,{args:m,position:[f[0]+h/2,f[1]+g/2,f[2]+_/2],children:(0,T.jsx)(`meshBasicMaterial`,{color:`#00fbff`,wireframe:!0})}),t[27]=o,t[28]=f[0],t[29]=f[1],t[30]=f[2],t[31]=m,t[32]=h,t[33]=g,t[34]=_,t[35]=Y):Y=t[35];let X;if(t[36]!==L||t[37]!==z||t[38]!==K){let e;t[40]!==L||t[41]!==K?(e=e=>{let[t,n]=e,r=L[0]+t*E-D,i=L[2]+n*E-D;return(0,T.jsx)(`mesh`,{geometry:K,position:[r,L[1],i],children:(0,T.jsx)(`meshStandardMaterial`,{color:`#00fbff`,transparent:!0,opacity:.4,wireframe:!0,side:2})},`${t},${n}`)},t[40]=L,t[41]=K,t[42]=e):e=t[42],X=z.map(e),t[36]=L,t[37]=z,t[38]=K,t[39]=X}else X=t[39];let Z;t[43]!==L||t[44]!==W||t[45]!==H||t[46]!==U||t[47]!==z||t[48]!==K||t[49]!==V||t[50]!==C?(Z=(0,T.jsx)(se,{reps:z,basePosition:L,surfaceGeometry:K,surfaceTexture:V,envMapTexture:H,opacity:U,waveMagnitude:C,envMapIntensity:W}),t[43]=L,t[44]=W,t[45]=H,t[46]=U,t[47]=z,t[48]=K,t[49]=V,t[50]=C,t[51]=Z):Z=t[51];let Q;t[52]!==X||t[53]!==Z?(Q=(0,T.jsx)(b.Suspense,{fallback:X,children:Z}),t[52]=X,t[53]=Z,t[54]=Q):Q=t[54];let $;return t[55]!==u||t[56]!==Y||t[57]!==Q?($=(0,T.jsxs)(`group`,{quaternion:u,children:[Y,Q]}),t[55]=u,t[56]=Y,t[57]=Q,t[58]=$):$=t[58],$}),se=(0,b.memo)(function({reps:e,basePosition:t,surfaceGeometry:n,surfaceTexture:r,envMapTexture:a,opacity:s,waveMagnitude:l,envMapIntensity:u}){let d=m(r),f=m(a??`special/lush_env`),g=p(),[v,ee]=h([d,f],e=>{(Array.isArray(e)?e:[e]).forEach(e=>{_(e,{anisotropy:g}),e.colorSpace=``,e.wrapS=c,e.wrapT=c})}),{animationEnabled:te}=o(),y=(0,b.useMemo)(()=>w({opacity:s,waveMagnitude:l,envMapIntensity:u,baseTexture:v,envMapTexture:ee}),[s,l,u,v,ee]),x=(0,b.useRef)(0);return i((e,t)=>{te?(x.current+=t,y.uniforms.uTime.value=x.current):(x.current=0,y.uniforms.uTime.value=0)}),(0,b.useEffect)(()=>()=>{y.dispose()},[y]),(0,T.jsx)(T.Fragment,{children:e.map(([e,r])=>{let i=t[0]+e*E-D,a=t[2]+r*E-D;return(0,T.jsx)(`mesh`,{geometry:n,material:y,position:[i,t[1],a]},`${e},${r}`)})})});function ce(e){return e.camera}function le(e,t){let n=e+D,r=t+D,i=Math.trunc(n/E),a=Math.trunc(r/E);n<0&&i--,r<0&&a--;let o=[];for(let e=a-1;e<=a+1;e++)for(let t=i-1;t<=i+1;t++)o.push([t,e]);return o}export{O as WaterBlock,oe as WaterMaterial};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
import{n as e}from"./jsx-runtime-BpGWiA-R.js";import{i as t,n}from"./traditional-DPdbI9gv.js";var r=e=>(t,n,r)=>{let i=r.subscribe;return r.subscribe=((e,t,n)=>{let a=e;if(t){let i=n?.equalityFn||Object.is,o=e(r.getState());a=n=>{let r=e(n);if(!i(o,r)){let e=o;t(o=r,e)}},n?.fireImmediately&&t(o,o)}return i(a)}),e(t,n,r)};function i(e){let t=new Map;for(let n of e.state.datablocks.values()){if(n._class!==`tsshapeconstructor`)continue;let e=n.baseshape;if(typeof e!=`string`)continue;let r=e.toLowerCase(),i=r.replace(/\.dts$/i,``)+`_`,a=new Map;for(let e=0;e<=127;e++){let t=n[`sequence${e}`];if(typeof t!=`string`)continue;let r=t.indexOf(` `);if(r===-1)continue;let o=t.slice(0,r).toLowerCase(),s=t.slice(r+1).trim().toLowerCase();if(!s||!o.startsWith(i)||!o.endsWith(`.dsq`))continue;let c=o.slice(i.length,-4);c&&a.set(s,c)}a.size>0&&t.set(r,a)}return t}function a(e,t,n){let r=new Map;for(let n of e){let e=t.clipAction(n);r.set(n.name.toLowerCase(),e)}if(n)for(let[e,t]of n){let n=r.get(t);n&&!r.has(e)&&r.set(e,n)}return r}e();function o(e){return e.toLowerCase()}function s(e){let t=o(e.trim());return t.startsWith(`$`)?t.slice(1):t}function c(e,t,n){return e<t?t:e>n?n:e}function l(e){let t={},n={},r={},i={};for(let n of e.state.objectsById.values())t[n._id]=0,n._name&&(r[o(n._name)]=n._id,n._isDatablock&&(i[o(n._name)]=n._id));for(let t of e.state.globals.keys())n[s(t)]=0;return{objectVersionById:t,globalVersionByName:n,objectIdsByName:r,datablockIdsByName:i}}var u={runtime:{runtime:null,sequenceAliases:new Map,objectVersionById:{},globalVersionByName:{},objectIdsByName:{},datablockIdsByName:{},lastRuntimeTick:0},playback:{recording:null,status:`stopped`,timeMs:0,rate:1,durationMs:0,streamSnapshot:null}},d=t()(r(e=>({...u,setRuntime(t){let n=l(t),r=i(t);e(e=>({...e,runtime:{runtime:t,sequenceAliases:r,objectVersionById:n.objectVersionById,globalVersionByName:n.globalVersionByName,objectIdsByName:n.objectIdsByName,datablockIdsByName:n.datablockIdsByName,lastRuntimeTick:0}}))},clearRuntime(){e(e=>({...e,runtime:{runtime:null,sequenceAliases:new Map,objectVersionById:{},globalVersionByName:{},objectIdsByName:{},datablockIdsByName:{},lastRuntimeTick:0}}))},applyRuntimeBatch(t,n){t.length!==0&&e(e=>{let r={...e.runtime.objectVersionById},i={...e.runtime.globalVersionByName},a={...e.runtime.objectIdsByName},c={...e.runtime.datablockIdsByName},l=e=>{e!=null&&(r[e]=(r[e]??0)+1)};for(let e of t){if(e.type===`object.created`){let t=e.object;if(l(e.objectId),t._name){let n=o(t._name);a[n]=e.objectId,t._isDatablock&&(c[n]=e.objectId)}l(t._parent?._id);continue}if(e.type===`object.deleted`){let t=e.object;if(delete r[e.objectId],t?._name){let e=o(t._name);delete a[e],t._isDatablock&&delete c[e]}l(t?._parent?._id);continue}if(e.type===`field.changed`){l(e.objectId);continue}if(e.type===`global.changed`){let t=s(e.name);i[t]=(i[t]??0)+1;continue}}let u=n?.tick??(e.runtime.lastRuntimeTick>0?e.runtime.lastRuntimeTick+1:1);return{...e,runtime:{...e.runtime,objectVersionById:r,globalVersionByName:i,objectIdsByName:a,datablockIdsByName:c,lastRuntimeTick:u}}})},setRecording(t){let n=Math.max(0,(t?.duration??0)*1e3);e(e=>({...e,playback:{recording:t,status:t?`stopped`:e.playback.status,timeMs:t?0:e.playback.timeMs,rate:t?1:e.playback.rate,durationMs:n,streamSnapshot:t?null:e.playback.streamSnapshot}}))},setPlaybackTime(t){e(e=>{let n=c(t,0,e.playback.durationMs);return{...e,playback:{...e.playback,timeMs:n}}})},setPlaybackStatus(t){e(e=>({...e,playback:{...e.playback,status:t}}))},setPlaybackRate(t){let n=Number.isFinite(t)?c(t,.01,16):1;e(e=>({...e,playback:{...e.playback,rate:n}}))},setPlaybackStreamSnapshot(t){e(e=>({...e,playback:{...e.playback,streamSnapshot:t}}))}}))),f=0;function p(){return f}function m(e,t){f+=e*t*1e3}function h(){f=0}d.subscribe(e=>e.playback.status,e=>{e===`stopped`&&h()});function g(){return d}function _(e,t){return n(d,e,t)}export{g as a,_ as i,p as n,a as o,d as r,r as s,m as t};
import{n as e}from"./jsx-runtime-BpGWiA-R.js";import{i as t,n}from"./traditional-CVpSAKe0.js";var r=e=>(t,n,r)=>{let i=r.subscribe;return r.subscribe=((e,t,n)=>{let a=e;if(t){let i=n?.equalityFn||Object.is,o=e(r.getState());a=n=>{let r=e(n);if(!i(o,r)){let e=o;t(o=r,e)}},n?.fireImmediately&&t(o,o)}return i(a)}),e(t,n,r)};function i(e){let t=new Map;for(let n of e.state.datablocks.values()){if(n._class!==`tsshapeconstructor`)continue;let e=n.baseshape;if(typeof e!=`string`)continue;let r=e.toLowerCase(),i=r.replace(/\.dts$/i,``)+`_`,a=new Map;for(let e=0;e<=127;e++){let t=n[`sequence${e}`];if(typeof t!=`string`)continue;let r=t.indexOf(` `);if(r===-1)continue;let o=t.slice(0,r).toLowerCase(),s=t.slice(r+1).trim().toLowerCase();if(!s||!o.startsWith(i)||!o.endsWith(`.dsq`))continue;let c=o.slice(i.length,-4);c&&a.set(s,c)}a.size>0&&t.set(r,a)}return t}function a(e,t,n){let r=new Map;for(let n of e){let e=t.clipAction(n);r.set(n.name.toLowerCase(),e)}if(n)for(let[e,t]of n){let n=r.get(t);n&&!r.has(e)&&r.set(e,n)}return r}e();function o(e){return e.toLowerCase()}function s(e){let t=o(e.trim());return t.startsWith(`$`)?t.slice(1):t}function c(e,t,n){return e<t?t:e>n?n:e}function l(e){let t={},n={},r={},i={};for(let n of e.state.objectsById.values())t[n._id]=0,n._name&&(r[o(n._name)]=n._id,n._isDatablock&&(i[o(n._name)]=n._id));for(let t of e.state.globals.keys())n[s(t)]=0;return{objectVersionById:t,globalVersionByName:n,objectIdsByName:r,datablockIdsByName:i}}var u={runtime:{runtime:null,sequenceAliases:new Map,objectVersionById:{},globalVersionByName:{},objectIdsByName:{},datablockIdsByName:{},lastRuntimeTick:0},playback:{recording:null,status:`stopped`,timeMs:0,rate:1,durationMs:0,streamSnapshot:null}},d=t()(r(e=>({...u,setRuntime(t){let n=l(t),r=i(t);e(e=>({...e,runtime:{runtime:t,sequenceAliases:r,objectVersionById:n.objectVersionById,globalVersionByName:n.globalVersionByName,objectIdsByName:n.objectIdsByName,datablockIdsByName:n.datablockIdsByName,lastRuntimeTick:0}}))},clearRuntime(){e(e=>({...e,runtime:{runtime:null,sequenceAliases:new Map,objectVersionById:{},globalVersionByName:{},objectIdsByName:{},datablockIdsByName:{},lastRuntimeTick:0}}))},applyRuntimeBatch(t,n){t.length!==0&&e(e=>{let r={...e.runtime.objectVersionById},i={...e.runtime.globalVersionByName},a={...e.runtime.objectIdsByName},c={...e.runtime.datablockIdsByName},l=e=>{e!=null&&(r[e]=(r[e]??0)+1)};for(let e of t){if(e.type===`object.created`){let t=e.object;if(l(e.objectId),t._name){let n=o(t._name);a[n]=e.objectId,t._isDatablock&&(c[n]=e.objectId)}l(t._parent?._id);continue}if(e.type===`object.deleted`){let t=e.object;if(delete r[e.objectId],t?._name){let e=o(t._name);delete a[e],t._isDatablock&&delete c[e]}l(t?._parent?._id);continue}if(e.type===`field.changed`){l(e.objectId);continue}if(e.type===`global.changed`){let t=s(e.name);i[t]=(i[t]??0)+1;continue}}let u=n?.tick??(e.runtime.lastRuntimeTick>0?e.runtime.lastRuntimeTick+1:1);return{...e,runtime:{...e.runtime,objectVersionById:r,globalVersionByName:i,objectIdsByName:a,datablockIdsByName:c,lastRuntimeTick:u}}})},setRecording(t){let n=Math.max(0,(t?.duration??0)*1e3);e(e=>({...e,playback:{recording:t,status:t?`stopped`:e.playback.status,timeMs:t?0:e.playback.timeMs,rate:t?1:e.playback.rate,durationMs:n,streamSnapshot:t?null:e.playback.streamSnapshot}}))},setPlaybackTime(t){e(e=>{let n=c(t,0,e.playback.durationMs);return{...e,playback:{...e.playback,timeMs:n}}})},setPlaybackStatus(t){e(e=>({...e,playback:{...e.playback,status:t}}))},setPlaybackRate(t){let n=Number.isFinite(t)?c(t,.01,16):1;e(e=>({...e,playback:{...e.playback,rate:n}}))},setPlaybackStreamSnapshot(t){e(e=>({...e,playback:{...e.playback,streamSnapshot:t}}))}}))),f=0;function p(){return f}function m(e,t){f+=e*t*1e3}function h(){f=0}d.subscribe(e=>e.playback.status,e=>{e===`stopped`&&h()});function g(){return d}function _(e,t){return n(d,e,t)}export{g as a,_ as i,p as n,a as o,d as r,r as s,m as t};

View file

@ -0,0 +1 @@
import{r as e}from"./chunk-DECur_0Z.js";import{r as t}from"./jsx-runtime-BpGWiA-R.js";var n=e(t(),1),r={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},i=n.createContext&&n.createContext(r),a=[`attr`,`size`,`title`];function o(e,t){if(e==null)return{};var n,r,i=s(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function s(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},c.apply(null,arguments)}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function u(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?l(Object(n),!0).forEach(function(t){d(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function d(e,t,n){return(t=f(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function f(e){var t=p(e,`string`);return typeof t==`symbol`?t:t+``}function p(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function m(e){return e&&e.map((e,t)=>n.createElement(e.tag,u({key:t},e.attr),m(e.child)))}function h(e){return t=>n.createElement(g,c({attr:u({},e.attr)},t),m(e.child))}function g(e){var t=t=>{var{attr:r,size:i,title:s}=e,l=o(e,a),d=i||t.size||`1em`,f;return t.className&&(f=t.className),e.className&&(f=(f?f+` `:``)+e.className),n.createElement(`svg`,c({stroke:`currentColor`,fill:`currentColor`,strokeWidth:`0`},t.attr,r,l,{className:f,style:u(u({color:e.color||t.color},t.style),e.style),height:d,width:d,xmlns:`http://www.w3.org/2000/svg`}),s&&n.createElement(`title`,null,s),e.children)};return i===void 0?t(r):n.createElement(i.Consumer,null,e=>t(e))}export{h as t};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
import{r as e,t}from"./chunk-DECur_0Z.js";import{t as n}from"./logger-DeDFhQmp.js";var r,i;function a(e,t){return t.reduce((e,[t,n])=>({type:`BinaryExpression`,operator:t,left:e,right:n}),e)}function o(e,t){return{type:`UnaryExpression`,operator:e,argument:t}}function s(e,t){return e.type===`Identifier`&&e.name.toLowerCase()===`exec`&&(t.length>0&&t[0].type===`StringLiteral`?r.add(t[0].value):i=!0),{type:`CallExpression`,callee:e,arguments:t}}function c(){return Array.from(r)}var l=class extends SyntaxError{constructor(e,t,n,r){super(e),this.expected=t,this.found=n,this.location=r,this.name=`SyntaxError`}format(e){let t=`Error: `+this.message;if(this.location){let n=null,r=e.find(e=>e.source===this.location.source);r&&(n=r.text.split(/\r\n|\n|\r/g));let i=this.location.start,a=this.location.source&&typeof this.location.source.offset==`function`?this.location.source.offset(i):i,o=this.location.source+`:`+a.line+`:`+a.column;if(n){let e=this.location.end,r=``.padEnd(a.line.toString().length,` `),s=n[i.line-1],c=(i.line===e.line?e.column:s.length+1)-i.column||1;t+=`
import{r as e,t}from"./chunk-DECur_0Z.js";import{t as n}from"./logger-CiAJCFpz.js";var r,i;function a(e,t){return t.reduce((e,[t,n])=>({type:`BinaryExpression`,operator:t,left:e,right:n}),e)}function o(e,t){return{type:`UnaryExpression`,operator:e,argument:t}}function s(e,t){return e.type===`Identifier`&&e.name.toLowerCase()===`exec`&&(t.length>0&&t[0].type===`StringLiteral`?r.add(t[0].value):i=!0),{type:`CallExpression`,callee:e,arguments:t}}function c(){return Array.from(r)}var l=class extends SyntaxError{constructor(e,t,n,r){super(e),this.expected=t,this.found=n,this.location=r,this.name=`SyntaxError`}format(e){let t=`Error: `+this.message;if(this.location){let n=null,r=e.find(e=>e.source===this.location.source);r&&(n=r.text.split(/\r\n|\n|\r/g));let i=this.location.start,a=this.location.source&&typeof this.location.source.offset==`function`?this.location.source.offset(i):i,o=this.location.source+`:`+a.line+`:`+a.column;if(n){let e=this.location.end,r=``.padEnd(a.line.toString().length,` `),s=n[i.line-1],c=(i.line===e.line?e.column:s.length+1)-i.column||1;t+=`
--> `+o+`
`+r+` |
`+a.line+` | `+s+`

View file

@ -9,20 +9,21 @@
/>
<meta name="description" content="Tribes 2 forever." />
<link rel="icon" type="image/png" href="/t2-mapper/icon.png" />
<script type="module" crossorigin src="/t2-mapper/assets/index-swyLT7qk.js"></script>
<script type="module" crossorigin src="/t2-mapper/assets/index-BBAkb8y-.js"></script>
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/chunk-DECur_0Z.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/logger-DeDFhQmp.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/mission-BDFwr4ou.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/extends-BbWS2LU5.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/logger-CiAJCFpz.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/mission-BLbEDC74.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/extends-CNSZZ44D.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/jsx-runtime-BpGWiA-R.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/three.module-Bu2Gkdne.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/traditional-DPdbI9gv.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/react-three-fiber.esm-1xQMUSXT.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/Html-BD9DC-n9.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/three.module-CqFTqVus.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/traditional-CVpSAKe0.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/react-three-fiber.esm-CFJ5mGMW.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/Html-CIkmciH6.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/useBaseQuery-C4sh7dim.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/manifest-jQsIRiPo.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/SettingsProvider-BFWzoiK1.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/engineStore-Clbs91WD.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/manifest-CnxBQu_n.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/SettingsProvider-CZgYJ4FU.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/iconBase-DI0lMIX5.js">
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/engineStore-CLELjjpY.js">
<link rel="stylesheet" crossorigin href="/t2-mapper/assets/index-CuVmt8h5.css">
</head>
<body>

View file

@ -69,6 +69,7 @@ export class GameConnection extends EventEmitter<GameConnectionEvents> {
private rawMessageCount = 0;
private _mapName?: string;
private observerEnforced = false;
private lastLoggedMove: string = "";
/** Send timestamps by sequence number for RTT measurement. */
private sendTimestamps = new Map<number, number>();
/** Smoothed RTT in ms (exponential moving average). */
@ -693,6 +694,26 @@ export class GameConnection extends EventEmitter<GameConnectionEvents> {
* just like real Tribes 2's moveWritePacket.
*/
sendMoves(moves: ClientMoveData[], moveStartIndex: number): void {
if (moves.length > 0) {
const m = moves[moves.length - 1];
const key = `${m.yaw.toFixed(4)},${m.pitch.toFixed(4)},${m.x.toFixed(2)},${m.y.toFixed(2)},${m.z.toFixed(2)},${m.trigger.map(Number).join("")}`;
if (key !== this.lastLoggedMove) {
this.lastLoggedMove = key;
connLog.info(
{
idx: moveStartIndex,
n: moves.length,
yaw: +m.yaw.toFixed(4),
pitch: +m.pitch.toFixed(4),
x: +m.x.toFixed(2),
y: +m.y.toFixed(2),
z: +m.z.toFixed(2),
trig: m.trigger.map(Number).join(""),
},
"browser → relay move",
);
}
}
this.emitDataPacket(moves, moveStartIndex);
}

View file

@ -7,7 +7,7 @@ export const logger = pino({
...(isDev && {
transport: {
target: "pino-pretty",
options: { colorize: true },
options: { colorize: true, singleLine: true },
},
}),
});

View file

@ -1,7 +1,7 @@
import { useEffect, useState, useRef, RefObject } from "react";
import { RiLandscapeFill } from "react-icons/ri";
import { FaRotateRight } from "react-icons/fa6";
import { LuClipboardList } from "react-icons/lu";
import { LuClipboardList, LuUsers } from "react-icons/lu";
import { Camera } from "three";
import {
useControls,
@ -26,6 +26,7 @@ export function InspectorControls({
missionName,
missionType,
onOpenMapInfo,
onOpenScoreScreen,
onOpenServerBrowser,
onChooseMap,
onCancelChoosingMap,
@ -36,6 +37,7 @@ export function InspectorControls({
missionName: string;
missionType: string;
onOpenMapInfo: () => void;
onOpenScoreScreen?: () => void;
onOpenServerBrowser?: () => void;
onChooseMap?: () => void;
onCancelChoosingMap?: () => void;
@ -163,6 +165,17 @@ export function InspectorControls({
<LuClipboardList />
<span className={styles.ButtonLabel}>Show map info</span>
</button>
{onOpenScoreScreen && (
<button
type="button"
className={styles.MapInfoButton}
aria-label="Show scores"
onClick={onOpenScoreScreen}
>
<LuUsers />
<span className={styles.ButtonLabel}>Show scores</span>
</button>
)}
</div>
<div className={styles.Accordions}>
<AccordionGroup type="multiple" defaultValue={DEFAULT_PANELS}>

View file

@ -102,6 +102,10 @@ const ServerBrowser = createLazy(
"ServerBrowser",
() => import("@/src/components/ServerBrowser"),
);
const ScoreScreen = createLazy(
"ScoreScreen",
() => import("@/src/components/ScoreScreen"),
);
export function MapInspector() {
const [currentMission, setCurrentMission] = useMissionQueryState();
@ -111,6 +115,7 @@ export function MapInspector() {
const { missionName, missionType } = currentMission;
const [mapInfoOpen, setMapInfoOpen] = useState(false);
const [serverBrowserOpen, setServerBrowserOpen] = useState(false);
const [scoreScreenOpen, setScoreScreenOpen] = useState(false);
const [choosingMap, setChoosingMap] = useState(false);
const [missionLoadingProgress, setMissionLoadingProgress] = useState(0);
const [showLoadingIndicator, setShowLoadingIndicator] = useState(true);
@ -276,6 +281,9 @@ export function MapInspector() {
missionName={missionName}
missionType={missionType}
onOpenMapInfo={() => setMapInfoOpen(true)}
onOpenScoreScreen={
hasStreamData ? () => setScoreScreenOpen(true) : undefined
}
onOpenServerBrowser={
features.live ? () => setServerBrowserOpen(true) : undefined
}
@ -300,7 +308,11 @@ export function MapInspector() {
<div className={styles.Content}>
<div className={styles.ThreeView}>
<ThreeCanvas
dpr={mapInfoOpen || serverBrowserOpen ? 0.25 : undefined}
dpr={
mapInfoOpen || serverBrowserOpen || scoreScreenOpen
? 0.25
: undefined
}
onCreated={(state) => {
cameraRef.current = state.camera;
invalidateRef.current = state.invalidate;
@ -342,7 +354,7 @@ export function MapInspector() {
</TickProvider>
</ThreeCanvas>
</div>
{hasStreamData ? (
{hasStreamData && !scoreScreenOpen ? (
<Suspense>
<PlayerHUD />
</Suspense>
@ -386,6 +398,13 @@ export function MapInspector() {
</Suspense>
</ViewTransition>
) : null}
{scoreScreenOpen ? (
<ViewTransition>
<Suspense>
<ScoreScreen onClose={() => setScoreScreenOpen(false)} />
</Suspense>
</ViewTransition>
) : null}
</RecordingProvider>
</main>
);

View file

@ -42,6 +42,20 @@
image-rendering: pixelated;
}
.CompassClock {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 10px;
font-weight: 600;
font-variant-numeric: tabular-nums;
color: rgba(200, 240, 230, 0.9);
text-shadow: 0 0 4px rgba(0, 0, 0, 0.8);
pointer-events: none;
white-space: nowrap;
}
.Bars {
display: flex;
flex-direction: column;
@ -87,27 +101,27 @@
/* ── Team Scores (bottom-left) ── */
.TeamInfo {
display: flex;
flex-direction: column;
gap: 2px;
}
.TeamScores {
position: absolute;
bottom: 6px;
left: 6px;
font-size: 12px;
border: 1px solid rgba(128, 255, 200, 0.15);
border-collapse: collapse;
}
.ObserverCount {
position: absolute;
bottom: calc(100%);
display: block;
padding: 4px 6px;
font-size: 10px;
color: rgb(193, 228, 216);
text-shadow: 0 0 2px rgba(0, 0, 0, 0.6);
}
.TeamRow {
flex: 1 0 auto;
display: flex;
align-items: center;
justify-content: space-between;
gap: 6px;
padding: 4px 8px 4px 6px;
background: rgba(0, 50, 60, 0.65);
}
@ -119,6 +133,7 @@
min-width: 6em;
font-size: 12px;
font-weight: 500;
padding: 5px 6px;
}
.TeamNameFriendly {
@ -135,11 +150,14 @@
color: #fff;
font-weight: 500;
text-align: right;
padding: 0 10px;
border-left: 1px solid rgba(128, 255, 200, 0.15);
}
.TeamCount {
color: #9ba;
font-size: 9px;
color: rgb(125, 155, 150);
font-size: 11px;
padding: 0 6px;
}
/* ── Pack + Inventory HUD (bottom-right) ── */

View file

@ -3,14 +3,26 @@ import { textureToUrl } from "../loaders";
import type { StreamEntity, TeamScore, WeaponsHudSlot } from "../stream/types";
import styles from "./PlayerHUD.module.css";
import { ChatWindow } from "./ChatWindow";
import { LuUsers } from "react-icons/lu";
const COMPASS_URL = textureToUrl("gui/hud_new_compass");
const NSEW_URL = textureToUrl("gui/hud_new_NSEW");
function formatClockHud(clockMs: number): string {
const absSec = Math.abs(clockMs) / 1000;
const displaySec = clockMs < 0 ? Math.ceil(absSec) : Math.floor(absSec);
const mins = Math.floor(displaySec / 60);
const secs = displaySec % 60;
return `${String(mins).padStart(2, "0")}:${String(secs).padStart(2, "0")}`;
}
function Compass() {
const yaw = useEngineSelector(
(state) => state.playback.streamSnapshot?.camera?.yaw,
);
const matchClockMs = useEngineSelector(
(state) => state.playback.streamSnapshot?.matchClockMs,
);
if (yaw == null) return null;
// The ring notch is the fixed heading indicator (always "forward" at top).
// The NSEW letters rotate to show world cardinal directions relative to
@ -26,6 +38,11 @@ function Compass() {
className={styles.CompassNSEW}
style={{ transform: `rotate(${-deg}deg)` }}
/>
{matchClockMs != null && (
<span className={styles.CompassClock}>
{formatClockHud(matchClockMs)}
</span>
)}
</div>
);
}
@ -216,6 +233,11 @@ function TeamScores() {
const playerSensorGroup = useEngineSelector(
(state) => state.playback.streamSnapshot?.playerSensorGroup,
);
const observerCount = useEngineSelector(
(state) =>
state.playback.streamSnapshot?.playerRoster?.filter((p) => p.teamId <= 0)
.length ?? 0,
);
if (!teamScores?.length) return null;
// Sort: friendly team first (if known), then by teamId.
const sorted = [...teamScores].sort((a, b) => {
@ -226,33 +248,41 @@ function TeamScores() {
return a.teamId - b.teamId;
});
return (
<div className={styles.TeamScores}>
{sorted.map((team: TeamScore) => {
const isFriendly =
playerSensorGroup > 0 && team.teamId === playerSensorGroup;
const name =
team.name ||
(DEFAULT_TEAM_NAMES[team.teamId] ?? `Team ${team.teamId}`);
return (
<div key={team.teamId} className={styles.TeamRow}>
<div className={styles.TeamInfo}>
<span
<table className={styles.TeamScores}>
<tbody>
{observerCount > 0 && (
<tr>
<td className={styles.ObserverCount} colSpan={3}>
{observerCount} {observerCount === 1 ? "observer" : "observers"}
</td>
</tr>
)}
{sorted.map((team: TeamScore) => {
const isFriendly =
playerSensorGroup > 0 && team.teamId === playerSensorGroup;
const name =
team.name ||
(DEFAULT_TEAM_NAMES[team.teamId] ?? `Team ${team.teamId}`);
return (
<tr key={team.teamId} className={styles.TeamRow}>
<td
className={
isFriendly ? styles.TeamNameFriendly : styles.TeamNameEnemy
}
>
{name}
</span>{" "}
<span className={styles.TeamCount}>
{team.playerCount}{" "}
{team.playerCount === 1 ? "player" : "players"}
</span>
</div>
<span className={styles.TeamScore}>{team.score}</span>
</div>
);
})}
</div>
</td>
<td className={styles.TeamCount}>
({team.playerCount.toLocaleString()})
</td>
<td className={styles.TeamScore}>
{team.score.toLocaleString()}
</td>
</tr>
);
})}
</tbody>
</table>
);
}

View file

@ -0,0 +1,236 @@
.Dialog {
composes: Dialog from "./GameDialog.module.css";
width: 600px;
min-height: 360px;
display: grid;
grid-template-columns: 100%;
grid-template-rows: auto 1fr auto;
}
.Overlay {
composes: Overlay from "./GameDialog.module.css";
}
.TitleBar {
display: flex;
align-items: center;
padding: 7px 15px 6px 16px;
border-bottom: 1px solid rgba(0, 190, 220, 0.25);
background: rgba(32, 83, 85, 0.8);
color: rgba(133, 255, 222, 0.9);
box-shadow:
inset 0 2px 4px rgba(114, 255, 246, 0.2),
inset 0 -2px 5px rgba(20, 30, 31, 0.5);
}
.PlayerTotal {
display: flex;
align-items: center;
gap: 8px;
font-size: 12px;
font-weight: 500;
color: rgba(141, 219, 214, 0.8);
margin: 0 0 0 auto;
}
.Title {
font-size: 14px;
font-weight: 500;
line-height: 1.5;
margin: 0;
text-transform: uppercase;
text-shadow: 0 -1px 0 rgba(10, 25, 26, 0.6);
}
.MatchClock {
display: flex;
align-items: center;
gap: 7px;
font-size: 12px;
font-weight: 500;
font-variant-numeric: tabular-nums;
margin: 0 0 0 16px;
}
.Time {
color: rgba(133, 255, 222, 0.9);
}
.PlayersIcon {
font-size: 16px;
}
.ClockIcon {
font-size: 16px;
}
/* Table layout */
.TableWrapper {
overflow-y: auto;
overflow-x: hidden;
min-height: 0;
}
.Table {
width: 100%;
border-collapse: separate;
border-spacing: 0;
font-size: 13px;
padding-bottom: 8px;
}
/* Sticky thead — works because TableWrapper is the scroll container */
.Table thead {
position: sticky;
top: 0;
z-index: 1;
}
/* Team name + score row */
.TeamHeaderRow th {
padding: 8px 16px;
font-weight: 500;
background: rgba(20, 37, 38, 0.95);
box-shadow: inset 0 -1px 0 rgba(0, 190, 220, 0.2);
}
.TeamName {
width: 50%;
font-size: 18px;
font-weight: 500;
color: #7dffff;
text-align: left;
}
.TeamScore {
font-size: 22px;
font-weight: 500;
color: #7dffff;
text-align: right;
}
/* Column sub-headers (Players / Score) */
.ColumnHeaderRow th {
padding: 6px 15px 7px 15px;
background: rgba(10, 25, 26, 0.95);
box-shadow: inset 0 -1px 0 rgba(0, 190, 220, 0.15);
font-size: 12px;
font-weight: 500;
color: rgba(125, 255, 255, 0.7);
text-transform: uppercase;
text-align: left;
}
.ColumnHeader {
}
.ColumnHeaderScore {
text-align: right !important;
}
.ColumnPing {
font-size: 10px;
font-weight: 500;
color: rgba(125, 255, 255, 0.4);
margin: 0 0 0 8px;
text-transform: none;
}
/* Player rows */
.PlayerBody td {
line-height: calc(16 / 13);
padding: 3px 16px;
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
}
.PlayerBody tr:last-child td {
border-bottom: none;
}
.PlayerBody tr:hover {
background: rgba(65, 131, 139, 0.08);
}
.PlayerName {
width: 50%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: 500;
}
.PlayerNameLocal {
composes: PlayerName;
color: #5dff8a;
}
.PlayerScore {
text-align: right;
white-space: nowrap;
font-weight: 500;
color: rgba(176, 213, 201, 0.8);
}
.PlayerScoreLocal {
composes: PlayerScore;
color: #5dff8a;
}
/* Divider between team columns */
.TeamHeaderRow th:nth-child(2),
.ColumnHeaderRow th:nth-child(2),
.PlayerBody td:nth-child(2),
.ObserverBody td:nth-child(2) {
border-right: 1px solid rgba(0, 190, 220, 0.15);
}
/* Observers */
.ObserverBody tr:first-child th {
box-shadow:
inset 0 1px 0 rgba(0, 190, 220, 0.15),
inset 0 -1px 0 rgba(0, 190, 220, 0.15);
}
.ObserverBody td {
padding: 2px 16px;
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
}
.ObserverBody tr:hover {
background: rgba(65, 131, 139, 0.08);
}
/* Footer */
.Footer {
display: flex;
align-items: center;
gap: 16px;
padding: 10px 12px;
border-top: 1px solid rgba(0, 190, 220, 0.25);
background: rgba(2, 20, 21, 0.7);
flex-shrink: 0;
}
.CloseButton {
composes: DialogButton from "./GameDialog.module.css";
}
.Hint {
font-size: 12px;
color: rgba(201, 220, 216, 0.3);
margin-left: auto;
}
.Empty {
padding: 32px 16px;
text-align: center;
color: rgba(201, 220, 216, 0.3);
font-style: italic;
}
@media (max-width: 719px) {
.Hint,
.ColumnPing {
display: none;
}
}

View file

@ -0,0 +1,358 @@
import { useEffect, useRef, useMemo } from "react";
import { LuUsers } from "react-icons/lu";
import { IoMdStopwatch } from "react-icons/io";
import { useEngineSelector } from "../state/engineStore";
import { liveConnectionStore } from "../state/liveConnectionStore";
import { useDataSource } from "../state/gameEntityStore";
import type { PlayerRosterEntry, TeamScore } from "../stream/types";
import styles from "./ScoreScreen.module.css";
const DEFAULT_TEAM_NAMES: Record<number, string> = {
1: "Storm",
2: "Inferno",
3: "Starwolf",
4: "Diamond Sword",
5: "Blood Eagle",
6: "Phoenix",
};
function computePingStats(players: PlayerRosterEntry[]): {
avg: number;
dev: number;
} {
if (!players.length) return { avg: 0, dev: 0 };
const pings = players.map((p) => p.ping);
const avg = pings.reduce((a, b) => a + b, 0) / pings.length;
const variance =
pings.reduce((sum, p) => sum + (p - avg) ** 2, 0) / pings.length;
return { avg: Math.round(avg), dev: Math.round(Math.sqrt(variance)) };
}
function formatClock(totalSec: number): string {
const sign = totalSec < 0 ? "-" : "";
const abs = Math.abs(totalSec);
const mins = Math.floor(abs / 60);
const secs = Math.floor(abs % 60);
return `${sign}${String(mins).padStart(2, "0")}:${String(secs).padStart(2, "0")}`;
}
/** Renders the match clock. Negative clockMs = counting down, positive = counting up. */
function MatchClock({ clockMs }: { clockMs: number }) {
// Match the C++ HudClockCtrl: display absolute value, sign determines direction.
const absSec = Math.abs(clockMs) / 1000;
const displaySec = clockMs < 0 ? Math.ceil(absSec) : Math.floor(absSec);
return (
<span className={styles.MatchClock}>
<IoMdStopwatch className={styles.ClockIcon} />{" "}
<span className={styles.Time}>{formatClock(displaySec)}</span>
</span>
);
}
function getTeamName(team: TeamScore): string {
return team.name || DEFAULT_TEAM_NAMES[team.teamId] || `Team ${team.teamId}`;
}
export function ScoreScreen({ onClose }: { onClose: () => void }) {
const dialogRef = useRef<HTMLDivElement>(null);
const dataSource = useDataSource();
const isLive = dataSource === "live";
const connectedClientId = useEngineSelector(
(state) => state.playback.streamSnapshot?.connectedClientId,
);
const teamScores = useEngineSelector(
(state) => state.playback.streamSnapshot?.teamScores,
);
const playerRoster = useEngineSelector(
(state) => state.playback.streamSnapshot?.playerRoster,
);
const playerSensorGroup = useEngineSelector(
(state) => state.playback.streamSnapshot?.playerSensorGroup,
);
const matchClockMs = useEngineSelector(
(state) => state.playback.streamSnapshot?.matchClockMs,
);
// Focus and exit pointer lock on open
useEffect(() => {
dialogRef.current?.focus();
try {
document.exitPointerLock();
} catch {
/* expected */
}
}, []);
// Block keyboard events from reaching Three.js while open
useEffect(() => {
const handleKeyDown = (e: KeyboardEvent) => {
if (e.key === "Escape") {
onClose();
}
e.stopImmediatePropagation();
};
const handleKeyUp = (e: KeyboardEvent) => {
e.stopImmediatePropagation();
};
window.addEventListener("keydown", handleKeyDown, { capture: true });
window.addEventListener("keyup", handleKeyUp, { capture: true });
return () => {
window.removeEventListener("keydown", handleKeyDown, { capture: true });
window.removeEventListener("keyup", handleKeyUp, { capture: true });
};
}, [onClose]);
// Poll for scores every 4 seconds in live mode
useEffect(() => {
if (!isLive) return;
const request = () => {
liveConnectionStore.getState().sendCommand("getScores");
};
request();
const interval = setInterval(request, 4000);
return () => clearInterval(interval);
}, [isLive]);
// Group players by team, sorted by score descending
const { teamPlayers, observers } = useMemo(() => {
const teamPlayers = new Map<number, PlayerRosterEntry[]>();
const observers: PlayerRosterEntry[] = [];
if (playerRoster) {
for (const player of playerRoster) {
if (player.teamId > 0) {
const list = teamPlayers.get(player.teamId);
if (list) {
list.push(player);
} else {
teamPlayers.set(player.teamId, [player]);
}
} else {
observers.push(player);
}
}
}
for (const list of teamPlayers.values()) {
list.sort(
(a, b) =>
b.score - a.score || (a.name ?? "").localeCompare(b.name ?? ""),
);
}
observers.sort((a, b) => (a.name ?? "").localeCompare(b.name ?? ""));
return { teamPlayers, observers };
}, [playerRoster]);
// Sort teams by natural order (team1, team2, etc.)
const sortedTeams = useMemo(() => {
if (!teamScores?.length) return [];
return [...teamScores].sort((a, b) => a.teamId - b.teamId);
}, [teamScores]);
const hasTeams = sortedTeams.length >= 2;
const team1 = sortedTeams[0];
const team2 = sortedTeams[1];
const team1Players = team1 ? (teamPlayers.get(team1.teamId) ?? []) : [];
const team2Players = team2 ? (teamPlayers.get(team2.teamId) ?? []) : [];
const team1Ping = useMemo(
() => computePingStats(team1Players),
[team1Players],
);
const team2Ping = useMemo(
() => computePingStats(team2Players),
[team2Players],
);
const maxRows = Math.max(team1Players.length, team2Players.length);
return (
<div className={styles.Overlay} onClick={onClose}>
<div
ref={dialogRef}
className={styles.Dialog}
onClick={(e) => e.stopPropagation()}
role="dialog"
aria-modal="true"
aria-label="Score Screen"
tabIndex={-1}
>
<header className={styles.TitleBar}>
<h2 className={styles.Title}>Score</h2>{" "}
<span className={styles.PlayerTotal}>
<LuUsers className={styles.PlayersIcon} />{" "}
{playerRoster?.length ?? 0} players
</span>{" "}
{matchClockMs != null && <MatchClock clockMs={matchClockMs} />}
</header>
{hasTeams ? (
<div className={styles.TableWrapper}>
<table className={styles.Table}>
<thead>
<tr className={styles.TeamHeaderRow}>
<th className={styles.TeamName}>{getTeamName(team1)}</th>
<th className={styles.TeamScore}>{team1.score}</th>
<th className={styles.TeamName}>{getTeamName(team2)}</th>
<th className={styles.TeamScore}>{team2.score}</th>
</tr>
<tr className={styles.ColumnHeaderRow}>
<th className={styles.ColumnHeader}>
<span>Players ({team1Players.length})</span>
{team1Players.length > 0 && (
<span className={styles.ColumnPing}>
{" "}
PING: {team1Ping.avg}&thinsp;&#177;&thinsp;
{team1Ping.dev}&thinsp;ms
</span>
)}
</th>
<th className={styles.ColumnHeaderScore}>Score</th>
<th className={styles.ColumnHeader}>
<span>Players ({team2Players.length})</span>
{team2Players.length > 0 && (
<span className={styles.ColumnPing}>
{" "}
PING: {team2Ping.avg}&thinsp;&#177;&thinsp;
{team2Ping.dev}&thinsp;ms
</span>
)}
</th>
<th className={styles.ColumnHeaderScore}>Score</th>
</tr>
</thead>
<tbody className={styles.PlayerBody}>
{Array.from({ length: maxRows }, (_, i) => {
const p1 = team1Players[i];
const p2 = team2Players[i];
const p1IsLocal =
connectedClientId != null &&
p1?.clientId === connectedClientId;
const p2IsLocal =
connectedClientId != null &&
p2?.clientId === connectedClientId;
return (
<tr key={`${p1?.clientId ?? ""}-${p2?.clientId ?? ""}`}>
<td
className={
p1IsLocal ? styles.PlayerNameLocal : styles.PlayerName
}
>
{p1?.name || (p1 ? "..." : "")}
</td>
<td
className={
p1IsLocal
? styles.PlayerScoreLocal
: styles.PlayerScore
}
>
{p1 != null ? p1.score : ""}
</td>
<td
className={
p2IsLocal ? styles.PlayerNameLocal : styles.PlayerName
}
>
{p2?.name || (p2 ? "..." : "")}
</td>
<td
className={
p2IsLocal
? styles.PlayerScoreLocal
: styles.PlayerScore
}
>
{p2 != null ? p2.score : ""}
</td>
</tr>
);
})}
</tbody>
{observers.length > 0 &&
(() => {
// Split into two columns, filling top-to-bottom then left-to-right.
const half = Math.ceil(observers.length / 2);
const obsRows = Math.ceil(observers.length / 2);
return (
<tbody className={styles.ObserverBody}>
<tr className={styles.ColumnHeaderRow}>
<th colSpan={2} className={styles.ColumnHeader}>
Observers ({observers.length})
</th>
<th colSpan={2} className={styles.ColumnHeader}>
&nbsp;
</th>
</tr>
{Array.from({ length: obsRows }, (_, i) => {
const o1 = observers[i];
const o2 = observers[i + half];
const o1IsLocal =
connectedClientId != null &&
o1?.clientId === connectedClientId;
const o2IsLocal =
connectedClientId != null &&
o2?.clientId === connectedClientId;
return (
<tr
key={`${o1?.clientId ?? ""}-${o2?.clientId ?? ""}`}
>
<td
className={
o1IsLocal
? styles.PlayerNameLocal
: styles.PlayerName
}
>
{o1?.name || (o1 ? "..." : "")}
</td>
<td
className={
o1IsLocal
? styles.PlayerScoreLocal
: styles.PlayerScore
}
>
{o1 != null ? o1.score : ""}
</td>
<td
className={
o2IsLocal
? styles.PlayerNameLocal
: styles.PlayerName
}
>
{o2?.name || ""}
</td>
<td
className={
o2IsLocal
? styles.PlayerScoreLocal
: styles.PlayerScore
}
>
{o2 != null ? o2.score : ""}
</td>
</tr>
);
})}
</tbody>
);
})()}
</table>
</div>
) : (
<div className={styles.Empty}>
{playerRoster?.length
? "No team data available"
: "Waiting for player data\u2026"}
</div>
)}
<div className={styles.Footer}>
<button className={styles.CloseButton} onClick={onClose}>
Close
</button>
<span className={styles.Hint}>Esc to close</span>
</div>
</div>
</div>
);
}

View file

@ -59,6 +59,7 @@
min-height: 0;
border-collapse: collapse;
font-size: 13px;
user-select: none;
}
.Table th {

View file

@ -6,6 +6,7 @@ import {
STREAM_TICK_SEC,
torqueHorizontalFovToThreeVerticalFov,
} from "../stream/playbackUtils";
import { useSettings } from "./SettingsProvider";
import { ParticleEffects } from "./ParticleEffects";
import { PlayerEyeOffset } from "./PlayerModel";
import { stopAllTrackedSounds } from "./AudioEmitter";
@ -102,6 +103,7 @@ export function StreamingController({
recording: StreamRecording;
}) {
const engineStore = useEngineStoreApi();
const { fov: userFov } = useSettings();
const playbackClockRef = useRef(0);
const prevTickSnapshotRef = useRef<StreamSnapshot | null>(null);
const currentTickSnapshotRef = useRef<StreamSnapshot | null>(null);
@ -457,16 +459,14 @@ export function StreamingController({
}
if (
Number.isFinite(currentCamera.fov) &&
"isPerspectiveCamera" in state.camera &&
(state.camera as any).isPerspectiveCamera
) {
const perspectiveCamera = state.camera as any;
const fovValue =
previousCamera && Number.isFinite(previousCamera.fov)
? previousCamera.fov +
(currentCamera.fov - previousCamera.fov) * interpT
: currentCamera.fov;
// Use the user's FOV preference, matching how the real client applies
// $pref::Player::defaultFov locally. The stream's camera FOV is the
// recorder's setting (demos) or server default (live).
const fovValue = userFov;
const verticalFov = torqueHorizontalFovToThreeVerticalFov(
fovValue,
perspectiveCamera.aspect,

View file

@ -45,6 +45,7 @@ import type {
StreamingPlayback,
InventoryHudSlot,
PendingAudioEvent,
PlayerRosterEntry,
TeamScore,
WeaponsHudSlot,
WeaponImageState,
@ -214,7 +215,14 @@ export abstract class StreamEngine implements StreamingPlayback {
protected backpackHud = { packIndex: -1, active: false, text: "" };
protected inventoryHud = { slots: new Map<number, number>(), activeSlot: -1 };
protected teamScores: TeamScore[] = [];
protected playerRoster = new Map<number, { name: string; teamId: number }>();
protected playerRoster = new Map<
number,
{ name: string; teamId: number; score: number; ping: number; packetLoss: number }
>();
/** Stream time (seconds) when the clock was last set. */
protected clockAnchorStreamSec: number | null = null;
/** Duration in ms passed to setTime (0 = count-up, >0 = count-down). */
protected clockDurationMs: number = 0;
// ── Mission info (from server messages) ──
/** Mission display name (e.g. "Riverdance"), from MsgMissionDropInfo/MsgLoadInfo. */
@ -227,6 +235,8 @@ export abstract class StreamEngine implements StreamingPlayback {
serverDisplayName: string | null = null;
/** Server-assigned name of the connected/recording player. */
connectedPlayerName: string | null = null;
/** Client ID of the connected player (from MsgClientJoin "Welcome" message). */
connectedClientId: number | null = null;
/** Called when mission info changes (mission name, game type, etc.). */
onMissionInfoChange?: () => void;
@ -337,12 +347,16 @@ export abstract class StreamEngine implements StreamingPlayback {
this.inventoryHud = { slots: new Map(), activeSlot: -1 };
this.teamScores = [];
this.playerRoster.clear();
this.clockAnchorStreamSec = null;
this.clockDurationMs = 0;
this.nextExplosionId = 0;
this.missionDisplayName = null;
this.missionTypeDisplayName = null;
this.gameClassName = null;
this.serverDisplayName = null;
this.connectedPlayerName = null;
// Note: connectedPlayerName and connectedClientId are NOT cleared here —
// they are connection-level state set once from the "Welcome" MsgClientJoin,
// and should persist across mission changes.
}
// ── Net string resolution ──
@ -516,7 +530,7 @@ export abstract class StreamEngine implements StreamingPlayback {
const pendingTargetId = this.pendingNameTags.get(id);
if (pendingTargetId != null) {
this.pendingNameTags.delete(id);
const name = stripTaggedStringMarkup(value);
const name = stripTaggedStringMarkup(value).trim();
this.targetNames.set(pendingTargetId, name);
for (const entity of this.entities.values()) {
if (entity.targetId === pendingTargetId) {
@ -534,7 +548,7 @@ export abstract class StreamEngine implements StreamingPlayback {
if (targetId != null && nameTag != null) {
const resolved = this.netStrings.get(nameTag);
if (resolved) {
this.targetNames.set(targetId, stripTaggedStringMarkup(resolved));
this.targetNames.set(targetId, stripTaggedStringMarkup(resolved).trim());
} else {
// NetStringEvent hasn't arrived yet — defer resolution.
this.pendingNameTags.set(nameTag, targetId);
@ -1806,7 +1820,10 @@ export abstract class StreamEngine implements StreamingPlayback {
if (args.length < 2) return;
const msgType = this.resolveNetString(args[0]);
if (msgType === "MsgTeamScoreIs" && args.length >= 4) {
if (
(msgType === "MsgTeamScoreIs" || msgType === "MsgTeamScore") &&
args.length >= 4
) {
const teamId = parseInt(this.resolveNetString(args[2]), 10);
const newScore = parseInt(this.resolveNetString(args[3]), 10);
if (!isNaN(teamId) && !isNaN(newScore)) {
@ -1817,11 +1834,12 @@ export abstract class StreamEngine implements StreamingPlayback {
}
}
} else if (msgType === "MsgCTFAddTeam" && args.length >= 6) {
const teamIdx = parseInt(this.resolveNetString(args[2]), 10);
// Wire order: args[2]=teamId (1-based), args[3]=teamName,
// args[4]=flagStatus, args[5]=teamScore
const teamId = parseInt(this.resolveNetString(args[2]), 10);
const teamName = stripTaggedStringMarkup(this.resolveNetString(args[3]));
const score = parseInt(this.resolveNetString(args[5]), 10);
if (!isNaN(teamIdx)) {
const teamId = teamIdx + 1;
if (!isNaN(teamId) && teamId > 0) {
const existing = this.teamScores.find((t) => t.teamId === teamId);
if (existing) {
existing.name = teamName;
@ -1843,10 +1861,14 @@ export abstract class StreamEngine implements StreamingPlayback {
).trim();
const clientId = parseInt(this.resolveNetString(args[3]), 10);
if (!isNaN(clientId)) {
const existing = this.playerRoster.get(clientId);
// The real client (message.cs handleClientJoin) creates a fresh
// ScriptObject with score=0, overwriting any previous entry.
this.playerRoster.set(clientId, {
name,
teamId: existing?.teamId ?? 0,
teamId: 0,
score: 0,
ping: 0,
packetLoss: 0,
});
this.onRosterChanged();
}
@ -1859,27 +1881,66 @@ export abstract class StreamEngine implements StreamingPlayback {
);
if (msgFormat.includes("Welcome to Tribes")) {
this.connectedPlayerName = name;
this.connectedClientId = clientId;
this.onMissionInfoChange?.();
}
}
} else if (msgType === "MsgClientDrop" && args.length >= 3) {
const clientId = parseInt(this.resolveNetString(args[2]), 10);
} else if (msgType === "MsgClientDrop" && args.length >= 4) {
// Wire order: args[2]=clientName, args[3]=clientId
const clientId = parseInt(this.resolveNetString(args[3]), 10);
if (!isNaN(clientId)) {
this.playerRoster.delete(clientId);
this.onRosterChanged();
}
} else if (msgType === "MsgClientJoinTeam" && args.length >= 4) {
const clientId = parseInt(this.resolveNetString(args[2]), 10);
const teamId = parseInt(this.resolveNetString(args[3]), 10);
} else if (msgType === "MsgClientJoinTeam" && args.length >= 6) {
// Wire order: args[2]=clientName, args[3]=teamName, args[4]=clientId, args[5]=teamId
const clientId = parseInt(this.resolveNetString(args[4]), 10);
const teamId = parseInt(this.resolveNetString(args[5]), 10);
if (!isNaN(clientId) && !isNaN(teamId)) {
const existing = this.playerRoster.get(clientId);
if (existing) {
existing.teamId = teamId;
} else {
this.playerRoster.set(clientId, { name: "", teamId });
this.playerRoster.set(clientId, {
name: "",
teamId,
score: 0,
ping: 0,
packetLoss: 0,
});
}
this.onRosterChanged();
}
} else if (msgType === "MsgPlayerScore" && args.length >= 5) {
// Wire order: args[2]=clientId, args[3]=score, args[4]=ping, args[5]=packetLoss
// Only update existing roster entries — the real client (scoreList.cs
// handlePlayerScore) warns and ignores scores for unknown clients.
const clientId = parseInt(this.resolveNetString(args[2]), 10);
if (!isNaN(clientId)) {
const existing = this.playerRoster.get(clientId);
if (existing) {
const score = parseInt(this.resolveNetString(args[3]), 10);
const ping = parseInt(this.resolveNetString(args[4]), 10);
const packetLoss = parseInt(
this.resolveNetString(args[5] ?? ""),
10,
);
if (!isNaN(score)) existing.score = score;
if (!isNaN(ping)) existing.ping = ping;
if (!isNaN(packetLoss)) existing.packetLoss = packetLoss;
this.onRosterChanged();
}
}
} else if (msgType === "MsgSystemClock" && args.length >= 4) {
// Wire order: args[2]=timeLimitMinutes, args[3]=timeRemainingMS
// The real client calls clockHud.setTime(timeRemainingMS / 60000).
// setTime(0) → count-up clock (pre-match elapsed).
// setTime(N) → count-down clock (N minutes remaining).
const timeRemainingMS = parseFloat(this.resolveNetString(args[3]));
this.clockAnchorStreamSec = this.getTimeSec();
this.clockDurationMs = Number.isFinite(timeRemainingMS)
? timeRemainingMS
: 0;
} else if (msgType === "MsgMissionDropInfo" && args.length >= 5) {
// messageClient(%cl, 'MsgMissionDropInfo', ..., $MissionDisplayName, $MissionTypeDisplayName, $ServerName)
const missionDisplayName = stripTaggedStringMarkup(
@ -2098,12 +2159,26 @@ export abstract class StreamEngine implements StreamingPlayback {
return entities;
}
/**
* Compute the match clock value in ms, mirroring HudClockCtrl's actualTimeMS.
* Negative = counting down (remaining), positive = counting up (elapsed).
* Returns null if no clock has been set.
*/
protected computeMatchClockMs(timeSec: number): number | null {
if (this.clockAnchorStreamSec == null) return null;
const elapsedMs = (timeSec - this.clockAnchorStreamSec) * 1000;
// actualTimeMS = -clockDurationMs + elapsed
// duration=0 → positive (count-up), duration>0 → starts negative (count-down)
return -this.clockDurationMs + elapsedMs;
}
/** Build HUD arrays for snapshot. */
protected buildHudState(): {
weaponsHud: { slots: WeaponsHudSlot[]; activeIndex: number };
inventoryHud: { slots: InventoryHudSlot[]; activeSlot: number };
backpackHud: BackpackHudState | null;
teamScores: TeamScore[];
playerRoster: PlayerRosterEntry[];
} {
const weaponsHud = {
slots: Array.from(this.weaponsHud.slots.entries()).map(
@ -2131,7 +2206,12 @@ export abstract class StreamEngine implements StreamingPlayback {
ts.playerCount = teamCounts.get(ts.teamId) ?? 0;
}
return { weaponsHud, inventoryHud, backpackHud, teamScores };
const playerRoster: PlayerRosterEntry[] = [];
for (const [clientId, entry] of this.playerRoster) {
playerRoster.push({ clientId, ...entry });
}
return { weaponsHud, inventoryHud, backpackHud, teamScores, playerRoster };
}
/** Build filtered chat and audio event arrays for the current time. */

View file

@ -27,6 +27,7 @@ import type {
StreamRecording,
StreamSnapshot,
TeamScore,
PlayerRosterEntry,
WeaponsHudSlot,
InventoryHudSlot,
BackpackHudState,
@ -57,6 +58,7 @@ function extractMissionInfo(demoValues: string[]): DemoMissionInfo {
let serverDisplayName: string | null = null;
let mod: string | null = null;
let recorderName: string | null = null;
let recorderClientId: number = NaN;
let recordingDate: string | null = null;
for (let i = 0; i < demoValues.length; i++) {
@ -71,8 +73,9 @@ function extractMissionInfo(demoValues: string[]): DemoMissionInfo {
if (!value) continue;
if (value.startsWith("1\t")) {
// Row 1: "1\ttime\trecorderName\tteam\tplayerId"
// Row 1: "1\tclientId\trecorderName\tteamName\tguid"
const fields = value.split("\t");
if (fields[1]) recorderClientId = parseInt(fields[1], 10);
if (fields[2]) recorderName = stripTaggedStringMarkup(fields[2]).trim();
continue;
}
@ -101,6 +104,9 @@ function extractMissionInfo(demoValues: string[]): DemoMissionInfo {
serverDisplayName,
mod,
recorderName,
recorderClientId: Number.isFinite(recorderClientId)
? recorderClientId
: null,
recordingDate,
};
}
@ -113,8 +119,13 @@ interface ParsedDemoValues {
activeSlot: number;
} | null;
teamScores: TeamScore[];
playerRoster: Map<number, { name: string; teamId: number }>;
playerRoster: Map<
number,
{ name: string; teamId: number; score: number; ping: number; packetLoss: number }
>;
chatMessages: string[];
/** Value from clockHud.getTime() — minutes passed to setTime(). */
clockTimeMin: number | null;
gravity: number;
}
@ -133,6 +144,7 @@ function parseDemoValues(demoValues: string[]): ParsedDemoValues {
teamScores: [],
playerRoster: new Map(),
chatMessages: [],
clockTimeMin: null,
gravity: -20,
};
if (!demoValues.length) return result;
@ -152,11 +164,14 @@ function parseDemoValues(demoValues: string[]): ParsedDemoValues {
const playerCountByTeam = new Map<number, number>();
for (let i = 0; i < playerCount; i++) {
const fields = next().split("\t");
const name = fields[0] ?? "";
const name = stripTaggedStringMarkup(fields[0] ?? "").trim();
const clientId = parseInt(fields[2], 10);
const teamId = parseInt(fields[4], 10);
const score = parseInt(fields[5], 10) || 0;
const ping = parseInt(fields[6], 10) || 0;
const packetLoss = parseInt(fields[7], 10) || 0;
if (!isNaN(clientId) && !isNaN(teamId)) {
result.playerRoster.set(clientId, { name, teamId });
result.playerRoster.set(clientId, { name, teamId, score, ping, packetLoss });
}
if (!isNaN(teamId) && teamId > 0) {
playerCountByTeam.set(teamId, (playerCountByTeam.get(teamId) ?? 0) + 1);
@ -262,9 +277,15 @@ function parseDemoValues(demoValues: string[]): ParsedDemoValues {
}
}
// CLOCK: 1 value
// CLOCK: 1 value — "isVisible\tremainingMinutes"
if (idx >= demoValues.length) return result;
next();
{
const clockFields = next().split("\t");
const timeMin = parseFloat(clockFields[1] ?? "");
if (Number.isFinite(timeMin)) {
result.clockTimeMin = timeMin;
}
}
// CHAT: always 10 entries
for (let i = 0; i < 10; i++) {
@ -345,6 +366,7 @@ class StreamingPlayback extends StreamEngine {
teamScoresGen: number;
rosterGen: number;
teamScores: TeamScore[];
playerRoster: PlayerRosterEntry[];
weaponsHudGen: number;
weaponsHud: { slots: WeaponsHudSlot[]; activeIndex: number };
inventoryHudGen: number;
@ -472,7 +494,7 @@ class StreamingPlayback extends StreamEngine {
if (entry.name) {
this.targetNames.set(
entry.targetId,
stripTaggedStringMarkup(entry.name),
stripTaggedStringMarkup(entry.name).trim(),
);
}
this.targetTeams.set(entry.targetId, entry.sensorGroup);
@ -672,6 +694,11 @@ class StreamingPlayback extends StreamEngine {
}
this.teamScores = parsed.teamScores;
this.playerRoster = new Map(parsed.playerRoster);
if (parsed.clockTimeMin != null) {
// Reproduce clockHud.setTime(getTime()) at demo start (timeSec=0).
this.clockAnchorStreamSec = 0;
this.clockDurationMs = parsed.clockTimeMin * 60 * 1000;
}
// Seed chat messages from demoValues
for (const rawLine of parsed.chatMessages) {
const segments = parseColorSegments(rawLine);
@ -912,12 +939,14 @@ class StreamingPlayback extends StreamEngine {
: null;
let teamScores: TeamScore[];
let playerRoster: PlayerRosterEntry[];
if (
prev &&
prev.teamScoresGen === this._teamScoresGen &&
prev.rosterGen === this._rosterGen
) {
teamScores = prev.teamScores;
playerRoster = prev.playerRoster;
} else {
teamScores = this.teamScores.map((ts) => ({ ...ts }));
const teamCounts = new Map<number, number>();
@ -929,12 +958,17 @@ class StreamingPlayback extends StreamEngine {
for (const ts of teamScores) {
ts.playerCount = teamCounts.get(ts.teamId) ?? 0;
}
playerRoster = [];
for (const [clientId, entry] of this.playerRoster) {
playerRoster.push({ clientId, ...entry });
}
}
this._snap = {
teamScoresGen: this._teamScoresGen,
rosterGen: this._rosterGen,
teamScores,
playerRoster,
weaponsHudGen: this._weaponsHudGen,
weaponsHud,
inventoryHudGen: this._inventoryHudGen,
@ -959,6 +993,9 @@ class StreamingPlayback extends StreamEngine {
backpackHud,
inventoryHud,
teamScores,
playerRoster,
connectedClientId: this.connectedClientId,
matchClockMs: this.computeMatchClockMs(timeSec),
};
}
@ -1026,6 +1063,7 @@ export async function createDemoStreamingRecording(
playback.gameClassName = info.gameClassName;
playback.serverDisplayName = info.serverDisplayName;
playback.connectedPlayerName = info.recorderName;
playback.connectedClientId = info.recorderClientId;
return {
source: "demo",

View file

@ -320,6 +320,11 @@ export class LiveStreamAdapter extends StreamEngine {
}
}
/** Request updated scores from the server (triggers MsgPlayerScore messages). */
requestScores(): void {
this.relay.sendCommand("getScores", []);
}
/** Get the player list (for observer cycling UI). */
getPlayerList(): PlayerListEntry[] {
const entries: PlayerListEntry[] = [];
@ -608,7 +613,7 @@ export class LiveStreamAdapter extends StreamEngine {
const entities = this.buildEntityList();
const timeSec = this.currentTimeSec;
const { chatMessages, audioEvents } = this.buildTimeFilteredEvents(timeSec);
const { weaponsHud, inventoryHud, backpackHud, teamScores } =
const { weaponsHud, inventoryHud, backpackHud, teamScores, playerRoster } =
this.buildHudState();
// Default observer camera if none exists
@ -636,6 +641,9 @@ export class LiveStreamAdapter extends StreamEngine {
backpackHud,
inventoryHud,
teamScores,
playerRoster,
connectedClientId: this.connectedClientId,
matchClockMs: this.computeMatchClockMs(timeSec),
};
this._snapshot = snapshot;

View file

@ -219,6 +219,15 @@ export interface TeamScore {
playerCount: number;
}
export interface PlayerRosterEntry {
clientId: number;
name: string;
teamId: number;
score: number;
ping: number;
packetLoss: number;
}
export interface BackpackHudState {
/** Index into the $BackpackHudData table, or -1 if no pack. */
packIndex: number;
@ -269,6 +278,14 @@ export interface StreamSnapshot {
};
/** Team scores aggregated from the PLAYERLIST demoValues section. */
teamScores: TeamScore[];
/** Player roster from MsgClientJoin / MsgPlayerScore messages. */
playerRoster: PlayerRosterEntry[];
/** Client ID of the connected/recording player, for highlighting in roster. */
connectedClientId: number | null;
/** Match clock value in milliseconds, mirroring HudClockCtrl's actualTimeMS.
* Negative = counting down (remaining time), positive = counting up (elapsed).
* Null if no clock has been set. Pauses/seeks with playback. */
matchClockMs: number | null;
}
export interface StreamingPlayback {