From 55fae9d7be5114f6f628c2422661b8a2fd61cda2 Mon Sep 17 00:00:00 2001 From: mcautoma Date: Sat, 7 Mar 2026 03:27:00 +0000 Subject: [PATCH] Updating to editor version 0.1.0-beta.1.26.10-preview.27 and server version 2.7.0-beta.1.26.10-preview.27 --- README.md | 2 -- camera-grapple/en_US.lang | 14 ++++++-- dye-brush/dye-brush.ts | 46 ++++++++++++------------ dye-brush/en_US.lang | 14 ++++++-- editor-samples.mceditoraddon | Bin 86436 -> 28576 bytes empty/en_US.lang | 13 ++++++- farm-generator/en_US.lang | 15 ++++++-- farm-generator/farm-generator.ts | 5 +-- goto-mark/en_US.lang | 14 ++++++-- goto-mark/goto-mark.ts | 3 +- minimal/en_US.lang | 13 ++++++- minimal/minimal.ts | 10 ++++-- portal-generator/en_US.lang | 13 +++++-- portal-generator/portal-generator.ts | 52 +++++++++++++++------------ tree-generator/en_US.lang | 13 +++++-- tree-generator/tree-generator.ts | 7 ++-- 16 files changed, 164 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index 023c19d..ce4cacf 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,6 @@ If you don't, then the samples won't be visible to the `Minecraft Bedrock Previe | Farm Generator | Adds a dialog that allows you to place a selection of randomized farms containing different combinations of crops and animals, as well as adding irrigation to help grow plants.

This extension demonstrates the use of UI components, block placement and mouse input.

**Notes**: Activate using CTRL+SHIFT+F or from the tool rail.
**Author**: Molly | | Goto Mark | Adds a dialog that allows you to modify the players current position in the world by directly typing coordinates. In addition, you can set the players default spawn position (and jump to it at any time during editing).
The extension also allows you to set up to 9 custom world locations as named bookmarks, and jump to them at any time during editing.

This extension demonstrates dynamic UI component updates, text input, and persistent storage using entity dynamic properties.

**Notes**: No input required, activated from tool rail.
**Author**: Chloe, Eser & Dave | | Portal Generator | Adds a dialog that allows you to place either Nether or End portals (in various states of completion).

This extension demonstrates dynamic UI component updates, and block placement.

**Notes**: Activated using CTRL+SHIFT+P or from tool rail.
**Author**: Andrew. | -| Simple Empty | Adds an extension which as a very basic set of barely functional components designed to demonstrate setting up a new Editor tool using the Simple Tool wrapper. The extension demonstrates how to set up the data definitions that will ultimately direct how the tool registers itself with the Editor, and sets up the visual layouts - ready for the creator to fill in the functionality.
**Author**: Dave | -| Simple Locate Biome | Adds an extension which demonstrates the use of sub-panes to group together UI controls, and uses the visibility of those sub-panes to create different views of data. The extension also demonstrates the use of the mutually exclusive visibility properties of sub-panes, and some use of the Biome API.
**Author**: Dave & Mitch | | Tree Generator | Adds a dialog that allows you to place a selection of randomized trees of certain types wherever you click in the world.

This extension demonstrates the use of UI components, block placement and mouse input.

**Notes**: Activated using CTRL+SHIFT+T or through the tool rail.
**Author**: Jake || | | diff --git a/camera-grapple/en_US.lang b/camera-grapple/en_US.lang index beb9c28..064f2fa 100644 --- a/camera-grapple/en_US.lang +++ b/camera-grapple/en_US.lang @@ -2,6 +2,14 @@ ## ## Note, trailing spaces will NOT be trimmed. If you want room between the end of the string and the start of a ## comment on the same line, use TABs. -sample.cameragrapple.title=Camera Base Grapple -sample.cameragrapple.keyBinding.flyToCursor=Fly To Cursor -sample.cameragrapple.keyBinding.flyToSelection=Fly To Selection \ No newline at end of file +sample.gotomark.tool.title=Sample Goto Mark ### Sample Text. {MaxLength=1000} +sample.cameragrapple.title=Sample Camera Base Grapple ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToCursor=Fly To Cursor (Sample) ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToSelection=Fly To Selection (Sample) ### Sample Text. {MaxLength=1000} +sample.dyebrush.tool.title=Sample Dye Brush ### Sample Text. {MaxLength=1000} +sample.farmgenerator.tool.title=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.farmgenerator.keyBinding.toggleTool=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.title=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.keyBinding.toggleTool=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.tool.title=Sample Tree Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.keyBinding.toggleTool=Sample Tree Generator ### Sample Text. {MaxLength=1000} \ No newline at end of file diff --git a/dye-brush/dye-brush.ts b/dye-brush/dye-brush.ts index 2fb8f62..8b22adf 100644 --- a/dye-brush/dye-brush.ts +++ b/dye-brush/dye-brush.ts @@ -3,12 +3,12 @@ import { ActionTypes, ColorPickerPropertyItemVariant, - CursorProperties, CursorTargetMode, IDropdownPropertyItemEntry, IModalTool, IObservable, IPlayerUISession, + LogChannel, makeObservable, ModalToolLifecycleEventPayload, MouseActionType, @@ -36,6 +36,8 @@ import { } from '@minecraft/server'; import { Vector3Utils, VECTOR3_UP } from '@minecraft/math'; +const MODAL_TOOL_ID = 'editorSample:dyeBrushTool'; + // Color identifiers expected by EntityColorComponent enum EntityColor { White = 0, @@ -143,7 +145,6 @@ interface DyeBrushStorage { currentColor: EntityColor; brushColor: IObservable; brushSize: number; - backedUpCursorProps: CursorProperties | undefined; } type DyeBrushSession = IPlayerUISession; @@ -256,14 +257,19 @@ class PreviewVolume { } } -function onColorUpdated(newColor: RGBA, uiSession: DyeBrushSession) { +function onColorUpdated(newColor: RGBA, uiSession: DyeBrushSession, isActivation: boolean) { if (uiSession.scratchStorage) { uiSession.scratchStorage.previewSelection.hullColor = newColor; uiSession.scratchStorage.previewSelection.outlineColor = { ...newColor, alpha: 1 }; - const cursorProps = uiSession.extensionContext.cursor.getProperties(); + const cursorProps = uiSession.extensionContext.cursor.getDefaultProperties(); + cursorProps.visible = true; cursorProps.outlineColor = { ...newColor, alpha: 1 }; cursorProps.targetMode = CursorTargetMode.Face; - uiSession.extensionContext.cursor.setProperties(cursorProps); + if (isActivation) { + uiSession.extensionContext.cursor.pushPropertiesById(cursorProps, MODAL_TOOL_ID); + } else { + uiSession.extensionContext.cursor.updatePropertiesById(cursorProps, MODAL_TOOL_ID); + } } } @@ -278,6 +284,7 @@ function addDyeBrushPane(uiSession: DyeBrushSession, tool: IModalTool) { title: 'sample.dyeBrush.pane.title', infoTooltip: { description: ['sample.dyebrush.tool.tooltip'] }, }); + pane.beginConstruct(); const entityBrush = makeObservable(EntityColor.White); @@ -298,7 +305,7 @@ function addDyeBrushPane(uiSession: DyeBrushSession, tool: IModalTool) { if (foundColor) { brushColor.set({ ...foundColor, alpha: brushColor.value.alpha }); } - onColorUpdated(brushColor.value, uiSession); + onColorUpdated(brushColor.value, uiSession, false); } }, }); @@ -307,15 +314,17 @@ function addDyeBrushPane(uiSession: DyeBrushSession, tool: IModalTool) { variant: ColorPickerPropertyItemVariant.Expanded, onChange: (color: RGBA) => { entityBrush.set(findClosestColor(color, colorPalette)); - onColorUpdated(brushColor.value, uiSession); + onColorUpdated(brushColor.value, uiSession, false); }, }); + pane.endConstruct(); + tool.bindPropertyPane(pane); const onExecuteBrush = () => { if (uiSession.scratchStorage === undefined) { - uiSession.log.error('Storage was not initialized.'); + uiSession.log.error('Storage was not initialized.', { channelMask: LogChannel.All }); return; } @@ -365,7 +374,7 @@ function addDyeBrushPane(uiSession: DyeBrushSession, tool: IModalTool) { actionType: ActionTypes.MouseRayCastAction, onExecute: (_, mouseProps: MouseProps) => { if (uiSession.scratchStorage === undefined) { - uiSession.log.error('Storage was not initialized.'); + uiSession.log.error('Storage was not initialized.', { channelMask: LogChannel.All }); return; } @@ -407,7 +416,7 @@ function addDyeBrushPane(uiSession: DyeBrushSession, tool: IModalTool) { const executeBrushSizeAction = uiSession.actionManager.createAction({ actionType: ActionTypes.MouseRayCastAction, onExecute: (_, mouseProps: MouseProps) => { - if (mouseProps.mouseAction === MouseActionType.Wheel) { + if (mouseProps.mouseAction === MouseActionType.Wheel && mouseProps.modifiers.shift) { if (mouseProps.inputType === MouseInputType.WheelOut) { if (entityBrush.value > 0) { entityBrush.set(entityBrush.value - 1); @@ -417,7 +426,7 @@ function addDyeBrushPane(uiSession: DyeBrushSession, tool: IModalTool) { entityBrush.set(entityBrush.value + 1); } } - onColorUpdated(brushColor.value, uiSession); + onColorUpdated(brushColor.value, uiSession, false); } }, }); @@ -425,24 +434,16 @@ function addDyeBrushPane(uiSession: DyeBrushSession, tool: IModalTool) { tool.onModalToolActivation.subscribe((evt: ModalToolLifecycleEventPayload) => { if (evt.isActiveTool) { - if (uiSession.scratchStorage && !uiSession.scratchStorage.backedUpCursorProps) { - uiSession.scratchStorage.backedUpCursorProps = uiSession.extensionContext.cursor.getProperties(); - } - onColorUpdated(brushColor.value, uiSession); + onColorUpdated(brushColor.value, uiSession, true); } else { - if (uiSession.scratchStorage && uiSession.scratchStorage.backedUpCursorProps) { - uiSession.extensionContext.cursor.setProperties(uiSession.scratchStorage.backedUpCursorProps); - uiSession.scratchStorage.backedUpCursorProps = undefined; - } + uiSession.extensionContext.cursor.popPropertiesById(MODAL_TOOL_ID); } uiSession.scratchStorage?.previewSelection?.clearVolume(); }); - - pane.hide(); } export function addDyeBrushTool(uiSession: DyeBrushSession) { - const tool = uiSession.toolRail.addTool('editorSample:dyeBrushTool', { + const tool = uiSession.toolRail.addTool(MODAL_TOOL_ID, { title: 'sample.dyebrush.tool.title', tooltip: 'sample.dyebrush.tool.tooltip', icon: 'pack://textures/dye-brush.png', @@ -466,7 +467,6 @@ export function registerDyeBrushExtension() { currentColor: EntityColor.White, brushColor: makeObservable({ red: 1, green: 1, blue: 1, alpha: 0.5 }), brushSize: 4, - backedUpCursorProps: undefined, }; uiSession.scratchStorage = storage; diff --git a/dye-brush/en_US.lang b/dye-brush/en_US.lang index b7f94b8..c7cb7b3 100644 --- a/dye-brush/en_US.lang +++ b/dye-brush/en_US.lang @@ -2,6 +2,16 @@ ## ## Note, trailing spaces will NOT be trimmed. If you want room between the end of the string and the start of a ## comment on the same line, use TABs. -sample.dyebrush.tool.title=Dye Brush +sample.gotomark.tool.title=Sample Goto Mark ### Sample Text. {MaxLength=1000} +sample.cameragrapple.title=Sample Camera Base Grapple ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToCursor=Fly To Cursor (Sample) ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToSelection=Fly To Selection (Sample) ### Sample Text. {MaxLength=1000} +sample.dyebrush.tool.title=Sample Dye Brush ### Sample Text. {MaxLength=1000} sample.dyebrush.tool.tooltip=Change the color of entity color components. The updated color is applied when entity simulation resumes. -sample.dyebrush.pane.colordropdown.title=Color \ No newline at end of file +sample.dyebrush.pane.colordropdown.title=Color +sample.farmgenerator.tool.title=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.farmgenerator.keyBinding.toggleTool=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.title=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.keyBinding.toggleTool=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.tool.title=Sample Tree Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.keyBinding.toggleTool=Sample Tree Generator ### Sample Text. {MaxLength=1000} \ No newline at end of file diff --git a/editor-samples.mceditoraddon b/editor-samples.mceditoraddon index 33f91363c2cb08032f268d128829a137c89d3713..acca6a5db5480248410e1eef1616c3f0b169ea4b 100644 GIT binary patch delta 2392 zcmZ8i2{@E%8=lYDGfRyn3M2b64#twgLAGX$nGt0lYnCjL!a-BvL`5VfOxZ$?B~39# zr;;@ynNZm)Bo1+oZ6eN$>95oOe%E__-}^lG``q{SJ@0kDw~P4-#sDY*3+5FC39_HY z-TrPFP&C>7M3a_iyu=1fuIKn5z8vo}{=swnLwZD}o8F63Mci|XjnB;kOjud-q$-2) zkxD&vO6sbhTw^j6MBH`2`RbfFriD~Xs>75m9vEl-MeLE)gM z-RMby5)6a|TC`M_rvA>G&m)?2P2wE7`P^lsuMT-Qx(jyhzF>2D%yduUtW{`>CG5=s zR&WJHFVD#2;9U5KqV4rGVpvw&nkF4R9ud}ZU}AY?c!GMHw%>D9*?9R~&xGAkN9C9& ze?vXY=d>%Vh=@@)gQwQxLNY0ad3+wv;yU8n{1Sub*W?=DNvAr(8l%8pPz$koWh57v zC6ru1=L=Rx#HzeY+u1j;*R`0X3zU#n3`5pmEY}eWcA@)r)e^|v#WF6#akH;20!8`t z&*T=X_G(osEg_Mez2>W^%&iJzd322i5?l@K9Ca$KO`4=zx@Wj&eCTBf5U>J*tHlO# zBme|5<^_R%ZU6|B0hgh`^#R`dGk^%d%WaCneHn0o{I>;?o32)3N8I=LyJb3HbhlHK zNqIn@91=F958wO~#DW<_AJQ*C49Ygb>hdC`bNeb%Pp{ix{Zq7B5zmf@dA%Xa+H|H- z-_Z6hCA88%#zaRI%`4!Qw904}%~1P5&s5}n5p;TKi0}hJU(+Uoaz}m_$;8t;(n|dN zA_7DuPNH*$-AFj4O#xWT8vh$iiE*Q&j->!Ol_@1-a`#UoSI6udiVNXjRR2qxX3rFi zle|GPf4!+`CJcYu|CH3;UZQW>H5#gOIux!*snax$ zy0`BswI)i_Dtvt|xMIf=_*4<1%t04jBaLz8V)KP6vz`CY z3F=a2SfM=j_r?afk zy&39d3AbLrI&3aKoTFK!21XY(q^=+&=4!_v&o2#W+Rz`v)HT#mk}&Vw+WNX$vU-|t z(JHE`>#qCw2Q)(y(Y+%uLL^075jRkV)2*zZYg5eybm@aC@xd=LdT; zt|rglS=)>`d8EL1v7gkFpzhtFAYNz)BgxYcXp1@vpNU!8pqjk+J!8BLxumwmTP9bo zUiXjdze(fRHWrFlUsTES=&UPm-qRXKcF2#J8=l&kEV) zxXC9vQLj(8vKU^?doRCB3)RgKBfSUBZv@&4ZuSJsmr?V+u|O3=tY?s=^Dz{UPK zjat(ziQ#ZEEMaltdZpQHi&32f0*3XZ4)>du62Qd{Ivx$?d0z-qD&p(aTbR2WuiI*% zxs~Liwp*>nA;k~cG)e|*>UYG~GeUZw7>wqM%s~=sGlLQgxAaoVDNAqmK_7vtHQray zMz!CKl*QSGYj>l~x_r%XW`kQ9=cnzGm*$@qIwwTu-{;vt`be9d@i+0zmuAUNhcVSY zkpyF-*Y@G86gT>-ZjR^QxodXk7^x?mbSvq3*uZlC7RM#kuLT=CVLN2yF0M-ogE)g@ zc@!lSV6g3ZbT1Tu0CVjx%o;#ZYVg1=I$aCUC*>+6@hKvq_FXt z6eJPY8FYEdol;=>@4xHH`HTJ(XzZeK)Bu;;3&U7*^9AdYt3iRpZ%TACe7f5aBThi zB|w4L0_I3gNak4K#Yy&_KK9)p$9{7M5>$7-8lWs30>m?C00^9b1$a>4AD1>|(H4;6 zdCx;Z+OiQcU0{{-*=P z5pv)g6ruo#XmFMM=*xE``$PKs0uGup!{Rv%vJ?m&5aBjP8qX&F{aZK<1wg)4`yu-^ zY5Kq(J`hNpJ%9OLjU(cwJ+~UW*)rRDAIOJ!7qDS@?5Xw>RLtocF#(X|5~~r|#1Ic| z*pC1p0YO04>~nhP1c&)wR!Z6% delta 60560 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 z z?e@vdAt%0bFIKPYozfw2@>AK^$$8{tG>JD1F7bFd?6ulrph@xMp9b_u{dT6(hwmJQ zuM>OXdlY@3IC$2VCA=hq)=FH?%Ip$}2qr?p&n)Kzv7qwW*LN&v5Io`bwAO(86(rJ~ z@60!L(=M4e9)U&i|6S9{I+ACg0*(uPb#G~`oV z(A~FX0Z|kn@0Ol-TBU>Azf!<8X~Wc3Err(6?Fjm~)%~zA6P0w$4qo(GK_^HBA-sJx z;rnv(iw%u3t2Slh2RFcSeM5E+jRl~5t%CEm@GM3TSElQ3NV+yiJB<@ALp=EhoPyb+(&OL(q8`3 zUp-gKygqOc5C8&*f9NlGn(6y)!evM*&#Ph01S1Q?`Z0D63wBZWO$2QOu^!i*)sT>jt zdHVp;-%ex6sX|Rh7D1{NQUIhuUsIu_43EItPYWODOcrEn8V1-!!|VHiW}zu^AKA^o zR`iIBvBIHpewB@3Yc*t#{-vU|OjaCiR5jTQff}aSv0rdu)C;OVTrKW1>^ONgh5t?) zM0DBJNCQXzft9*Mp|mJ|{SS8lztV5L5k$hkBwHflBPak!B!e&AZDBe4QB&)Cfs*rZ zz1ipsW|crmV~FZlkY@dGT$Lc-f#eeX6e#N zXegifA?)Dpfgly$qSnbs2x;u)ZDe#SbuVW2CwS zMJ(vQVz1K1RJW)i3Hx^{L6NCWNo(-$R2`wgA9#%a9aAyI=O~hboviFW+nO<%*?o5Q zVE$}x5g4N@r3y(D{31KzjEuroj-D{$J$Y=5=r=qtYj;RAo{ipTKt7t7lZ!km8$y?2 ziROn0m#R-H(zxr&oneqA1wsH)@pUwH8rK|^2?XrrY<6w|TMv9bfw$~<=Gs31P+ z>5$r{!H6vWcCA9X;jJ*P8QOIe&r?o33f5wDn<0&i`%E6QqLoF)klOAv#z>c1tB8EtD=-Rz^yP<-n-E!$=fP7cDGGc}zOZWkeIt|m>?)q%v;Yf4L7A_F4iRioXwTMJp z{4wZyVn_6(rf1RU0^&XpEmG<2apqM%u)GQXWN_pm_*MAhUc-Ovg1>~n)0{b;2!sLl z8D&HLLW&MMm8ptuJq3-A6k*6&E1X0XyP|6oa-H@qabDuHtXYDUO*O-UV+5}!N4u?? z+&snC49XK2LFw9^+aoOnM&`$p-F%`?BHB8^fqoNJN$_vPzj8vCYrM9$&e!lC;{Vft z>W0mOU{KyNBZGD`tso&Fq~rB$L`mOrNHlYTcVB^LUvtU+YPN4bq!5jM&5-eIT7dXX zNECD>Sx6`*=>Hfz@#i)KP{&a5AR9nDg)RQy4f!q4oBA&p3R^7dzx#kU_4045uMwhu zC(t2&iy+Iqp}_l>+WDKzKRSYrlI^k1CJiv3km;D0;pe^%vN^Z2Li{&!VYO8iZW5Jd8~Yzcq}pp7K|&irML a2~d)SeI3a_Kw!Mysjts+CHpGA5dR0ZWMpjs diff --git a/empty/en_US.lang b/empty/en_US.lang index 7643074..a7cf3e0 100644 --- a/empty/en_US.lang +++ b/empty/en_US.lang @@ -2,4 +2,15 @@ ## ## Note, trailing spaces will NOT be trimmed. If you want room between the end of the string and the start of a ## comment on the same line, use TABs. -sample.empty.title=Empty Template \ No newline at end of file +sample.gotomark.tool.title=Sample Goto Mark ### Sample Text. {MaxLength=1000} +sample.cameragrapple.title=Sample Camera Base Grapple ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToCursor=Fly To Cursor (Sample) ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToSelection=Fly To Selection (Sample) ### Sample Text. {MaxLength=1000} +sample.empty.title=Empty Template +sample.dyebrush.tool.title=Sample Dye Brush ### Sample Text. {MaxLength=1000} +sample.farmgenerator.tool.title=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.farmgenerator.keyBinding.toggleTool=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.title=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.keyBinding.toggleTool=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.tool.title=Sample Tree Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.keyBinding.toggleTool=Sample Tree Generator ### Sample Text. {MaxLength=1000} \ No newline at end of file diff --git a/farm-generator/en_US.lang b/farm-generator/en_US.lang index ea3a5a8..044b4e5 100644 --- a/farm-generator/en_US.lang +++ b/farm-generator/en_US.lang @@ -2,7 +2,12 @@ ## ## Note, trailing spaces will NOT be trimmed. If you want room between the end of the string and the start of a ## comment on the same line, use TABs. -sample.farmgenerator.tool.title=Farm Generator +sample.gotomark.tool.title=Sample Goto Mark ### Sample Text. {MaxLength=1000} +sample.cameragrapple.title=Sample Camera Base Grapple ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToCursor=Fly To Cursor (Sample) ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToSelection=Fly To Selection (Sample) ### Sample Text. {MaxLength=1000} +sample.dyebrush.tool.title=Sample Dye Brush ### Sample Text. {MaxLength=1000} +sample.farmgenerator.tool.title=Sample Farm Generator ### Sample Text. {MaxLength=1000} sample.farmgenerator.tool.tooltip=Quickly create a custom farm sample.farmgenerator.pane.title=Farm Generator sample.farmgenerator.pane.length=Length @@ -20,5 +25,9 @@ sample.farmgenerator.pane.animals.title=Animals sample.farmgenerator.pane.animals.cow=Cow sample.farmgenerator.pane.animals.sheep=Sheep sample.farmgenerator.pane.animals.pig=Pig -sample.farmgenerator.keyBinding.toggleTool=Toggle Farm Generator Tool -sample.farmgenerator.keyBinding.place=Place Farm At Cursor \ No newline at end of file +sample.farmgenerator.keyBinding.toggleTool=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.farmgenerator.keyBinding.place=Place Farm At Cursor +sample.portalgenerator.title=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.keyBinding.toggleTool=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.tool.title=Sample Tree Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.keyBinding.toggleTool=Sample Tree Generator ### Sample Text. {MaxLength=1000} \ No newline at end of file diff --git a/farm-generator/farm-generator.ts b/farm-generator/farm-generator.ts index 1e35c90..1bd9d30 100644 --- a/farm-generator/farm-generator.ts +++ b/farm-generator/farm-generator.ts @@ -9,6 +9,7 @@ import { IPlayerUISession, InputModifier, KeyboardKey, + LogChannel, MouseActionType, MouseInputType, MouseProps, @@ -178,7 +179,7 @@ function addFarmGeneratorSettingsPane(uiSession: IPlayerUISession, tool: IModalT : player.getBlockFromViewDirection(); if (!raycastResult) { - uiSession.log.error('No block from view vector'); + uiSession.log.error('No block from view vector', { channelMask: LogChannel.All }); return; } const targetBlock = raycastResult.block; @@ -398,7 +399,7 @@ function addFarmGeneratorTool(uiSession: IPlayerUISession) { uiSession.inputManager.registerKeyBinding( EditorInputContext.GlobalToolMode, toolToggleAction, - { key: KeyboardKey.KEY_F, modifier: InputModifier.Control | InputModifier.Shift }, + { key: KeyboardKey.KEY_F, modifier: InputModifier.Control | InputModifier.Shift | InputModifier.Alt }, { uniqueId: 'editorSamples:farmGenerator:toggleTool', label: 'sample.farmgenerator.keyBinding.toggleTool', diff --git a/goto-mark/en_US.lang b/goto-mark/en_US.lang index 0628847..4b61ddc 100644 --- a/goto-mark/en_US.lang +++ b/goto-mark/en_US.lang @@ -2,7 +2,7 @@ ## ## Note, trailing spaces will NOT be trimmed. If you want room between the end of the string and the start of a ## comment on the same line, use TABs. -sample.gotomark.tool.title=Goto Mark +sample.gotomark.tool.title=Sample Goto Mark ### Sample Text. {MaxLength=1000} sample.gotomark.tool.tooltip=Set or Jump to a stored location sample.gotomark.pane.title=Goto Mark sample.gotomark.pane.location=Player Location @@ -14,4 +14,14 @@ sample.gotomark.pane.locationpane.button.teleport=Teleport to Stored Location %1 sample.gotomark.pane.locationpane.button.delete=Delete Stored Location sample.gotomark.pane.locationpane.input.name=New Name sample.gotomark.pane.locationpane.button.store=Store Current Location As... -sample.gotomark.pane.locationpane.dropdownLabel=Stored Location \ No newline at end of file +sample.gotomark.pane.locationpane.dropdownLabel=Stored Location +sample.cameragrapple.title=Sample Camera Base Grapple ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToCursor=Fly To Cursor (Sample) ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToSelection=Fly To Selection (Sample) ### Sample Text. {MaxLength=1000} +sample.dyebrush.tool.title=Sample Dye Brush ### Sample Text. {MaxLength=1000} +sample.farmgenerator.tool.title=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.farmgenerator.keyBinding.toggleTool=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.title=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.keyBinding.toggleTool=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.tool.title=Sample Tree Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.keyBinding.toggleTool=Sample Tree Generator ### Sample Text. {MaxLength=1000} \ No newline at end of file diff --git a/goto-mark/goto-mark.ts b/goto-mark/goto-mark.ts index 73d460f..9970b30 100644 --- a/goto-mark/goto-mark.ts +++ b/goto-mark/goto-mark.ts @@ -122,6 +122,7 @@ function addExtensionTool(uiSession: IPlayerUISession): IModal function buildParentPane(uiSession: IPlayerUISession, storage: ExtensionStorage): IRootPropertyPane { const parentPane = uiSession.createPropertyPane({ title: 'sample.gotomark.pane.title', + uniqueId: 'editorSamples:pane:goToMark', }); const playerLocation = makeObservable(vector3Truncate(uiSession.extensionContext.player.location)); @@ -420,7 +421,7 @@ export function registerGotoMarkExtension() { `Found ${storage.storedLocations.length} stored locations during initialization` ); } - } catch (e) { + } catch (_e) { uiSession.log.info('No stored locations found during initialization'); } diff --git a/minimal/en_US.lang b/minimal/en_US.lang index d5f4a97..59f0253 100644 --- a/minimal/en_US.lang +++ b/minimal/en_US.lang @@ -2,7 +2,18 @@ ## ## Note, trailing spaces will NOT be trimmed. If you want room between the end of the string and the start of a ## comment on the same line, use TABs. +sample.gotomark.tool.title=Sample Goto Mark ### Sample Text. {MaxLength=1000} +sample.cameragrapple.title=Sample Camera Base Grapple ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToCursor=Fly To Cursor (Sample) ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToSelection=Fly To Selection (Sample) ### Sample Text. {MaxLength=1000} +sample.dyebrush.tool.title=Sample Dye Brush ### Sample Text. {MaxLength=1000} +sample.farmgenerator.tool.title=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.farmgenerator.keyBinding.toggleTool=Sample Farm Generator ### Sample Text. {MaxLength=1000} sample.minimal.pane.title=Minimal Extension Pane sample.minimal.pane.button.clickme=Click Me! sample.minimal.menu.title=Minimal Extension -sample.minimal.menu.showpane=Show my property pane \ No newline at end of file +sample.minimal.menu.showpane=Show my property pane +sample.portalgenerator.title=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.keyBinding.toggleTool=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.tool.title=Sample Tree Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.keyBinding.toggleTool=Sample Tree Generator ### Sample Text. {MaxLength=1000} \ No newline at end of file diff --git a/minimal/minimal.ts b/minimal/minimal.ts index e08a24a..046560d 100644 --- a/minimal/minimal.ts +++ b/minimal/minimal.ts @@ -5,6 +5,7 @@ import { CoreMenuType, IMenu, IPlayerUISession, + LogChannel, registerEditorExtension, } from '@minecraft/server-editor'; @@ -22,7 +23,9 @@ type PerPlayerStorage = { // the button has been clicked function showPlayerMessage(uiSession: IPlayerUISession) { if (!uiSession.scratchStorage) { - uiSession.log.error("We're missing scratch storage - this shouldn't happen!"); + uiSession.log.error("We're missing scratch storage - this shouldn't happen!", { + channelMask: LogChannel.All, + }); return; } const clickCount = uiSession.scratchStorage.NUM_TIMES_PLAYER_CLICKED; @@ -66,6 +69,7 @@ export function registerMinimalExtension() { // when you adjust the slider, you can inspect the binding object property 'mySlider' for the current value. const extensionPane = uiSession.createPropertyPane({ title: 'sample.minimal.pane.title', + uniqueId: 'editorSamples:pane:minimal', }); // Creating UI elements like buttons and sliders require a couple of simple steps. @@ -116,7 +120,9 @@ export function registerMinimalExtension() { ); }) .catch((error: Error) => { - uiSession.log.error(error.message); + uiSession.log.error(error.message, { + channelMask: LogChannel.All, + }); }); // Normally we return a collection of IDisposable objects that the extension system will clean diff --git a/portal-generator/en_US.lang b/portal-generator/en_US.lang index 7d486db..c54e7a9 100644 --- a/portal-generator/en_US.lang +++ b/portal-generator/en_US.lang @@ -2,7 +2,14 @@ ## ## Note, trailing spaces will NOT be trimmed. If you want room between the end of the string and the start of a ## comment on the same line, use TABs. -sample.portalgenerator.title=Portal Generator +sample.gotomark.tool.title=Sample Goto Mark ### Sample Text. {MaxLength=1000} +sample.cameragrapple.title=Sample Camera Base Grapple ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToCursor=Fly To Cursor (Sample) ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToSelection=Fly To Selection (Sample) ### Sample Text. {MaxLength=1000} +sample.dyebrush.tool.title=Sample Dye Brush ### Sample Text. {MaxLength=1000} +sample.farmgenerator.tool.title=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.farmgenerator.keyBinding.toggleTool=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.title=Sample Portal Generator ### Sample Text. {MaxLength=1000} sample.portalgenerator.tooltip=Create Portals with a single click sample.portalgenerator.pane.title=Portal Generator sample.portalgenerator.pane.replacefloor=Replace Floor @@ -20,4 +27,6 @@ sample.portalgenerator.pane.nether.pane.corners.tooltip=Adds corner blocks to th sample.portalgenerator.pane.nether.pane.percentage=Percentage Complete sample.portalgenerator.pane.end.pane.title=End Portal sample.portalgenerator.pane.end.pane.filledcount=Filled 'Eye of Ender' count -sample.portalgenerator.keyBinding.toggleTool=Toggle Portal Generator Tool \ No newline at end of file +sample.portalgenerator.keyBinding.toggleTool=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.tool.title=Sample Tree Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.keyBinding.toggleTool=Sample Tree Generator ### Sample Text. {MaxLength=1000} \ No newline at end of file diff --git a/portal-generator/portal-generator.ts b/portal-generator/portal-generator.ts index 7470a6b..d96ebb8 100644 --- a/portal-generator/portal-generator.ts +++ b/portal-generator/portal-generator.ts @@ -7,6 +7,7 @@ import { ImageResourceType, IObservable, IRootPropertyPane, + LogChannel, makeObservable, NumberPropertyItemVariant, Ray, @@ -60,6 +61,8 @@ interface IPortalGenerator { } class PortalGenerator implements IDisposable { + static readonly MODAL_TOOL_ID = 'editorSample:portalTool'; + private _netherPortal: NetherPortal; private _endPortal: EndPortal; private _activePortal?: IPortalGenerator; @@ -77,7 +80,7 @@ class PortalGenerator implements IDisposable { public toolPane(uiSession: PortalGeneratorSession): IRootPropertyPane | undefined { if (!this._pane) { - uiSession.log.error('Tool pane not initialized'); + uiSession.log.error('Tool pane not initialized', { channelMask: LogChannel.All }); return undefined; } return this._pane; @@ -93,18 +96,26 @@ class PortalGenerator implements IDisposable { }); // Add the extension to the tool rail and give it an icon - const tool = uiSession.toolRail.addTool('editorSample:portalTool', { + const tool = uiSession.toolRail.addTool(PortalGenerator.MODAL_TOOL_ID, { title: 'sample.portalgenerator.title', icon: 'pack://textures/portal-generator.png', tooltip: 'sample.portalgenerator.tooltip', action: toolToggleAction, }); + tool.onModalToolActivation.subscribe(evt => { + if (evt.isActiveTool) { + uiSession.extensionContext.cursor.pushPropertiesById({}, PortalGenerator.MODAL_TOOL_ID); + } else { + uiSession.extensionContext.cursor.popPropertiesById(PortalGenerator.MODAL_TOOL_ID); + } + }); + // Register a global shortcut (CTRL + SHIFT + P) to select the tool uiSession.inputManager.registerKeyBinding( EditorInputContext.GlobalToolMode, toolToggleAction, - { key: KeyboardKey.KEY_P, modifier: InputModifier.Control | InputModifier.Shift }, + { key: KeyboardKey.KEY_P, modifier: InputModifier.Control | InputModifier.Shift | InputModifier.Alt }, { uniqueId: 'editorSamples:portalGenerator:toggleTool', label: 'sample.portalgenerator.keyBinding.toggleTool', @@ -148,7 +159,7 @@ class PortalGenerator implements IDisposable { title: 'sample.portalgenerator.pane.replacefloor', onChange: (current: boolean) => { const targetMode = current ? CursorTargetMode.Block : CursorTargetMode.Face; - uiSession.extensionContext.cursor.setProperties({ targetMode }); + uiSession.extensionContext.cursor.updatePropertiesById({ targetMode }, PortalGenerator.MODAL_TOOL_ID); }, variant: BoolPropertyItemVariant.ToggleSwitch, }); @@ -178,8 +189,6 @@ class PortalGenerator implements IDisposable { } activatePortalGenerator(uiSession: PortalGeneratorSession, portalType: PortalType): void { - this._pane?.hide(); - if (this._activePortal) { this._activePortal.deactivatePane(); } @@ -191,8 +200,6 @@ class PortalGenerator implements IDisposable { } this._activePortal.activatePane(uiSession); - - this._pane?.show(); } } @@ -211,7 +218,7 @@ class NetherPortal implements IPortalGenerator { public subPane(uiSession: PortalGeneratorSession): IPropertyPane | undefined { if (!this._pane) { - uiSession.log.error('Sub pane not initialized'); + uiSession.log.error('Sub pane not initialized', { channelMask: LogChannel.All }); return undefined; } return this._pane; @@ -227,22 +234,19 @@ class NetherPortal implements IPortalGenerator { } this._pane = this.buildSubPane(uiSession); - this._pane?.show(); } deactivatePane(): void { if (this._pane) { - this._pane.hide(); this._parentPane?.removeSubPane(this._pane); } - this._pane = undefined; } buildSubPane(uiSession: PortalGeneratorSession): IPropertyPane | undefined { const windowPane = this._parentPane; if (!windowPane) { - uiSession.log.error('Failed to find window binding'); + uiSession.log.error('Failed to find window binding', { channelMask: LogChannel.All }); return undefined; } @@ -250,6 +254,8 @@ class NetherPortal implements IPortalGenerator { title: 'sample.portalgenerator.pane.nether.pane.title', }); + subPane.beginConstruct(); + subPane.addDropdown(this._orientation, { title: 'sample.portalgenerator.pane.nether.pane.orientation', entries: [ @@ -290,6 +296,8 @@ class NetherPortal implements IPortalGenerator { variant: NumberPropertyItemVariant.InputFieldAndSlider, }); + subPane.endConstruct(); + return subPane; } @@ -330,7 +338,7 @@ class NetherPortal implements IPortalGenerator { z: location.z + this._sizeX.value, }; } else { - uiSession.log.error('Failed to get valid orientation'); + uiSession.log.error('Failed to get valid orientation', { channelMask: LogChannel.All }); uiSession.extensionContext.transactionManager.discardOpenTransaction(); return; } @@ -415,7 +423,7 @@ class EndPortal implements IPortalGenerator { public subPane(uiSession: PortalGeneratorSession): IPropertyPane | undefined { if (!this._pane) { - uiSession.log.error('Sub pane not initialized'); + uiSession.log.error('Sub pane not initialized', { channelMask: LogChannel.All }); return undefined; } return this._pane; @@ -429,24 +437,20 @@ class EndPortal implements IPortalGenerator { if (this._pane) { this.deactivatePane(); } - this._pane = this.buildSubPane(uiSession); - this._pane?.show(); } deactivatePane(): void { if (this._pane) { - this._pane.hide(); this._parentPane?.removeSubPane(this._pane); } - this._pane = undefined; } buildSubPane(uiSession: PortalGeneratorSession): IPropertyPane | undefined { const windowPane = this._parentPane; if (!windowPane) { - uiSession.log.error('Failed to find window pane'); + uiSession.log.error('Failed to find window pane', { channelMask: LogChannel.All }); return undefined; } @@ -454,6 +458,8 @@ class EndPortal implements IPortalGenerator { title: 'sample.portalgenerator.pane.end.pane.title', }); + subPane.beginConstruct(); + subPane.addNumber(this._filledEyeCount, { title: 'sample.portalgenerator.pane.end.pane.filledcount', min: 0, @@ -462,6 +468,8 @@ class EndPortal implements IPortalGenerator { isInteger: true, }); + subPane.endConstruct(); + return subPane; } @@ -471,7 +479,7 @@ class EndPortal implements IPortalGenerator { const targetBlock = me.dimension.getBlock(location); if (targetBlock === undefined) { - uiSession.log.error('No block selected'); + uiSession.log.error('No block selected', { channelMask: LogChannel.All }); return; } @@ -534,7 +542,7 @@ class EndPortal implements IPortalGenerator { i += 1; } } else { - uiSession.log.error('Failed to get block'); + uiSession.log.error('Failed to get block', { channelMask: LogChannel.All }); } } } diff --git a/tree-generator/en_US.lang b/tree-generator/en_US.lang index 2a14b53..6ede9a7 100644 --- a/tree-generator/en_US.lang +++ b/tree-generator/en_US.lang @@ -2,11 +2,20 @@ ## ## Note, trailing spaces will NOT be trimmed. If you want room between the end of the string and the start of a ## comment on the same line, use TABs. -sample.treegenerator.tool.title=Tree Generator +sample.gotomark.tool.title=Sample Goto Mark ### Sample Text. {MaxLength=1000} +sample.cameragrapple.title=Sample Camera Base Grapple ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToCursor=Fly To Cursor (Sample) ### Sample Text. {MaxLength=1000} +sample.cameragrapple.keyBinding.flyToSelection=Fly To Selection (Sample) ### Sample Text. {MaxLength=1000} +sample.dyebrush.tool.title=Sample Dye Brush ### Sample Text. {MaxLength=1000} +sample.farmgenerator.tool.title=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.farmgenerator.keyBinding.toggleTool=Sample Farm Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.title=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.portalgenerator.keyBinding.toggleTool=Sample Portal Generator ### Sample Text. {MaxLength=1000} +sample.treegenerator.tool.title=Sample Tree Generator ### Sample Text. {MaxLength=1000} sample.treegenerator.tool.tooltip=Single Click to place whole trees sample.treegenerator.pane.title=Tree Generator sample.treegenerator.pane.type=Tree Type sample.treegenerator.pane.height=Tree Height sample.treegenerator.pane.variance=Tree Height Random Variance sample.treegenerator.keyBinding.place=Place Tree At Cursor -sample.treegenerator.keyBinding.toggleTool=Toggle Tree Generator Tool \ No newline at end of file +sample.treegenerator.keyBinding.toggleTool=Sample Tree Generator ### Sample Text. {MaxLength=1000} \ No newline at end of file diff --git a/tree-generator/tree-generator.ts b/tree-generator/tree-generator.ts index 3b2e37a..ebb9cef 100644 --- a/tree-generator/tree-generator.ts +++ b/tree-generator/tree-generator.ts @@ -339,6 +339,8 @@ function addToolSettingsPane(uiSession: IPlayerUISession, tool: IModalTool) { uiSession.extensionContext.transactionManager.commitOpenTransaction(); }; + pane.beginConstruct(); + // Add a dropdown for available tree types pane.addDropdown(settings.treeType, { title: 'sample.treegenerator.pane.type', @@ -381,7 +383,8 @@ function addToolSettingsPane(uiSession: IPlayerUISession, tool: IModalTool) { ); tool.bindPropertyPane(pane); - pane.hide(); + pane.endConstruct(); + // Create an action that will be executed on left mouse click const executeMouseAction = uiSession.actionManager.createAction({ actionType: ActionTypes.MouseRayCastAction, @@ -423,7 +426,7 @@ function addTool(uiSession: IPlayerUISession) { uiSession.inputManager.registerKeyBinding( EditorInputContext.GlobalToolMode, toolToggleAction, - { key: KeyboardKey.KEY_T, modifier: InputModifier.Control | InputModifier.Shift }, + { key: KeyboardKey.KEY_T, modifier: InputModifier.Control | InputModifier.Shift | InputModifier.Alt }, { uniqueId: 'editorSamples:treeGenerator:toggleTool', label: 'sample.treegenerator.keyBinding.toggleTool' } );