[{"data":1,"prerenderedAt":511},["ShallowReactive",2],{"docs-navigation:de":3,"content-page:docs:_hGi9Gl_pxFwJ74gSGK-tURrn9T2n5Omq7_NteOwYZQ":197,"content-page-surround:docs:_hGi9Gl_pxFwJ74gSGK-tURrn9T2n5Omq7_NteOwYZQ":509},[4,54,74],{"title":5,"page":6,"canonicalKey":7,"locale":8,"id":9,"draft":6,"icon":10,"sidebar":11,"children":12},"Ableitungen",false,"1","de","content:de:1.dokumentation:1.anleitungen:.navigation.yml","lucide:route","section",[13,19,26,33,40,47],{"title":14,"id":15,"canonicalKey":16,"locale":8,"draft":6,"icon":17,"path":18},"Guild Wars auf dem Mac installieren","content:de:1.dokumentation:1.anleitungen:1.installation.md","1\u002F1","lucide:download","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Finstallation",{"title":20,"id":21,"canonicalKey":22,"locale":8,"draft":6,"navigation":23,"icon":24,"path":25},"Konten & Mobile-Verknüpfung","content:de:1.dokumentation:1.anleitungen:2.konten.md","1\u002F2",{"title":20},"lucide:key-round","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fkonten",{"title":27,"id":28,"canonicalKey":29,"locale":8,"draft":6,"navigation":30,"icon":31,"path":32},"Auf dem Mac spielen: Optionen","content:de:1.dokumentation:1.anleitungen:3.guild-wars-auf-dem-mac-spielen.md","1\u002F3",{"title":27},"lucide:scale","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fguild-wars-auf-dem-mac-spielen",{"title":34,"id":35,"canonicalKey":36,"locale":8,"draft":6,"navigation":37,"icon":38,"path":39},"Leistung","content:de:1.dokumentation:1.anleitungen:4.leistung.md","1\u002F4",{"title":34},"lucide:gauge","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fleistung",{"title":41,"id":42,"canonicalKey":43,"locale":8,"draft":6,"navigation":44,"icon":45,"path":46},"Templates","content:de:1.dokumentation:1.anleitungen:5.templates.md","1\u002F5",{"title":41},"lucide:bookmark","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Ftemplates",{"title":48,"id":49,"canonicalKey":50,"locale":8,"draft":6,"navigation":51,"icon":52,"path":53},"Fehlerbehebung","content:de:1.dokumentation:1.anleitungen:6.fehlerbehebung.md","1\u002F6",{"title":48},"lucide:wrench","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Ffehlerbehebung",{"title":55,"page":6,"canonicalKey":56,"locale":8,"id":57,"draft":6,"icon":58,"sidebar":59,"children":60},"Projekt","2","content:de:1.dokumentation:2.projekt:.navigation.yml","lucide:shield-check","group",[61,67],{"title":62,"id":63,"canonicalKey":64,"locale":8,"draft":6,"navigation":65,"icon":58,"path":66},"Sicherheit & Kontorisiko","content:de:1.dokumentation:2.projekt:1.sicherheit.md","2\u002F1",{"title":62},"\u002Fde\u002Fdokumentation\u002Fprojekt\u002Fsicherheit",{"title":68,"id":69,"canonicalKey":70,"locale":8,"draft":6,"navigation":71,"icon":72,"path":73},"Über & Credits","content:de:1.dokumentation:2.projekt:2.ueber.md","2\u002F2",{"title":68},"lucide:users","\u002Fde\u002Fdokumentation\u002Fprojekt\u002Fueber",{"title":75,"page":6,"canonicalKey":76,"locale":77,"id":78,"draft":6,"icon":79,"sidebar":11,"fallback":80,"children":81},"For ArenaNet","3","en","content:en:1.docs:3.upstream:.navigation.yml","lucide:send",true,[82,89,96,122,148,160,179],{"title":83,"id":84,"canonicalKey":85,"locale":77,"draft":6,"navigation":86,"icon":87,"fallback":80,"path":88},"Introduction","content:en:1.docs:3.upstream:1.introduction.md","3\u002F1",{"title":83},"lucide:book-open-check","\u002Fde\u002Fdokumentation\u002Fupstream\u002Fintroduction",{"title":90,"id":91,"canonicalKey":92,"locale":77,"draft":6,"navigation":93,"icon":94,"fallback":80,"path":95},"Request summary","content:en:1.docs:3.upstream:2.request-summary.md","3\u002F2",{"title":90},"lucide:list-checks","\u002Fde\u002Fdokumentation\u002Fupstream\u002Frequest-summary",{"title":97,"page":6,"canonicalKey":98,"locale":77,"id":99,"draft":6,"icon":100,"sidebar":59,"fallback":80,"children":101},"File system","3\u002F3","content:en:1.docs:3.upstream:3.filesystem:.navigation.yml","lucide:folder-x",[102,108,115],{"title":103,"id":104,"canonicalKey":105,"locale":77,"draft":6,"navigation":106,"icon":100,"fallback":80,"path":107},"File routines (UR-01…04)","content:en:1.docs:3.upstream:3.filesystem:1.unimplemented-routines.md","3\u002F3\u002F1",{"title":103},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Funimplemented-routines",{"title":109,"id":110,"canonicalKey":111,"locale":77,"draft":6,"navigation":112,"icon":113,"fallback":80,"path":114},"RemoveExtension (UR-05)","content:en:1.docs:3.upstream:3.filesystem:2.path-remove-extension.md","3\u002F3\u002F2",{"title":109},"lucide:scissors","\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Fpath-remove-extension",{"title":116,"id":117,"canonicalKey":118,"locale":77,"draft":6,"navigation":119,"icon":120,"fallback":80,"path":121},"File::Open mode (UR-06)","content:en:1.docs:3.upstream:3.filesystem:3.file-open-mode.md","3\u002F3\u002F3",{"title":116},"lucide:file-plus-2","\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Ffile-open-mode",{"title":123,"page":6,"canonicalKey":124,"locale":77,"id":125,"draft":6,"icon":126,"sidebar":59,"fallback":80,"children":127},"Input","3\u002F4","content:en:1.docs:3.upstream:4.input:.navigation.yml","lucide:mouse-pointer-click",[128,134,141],{"title":129,"id":130,"canonicalKey":131,"locale":77,"draft":6,"navigation":132,"icon":126,"fallback":80,"path":133},"Double-click (UR-07)","content:en:1.docs:3.upstream:4.input:1.double-click-flag.md","3\u002F4\u002F1",{"title":129},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fdouble-click-flag",{"title":135,"id":136,"canonicalKey":137,"locale":77,"draft":6,"navigation":138,"icon":139,"fallback":80,"path":140},"Key labels (UR-08)","content:en:1.docs:3.upstream:4.input:2.key-labels.md","3\u002F4\u002F2",{"title":135},"lucide:keyboard","\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fkey-labels",{"title":142,"id":143,"canonicalKey":144,"locale":77,"draft":6,"navigation":145,"icon":146,"fallback":80,"path":147},"Cursor re-test (UR-09)","content:en:1.docs:3.upstream:4.input:3.cursor-re-evaluation.md","3\u002F4\u002F3",{"title":142},"lucide:pointer","\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fcursor-re-evaluation",{"title":149,"page":6,"canonicalKey":150,"locale":77,"id":151,"draft":6,"icon":152,"sidebar":59,"fallback":80,"children":153},"Runtime","3\u002F5","content:en:1.docs:3.upstream:5.runtime:.navigation.yml","lucide:cpu",[154],{"title":155,"id":156,"canonicalKey":157,"locale":77,"draft":6,"navigation":158,"icon":152,"fallback":80,"path":159},"Heap maximum (UR-10)","content:en:1.docs:3.upstream:5.runtime:1.heap-maximum.md","3\u002F5\u002F1",{"title":155},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Fruntime\u002Fheap-maximum",{"title":161,"page":6,"canonicalKey":162,"locale":77,"id":163,"draft":6,"icon":164,"sidebar":59,"fallback":80,"children":165},"Interface proposals","3\u002F6","content:en:1.docs:3.upstream:6.proposals:.navigation.yml","lucide:plug",[166,173],{"title":167,"id":168,"canonicalKey":169,"locale":77,"draft":6,"navigation":170,"icon":171,"fallback":80,"path":172},"Build identity (UR-11)","content:en:1.docs:3.upstream:6.proposals:1.build-identification.md","3\u002F6\u002F1",{"title":167},"lucide:fingerprint","\u002Fde\u002Fdokumentation\u002Fupstream\u002Fproposals\u002Fbuild-identification",{"title":174,"id":175,"canonicalKey":176,"locale":77,"draft":6,"navigation":177,"icon":164,"fallback":80,"path":178},"Host interface (UR-12)","content:en:1.docs:3.upstream:6.proposals:2.platform-host-interface.md","3\u002F6\u002F2",{"title":174},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Fproposals\u002Fplatform-host-interface",{"title":180,"page":6,"canonicalKey":181,"locale":77,"id":182,"draft":6,"icon":183,"sidebar":59,"fallback":80,"children":184},"Reference","3\u002F7","content:en:1.docs:3.upstream:7.reference:.navigation.yml","lucide:microscope",[185,191],{"title":186,"id":187,"canonicalKey":188,"locale":77,"draft":6,"navigation":189,"icon":52,"fallback":80,"path":190},"Our workarounds","content:en:1.docs:3.upstream:7.reference:1.our-workarounds.md","3\u002F7\u002F1",{"title":186},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Freference\u002Four-workarounds",{"title":192,"id":193,"canonicalKey":194,"locale":77,"draft":6,"navigation":195,"icon":183,"fallback":80,"path":196},"Verification method","content:en:1.docs:3.upstream:7.reference:2.verification-method.md","3\u002F7\u002F2",{"title":192},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Freference\u002Fverification-method",{"title":198,"ref":199,"description":200,"icon":146,"updated":201,"navigation":202,"body":203,"type":491,"id":143,"canonicalKey":144,"draft":6,"partial":6,"locale":77,"collection":492,"navigationFile":6,"file":493,"route":499,"resolution":506},"UR-09: the cursor is not re-tested after a mode change","docs\u002Fupstream\u002Finput\u002Fcursor-re-evaluation","A salvage or identification kit hides the cursor at once, but the targeting cursor appears only on the next pointer input. Measured gaps reach 1,795 ms.","2026-08-04",{"title":142},{"type":204,"children":205,"toc":474},"root",[206,214,225,230,237,242,306,311,317,330,335,341,346,353,359,389,395,445,451,462,469],{"type":207,"tag":208,"props":209,"children":210},"element","p",{},[211],{"type":212,"value":213},"text","When the player uses an item that starts a targeting mode, the client hides\nthe cursor at once, but the targeting cursor appears only on the next pointer\ninput — or on the client's idle hover cadence. With the pointer held still,\nthe player sees no cursor at all for up to two seconds.",{"type":207,"tag":208,"props":215,"children":216},{},[217,223],{"type":207,"tag":218,"props":219,"children":220},"strong",{},[221],{"type":212,"value":222},"Fix:",{"type":212,"value":224}," low effort, small blast radius — one call at the point where the\nclient already handles the acknowledgement, and one extra hit-test per mode\nchange adds no measurable cost.",{"type":207,"tag":208,"props":226,"children":227},{},[228],{"type":212,"value":229},"Build used for the measurements below: 38797.",{"type":207,"tag":231,"props":232,"children":234},"h2",{"id":233},"what-we-measured",[235],{"type":212,"value":236},"What we measured",{"type":207,"tag":208,"props":238,"children":239},{},[240],{"type":212,"value":241},"We used a salvage kit and an identification kit, held the pointer still, and\nmeasured the gap between the cursor hide and the new cursor:",{"type":207,"tag":243,"props":244,"children":245},"table",{},[246,265],{"type":207,"tag":247,"props":248,"children":249},"thead",{},[250],{"type":207,"tag":251,"props":252,"children":253},"tr",{},[254,260],{"type":207,"tag":255,"props":256,"children":257},"th",{},[258],{"type":212,"value":259},"Run",{"type":207,"tag":255,"props":261,"children":262},{},[263],{"type":212,"value":264},"Gap",{"type":207,"tag":266,"props":267,"children":268},"tbody",{},[269,282,294],{"type":207,"tag":251,"props":270,"children":271},{},[272,277],{"type":207,"tag":273,"props":274,"children":275},"td",{},[276],{"type":212,"value":7},{"type":207,"tag":273,"props":278,"children":279},{},[280],{"type":212,"value":281},"183 ms",{"type":207,"tag":251,"props":283,"children":284},{},[285,289],{"type":207,"tag":273,"props":286,"children":287},{},[288],{"type":212,"value":56},{"type":207,"tag":273,"props":290,"children":291},{},[292],{"type":212,"value":293},"1,266 ms",{"type":207,"tag":251,"props":295,"children":296},{},[297,301],{"type":207,"tag":273,"props":298,"children":299},{},[300],{"type":212,"value":76},{"type":207,"tag":273,"props":302,"children":303},{},[304],{"type":212,"value":305},"1,795 ms",{"type":207,"tag":208,"props":307,"children":308},{},[309],{"type":212,"value":310},"The three runs used the same action on the same build. The spread is\nconsistent with this sequence: the server round-trip completes, and the cursor\ndecision then waits for the idle cycle.",{"type":207,"tag":231,"props":312,"children":314},{"id":313},"the-probe",[315],{"type":212,"value":316},"The probe",{"type":207,"tag":208,"props":318,"children":319},{},[320,322,328],{"type":212,"value":321},"We dispatched a synthetic ",{"type":207,"tag":323,"props":324,"children":325},"code",{},[326],{"type":212,"value":327},"mousemove",{"type":212,"value":329}," pair with zero distance after the gap,\nand the cursor resolved at once — this is how our host works around the\ndefect. Dispatching the same pair one frame after the click instead returned\nthe hidden cursor.",{"type":207,"tag":208,"props":331,"children":332},{},[333],{"type":212,"value":334},"So the client re-tests the pointer whenever something asks it to, but the mode\nisn't resolved until the server acknowledges the action.",{"type":207,"tag":231,"props":336,"children":338},{"id":337},"expected-behaviour",[339],{"type":212,"value":340},"Expected behaviour",{"type":207,"tag":208,"props":342,"children":343},{},[344],{"type":212,"value":345},"After the acknowledgement that completes a mode change, run the pointer\nhit-test once, without waiting for pointer input or the idle cycle.",{"type":207,"tag":347,"props":348,"children":350},"info",{"title":349},"Where we think the call belongs",[351],{"type":212,"value":352},"We didn't locate the acknowledgement handler in the module, so we won't name a\nfunction. In source, the right place is the handler that completes the mode\nchange, next to the code that already updates cursor state.",{"type":207,"tag":231,"props":354,"children":356},{"id":355},"acceptance-criteria",[357],{"type":212,"value":358},"Acceptance criteria",{"type":207,"tag":360,"props":361,"children":362},"ul",{},[363,369,374,379,384],{"type":207,"tag":364,"props":365,"children":366},"li",{},[367],{"type":212,"value":368},"The player uses a salvage kit and holds the pointer still. The targeting\ncursor appears within one frame after the server acknowledgement.",{"type":207,"tag":364,"props":370,"children":371},{},[372],{"type":212,"value":373},"The same result occurs for an identification kit.",{"type":207,"tag":364,"props":375,"children":376},{},[377],{"type":212,"value":378},"The same result occurs when the player cancels the mode.",{"type":207,"tag":364,"props":380,"children":381},{},[382],{"type":212,"value":383},"No extra hit-test runs while no mode change occurs. The idle cadence does\nnot change.",{"type":207,"tag":364,"props":385,"children":386},{},[387],{"type":212,"value":388},"The cursor does not flicker between the hide and the new cursor.",{"type":207,"tag":231,"props":390,"children":392},{"id":391},"how-to-reproduce",[393],{"type":212,"value":394},"How to reproduce",{"type":207,"tag":396,"props":397,"children":399},"steps",{"mode":398},"numbered",[400,407,412,418,423,429,434,440],{"type":207,"tag":401,"props":402,"children":404},"h3",{"id":403},"how-to-reproduce-prepare",[405],{"type":212,"value":406},"Prepare",{"type":207,"tag":208,"props":408,"children":409},{},[410],{"type":212,"value":411},"Log in. Put a salvage kit in the inventory. Put a salvageable item next to it.",{"type":207,"tag":401,"props":413,"children":415},{"id":414},"how-to-reproduce-start-the-mode",[416],{"type":212,"value":417},"Start the mode",{"type":207,"tag":208,"props":419,"children":420},{},[421],{"type":212,"value":422},"Click the salvage kit. Do not move the mouse.",{"type":207,"tag":401,"props":424,"children":426},{"id":425},"how-to-reproduce-observe",[427],{"type":212,"value":428},"Observe",{"type":207,"tag":208,"props":430,"children":431},{},[432],{"type":212,"value":433},"The cursor disappears. Wait. The targeting cursor appears after a delay of up\nto about two seconds.",{"type":207,"tag":401,"props":435,"children":437},{"id":436},"how-to-reproduce-compare",[438],{"type":212,"value":439},"Compare",{"type":207,"tag":208,"props":441,"children":442},{},[443],{"type":212,"value":444},"Repeat the test, and move the mouse one pixel after the click. The targeting\ncursor appears at once.",{"type":207,"tag":231,"props":446,"children":448},{"id":447},"our-workaround-today",[449],{"type":212,"value":450},"Our workaround today",{"type":207,"tag":208,"props":452,"children":453},{},[454,456,460],{"type":212,"value":455},"The host watches for two conditions: a click that produced no cursor event,\nand a hidden cursor state right after a click. In both cases it dispatches one\nsynthetic out-and-back ",{"type":207,"tag":323,"props":457,"children":458},{},[459],{"type":212,"value":327},{"type":212,"value":461}," pair at the last click position — the\nphysical pointer doesn't move — retrying every 150 ms for up to 2,500 ms.\nDuring that window the host holds the last visible cursor image instead of an\nempty cursor.",{"type":207,"tag":463,"props":464,"children":466},"warning",{"title":465},"This workaround needs our native-cursor feature",[467],{"type":212,"value":468},"The replay only works when the host can read the client's cursor state, which\nneeds a certified client build. On a build we haven't certified, the player\ngets the raw defect.",{"type":207,"tag":208,"props":470,"children":471},{},[472],{"type":212,"value":473},"A client-side hit-test after the acknowledgement retires the whole replay.",{"title":475,"searchDepth":476,"depth":476,"links":477},"",4,[478,480,481,482,483,490],{"id":233,"depth":479,"text":236},2,{"id":313,"depth":479,"text":316},{"id":337,"depth":479,"text":340},{"id":355,"depth":479,"text":358},{"id":391,"depth":479,"text":394,"children":484},[485,487,488,489],{"id":403,"depth":486,"text":406},3,{"id":414,"depth":486,"text":417},{"id":425,"depth":486,"text":428},{"id":436,"depth":486,"text":439},{"id":447,"depth":479,"text":450},"markdown","docs",{"source":494,"path":495,"stem":496,"dir":497,"extension":498},"content","en\u002F1.docs\u002F3.upstream\u002F4.input\u002F3.cursor-re-evaluation.md","en\u002F1.docs\u002F3.upstream\u002F4.input\u002F3.cursor-re-evaluation","input","md",{"requestedPath":147,"resolvedPath":500,"alternates":501},"\u002Fdocs\u002Fupstream\u002Finput\u002Fcursor-re-evaluation",[502,504],{"locale":77,"path":500,"source":503},"variant",{"locale":8,"path":147,"source":505,"resolvedLocale":77},"fallback",{"requested":507,"resolved":508,"usedFallback":80},{"locale":8},{"locale":77},{"previous":510,"next":510},null,1786362945249]