1- import { world , system , Player , Vector3 } from "@minecraft/server" ;
1+ import { system , Player , Vector3 } from "@minecraft/server" ;
22import { ModalFormData } from "@minecraft/server-ui" ;
3- import { MinecraftDimensionTypes } from "@minecraft/vanilla-data" ;
43import {
54 spawnTerminator ,
65 TerminatorInputParam ,
76 TerminatorSkinModel ,
87} from "./summon.js" ;
8+ import { debugEnabled } from "../config.js" ;
99
1010function generateModalForm ( settings : TerminatorInputParam ) {
11- let dimensionIndex = 0 ;
1211 let skinModelIndex = 0 ;
13- switch ( settings . dimension . id ) {
14- case MinecraftDimensionTypes . Overworld :
15- dimensionIndex = 0 ;
16- break ;
17- case MinecraftDimensionTypes . Nether :
18- dimensionIndex = 1 ;
19- break ;
20- case MinecraftDimensionTypes . TheEnd :
21- dimensionIndex = 2 ;
22- break ;
23- }
2412 switch ( settings . skinmodel ) {
2513 case TerminatorSkinModel . Steve :
2614 skinModelIndex = 0 ;
2715 break ;
2816 case TerminatorSkinModel . Alex :
2917 skinModelIndex = 1 ;
3018 break ;
19+ case TerminatorSkinModel . Custom :
20+ skinModelIndex = 2 ;
21+ break ;
22+ case TerminatorSkinModel . CustomSlim :
23+ skinModelIndex = 3 ;
24+ break ;
3125 }
3226
3327 return new ModalFormData ( )
3428 . title ( "Spawn Terminator" )
35- . textField ( "Name Tag" , "Terminator" , "Terminator" )
29+ . textField ( "Name Tag" , settings . nametag , settings . nametag )
3630 . textField ( "Spawn Coordinates" , "x y z" , "~ ~ ~" )
37- . dropdown ( "Dimension" , [ "Overworld" , "Nether" , "The End" ] , dimensionIndex )
38- . dropdown ( "Skin Model" , [ "Steve" , "Alex" ] , skinModelIndex )
31+ . dropdown (
32+ "Skin Model" ,
33+ [ "Steve" , "Alex" , "Custom (Steve Model)" , "Custom (Alex Model)" ] ,
34+ skinModelIndex
35+ )
3936 . toggle ( "Enable Custom Skin" , settings . customskin )
4037 . toggle ( "Enable Bossbar" , settings . bossbar )
4138 . toggle ( "Enable Immunity" , settings . invulnerable )
@@ -75,18 +72,17 @@ function parseCoordinates(paramString: string, playerLocation: Vector3) {
7572}
7673
7774type TerminatorSpawnFormValues = [
78- string ,
79- string ,
80- number ,
81- number ,
82- boolean ,
83- boolean ,
84- boolean ,
85- boolean ,
86- boolean ,
87- boolean ,
88- boolean ,
89- boolean
75+ string , // nameTag
76+ string , // locationString
77+ number , // skinModelIndex
78+ boolean , // customSkin
79+ boolean , // bossbar
80+ boolean , // invulnerable
81+ boolean , // deathEvent
82+ boolean , // physics
83+ boolean , // regeneration
84+ boolean , // respawn
85+ boolean // breedable
9086] ;
9187
9288const getDefaultSpawnOptions = ( player : Player ) : TerminatorInputParam => ( {
@@ -100,12 +96,24 @@ const getDefaultSpawnOptions = (player: Player): TerminatorInputParam => ({
10096 respawn : true ,
10197 breedable : false ,
10298 coords : player . location ,
103- dimension : player . dimension ,
10499 skinmodel : TerminatorSkinModel . Steve ,
105100} ) ;
106101
102+ function getPlayerSpawnOptions ( player : Player ) : TerminatorInputParam {
103+ const playerOptionString = player . getDynamicProperty (
104+ "terminator:spawn_options"
105+ ) as string | undefined ;
106+ if ( ! playerOptionString ) return getDefaultSpawnOptions ( player ) ;
107+ try {
108+ return JSON . parse ( playerOptionString ) ;
109+ } catch ( error ) {
110+ if ( debugEnabled ) console . error ( error ) ;
111+ return getDefaultSpawnOptions ( player ) ;
112+ }
113+ }
114+
107115export function showSpawnTerminatorForm ( player : Player ) {
108- const spawnOptions : TerminatorInputParam = getDefaultSpawnOptions ( player ) ;
116+ const spawnOptions = getPlayerSpawnOptions ( player ) ;
109117 const form = generateModalForm ( spawnOptions ) ;
110118 form
111119 . show ( player )
@@ -114,7 +122,6 @@ export function showSpawnTerminatorForm(player: Player) {
114122 const [
115123 nameTag ,
116124 locationString ,
117- dimensionIndex ,
118125 skinModelIndex ,
119126 customSkin ,
120127 bossbar ,
@@ -125,26 +132,20 @@ export function showSpawnTerminatorForm(player: Player) {
125132 respawn ,
126133 breedable ,
127134 ] = result . formValues as TerminatorSpawnFormValues ;
128- let dimension = world . getDimension ( "overworld" ) ;
129135 let skinmodel : TerminatorSkinModel = TerminatorSkinModel . Steve ;
130- switch ( dimensionIndex ) {
131- case 0 :
132- dimension = world . getDimension ( "overworld" ) ;
133- break ;
134- case 1 :
135- dimension = world . getDimension ( "nether" ) ;
136- break ;
137- case 2 :
138- dimension = world . getDimension ( "the_end" ) ;
139- break ;
140- }
141136 switch ( skinModelIndex ) {
142137 case 0 :
143138 skinmodel = TerminatorSkinModel . Steve ;
144139 break ;
145140 case 1 :
146141 skinmodel = TerminatorSkinModel . Alex ;
147142 break ;
143+ case 2 :
144+ skinmodel = TerminatorSkinModel . Custom ;
145+ break ;
146+ case 3 :
147+ skinmodel = TerminatorSkinModel . CustomSlim ;
148+ break ;
148149 }
149150
150151 const jsonInput : TerminatorInputParam = {
@@ -158,10 +159,9 @@ export function showSpawnTerminatorForm(player: Player) {
158159 respawn : respawn ,
159160 breedable : breedable ,
160161 coords : parseCoordinates ( locationString , player . location ) ,
161- dimension,
162162 skinmodel,
163163 } ;
164- spawnTerminator ( jsonInput ) ;
164+ spawnTerminator ( jsonInput , player ) ;
165165 } )
166166 . catch ( ( error ) => console . error ( error + "\n" + error . stack ) ) ;
167167}
0 commit comments