diff --git a/src/main/java/carpet/script/command/CommandArgument.java b/src/main/java/carpet/script/command/CommandArgument.java index 1ddede7f..d2ea2f7d 100644 --- a/src/main/java/carpet/script/command/CommandArgument.java +++ b/src/main/java/carpet/script/command/CommandArgument.java @@ -63,6 +63,7 @@ import net.minecraft.command.argument.RotationArgumentType; import net.minecraft.command.argument.ScoreHolderArgumentType; import net.minecraft.command.argument.ScoreboardSlotArgumentType; import net.minecraft.command.argument.SwizzleArgumentType; +import net.minecraft.command.argument.TeamArgumentType; import net.minecraft.command.argument.TimeArgumentType; import net.minecraft.command.argument.UuidArgumentType; import net.minecraft.command.argument.Vec2ArgumentType; @@ -130,7 +131,6 @@ public abstract class CommandArgument new VanillaUnconfigurableArgument( "blockpredicate", BlockPredicateArgumentType::blockPredicate, (c, p) -> ValueConversions.ofBlockPredicate(c.getSource().getMinecraftServer().getTagManager(), BlockPredicateArgumentType.getBlockPredicate(c, p)), false ), - // block_predicate todo - not sure about the returned format. Needs to match block tags used in the API (future) new VanillaUnconfigurableArgument("teamcolor", ColorArgumentType::color, (c, p) -> { Formatting format = ColorArgumentType.getColor(c, p); @@ -165,7 +165,6 @@ public abstract class CommandArgument (c, p) -> ValueConversions.of(Registry.ENCHANTMENT.getId(ItemEnchantmentArgumentType.getEnchantment(c, p))), false ), // item_predicate ?? //same as item but accepts tags, not sure right now - // slot // item_slot new SlotArgument(), new VanillaUnconfigurableArgument("item", ItemStackArgumentType::itemStack, (c, p) -> ValueConversions.of(ItemStackArgumentType.getItemStackArgument(c, p).createStack(1, false)), false @@ -241,7 +240,9 @@ public abstract class CommandArgument new VanillaUnconfigurableArgument("swizzle", SwizzleArgumentType::swizzle, (c, p) -> StringValue.of(SwizzleArgumentType.getSwizzle(c, p).stream().map(Direction.Axis::asString).collect(Collectors.joining())), true ), - // team + new VanillaUnconfigurableArgument("team", TeamArgumentType::team, + (c, p) -> StringValue.of(TeamArgumentType.getTeam(c, p).getName()), false + ), new VanillaUnconfigurableArgument("time", TimeArgumentType::time, (c, p) -> new NumericValue(IntegerArgumentType.getInteger(c, p)), false ), @@ -437,7 +438,7 @@ public abstract class CommandArgument if (config.containsKey("options")) { Value optionsValue = config.get("options"); - if (!(optionsValue instanceof ListValue)) throw new InternalExpressionException("Custom sting type requires options passed as a list"); + if (!(optionsValue instanceof ListValue)) throw new InternalExpressionException("Custom string type requires options passed as a list"); validOptions = ((ListValue) optionsValue).getItems().stream() .map(v -> caseSensitive?v.getString():(v.getString().toLowerCase(Locale.ROOT))) .collect(Collectors.toSet()); diff --git a/src/main/resources/assets/carpet/scripts/distance_beta.sc b/src/main/resources/assets/carpet/scripts/distance_beta.sc index b1b3bc6d..f1c8409a 100644 --- a/src/main/resources/assets/carpet/scripts/distance_beta.sc +++ b/src/main/resources/assets/carpet/scripts/distance_beta.sc @@ -1,91 +1,136 @@ import('math','_euclidean','_manhattan','_round'); +global_display_modes = ['none', 'line', 'centered_sphere', 'box']; + __config()->{ 'commands'->{ 'from '->'set_start', - 'from to '->'_calculate', - 'to '->_(end_pos)->(_calculate(null,end_pos)), - 'toggle_line'->'_toggle_line' + 'from to '-> _(start, end) -> (global_current_start = start; calculate(end)), + 'to '-> 'calculate', + 'clear' -> _() -> global_display_shapes = [], + 'clear last' -> _() -> if(global_display_shapes, delete(global_display_shapes, -1)), + 'display ' -> 'set_mode' }, 'arguments' -> { 'start' -> {'type' -> 'location'}, - 'end' -> {'type' -> 'location'} + 'end' -> {'type' -> 'location'}, + 'mode' -> {'type' -> 'term', 'options' -> global_display_modes } } }; -global_start=null; -global_end=null; +global_current_start = null; +global_display_shapes = []; +global_renderer_running = false; -global_show_line=false; + +global_current_mode = 'none'; +global_generators = { + 'line' -> _(from, to) -> [ + ['line',20,'from',from,'to',to], + ['label',20,'pos',to+[0,0.2,0],'text',_round(_euclidean(from,to),0.001)] + ], + 'centered_sphere' -> _(from, to) -> [ + ['line',20,'from',from,'to',to, 'line', 5, 'color', 0x88888888], + ['sphere',20,'center',from,'radius',_euclidean(from,to)], + ['label',20,'pos',to+[0,0.2,0],'text',_round(_euclidean(from,to),0.001)] + ], + 'box' -> _(from, to) -> [ + ['line',20,'from',from,'to',to, 'line', 5, 'color', 0x88888888], + ['box',20,'from',from,'to',to], + ['label',20,'pos',to+[0,0.2,0],'text',_round(_euclidean(from,to),0.001)] + ], +}; __mktp(pos) -> str('!/tp %.6f %.6f %.6f', pos); set_start(pos)->( - global_start = pos; - global_end = null; + global_current_start = pos; print(player(),format('gi Initial point set to: ', 'g '+pos, __mktp(pos))) ); -_toggle_line()->( - global_show_line= !global_show_line; - if(global_show_line, - print('Toggled lines on'); - _draw_line() - , // else - print('Toggled lines off') - ); -); - -_calculate(start_pos, end_pos)->( - if(start_pos!=null, - set_start(start_pos); - calculate(end_pos) - , // else - if(global_start, - calculate(end_pos), - print(player(),format('r There was no initial point for '+player())); - set_start(end_pos) - ) +set_mode(mode)->( + if (global_display_modes ~ mode, + global_current_mode = mode ) ); -__on_player_places_block(player, item_tuple, hand, block) ->( - if(block=='brown_carpet' && system_info('world_carpet_rules'):'carpets'=='true', +calculate(end)->( + if(global_current_start != null, + measure(end) + , // else + print(player(),format('r No initial point selected')); + ) +); + +_carpets() -> system_info('world_carpet_rules'):'carpets'=='true'; + + +__on_player_places_block(player, item_tuple, hand, block) -> +( + if(block=='brown_carpet' && _carpets(), effective_pos = pos(block)+[0.5, 0, 0.5]; - if(global_start==null||player~'sneaking',//wont complain for first carpet - set_start(effective_pos), - _calculate(null, effective_pos) + if(global_current_start==null||player~'sneaking',//wont complain for first carpet + set_start(effective_pos) + , // else + calculate(effective_pos) ) ) ); -calculate(end_pos)->( - global_end = end_pos; - manhattan = _round(_manhattan(global_start, global_end),0.001);//rounding to nearest 0.01 for precision, but not ridiculous decimal places - spherical = _round(_euclidean(global_start, global_end), 0.001); +__on_player_uses_item(player, item_tuple, hand) -> +( + if (item_tuple:0 == 'brown_carpet' && hand == 'mainhand' && _carpets(), + if (player ~'sneaking', + global_current_mode = global_display_modes:(global_display_modes ~ global_current_mode + 1); + display_title(player, 'actionbar', format('w Distance mode: ','e '+global_current_mode)); + , + if(global_display_shapes, delete(global_display_shapes, -1)) + ) + ) +); + +measure(end)-> +( + if (global_current_start == null, return()); + start = global_current_start; + manhattan = _round(_manhattan(start, end),0.001);//rounding to nearest 0.01 for precision, but not ridiculous decimal places + spherical = _round(_euclidean(start, end), 0.001); //useful for chunk distances etc. - cylindrical = _round(_euclidean(global_start, [global_end:0, global_start:1, global_end:2]), 0.001); - + cylindrical = _round(_euclidean(start, [end:0, start:1, end:2]), 0.001); print(player(),format( 'w Distance between ', - 'c '+str('[%.1f, %.1f, %.1f]', global_start), __mktp(global_start), + 'c '+str('[%.1f, %.1f, %.1f]', start), __mktp(start), 'w and ', - 'c '+str('[%.1f, %.1f, %.1f]', global_end), __mktp(global_end), 'w :\n', + 'c '+str('[%.1f, %.1f, %.1f]', end), __mktp(end), 'w :\n', 'w - Spherical: ', 'wb '+spherical+'\n', 'w - Cylindrical: ', 'wb '+cylindrical+'\n', 'w - Manhattan: ', 'wb '+manhattan )); - - schedule(0,'_draw_line'); -); - -_draw_line()->( - if(global_show_line,//It will always draw from the global positions, so it will turn on if there is a line - if ( global_start && global_end, - draw_shape('line',20,'from',global_start,'to',global_end, 'player',player()); - draw_shape('label',20,'pos',global_end,'text',_round(_euclidean(global_start,global_end),0.001)); - ); - schedule(20,'_draw_line') + if (global_current_mode != 'none', + global_display_shapes += _create_shapes(global_current_mode, start, end); + for (global_display_shapes, draw_shape(_) ); + if (!global_renderer_running, + global_renderer_running = true; + render() + ) ) ); + +_create_shapes(mode, from, to) -> +( + + shapes = call(global_generators:mode, from+[0, 0.07, 0], to+[0, 0.07, 0]); + map(shapes, put(_, null, ['player', player()], 'extend'); _); +); + +render()->( + if (!global_display_shapes, + global_renderer_running = false; + return(); + ); + for (global_display_shapes, + draw_shape(_); + ); + schedule(20,'render') +);