Compare commits

..

24 Commits

Author SHA1 Message Date
ed27d2c62d Merge branch 'main' into lib-cutscene 2026-01-25 12:07:33 +01:00
Rares Bozga
dcc7f81705 Various bugfixes 2026-01-25 13:06:21 +02:00
Rares Bozga
7771b9041b Fix oversight in storyboard 2026-01-16 23:27:37 +02:00
dd126636c6 Merge pull request 'Completed cutscene library' (#5) from lib-cutscene into main
Reviewed-on: #5
2026-01-11 14:02:46 +01:00
Rares Bozga
06445b71fb Completed cutscene library 2026-01-11 15:02:17 +02:00
44ffc2b8d0 Merge pull request 'Added atomic handling for storyboard operations and fixed various bugs' (#4) from feature-storyboard-atomic into main
Reviewed-on: #4
2026-01-09 12:25:07 +01:00
Rares Bozga
01a4e7414c Various bugfixes 2026-01-09 13:24:07 +02:00
Rares Bozga
37268060a2 Initial variant of atomicity 2026-01-09 12:00:54 +02:00
4dd0e0aa09 Merge pull request 'Various bugfixes in ball.dsc lib and in storyboard_npc_tasks.dsc' (#3) from bugfix-27-12-2025 into main
Reviewed-on: #3
2025-12-27 12:54:06 +01:00
Rares Bozga
eef232d8c7 Various bugfixes in ball.dsc lib and in storyboard_npc_tasks.dsc 2025-12-27 13:51:48 +02:00
a026802854 Merge pull request 'Integrate new settings into existing codebase' (#2) from feature-settings-integration into main
Reviewed-on: #2
2025-12-25 01:04:46 +01:00
Rares Bozga
cc904c7137 Integrate new settings into existing codebase 2025-12-25 02:04:19 +02:00
Rares Bozga
537b5c0d9b Add various_placeholders miscellaneous module 2025-12-24 22:28:47 +02:00
Rares Bozga
8292fdb229 Fix NPC reallocation bug, update settings_config.dsc 2025-12-24 01:42:24 +02:00
c8d959506f Merge pull request 'refs #13 completed settings feature' (#1) from ticket-13 into main
Reviewed-on: #1
2025-12-18 23:39:30 +01:00
Sirger Tünde-Maria
cc1a6076f4 Merge branch 'main' into ticket-13 2025-12-19 00:34:47 +02:00
Rares Bozga
aedcb79e6d Update timebar_data file 2025-12-16 22:04:00 +02:00
Rares Bozga
03137e13c1 Prettify README.md 2025-12-16 21:59:40 +02:00
Rares Bozga
7669a93bad Prettify README.md 2025-12-16 21:51:38 +02:00
Rares Bozga
cf7265c3ce Prettify README.md 2025-12-16 21:48:27 +02:00
Rares Bozga
0f37c492ae Update README.md to check new Dedi 2025-12-16 00:13:29 +02:00
Rares Bozga
3adcd1d14f refs #16 Update README.md to test Gitea-Kanboard integration 2025-12-13 22:30:12 +02:00
Rares Bozga
9cd58c5041 Fix syntax errors and bugs on 1.21.10 2025-12-11 22:40:02 +02:00
Rares Bozga
a77544467d Removed problems from old Denizen code 2025-12-10 22:36:00 +02:00
44 changed files with 888 additions and 232 deletions

View File

@@ -1,6 +1,42 @@
# denizen-scripts
DenizenScript scripts (and data) folders of SakuraFalls.
<img src="https://sakurafalls.net/data/assets/logo/logo-bg-new-rsc2.png" width="300">
<img src="https://forum.denizenscript.com/data/assets/logo/logo.png" width="160">
# How to use
You should just be able to drag & drop this into your
DenizenScript folder on your server. Enjoy!
# About
This repository contains the *Denizen* `scripts` and `data` folders of SakuraFalls.
It contains the actual code used on the server at this time. You are free to explore and to
use the scripts that our server uses! We believe that gatekeeping roleplaying servers furhter
only leads to less variety and creativity. We hope that the code here, although just given as
is without further instructions, will lead to a new generation of awesome roleplaying servers.
## License
All files are licensed under **GNU GPL 3.0**.
You may use them on your server, but only under the license presented above.
A summary can be found here: https://www.tldrlegal.com/license/gnu-general-public-license-v3-gpl-3
## How to use
You should just be able to drag & drop this into your `plugins/Denizen` folder on your server.
Server software: **PaperMC 1.21.10-117**
*Denizen* version: **1.3.1-SNAPSHOT (build 7235-DEV)**.
Enjoy!
## Extra dependencies
The scripts here may depend on the following plugins, some of which may need to be purchased:
1. **Depenizen** (build 882)
https://ci.citizensnpcs.co/job/Depenizen/
2. **LiteBans** (latest)
https://www.spigotmc.org/resources/litebans.3715/
3. **LiteProfiles** (latest)
https://github.com/fishydarwin/LiteProfiles
4. **PlaceholderAPI** (latest)
https://www.spigotmc.org/resources/placeholderapi.6245/
5. **AreaShop** (2.9.1) *(md5sha256 variant)*
https://www.github.com/md5sha256/AreaShop
6. **ProtocolLib** (5.4.0)
https://www.spigotmc.org/resources/protocollib.1997/

View File

@@ -82,8 +82,7 @@ apartments_command_apartmentremoveaccess:
- aptrm
permission: apartments.command.apartmentremoveaccess
tab completions:
# TODO: use the procedural tab-complete to handle this correctly!
1: <server.online_players.parse[name]>
1: <proc[apartments_all_with_access].context[<player>].parse[name]>
script:
- if <context.source_type> != player:
- narrate "<&c>Please run this command as a player."

View File

@@ -109,3 +109,17 @@ apartments_end_edit:
- inventory set origin:<[item]> slot:<[slot]> player:<[player]>
- adjust <[player]> gamemode:survival
- flag <[player]> apartments_edit:!
apartments_all_with_access:
debug: false
type: procedure
definitions: player
script:
- define location <player.location>
- define apartment <proc[apartments_at].context[<[location]>]>
- if <[apartment]> == null:
- determine <list[]>
- define owner <proc[apartments_owner].context[<[apartment]>]>
- if <[owner]> != <[player]>:
- determine <list[]>
- determine <[owner].flag[apartments_access].get[<[apartment]>].if_null[<list[]>].keys>

View File

@@ -9,4 +9,5 @@ automoney_world:
- if <[time_passed].is_more_than[<duration[30m]>]>:
- flag <[player]> automoney_last:<util.time_now>
- money give players:<[player]> quantity:500
- if <proc[settings_get].context[<[player]>|game_see_auto_money_announcements]>:
- narrate format:formats_prefix targets:<[player]> "Thanks for being online! You have received ¥500."

View File

@@ -45,7 +45,7 @@ carry_command_carry:
- narrate format:formats_prefix "Sent a carry request to <&e><proc[character_get_name].context[<[target]>]>"
#
- narrate format:formats_prefix targets:<[target]> "<&e><proc[character_get_name].context[<player>]> <&7> would like to carry you."
- narrate targets:<[target]> "<element[<&a><&l>[ACCEPT]].on_click[<entry[carry].command>]>"
- narrate targets:<[target]> <element[<&a><&l>[ACCEPT]].on_click[<entry[carry].command>]>
carry_command_uncarry:
debug: false

View File

@@ -378,14 +378,14 @@ chat_command_channelswitch:
- define channel <context.args.get[1].to_lowercase>
- choose <[channel]>:
- case ic:
- flag <player> chat_channel:ic
- run settings_set def.player:<player> def.key:text_rp_chat_channel def.value:ic
- narrate format:formats_prefix "Changed channel to IC."
- stop
- case ooc:
- if <player.has_flag[chat_disableooc]>:
- narrate "<&c>You currently have OOC disabled. Use /ooc first to enable it."
- stop
- flag <player> chat_channel:ooc
- run settings_set def.player:<player> def.key:text_rp_chat_channel def.value:oocz
- narrate format:formats_prefix "Changed channel to OOC."
- stop
- narrate "<&c>Unknown channel <[channel]>. Please try: ic, ooc."
@@ -414,5 +414,5 @@ chat_command_chatcolor:
- if !<proc[chat_allowed_colors].contains[<[color]>]>:
- narrate "<&c>You must choose a color from this list: <proc[chat_allowed_colors].comma_separated>"
- stop
- flag <player> chat_color:<element[&<color[<[color]>].hex>].parse_color>
- run settings_set def.player:<player> def.key:text_rp_chat_color def.value:<[color]>
- narrate format:formats_prefix "Changed chat color to <element[&<color[<[color]>].hex>].parse_color><[color]>."

View File

@@ -29,7 +29,8 @@ chat_channel_ooc:
script:
- define message <[message].strip_color.replace[&\].with[&].unescaped>
- define final "<&8>[<&7><&l>OOC<&8>] <proc[chat_special_group].context[<[player]>]><proc[chat_name_ooc].context[<[player]>]><&7>: <&l><[message]>"
- narrate targets:<server.online_players.filter_tag[<[filter_value].has_flag[chat_disableooc].not>]> <[final]>
- define targets <server.online_players.filter_tag[<[filter_value].has_flag[chat_disableooc].not>]>
- narrate targets:<[targets]> <[final]>
- announce to_console <[final]>
chat_channel_looc:
@@ -39,7 +40,8 @@ chat_channel_looc:
script:
- define message <[message].strip_color.replace[&\].with[&].unescaped>
- define final "<&8>[<&7>LOOC<&8>] <proc[chat_special_group].context[<[player]>]><&7><proc[character_get_name].context[<[player]>]> <proc[chat_name_ooc].context[<[player]>]><&7>: <[message]>"
- narrate targets:<[player].location.find_players_within[10]> <[final]>
- define targets <[player].location.find_players_within[10]>
- narrate targets:<[targets]> <[final]>
- announce to_console <[final]>
chat_allowed_colors:
@@ -71,6 +73,40 @@ chat_tokenize_actions:
- define index <[index].add[1]>
- determine <[result].trim>
chat_channel_check_targets:
debug: false
type: task
script:
- if <[targets].size> <= 1:
- if <proc[settings_get].context[<[player]>|text_rp_chat_distance_warning]>:
- narrate "<&6>* <&7><&o>It seemed like nobody could hear you." targets:<[player]>
chat_channel_check_targets_language:
debug: false
type: task
script:
- if <[all].size> <= 1:
- if <proc[settings_get].context[<[player]>|text_rp_chat_distance_warning]>:
- narrate "<&6>* <&7><&o>It seemed like nobody could hear you." targets:<[player]>
chat_accessibility_space_message_inject_define:
debug: false
type: task
script:
- define space_targets <[targets].filter_tag[<proc[settings_get].context[<[filter_value]>|accessibility_rp_chat_space_messages]>]>
chat_accessibility_space_message_inject_define_language:
debug: false
type: task
script:
- define space_targets <[all].filter_tag[<proc[settings_get].context[<[filter_value]>|accessibility_rp_chat_space_messages]>]>
chat_accessibility_space_message_inject_apply:
debug: false
type: task
script:
- narrate targets:<[space_targets]> <&f>
chat_channel_ic:
debug: false
type: task
@@ -84,9 +120,14 @@ chat_channel_ic:
- stop
- if !<[player].has_permission[chat.colors]>:
- define message <[message].strip_color>
- define tokenized <proc[chat_tokenize_actions].context[<[message]>|<player.flag[chat_color].if_null[<&e>]>says<&7>:|<player.flag[chat_color].if_null[<&e>]>|<&f>|<&f><&dq><&f>|false].replace[&\].with[&].unescaped>
- define tokenized <proc[chat_tokenize_actions].context[<[message]>|<element[&<color[<proc[settings_get].context[<[player]>|text_rp_chat_color]>].hex>].parse_color>says<&7>:|<element[&<color[<proc[settings_get].context[<[player]>|text_rp_chat_color]>].hex>].parse_color>|<&f>|<&f><&dq><&f>|false].replace[&\].with[&].unescaped>
- define final "<&color[#b8b9ba]><placeholder[essentials_nickname].player[<[player]>]> <&f><proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <[tokenized]>"
- narrate targets:<[player].location.find_players_within[10]> <[final]>
- define targets <[player].location.find_players_within[10]>
- inject chat_accessibility_space_message_inject_define
- inject chat_accessibility_space_message_inject_apply
- inject chat_channel_check_targets
- narrate targets:<[targets]> <[final]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final]>
chat_channel_ic_me:
@@ -97,8 +138,13 @@ chat_channel_ic_me:
- define message <[message].replace[&\].with[&].unescaped>
- if !<[player].has_permission[chat.colors]>:
- define message <[message].strip_color>
- define final "<&e>*** <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <player.flag[chat_color].if_null[<&e>]><&o><[message]>"
- narrate targets:<[player].location.find_players_within[10]> <[final]>
- define final "<&e>*** <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <element[&<color[<proc[settings_get].context[<[player]>|text_rp_chat_color]>].hex>].parse_color><&o><[message]>"
- define targets <[player].location.find_players_within[10]>
- inject chat_accessibility_space_message_inject_define
- inject chat_accessibility_space_message_inject_apply
- inject chat_channel_check_targets
- narrate targets:<[targets]> <[final]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final]>
chat_channel_ic_mec:
@@ -109,8 +155,13 @@ chat_channel_ic_mec:
- define message <[message].replace[&\].with[&].unescaped>
- if !<[player].has_permission[chat.colors]>:
- define message <[message].strip_color>
- define final "<&e>* <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <player.flag[chat_color].if_null[<&e>]><&o><[message]>"
- narrate targets:<[player].location.find_players_within[3]> <[final]>
- define final "<&e>* <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <element[&<color[<proc[settings_get].context[<[player]>|text_rp_chat_color]>].hex>].parse_color><&o><[message]>"
- define targets <[player].location.find_players_within[3]>
- inject chat_accessibility_space_message_inject_define
- inject chat_accessibility_space_message_inject_apply
- inject chat_channel_check_targets
- narrate targets:<[targets]> <[final]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final]>
chat_channel_ic_mel:
@@ -121,8 +172,13 @@ chat_channel_ic_mel:
- define message <[message].replace[&\].with[&].unescaped>
- if !<[player].has_permission[chat.colors]>:
- define message <[message].strip_color>
- define final "<&e>**** <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <player.flag[chat_color].if_null[<&e>]><&o><[message]>"
- narrate targets:<[player].location.find_players_within[25]> <[final]>
- define final "<&e>**** <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <element[&<color[<proc[settings_get].context[<[player]>|text_rp_chat_color]>].hex>].parse_color><&o><[message]>"
- define targets <[player].location.find_players_within[25]>
- inject chat_accessibility_space_message_inject_define
- inject chat_accessibility_space_message_inject_apply
- inject chat_channel_check_targets
- narrate targets:<[targets]> <[final]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final]>
chat_channel_ic_whisper:
@@ -140,7 +196,12 @@ chat_channel_ic_whisper:
- define message <[message].strip_color>
- define tokenized <proc[chat_tokenize_actions].context[<[message]>|whispers|<&8>|<&7>|<&6><&sq>|false].replace[&\].with[&].unescaped>
- define final "<&color[#d1d1d1]><placeholder[essentials_nickname].player[<[player]>]> <&f><proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <[tokenized]>"
- narrate targets:<[player].location.find_players_within[3]> <[final]>
- define targets <[player].location.find_players_within[3]>
- inject chat_accessibility_space_message_inject_define
- inject chat_accessibility_space_message_inject_apply
- inject chat_channel_check_targets
- narrate targets:<[targets]> <[final]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final]>
chat_channel_ic_yell:
@@ -158,7 +219,11 @@ chat_channel_ic_yell:
- define message <[message].strip_color>
- define tokenized <proc[chat_tokenize_actions].context[<[message]>|yells|<&6>|<&f>|<&6><&sq>|true].replace[&\].with[&].unescaped>
- define final "<&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <[tokenized]>"
- narrate targets:<[player].location.find_players_within[25]> <[final]>
- define targets <[player].location.find_players_within[25]>
- inject chat_accessibility_space_message_inject_define
- inject chat_accessibility_space_message_inject_apply
- narrate targets:<[targets]> <[final]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final]>
chat_channel_ic_my:
@@ -175,7 +240,11 @@ chat_channel_ic_my:
- else:
- define possession_name <[possession_name]><&sq>s
- define final "<&e>*** <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <[possession_name]> <&f><[message]>"
- narrate targets:<[player].location.find_players_within[10]> <[final]>
- define targets <[player].location.find_players_within[10]>
- inject chat_accessibility_space_message_inject_define
- inject chat_accessibility_space_message_inject_apply
- narrate targets:<[targets]> <[final]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final]>
chat_channel_ic_it:
@@ -187,7 +256,11 @@ chat_channel_ic_it:
- if !<[player].has_permission[chat.colors]>:
- define message <[message].strip_color>
- define final "<&6>*** <&e><[message]> <&7>(<proc[character_get_name].context[<[player]>]>)"
- narrate targets:<[player].location.find_players_within[10]> <[final]>
- define targets <[player].location.find_players_within[10]>
- inject chat_accessibility_space_message_inject_define
- inject chat_accessibility_space_message_inject_apply
- narrate targets:<[targets]> <[final]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final]>
chat_channel_ic_itc:
@@ -199,7 +272,11 @@ chat_channel_ic_itc:
- if !<[player].has_permission[chat.colors]>:
- define message <[message].strip_color>
- define final "<&6>* <&e><[message]> <&7>(<proc[character_get_name].context[<[player]>]>)"
- narrate targets:<[player].location.find_players_within[3]> <[final]>
- define targets <[player].location.find_players_within[3]>
- inject chat_accessibility_space_message_inject_define
- inject chat_accessibility_space_message_inject_apply
- narrate targets:<[targets]> <[final]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final]>
chat_channel_ic_itl:
@@ -211,7 +288,11 @@ chat_channel_ic_itl:
- if !<[player].has_permission[chat.colors]>:
- define message <[message].strip_color>
- define final "<&6>**** <&e><[message]> <&7>(<proc[character_get_name].context[<[player]>]>)"
- narrate targets:<[player].location.find_players_within[25]> <[final]>
- define targets <[player].location.find_players_within[25]>
- inject chat_accessibility_space_message_inject_define
- inject chat_accessibility_space_message_inject_apply
- narrate targets:<[targets]> <[final]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final]>
chat_channel_ic_language:
@@ -225,10 +306,14 @@ chat_channel_ic_language:
- define final_known "<&6>[<&7>L<&6>] <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <player.flag[chat_color].if_null[<&f>]>says <&f><&dq><&o><[message]><&f><&dq> in <[language]>"
- define final_unknown "<&6>[<&7>L<&6>] <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <player.flag[chat_color].if_null[<&f>]>says something in <[language]>"
- define all <[player].location.find_players_within[10]>
- inject chat_accessibility_space_message_inject_define_language
- inject chat_accessibility_space_message_inject_apply
- inject chat_channel_check_targets_language
- define speakers <[all].filter_tag[<[filter_value].flag[chat_languages].contains[<[language]>].if_null[false]>]>
- define others <[all].exclude[<[speakers]>]>
- narrate targets:<[speakers]> <[final_known]>
- narrate targets:<[others]> <[final_unknown]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final_known]>
chat_channel_ic_languagewhisper:
@@ -242,10 +327,14 @@ chat_channel_ic_languagewhisper:
- define final_known "<&6>[<&7>L<&6>] <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <&f>whispers <&dq><&o><[message]><&f><&dq> in <[language]>"
- define final_unknown "<&6>[<&7>L<&6>] <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <&f>whispers something in <[language]>"
- define all <[player].location.find_players_within[3]>
- inject chat_accessibility_space_message_inject_define_language
- inject chat_accessibility_space_message_inject_apply
- inject chat_channel_check_targets_language
- define speakers <[all].filter_tag[<[filter_value].flag[chat_languages].contains[<[language]>].if_null[false]>]>
- define others <[all].exclude[<[speakers]>]>
- narrate targets:<[speakers]> <[final_known]>
- narrate targets:<[others]> <[final_unknown]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final_known]>
chat_channel_ic_languageyell:
@@ -259,8 +348,12 @@ chat_channel_ic_languageyell:
- define final_known "<&6>[<&7>L<&6>] <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <&f>yells <&dq><&o><[message].to_uppercase><&f><&dq> in <[language]>"
- define final_unknown "<&6>[<&7>L<&6>] <&f><placeholder[essentials_nickname].player[<[player]>]> <proc[chat_special_group].context[<[player]>]><proc[chat_roles_group].context[<[player]>]> <proc[character_get_name].context[<[player]>]> <&f>yells something in <[language]>"
- define all <[player].location.find_players_within[25]>
- inject chat_accessibility_space_message_inject_define_language
- inject chat_accessibility_space_message_inject_apply
- inject chat_channel_check_targets_language
- define speakers <[all].filter_tag[<[filter_value].flag[chat_languages].contains[<[language]>].if_null[false]>]>
- define others <[all].exclude[<[speakers]>]>
- narrate targets:<[speakers]> <[final_known]>
- narrate targets:<[others]> <[final_unknown]>
- inject chat_accessibility_space_message_inject_apply
- announce to_console <[final_known]>

View File

@@ -4,8 +4,13 @@ chat_world:
events:
on player chats:
- determine cancelled passively
- define channel <player.flag[chat_channel].if_null[ic]>
- define channel <proc[settings_get].context[<player>|text_rp_chat_channel]>
- if <[channel]> == ic:
- run chat_channel_ic def.player:<player> def.message:<context.message.parse_color.escaped.replace[&].with[&\]>
- else if <[channel]> == ooc:
- run chat_channel_ooc def.player:<player> def.message:<context.message.escaped.replace[&].with[&\]>
on player receives message:
## yes, we will sync the chat thread and live dangerously
# manual settings_get because this event is very finnicky and dangerous
- if <player.flag[settings].get[accessibility_chat_disable_colors].if_null[false]>:
- determine MESSAGE:<context.message.strip_color>

View File

@@ -62,7 +62,7 @@ furniture_menu:
item: <[item]>
- define contents <[contents].with[<[loop_index]>].as[<[item_entry]>]>
- if <[page]> > 0:
- define contents_extra:
- definemap contents_extra:
49:
item: <item[ender_pearl[display=<&a><&lt><&lt>]]>
script: furniture_menu
@@ -71,7 +71,7 @@ furniture_menu:
page: <[page].sub[1]>
- define contents <[contents].include[<[contents_extra]>]>
- if <[page].add[1].mul[27]> < <[contents].size>:
- define contents_extra:
- definemap contents_extra:
51:
item: <item[ender_eye[display=<&a><&gt><&gt>]]>
script: furniture_menu

View File

@@ -30,7 +30,7 @@ guns_world_gun:
- playeffect effect:redstone at:<player.location.above[1].points_between[<[location]>].distance[0.1]> special_data:0.5|white visibility:16 quantity:6 offset:0,0,0
- stop
- playeffect effect:redstone at:<player.location.above[1].points_between[<[target].location.above[1]>].distance[0.1]> special_data:0.5|white visibility:16 quantity:6 offset:0,0,0
- if <[target].entity_type> != player:
- if <[target].type> != player:
- stop
- if <[target].has_flag[guns_frozen]>:
- stop
@@ -51,7 +51,7 @@ guns_world_taser:
- define target <player.precise_target[7]||null>
- if <[target]> == null:
- stop
- if <[target].entity_type> != player:
- if <[target].type> != player:
- stop
- if <[target].has_flag[guns_frozen]>:
- stop

View File

@@ -18,8 +18,15 @@ ball_create:
- spawn slime[silent=true;size=<[size]>;has_ai=false;visible=false] <[location].with_pitch[0].with_yaw[0]> save:ball_collision
- define ball_collision <entry[ball_collision].spawned_entity>
- define size <[ball_collision].bounding_box.get[1].sub[<[ball_collision].location>].x.abs.add[0.01]>
- spawn armor_stand[invulnerable=true;has_ai=false;gravity=false;visible=false] <[location].with_pitch[0].with_yaw[0].below[<[size].add[1]>]> save:ball_display
- spawn zombie[silent=true;has_ai=false;gravity=false;visible=false] <[location].with_pitch[0].with_yaw[0].below[<[size].add[1]>]> save:ball_display
- define ball_display <entry[ball_display].spawned_entity>
- if <[ball_display].is_baby>:
- age <[ball_display]> adult lock
- if <[ball_display].is_inside_vehicle>:
# CHICKEN JOCKEEEEEEEEEEEEEEEEEEEEEEEEEY
- define chicken <[ball_display].vehicle>
- adjust <[chicken]> passengers:<list[]>
- remove <[chicken]>
- adjust <[ball_display]> equipment:<map[].with[helmet].as[<[display_item]>]>
- flag <[ball_collision]> ball:<[id]>
- flag <[ball_collision]> ball_display:<[ball_display]>
@@ -142,8 +149,5 @@ ball_internal_physics_update_ball:
- define next <[changes].get[1].if_null[<[next]>]>
- define velocity <[changes].get[2].if_null[<[velocity]>]>
- flag <[ball]> ball_velocity:<[velocity]>
- if <[size]> <= 2:
- teleport <[ball].flag[ball_display]> <[next].below[<[size].add[0.7]>]>
- else:
- teleport <[ball].flag[ball_display]> <[next].below[<[size].add[0.7]>]>
- teleport <[ball].flag[ball_display]> <[ball].bounding_box.get[1].add[<[ball].bounding_box.get[2]>].div[2].below[1.575].below[0.125]>
- teleport <[ball]> <[next]>

309
scripts/lib/cutscene.dsc Normal file
View File

@@ -0,0 +1,309 @@
#
# Cutscene - library for creating cool cutscenes similar to the Replay Mod
#
# Playing cutscenes can also be atomic, meaning that if the player leaves mid
# cutscene, the cutscene may interrupt the queue that called the task in order
# to prevent the script from continuing.
# Determines the set of points passing through the given points spaced by the given distance.
# Effectively, the points representing the lines going from p0 to p1, then p1 to p2, etc...
# The points have to be given escaped! So <[myinput].escaped>!
cutscene_concatenate_points_between:
debug: false
type: procedure
definitions: points|distance
script:
- define points <[points].unescaped>
- define result <list[]>
- repeat <[points].size.sub[1]> as:index:
- define result <[result].include[<[points].get[<[index]>].points_between[<[points].get[<[index].add[1]>]>].distance[<[distance]>]>]>
- determine <[result]>
# Determines the Catmull-Rom spline passing through the given points, taking the distance
# between the resulting equidistant points and the resolution of the computation into account.
# Note that the efficiency of this algorithm is not amazing necessarily, so you should cache
# the results. Higher resolutions also mean the algorithm will take longer to finish.
# The points have to be given escaped! So <[myinput].escaped>!
cutscene_catmull_rom_equidistant_spline:
debug: false
type: procedure
definitions: points|distance|resolution
script:
- define points <[points].unescaped>
- define distance <[distance].if_null[0.25]>
- define resolution <[resolution].if_null[100]>
- if <[points].size> < 2:
- determine <[points]>
- if <[points].size> == 2:
- determine <[points].get[1].points_between[<[points].get[2]>].distance[<[distance]>]>
- define spline_points <list[]>
- define cumulative_distances <list[<element[0]>]>
- repeat <[points].size.sub[1]> from:0 as:segment_index:
- if <[segment_index]> == 0:
- define p0 <[points].get[1].sub[<[points].get[2].sub[<[points].get[1]>]>]>
- define p1 <[points].get[1]>
- define p2 <[points].get[2]>
- define p3 <tern[<[points].size.is_more_than[2]>].pass[<[points].get[3]>].fail[<[points].get[2]>]>
- else if <[segment_index]> == <[points].size.sub[2]>:
- define p0 <[points].get[<[segment_index]>]>
- define p1 <[points].get[<[segment_index].add[1]>]>
- define p2 <[points].get[<[segment_index].add[2]>]>
- define p3 <[points].get[<[segment_index].add[2]>].add[<[points].get[<[segment_index].add[2]>].sub[<[points].get[<[segment_index].add[1]>]>]>]>
- else:
- define p0 <[points].get[<[segment_index]>]>
- define p1 <[points].get[<[segment_index].add[1]>]>
- define p2 <[points].get[<[segment_index].add[2]>]>
- define p3 <[points].get[<[segment_index].add[3]>]>
- define t 0
- while <[t]> < 1:
- define t2 <[t].mul[<[t]>]>
- define t3 <[t2].mul[<[t]>]>
- define px <element[0.5].mul[<[p1].x.mul[2].add[<[p2].x.sub[<[p0].x>].mul[<[t]>]>].add[<[p0].x.mul[2].sub[<[p1].x.mul[5]>].add[<[p2].x.mul[4]>].sub[<[p3].x>].mul[<[t2]>]>].add[<[p0].x.mul[-1].add[<[p1].x.mul[3]>].sub[<[p2].x.mul[3]>].add[<[p3].x>].mul[<[t3]>]>]>]>
- define py <element[0.5].mul[<[p1].y.mul[2].add[<[p2].y.sub[<[p0].y>].mul[<[t]>]>].add[<[p0].y.mul[2].sub[<[p1].y.mul[5]>].add[<[p2].y.mul[4]>].sub[<[p3].y>].mul[<[t2]>]>].add[<[p0].y.mul[-1].add[<[p1].y.mul[3]>].sub[<[p2].y.mul[3]>].add[<[p3].y>].mul[<[t3]>]>]>]>
- define pz <element[0.5].mul[<[p1].z.mul[2].add[<[p2].z.sub[<[p0].z>].mul[<[t]>]>].add[<[p0].z.mul[2].sub[<[p1].z.mul[5]>].add[<[p2].z.mul[4]>].sub[<[p3].z>].mul[<[t2]>]>].add[<[p0].z.mul[-1].add[<[p1].z.mul[3]>].sub[<[p2].z.mul[3]>].add[<[p3].z>].mul[<[t3]>]>]>]>
- define point <location[<[px]>,<[py]>,<[pz]>,<[points].get[1].world.name>]>
- if <[spline_points].size> > 0:
- define last_point <[spline_points].get[-1]>
- define cumulative_distance <[last_point].distance[<[point]>]>
- define cumulative_distances <[cumulative_distances].include[<[cumulative_distances].get[-1].add[<[cumulative_distance]>]>]>
- define spline_points <[spline_points].include[<[point]>]>
- define t <[t].add[<element[1].div[<[resolution]>]>]>
- define equidistant_points <list[<[spline_points].get[1]>]>
- define total_length <[cumulative_distances].get[-1]>
- define current_distance 0
- define current_index 1
- while <[current_distance]> < <[total_length]>:
- define target_distance <[current_distance].add[<[distance]>]>
- if <[target_distance]> > <[total_length]>:
- while stop
- while <[current_index]> < <[cumulative_distances].size> && <[cumulative_distances].get[<[current_index].add[1]>]> < <[target_distance]>:
- define current_index <[current_index].add[1]>
- define t1 <[cumulative_distances].get[<[current_index]>]>
- define t2 <[cumulative_distances].get[<[current_index].add[1]>]>
- define alpha <[target_distance].sub[<[t1]>].div[<[t2].sub[<[t1]>]>]>
- define p1 <[spline_points].get[<[current_index]>]>
- define p2 <[spline_points].get[<[current_index].add[1]>]>
- define x <[p1].x.add[<[alpha].mul[<[p2].x.sub[<[p1].x>]>]>]>
- define y <[p1].y.add[<[alpha].mul[<[p2].y.sub[<[p1].y>]>]>]>
- define z <[p1].z.add[<[alpha].mul[<[p2].z.sub[<[p1].z>]>]>]>
- define point <location[<[x]>,<[y]>,<[z]>,<[points].get[1].world.name>]>
- define equidistant_points <[equidistant_points].include[<[point]>]>
- define current_distance <[target_distance]>
- define last_control_point <[points].get[-1]>
- define last_generated <[equidistant_points].get[-1]>
- if <[last_generated].distance[<[last_control_point]>]> >= <[distance].div[2]>:
- define equidistant_points <[equidistant_points].include[<[last_control_point]>]>
- determine <[equidistant_points]>
# Previews the given path for the given player, where the source definition are the points that
# the resulting path must pass through, for the specified duration_tag. Note for the duration_tag
# that a <duration[]> is required, and it will not work if using simple <element[]>, like '5s'.
cutscene_preview_path:
debug: false
type: task
definitions: player|source|result|duration_tag
script:
- define duration_tag <[duration_tag].if_null[<duration[5s]>]>
- define now <util.current_time_millis>
- while <util.current_time_millis.sub[<[now]>]> < <[duration_tag].in_milliseconds>:
- if !<[player].is_online>:
- stop
- playeffect at:<[source]> targets:<[player]> effect:CLOUD offset:0,0,0 quantity:1 velocity:0,0,0 visibility:1000
- playeffect at:<[result]> targets:<[player]> effect:ENCHANTED_HIT offset:0,0,0 quantity:1 velocity:0,0,0 visibility:1000
- wait 5t
# Simple linear interpolation.
# Given as parameter to cutscene_follow_path_by_interpolation.
cutscene_interpolate_linear:
debug: false
type: procedure
definitions: step
script:
- determine 0.5
# Ease in interpolation.
# Given as parameter to cutscene_follow_path_by_interpolation.
cutscene_interpolate_ease_in:
debug: false
type: procedure
definitions: step
script:
- determine <[step].mul[<util.pi.div[2]>].sin>
# Ease out interpolation.
# Given as parameter to cutscene_follow_path_by_interpolation.
cutscene_interpolate_ease_out:
debug: false
type: procedure
definitions: step
script:
- determine <[step].mul[<util.pi.div[2]>].add[<util.pi.div[2]>].sin>
# Ease in-out interpolation.
# Given as parameter to cutscene_follow_path_by_interpolation.
cutscene_interpolate_ease_in_out:
debug: false
type: procedure
definitions: step
script:
- determine <[step].mul[<util.pi>].sin>
# Makes the player follow the given path at the given speed, using the provided interpolation.
# Note that the speed is an arbitrary construct, but higher numbers will make the player follow
# the path faster.
cutscene_follow_path_by_interpolation:
debug: false
type: task
definitions: player|path|look_at|speed|interpolation_procedure
script:
- if <[path].size> == 0:
- stop
- define look_at_is_list <tern[<[look_at].get[1].if_null[null].equals[null]>].pass[false].fail[true]>
- teleport <[player]> <[path].get[1]>
- define time_unit <[path].size.div[<[speed].mul[20]>]>
- define should_await_time 0
- define index 1
- while <[index]> < <[path].size>:
- define point <[path].get[<[index]>]>
- define step <[index].sub[1].div[<[path].size>]>
- define await_time <element[1].sub[<proc[<[interpolation_procedure]>].context[<[step]>]>].mul[<[time_unit]>]>
- define should_await_time <[should_await_time].add[<[await_time]>]>
- if <[should_await_time]> < 1:
- define index <[index].add[1]>
- while next
- wait <[should_await_time].round_down>t
- define should_await_time <[should_await_time].sub[<[should_await_time].round_down>]>
- define direction <[look_at].sub[<[point]>].normalize>
- define quaternion_pitch <[direction].quaternion_between_vectors[0,1,0].represented_angle.sub[<util.pi.div[2]>].to_degrees>
- define result_point <[point].with_pitch[<[quaternion_pitch]>].with_yaw[<[point].direction[<[look_at]>].yaw>]>
- if !<[player].is_online>:
- determine false
- teleport <[player]> <[result_point].add[0,-1,0]> offthread_repeat:8
- define index <[index].add[1]>
- if !<[player].is_online>:
- determine false
- teleport <[player]> <[path].get[-1]>
- determine true
# Creates and saves a cutscene.
# Definitions explanation:
# - name: The name of the cutscene. Must be unique, case sensitive.
# - points: The source points to generate the path from.
# - look_at: The location that the player should look at throughout the entire path follow
# - compute_spline: Whether to use straight lines for the path, or to compute a smooth spline.
# - interpolation_procedure: A procedure to interpolate the speed of the path follower.
#
# If the cutscene already exists, it will not create it and silently fail.
# Determines true if the cutscene was created, or false if it already exists.
cutscene_create_and_save:
debug: false
type: task
definitions: name|points|look_at|speed|compute_spline|interpolation_procedure
script:
- if <server.flag[cutscene].if_null[<map[]>].contains[<[name]>]>:
- determine false
- if !<[compute_spline]>:
- define result <proc[cutscene_concatenate_points_between].context[<[points].escaped>|0.33]>
- else:
- define result <proc[cutscene_catmull_rom_equidistant_spline].context[<[points].escaped>|0.33|50]>
- definemap cutscene:
name: <[name]>
source: <[points]>
result: <[result]>
look_at: <[look_at]>
speed: <[speed]>
interpolation_procedure: <[interpolation_procedure]>
- flag server cutscene:<server.flag[cutscene].if_null[<map[]>].with[<[name]>].as[<[cutscene]>]>
- determine true
# Destroys an existing cutscnee.
# If the cutscene doesn't exist, it will fail silently.
# Determines true if the cutscene was destroyed, or false if it did not yet exist.
cutscene_destroy:
debug: false
type: task
definitions: name
script:
- if !<server.flag[cutscene].if_null[<map[]>].contains[<[name]>]>:
- determine false
- flag server cutscene:<server.flag[cutscene].if_null[<map[]>].exclude[<[name]>]>
- determine false
# Previews the given path for the given player, using a saved cutscene as the source.
# Note for the duration_tag that a <duration[]> is required, and it will not work if
# using simple <element[]>, like '5s'.
cutscene_preview_path_by_name:
debug: false
type: task
definitions: name|player|duration_tag
script:
- if !<server.flag[cutscene].if_null[<map[]>].contains[<[name]>]>:
- debug error "Cannot preview path by name! <[name]> @ <[player]>"
- stop
- define cutscene <server.flag[cutscene].get[<[name]>]>
- run cutscene_preview_path def.player:<[player]> def.source:<[cutscene].get[source]> def.result:<[cutscene].get[result]> def.duration_tag:<[duration_tag]>
# Plays the given cutscene by name.
# If the player disconnects, the cutscene will stop playing, but the queue that
# called this task will continue. Consider cutscene_play_atomic in case you would
# like to stop the queue that called this task.
# Determines true if the cutscene completed, false otherwise.
# Should be ~waited for.
cutscene_play:
debug: false
type: task
definitions: name|player
script:
- run cutscene_stop def.player:<[player]>
- if !<server.flag[cutscene].if_null[<map[]>].contains[<[name]>]>:
- determine false
- define cutscene <server.flag[cutscene].get[<[name]>]>
- flag <[player]> cutscene:<map[].with[gamemode].as[<player.gamemode>].with[location].as[<player.location>]>
- adjust <[player]> gamemode:spectator
- run cutscene_follow_path_by_interpolation def.player:<[player]> def.path:<[cutscene].get[result]> def.look_at:<[cutscene].get[look_at]> def.speed:<[cutscene].get[speed]> def.interpolation_procedure:<[cutscene].get[interpolation_procedure]> save:result
- define queue <entry[result].created_queue>
- flag <[player]> cutscene_queue:<[queue]>
- waituntil <[queue].state.equals[running]> max:5t
- waituntil <[queue].state.equals[running].not>
- define ok <[queue].determination.get[1]>
- run cutscene_stop def.player:<player>
- determine <[ok]>
# Plays the cutscene atomically.
# See cutscene_play for an explanation.
# Should be ~waited for.
cutscene_play_atomic:
debug: false
type: task
definitions: name|player|queue
script:
- ~run cutscene_play def.name:<[name]> def.player:<[player]> save:result
- define result <entry[result].created_queue.determination.get[1]>
- if !<[result].if_null[false]>:
- debug log "Cancelled atomic cutscene: <[player].name> @ <[name]>"
- queue stop <[queue]>
# Stops the currently playing cutscene from playing.
# If no cutscene is playing, it silently fails.
cutscene_stop:
debug: false
type: task
definitions: player
script:
- if !<[player].has_flag[cutscene]>:
- stop
- define save <[player].flag[cutscene]>
- if <[player].flag[cutscene_queue]> != null:
- queue stop <[player].flag[cutscene_queue]>
- adjust <[player]> gamemode:<[save].get[gamemode]>
- teleport <[player]> <[save].get[location]>
- flag <[player]> cutscene:!
## Internal only!
cutscene_world:
debug: false
type: world
events:
on player joins:
- run cutscene_stop def.player:<player>

View File

@@ -35,7 +35,7 @@ textbox_write:
- queue stop <[queue]>
- run textbox_flush def.player:<[player]>
- stop
- define lines <[line3s].split[$$nl].parse_tag[<[parse_value].trim>]>
- define lines <[line3s].split[$$nl].parse_tag[<[parse_value].trim.replace[<&0>].with[<&6>]>]>
- flag <[player]> textbox_state:writing
- flag <[player]> textbox_input:<[lines]>
- flag <[player]> textbox_lines:<[lines].size>
@@ -44,6 +44,7 @@ textbox_write:
- bossbar create textbox_<[player].uuid>_2 players:<[player]> title:<empty>
- bossbar create textbox_<[player].uuid>_3 players:<[player]> title:<empty>
- wait 1t
- define write_speed <proc[settings_get].context[<[player]>|text_textbox_write_speed].if_null[1]>
- if <[avatar_unicode]> != null:
- bossbar create textbox_<[player].uuid>_avatar players:<[player]> title:<element[ ].repeat[64]><[avatar_unicode]>
- foreach <[lines]> as:line:
@@ -56,22 +57,22 @@ textbox_write:
- stop
- if !<[player].is_online>:
- stop
- bossbar update textbox_<[player].uuid>_<[loop_index]> title:<black><bold><[line].substring[1,<[value]>]>
- bossbar update textbox_<[player].uuid>_<[loop_index]> title:<&6><&l><[line].substring[1,<[value]>]>
- if <[value].sub[1].mod[3]> == 0:
- playsound sound:textbox.text <[player]> custom pitch:<util.random.decimal[0.98].to[1]>
- wait 1t
- playsound sound:textbox.text <[player]> custom pitch:<util.random.decimal[0.98].to[1]> volume:<proc[settings_get].context[<[player]>|sound_textbox_volume].div[100].if_null[1]>
- wait <[write_speed]>t
- if <[line].substring[<[value].add[1]>,<[value].add[1]>].trim.length.if_null[1]> == 0:
- if <[line].substring[<[value]>,<[value]>]> == ".":
- wait 2t
- if <[line].substring[<[value]>,<[value]>]> == "!":
- wait 2t
- if <[line].substring[<[value]>,<[value]>]> == "?":
- wait 2t
- if <[line].substring[<[value]>,<[value]>]> == "-":
- wait 2t
- if <[line].substring[<[value]>,<[value]>]> == ",":
- wait 2t
- wait <duration[1t]>
- if <[line].substring[<[value]>,<[value]>]> == .:
- wait <[write_speed].add[1]>t
- if <[line].substring[<[value]>,<[value]>]> == !:
- wait <[write_speed].add[1]>t
- if <[line].substring[<[value]>,<[value]>]> == ?:
- wait <[write_speed].add[1]>t
- if <[line].substring[<[value]>,<[value]>]> == -:
- wait <[write_speed].add[1]>t
- if <[line].substring[<[value]>,<[value]>]> == ,:
- wait <[write_speed].add[1]>t
- wait <duration[<[write_speed]>t]>
- if <[player].flag[textbox_state].if_null[null]> != writing:
- if <[queue].if_null[null]> != null && <[player].flag[textbox_state].if_null[null]> != continue:
- debug log "[Textbox] Write; cancelled queue <[queue].numeric_id><&at><[queue].script.name> for <[player].name>; state mismatch."
@@ -99,7 +100,7 @@ textbox_skip:
- bossbar create textbox_<[player].uuid>_<[value]> players:<[player]> title:<empty>
- define lines <[player].flag[textbox_input]>
- foreach <[lines]> as:line:
- bossbar update textbox_<[player].uuid>_<[loop_index]> title:<black><bold><[line]>
- bossbar update textbox_<[player].uuid>_<[loop_index]> title:<&6><&l><[line]>
- flag <[player]> textbox_state:continue
# Clears textbox and flushes all flag memory values
@@ -207,12 +208,12 @@ textbox_handle_click:
- ratelimit <player> 5t
- else if <[state]> == continue:
- determine cancelled passively
- playsound sound:textbox.close <player> custom
- playsound sound:textbox.close <player> custom volume:<proc[settings_get].context[<player>|sound_textbox_volume].div[100].if_null[1]>
- ~run textbox_flush def.player:<player>
- ratelimit <player> 10t
- else if <[state]> == choice:
- determine cancelled passively
- playsound sound:input.ok <player> custom
- playsound sound:input.ok <player> custom volume:<proc[settings_get].context[<player>|sound_textbox_volume].div[100].if_null[1]>
- flag <player> textbox_choice_select:<player.flag[textbox_choices].get[current]>
- ~run textbox_flush def.player:<player>
- ratelimit <player> 10t
@@ -249,7 +250,13 @@ textbox_choice:
- teleport <[player]> <[player].location.below.above.with_y[<[player].location.below.above.y.round_down>]>
- else:
- stop
- waituntil <[player].flag[textbox_state].if_null[null]> == null
- waituntil <[player].flag[textbox_state].if_null[null]> == null || !<[player].is_online>
- if !<[player].is_online>:
- if <[queue].if_null[null]> != null:
- debug log "[Textbox] Choice; cancelled queue <[queue].numeric_id><&at><[queue].script.name> for <[player].name>; offline"
- queue stop <[queue]>
- run textbox_flush def.player:<[player]>
- stop
- ~run textbox_flush def.player:<[player]>
- flag <[player]> textbox_state:choice
- flag <[player]> textbox_choices:<map[].with[data].as[<[choices]>].with[current].as[left]>
@@ -283,35 +290,35 @@ textbox_internal_choice_select:
- bossbar create textbox_<[player].uuid>_bottom players:<[player]> title:<empty>
- define choices <[player].flag[textbox_choices].get[data]>
#
- define left <&0><&l><[choices].get[left].get[text].if_null[null]>
- define right <&0><&l><[choices].get[right].get[text].if_null[null]>
- define top <&0><&l><[choices].get[top].get[text].if_null[null]>
- define bottom <&0><&l><[choices].get[bottom].get[text].if_null[null]>
- define left <&6><&l><[choices].get[left].get[text].if_null[null]>
- define right <&6><&l><[choices].get[right].get[text].if_null[null]>
- define top <&6><&l><[choices].get[top].get[text].if_null[null]>
- define bottom <&6><&l><[choices].get[bottom].get[text].if_null[null]>
#
- if <[choice_dir]> == left:
- if <[left]> == <&0><&l>null:
- if <[left]> == <&6><&l>null:
- stop
- define left "<&4>❤ <&0><&l><[left]>"
- define left "<&4>❤ <&6><&l><[left]>"
- else if <[choice_dir]> == right:
- if <[right]> == <&0><&l>null:
- if <[right]> == <&6><&l>null:
- stop
- define right "<&4>❤ <&0><&l><[right]>"
- define right "<&4>❤ <&6><&l><[right]>"
- else if <[choice_dir]> == top:
- if <[top]> == <&0><&l>null:
- if <[top]> == <&6><&l>null:
- stop
- define top "<&4>❤ <&0><&l><[top]>"
- define top "<&4>❤ <&6><&l><[top]>"
- else:
- if <[bottom]> == <&0><&l>null:
- if <[bottom]> == <&6><&l>null:
- stop
- define bottom "<&4>❤ <&0><&l><[bottom]>"
- define bottom "<&4>❤ <&6><&l><[bottom]>"
#
- define mid_padding <element[<&sp>].repeat[<element[30].sub[<[left].strip_color.length>].sub[<[right].strip_color.length>]>]>
#
- if <[top]> != <&0><&l>null:
- if <[top]> != <&6><&l>null:
- bossbar update textbox_<[player].uuid>_top title:<[top]>
- if <[left]> != <&0><&l>null || <[right]> != <&0><&l>null:
- if <[left]> != <&6><&l>null || <[right]> != <&6><&l>null:
- bossbar update textbox_<[player].uuid>_mid title:<[left]><[mid_padding]><[right]>
- if <[bottom]> != <&0><&l>null:
- if <[bottom]> != <&6><&l>null:
- bossbar update textbox_<[player].uuid>_bottom title:<[bottom]>
- flag <[player]> textbox_choices:<map[].with[data].as[<[choices]>].with[current].as[<[choice_dir]>]>
- playsound BLOCK_NOTE_BLOCK_BIT <[player]> pitch:2
- playsound BLOCK_NOTE_BLOCK_BIT <[player]> pitch:2 volume:<proc[settings_get].context[<[player]>|sound_textbox_volume].div[100].if_null[1]>

View File

@@ -16,7 +16,8 @@ liteprofilesutils_world:
- flag server liteprofilesutils_lastbestlimit:<[lastbestlimit].with[<[masteruuid]>].as[<[profilelimit].max[<[lastbestlimit].get[<[masteruuid]>].if_null[1]>]>]>
#
- define joinleavedata <script[liteprofilesutils_data].data_key[join-leave]>
- announce <[joinleavedata].get[leave].parsed>
- define setting_enabled_players <server.online_players.filter_tag[<proc[settings_get].context[<[filter_value]>|general_see_player_join_leave]>]>
- narrate <[joinleavedata].get[leave].parsed> targets:<[setting_enabled_players]>
on player joins:
- define masteruuid <proc[liteprofilesutils_get_master_uuid].context[<player>]>
# sync groups, O(scary)
@@ -61,9 +62,14 @@ liteprofilesutils_world:
- if <server.flag[liteprofilesutils_welcome].if_null[<list[]>].contains[<player.uuid>]>:
- announce <[joinleavedata].get[welcome].parsed>
- flag server liteprofilesutils_welcome:<server.flag[liteprofilesutils_welcome].if_null[<list[]>].include[<player.uuid>]>
- announce <[joinleavedata].get[join].parsed>
- define setting_enabled_players <server.online_players.filter_tag[<proc[settings_get].context[<[filter_value]>|general_see_player_join_leave]>]>
- narrate <[joinleavedata].get[join].parsed> targets:<[setting_enabled_players]>
## prevent /profile remove
on command:
- if <context.source_type> != player:
- stop
- if <player.is_op>:
- stop
- if <context.command.to_lowercase> == profile || <context.command.to_lowercase> == account || <context.command.to_lowercase> == pf:
- if <context.args.get[1].to_lowercase.if_null[null]> == remove:
- determine cancelled passively

View File

@@ -20,19 +20,21 @@ compatibility_check_world:
type: world
events:
after player joins:
- define player_version <player.viaversion_version.split[-].get[1].split[.].limit[3].get[1|2].separated_by[.]>
- define server_version <server.version.split[(].get[2].split[:].get[2].split[)].get[1].trim.split[.].limit[3].get[1|2].separated_by[.]>
- if <proc[settings_get].context[<player>|general_ignore_version_compatibility_check]>:
- stop
- define player_version <player.viaversion_version.split[-].get[2]>
- define server_version <server.version.split[(].get[2].split[:].get[2].split[)].get[1].trim>
- if <proc[compatibility_check_compare_versions].context[<[player_version]>|<[server_version]>]> == -1:
- wait 5s
- if !<player.is_online>:
- stop
- narrate ""
- narrate <&f>
- narrate "<&c><&l>[<&4><&l>!<&c><&l>] <&c>You are using an outdated Minecraft version!"
- narrate "<&6>Your version: <&f><[player_version]>"
- narrate "<&6>Server version: <&f><[server_version]>"
- narrate ""
- narrate <&f>
- narrate "<&f>You can still play, however we strongly encourage you to consider <&e>updating your game<&f>."
- narrate "<&f>We will not offer bug support if you are using an outdated version!"
- narrate ""
- narrate <&f>
- narrate "<&7>(Your ViaVersion protocol: <player.viaversion_protocol>)"
- narrate ""
- narrate <&f>

View File

@@ -0,0 +1,5 @@
various_placeholders_staff_rank:
debug: false
type: procedure
script:
- determine <placeholder[luckperms_prefix_element_highest_on_track_special].player[<player>].parse_color.to_minimessage>

View File

@@ -31,4 +31,4 @@ payto_command_payto:
- clickable usages:1 until:1m save:pay:
- execute as_player "pay <[target].name> <[amount]>"
- narrate format:formats_prefix "<&7>Would you like to pay <&6><[amount].as_money><&7> to <&6><proc[character_get_name].context[<[target]>]>"
- narrate "<element[<&a><&l>[CLICK HERE]].on_click[<entry[pay].command>]>"
- narrate <element[<&a><&l>[CLICK HERE]].on_click[<entry[pay].command>]>

View File

@@ -83,9 +83,10 @@ phones_commands_phonecall:
#
# before accepted
- if !<[target].has_flag[phones_is_maybe_called]>:
- if !<proc[settings_get].context[<[target]>|game_disable_phone_ringtone]>:
- nbs file:data/phones/songs/<[target].flag[phones].get[ringtone].if_null[Bad Apple]> play targets:<[target]>
- narrate targets:<[target]> "<&6>*** <&e>You're being called by <&e><[relative]><&7>."
- narrate targets:<[target]> "<&hover[<&a>Click to accept call from <[relative]>...]><element[<&a><&l>[ ACCEPT ]].on_click[<entry[accept].command>]><&end_hover>"
- narrate targets:<[target]> <&hover[<&a>Click to accept call from <[relative]>...]><element[<&a><&l>[ ACCEPT ]].on_click[<entry[accept].command>]><&end_hover>
# wait...
- flag <player> phones_call:<[target]>
- flag <player> phones_call_clickable:<entry[accept].id>

View File

@@ -93,18 +93,18 @@ phones_gui_home:
type: task
definitions: player
script:
- define inventory "<inventory[generic[size=54;title=<&f>邑邑邑邑鄀<&0>邒]]>"
- define inventory <inventory[generic[size=54;title=<&f>邑邑邑邑鄀<&0>邒]]>
# settings
- define settings <item[name_tag]>
- adjust def:settings "display:<&6>Settings"
- adjust def:settings display:<&6>Settings
- inventory set destination:<[inventory]> slot:13 origin:<[settings]>
# contacts
- define contacts <item[book]>
- adjust def:contacts "display:<&6>Contacts"
- adjust def:contacts display:<&6>Contacts
- inventory set destination:<[inventory]> slot:14 origin:<[contacts]>
# texts
- define texts <item[writable_book]>
- adjust def:texts "display:<&6>Messages"
- adjust def:texts display:<&6>Messages
- define notifications_textmessages <[player].flag[phones_notifications].get[textmessages].values.size.if_null[null]>
- if <[notifications_textmessages]> != null && <[notifications_textmessages]> != 0:
- if <[notifications_textmessages]> > 99:
@@ -120,11 +120,10 @@ phones_gui_home:
- define number <item[player_head]>
- adjust def:number "display:<&6>Your Number"
- adjust def:number lore:<list[<&e><proc[phones_nicer_format].context[<[player].flag[phones].get[number]>]>||<&7>You may also view your number|<&7>using /phonenumber.]>
- flag <[number]> phones_target_skull_uuid:<[player].uuid>
- inventory set destination:<[inventory]> slot:41 origin:<[number]>
- inventory adjust destination:<[inventory]> slot:41 skull_skin:<[player].uuid>|<proc[wardrobe_skin_texture_base64].context[<[player]>]>|<[player].name>
#
- inventory open player:<[player]> destination:<[inventory]>
- run phones_target_skulls_update def.player:<[player]>
# ---
# --- contacts related
@@ -161,11 +160,11 @@ phones_contacts_print:
- if <[page]> > 0:
- clickable usages:1 until:60s save:prev:
- execute as_player "phonecontacts <[page]>"
- define prevpage "<element[<&a><&lt>--].on_click[<entry[prev].command>]>"
- define prevpage <element[<&a><&lt>--].on_click[<entry[prev].command>]>
- if <[contacts].size> > <[page].add[1].mul[6]>:
- clickable usages:1 until:60s save:next:
- execute as_player "phonecontacts <[page].add[2]>"
- define nextpage "<element[<&a>--<&gt>].on_click[<entry[next].command>]>"
- define nextpage <element[<&a>--<&gt>].on_click[<entry[next].command>]>
- narrate targets:<[player]> "<&nl><[prevpage]> <&6>Page <[page].add[1]>/<[contacts].size.sub[1].div[6].round_down.add[1]> <[nextpage]>"
# ---
@@ -177,7 +176,7 @@ phones_texts_store:
type: task
definitions: player|target|contents
script:
- narrate targets:<[player]> format:formats_prefix "Sending..."
- narrate targets:<[player]> format:formats_prefix Sending...
#
- define playertexts phones_texts_<[player].uuid>_<[target].uuid>
- if <util.has_file[data/phones/texts/<[player].uuid>_<[target].uuid>.yml]>:
@@ -218,7 +217,7 @@ phones_texts_print:
type: task
definitions: player|target|page
script:
- narrate targets:<[player]> format:formats_prefix "Loading..."
- narrate targets:<[player]> format:formats_prefix Loading...
#
- define playertexts phones_texts_<[player].uuid>_<[target].uuid>
- ~yaml id:<[playertexts]> load:data/phones/texts/<[player].uuid>_<[target].uuid>.yml
@@ -243,11 +242,11 @@ phones_texts_print:
- if <[page]> > 0:
- clickable usages:1 until:60s save:prev:
- run phones_texts_print def.player:<[player]> def.target:<[target]> def.page:<[page].sub[1]>
- define prevpage "<element[<&a><&lt>--].on_click[<entry[prev].command>]>"
- define prevpage <element[<&a><&lt>--].on_click[<entry[prev].command>]>
- if <[messages_size]> > <[page].add[1].mul[5]>:
- clickable usages:1 until:60s save:next:
- run phones_texts_print def.player:<[player]> def.target:<[target]> def.page:<[page].add[1]>
- define nextpage "<element[<&a>--<&gt>].on_click[<entry[next].command>]>"
- define nextpage <element[<&a>--<&gt>].on_click[<entry[next].command>]>
- narrate targets:<[player]> "<&nl><[prevpage]> <&6>Page <[page].add[1]>/<[messages_size].sub[1].div[5].round_down.add[1]> <[nextpage]>"
# clear notifications?
- if <[player].flag[phones_notifications].get[textmessages].get[<[target]>].if_null[0]> > 0:
@@ -262,24 +261,25 @@ phones_gui_texts:
type: task
definitions: player|page
script:
- define inventory "<inventory[generic[size=54;title=<&f>邑邑邑邑鄀<&1>邒]]>"
- define inventory <inventory[generic[size=54;title=<&f>邑邑邑邑鄀<&1>邒]]>
- define textslist <util.list_files[data/phones/texts].filter[starts_with[<player.uuid>]].parse[split[_].get[2].split[.].get[1]].parse_tag[<player[<[parse_value]>]>].get[<[page].mul[16].add[1]>].to[<[page].add[1].mul[16]>].if_null[<list[]>]>
# show contacts/numbers
- foreach <[textslist]> as:target:
- define receiver <proc[phones_relative_name].context[<[player]>|<[target]>]>
- define textsender <item[player_head]>
- adjust def:textsender display:<&e><[receiver]>
- adjust def:textsender "lore:<list[<&7>Click to view your conversation.]>"
- adjust def:textsender lore:<list[<&7>Click to view your conversation.]>
# notifications
- define notifications_text <[player].flag[phones_notifications].get[textmessages].get[<[target]>].if_null[null]>
- if <[notifications_text]> != null:
- if <[notifications_text]> > 99:
- define notifications_text 99+
- adjust def:textsender "lore:<[textsender].lore.include[|<&7>You have <&6><[notifications_text]> <&7>unread messages.]>"
- adjust def:textsender lore:<[textsender].lore.include[|<&7>You have <&6><[notifications_text]> <&7>unread messages.]>
#
- flag <[textsender]> phones:<[target]>
- flag <[textsender]> phones_target_skull_uuid:<[target].uuid>
- inventory set destination:<[inventory]> slot:<[loop_index].sub[1].div[3].round_down.mul[9].add[4].add[<[loop_index].sub[1].mod[3]>]> origin:<[textsender]>
- define slot <[loop_index].sub[1].div[3].round_down.mul[9].add[4].add[<[loop_index].sub[1].mod[3]>]>
- inventory set destination:<[inventory]> slot:<[slot]> origin:<[textsender]>
- inventory adjust destination:<[inventory]> slot:<[slot]> skull_skin:<[target].uuid>|<proc[wardrobe_skin_texture_base64].context[<[target]>]>|<[target].name>
# back
- define back <item[oak_door]>
- adjust def:back display:<&7>Back
@@ -295,21 +295,6 @@ phones_gui_texts:
- inventory set destination:<[inventory]> slot:51 origin:<[nextpage]>
#
- inventory open player:<[player]> destination:<[inventory]>
- run phones_target_skulls_update def.player:<[player]>
# each skull you want to change has to be flagged with phones_target_skull_uuid:<[target].uuid>
phones_target_skulls_update:
debug: false
type: task
definitions: player
script:
- define inventory <[player].open_inventory>
- foreach <[inventory].map_slots> key:slot as:item:
- if <[item].has_flag[phones_target_skull_uuid]>:
- if <[inventory].viewers.if_null[<list[]>].is_empty>:
- stop
- define uuid <[item].flag[phones_target_skull_uuid]>
- inventory adjust slot:<[slot]> skull_skin:<[uuid]>|<player[<[uuid]>].skin_blob.if_null[0000]>|<player[<[uuid]>].name> destination:<[inventory]>
####
## NOTIFICATIONS
@@ -363,9 +348,9 @@ phones_gui_music:
# ringtone selection mode?
- define ringtone <[ringtone].if_null[false]>
# make inventory
- define inventory "<inventory[generic[size=54;title=<&f>邑邑邑邑鄀<&2>邒]]>"
- define inventory <inventory[generic[size=54;title=<&f>邑邑邑邑鄀<&2>邒]]>
- if <[ringtone]>:
- define inventory "<inventory[generic[size=54;title=<&f>邑邑邑邑鄀<&4>邒]]>"
- define inventory <inventory[generic[size=54;title=<&f>邑邑邑邑鄀<&4>邒]]>
- define songsize <util.list_files[data/phones/songs].size>
- define songsonpage <tern[<[ringtone]>].pass[15].fail[14]>
- define songlist <util.list_files[data/phones/songs].parse[split[.].get[1]].filter[length.is_more_than[0]].get[<[page].mul[<[songsonpage]>].add[1]>].to[<[page].add[1].mul[<[songsonpage]>]>].if_null[<list[]>]>
@@ -373,7 +358,7 @@ phones_gui_music:
- foreach <[songlist]> as:songname:
- define song <item[jukebox]>
- adjust def:song display:<&e><[songname]>
- adjust def:song "lore:<list[<&7>Click to start playing.]>"
- adjust def:song lore:<list[<&7>Click to start playing.]>
- flag <[song]> phones:<[songname]>
- inventory set destination:<[inventory]> slot:<[loop_index].sub[1].div[3].round_down.mul[9].add[4].add[<[loop_index].sub[1].mod[3]>]> origin:<[song]>
# stop
@@ -405,7 +390,7 @@ phones_gui_settings:
type: task
definitions: player
script:
- define inventory "<inventory[generic[size=54;title=<&f>邑邑邑邑鄀<&3>邒]]>"
- define inventory <inventory[generic[size=54;title=<&f>邑邑邑邑鄀<&3>邒]]>
# ringtone
- define ringtone <item[note_block]>
- adjust def:ringtone display:<&6>Ringtone
@@ -427,7 +412,7 @@ phones_gui_settings_blocked:
type: task
definitions: player|page
script:
- define inventory "<inventory[generic[size=54;title=<&f>邑邑邑邑鄀<&5>邒]]>"
- define inventory <inventory[generic[size=54;title=<&f>邑邑邑邑鄀<&5>邒]]>
- define blockedlist <[player].flag[phones].get[blocked].get[<[page].mul[16].add[1]>].to[<[page].add[1].mul[16]>].if_null[<list[]>]>
# show blocked numbers
- foreach <[blockedlist]> as:target:
@@ -435,7 +420,7 @@ phones_gui_settings_blocked:
- define blocked <item[player_head]>
- adjust def:blocked display:<&e><[blockednumber]>
- adjust def:blocked lore:<list[<&7>You may use /phoneunblock to unblock this number.]>
- flag <[blocked]> phones_target_skull_uuid:<[target].uuid>
- adjust def:blocked skull_skin:<[target].uuid>|<proc[wardrobe_skin_texture_base64].context[<[target]>]>|<[target].name>
- inventory set destination:<[inventory]> slot:<[loop_index].sub[1].div[3].round_down.mul[9].add[4].add[<[loop_index].sub[1].mod[3]>]> origin:<[blocked]>
# back
- define back <item[oak_door]>
@@ -452,4 +437,3 @@ phones_gui_settings_blocked:
- inventory set destination:<[inventory]> slot:51 origin:<[nextpage]>
#
- inventory open player:<[player]> destination:<[inventory]>
- run phones_target_skulls_update def.player:<[player]>

View File

@@ -115,11 +115,11 @@ phones_world_gui:
- run phones_gui_music def.player:<player> def.page:0 def.ringtone:false
- else if <[title]> == <&1>邒:
- if <context.item.material.name> == ender_pearl:
- define page <player.flag[phones_gui_page].sub_int[1]>
- define page <player.flag[phones_gui_page].sub[1]>
- flag <player> phones_gui_page:<[page]>
- run phones_gui_texts def.player:<player> def.page:<[page]>
- else if <context.item.material.name> == ender_eye:
- define page <player.flag[phones_gui_page].add_int[1]>
- define page <player.flag[phones_gui_page].add[1]>
- flag <player> phones_gui_page:<[page]>
- run phones_gui_texts def.player:<player> def.page:<[page]>
- else if <context.slot> == 50:
@@ -130,11 +130,11 @@ phones_world_gui:
# Music
- else if <[title]> == <&2>邒:
- if <context.item.material.name> == ender_pearl:
- define page <player.flag[phones_gui_page].sub_int[1]>
- define page <player.flag[phones_gui_page].sub[1]>
- flag <player> phones_gui_page:<[page]>
- run phones_gui_music def.player:<player> def.page:<[page]> def.ringtone:false
- else if <context.item.material.name> == ender_eye:
- define page <player.flag[phones_gui_page].add_int[1]>
- define page <player.flag[phones_gui_page].add[1]>
- flag <player> phones_gui_page:<[page]>
- run phones_gui_music def.player:<player> def.page:<[page]> def.ringtone:false
- else if <context.slot> == 50:
@@ -158,11 +158,11 @@ phones_world_gui:
# Ringtone Select
- else if <[title]> == <&4>邒:
- if <context.item.material.name> == ender_pearl:
- define page <player.flag[phones_gui_page].sub_int[1]>
- define page <player.flag[phones_gui_page].sub[1]>
- flag <player> phones_gui_page:<[page]>
- run phones_gui_music def.player:<player> def.page:<[page]> def.ringtone:true
- else if <context.item.material.name> == ender_eye:
- define page <player.flag[phones_gui_page].add_int[1]>
- define page <player.flag[phones_gui_page].add[1]>
- flag <player> phones_gui_page:<[page]>
- run phones_gui_music def.player:<player> def.page:<[page]> def.ringtone:true
- else if <context.slot> == 50:
@@ -174,11 +174,11 @@ phones_world_gui:
# Blocked
- else if <[title]> == <&5>邒:
- if <context.item.material.name> == ender_pearl:
- define page <player.flag[phones_gui_page].sub_int[1]>
- define page <player.flag[phones_gui_page].sub[1]>
- flag <player> phones_gui_page:<[page]>
- run phones_gui_settings_blocked def.player:<player> def.page:<[page]>
- else if <context.item.material.name> == ender_eye:
- define page <player.flag[phones_gui_page].add_int[1]>
- define page <player.flag[phones_gui_page].add[1]>
- flag <player> phones_gui_page:<[page]>
- run phones_gui_settings_blocked def.player:<player> def.page:<[page]>
- else if <context.slot> == 50:

View File

@@ -9,7 +9,7 @@ requestsearch_command_requestsearch:
- patdown
permission: invreq.patdown
tab completions:
1: <empyy>
1: <empty>
script:
- if <context.source_type> != player:
- narrate "<&c>Please run this command as a player."

View File

@@ -3,62 +3,146 @@ settings_config:
type: data
tabs:
- General
- Miscellaneous
- Game
- Text
- Sounds
- Accessibility
keys:
example1_key:
general_see_player_join_leave:
tab: General
name: example1 setting key
description: example1 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...
name: See player join and leave messages
description: If enabled, will show in chat when other players join or leave.
type: boolean
default: true
example2_key:
general_ignore_version_compatibility_check:
tab: General
name: example2 setting key
description: example2 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...
type: number
default: 5
min: 0
max: 10
increment: 0.5
example3_key:
tab: Miscellaneous
name: example3 setting key
description: example3 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...
name: Ignore version compatibility warning
description: If enabled, will not show the compatibility warning when joining the server on an old unsupported version.
type: boolean
default: false
##
game_see_auto_money_announcements:
tab: Game
name: See auto money announcements
description: If enabled, will show in chat when you receive money for being online.
type: boolean
default: true
game_disable_phone_ringtone:
tab: Game
name: Disable phone ringtone
description: If enabled, the ringtone won't play when your phone is calling.
type: boolean
default: false
##
text_rp_chat_color:
tab: Text
name: Roleplay chat color
description: Changes the color used for actions when using in character chat channels. Can also be changed using /chatcolor.
type: list
default: male
default: yellow
values:
- male
- female
- prefer not to say
example4_key:
tab: Miscellaneous
name: example4 setting key
description: example4 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...
type: text
default: text
max-length: 64
regex: "[a-z]+"
example5_key:
tab: Miscellaneous
name: example5 setting key
description: example5 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...
type: text
default: text
max-length: 64
regex: "[a-z]+"
example6_key:
tab: Miscellaneous
name: example6 setting key
description: example6 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...
type: text
default: text
max-length: 64
regex: "[a-z]+"
example7_key:
tab: Miscellaneous
name: example7 setting key
description: example7 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...
type: text
default: text
max-length: 64
regex: "[a-z]+"
- aqua
- blue
- fuchsia
- gray
- green
- lime
- maroon
- navy
- olive
- orange
- purple
- red
- silver
- teal
- yellow
text_rp_chat_channel:
tab: Text
name: Current roleplay chat channel
description: The channel you are currently using. Can also be changed using /chsw.
type: list
default: ic
values:
- ic
- ooc
text_rp_chat_distance_warning:
tab: Text
name: Warn when no message receivers
description: If enabled, will warn you when your in character chat channel message was not seen by any other player.
type: boolean
default: true
text_textbox_write_speed:
tab: Text
name: Textbox write speed
description: How fast textboxes should write text.
type: number
default: 2
min: 1
max: 3
increment: 1
##
sound_textbox_volume:
tab: Sounds
name: Textbox volume
description: Changes the volume when the textbox is writing.
type: number
default: 50
min: 0
max: 100
increment: 5
sound_vehicles_volume:
tab: Sounds
name: Vehicles volume
description: Changes the volume of vehicle engines.
type: number
default: 50
min: 0
max: 100
increment: 5
##
accessibility_chat_disable_colors:
tab: Accessibility
name: Disable colors in chat
description: If enabled, hides all colors in chat, instead using plain white.
type: boolean
default: false
accessibility_rp_chat_space_messages:
tab: Accessibility
name: Space messages for in character chat channels
description: If enabled, in character chat channel messages will be begin and end with a new line to distinguish where the message begins and ends.
type: boolean
default: false
##
# example1_key:
# tab: General
# name: example1 setting key
# description: example1 description
# type: boolean
# default: true
# example2_key:
# tab: General
# name: example2 setting key
# description: example2 description
# type: number
# default: 5
# min: 0
# max: 10
# increment: 0.5
# example3_key:
# tab: Miscellaneous
# name: example3 setting key
# description: example3 description
# type: list
# default: male
# values:
# - male
# - female
# - prefer not to say
# example4_key:
# tab: Miscellaneous
# name: example4 setting key
# description: example4 description
# type: text
# default: text
# max-length: 64
# regex: "[a-z]+"

View File

@@ -98,7 +98,7 @@ settings_menu_set_text_callback:
- define error <entry[result].created_queue.determination.get[1].if_null[null]>
- if <[error]> != null:
- narrate targets:<[player]> <&c><[error]>
- wait 1t
- wait 4t
- run settings_menu def.player:<[player]> def.tab:<[temp_state].get[tab]> def.page:<[temp_state].get[page]>
settings_menu_set_text_helper:
@@ -166,7 +166,7 @@ settings_menu_render_tabs:
type: task
script:
- foreach <[tabs]> as:t:
- define tab_button <item[book[display=<&b><[t]>]]>
- define tab_button <item[<tern[<[t].equals[<[tab]>]>].pass[enchanted_book].fail[book]>[display=<&b><[t]>]]>
- definemap content_entry_value:
item: <[tab_button]>
script: settings_menu
@@ -182,7 +182,7 @@ settings_menu_render_settings:
type: task
script:
- foreach <proc[settings_all_settings_from_page_from_tab].context[<[tab]>|<[page]>]> as:setting_key:
- define setting_item <item[paper[display=<&3><[keys].get[<[setting_key]>].get[name]>;lore=<[keys].get[<[setting_key]>].get[description].split_lines_by_width[128].split[<&nl>].parse_tag[<&7><[parse_value]>]>]]>
- define setting_item <item[paper[display=<&3><[keys].get[<[setting_key]>].get[name]>;lore=<[keys].get[<[setting_key]>].get[description].split_lines_by_width[<[keys].get[<[setting_key]>].get[name].text_width>].split[<&nl>].parse_tag[<&7><[parse_value]>]>]]>
- definemap content_entry_value:
item: <[setting_item]>
- define position <[loop_index].mul[9].add[1]>

View File

@@ -7,7 +7,10 @@ sports_football_world:
- ratelimit <player> 10t
- if !<context.entity.has_flag[ball]>:
- stop
- if !<context.entity.flag[ball].starts_with[sports_football]>:
- define ball <context.entity>
- if <[ball].type> != slime:
- define ball <proc[ball_get].context[<[ball].flag[ball]>]>
- if !<[ball].flag[ball].starts_with[sports_football]>:
- stop
- if !<player.has_flag[sports]>:
- stop
@@ -19,13 +22,13 @@ sports_football_world:
- define min_y <player.eye_location.direction.vector.y>
- if <[min_y]> < 0:
- define min_y 0
- define velo <context.entity.flag[ball_velocity].normalize.mul[0.05]>
- define velo <[ball].flag[ball_velocity].normalize.mul[0.05]>
- define kick <player.eye_location.direction.vector.mul[0.75].with_y[<[min_y]>].add[0,0.25,0].add[<[velo]>]>
- if <player.is_sprinting>:
- define kick <player.eye_location.direction.vector.with_y[0.25].mul[1.5]>
- if !<player.is_on_ground>:
- define kick <player.eye_location.direction.vector.with_y[0.75].mul[1.5]>
- run ball_vector_add def.ball:<context.entity> def.vector:<[kick]>
- run ball_vector_add def.ball:<[ball]> def.vector:<[kick]>
## out of bounds & ball collision
on player walks:
- if !<player.has_flag[sports]>:

View File

@@ -8,7 +8,7 @@ sports_volleyball_world:
- define ball <context.entity>
- if !<[ball].has_flag[ball]>:
- stop
- if <[ball].entity_type> == armor_stand:
- if <[ball].type> != slime:
- define ball <proc[ball_get].context[<[ball].flag[ball]>]>
- if !<[ball].flag[ball].starts_with[sports_volleyball]>:
- stop

View File

@@ -2,8 +2,10 @@ ch1_1_preassign:
debug: false
type: world
events:
on player joins:
after player joins:
- wait 1s
- if <proc[storyboard_player_state_get].context[<player>|preassign]> == null:
- if !<proc[storyboard_npc_exists].context[<player>|marie]>:
- run storyboard_npc_memalloc "def:<player>|marie|player|<location[-4,2,-15,world]>|Marie Ayashibayomi|true|<script[storyboard_skin_dump].data_key[marie].get[a]>"
- run storyboard_npc_set_assignment def.player:<player> def.name:marie def.assignment:ch1_1_marie_assign
- run storyboard_player_state_set def.player:<player> def.key:preassign def.value:true
@@ -17,7 +19,6 @@ ch1_1_marie_assign:
interact scripts:
- ch1_1_marie_interact
# TODO: this seems like the wrong place
ch1_1_define_phone:
debug: false
type: task
@@ -35,6 +36,7 @@ ch1_1_marie_interact:
1:
click trigger:
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player duration:999999s
@@ -98,9 +100,11 @@ ch1_1_marie_interact:
- run storyboard_npc_state_set def.player:<player> def.name:marie def.key:opinion def.value:-1
- zap 2
- disengage player
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>
2:
click trigger:
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player duration:999999s
@@ -129,6 +133,7 @@ ch1_1_marie_interact:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Mkay." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- wait 1s
- disengage player
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>
- stop
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Hm. Are you now?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You know, that was kind of$$nlmean of you." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
@@ -236,3 +241,4 @@ ch1_1_marie_interact:
- inventory update
- zap 3
- disengage player
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>

View File

@@ -14,6 +14,7 @@ dialogue_npc_kobayashi:
1:
click trigger:
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player
@@ -27,7 +28,7 @@ dialogue_npc_kobayashi:
- ~run textbox_choice def.player:<player> def.queue:<queue> def.choices:<[choices]> save:result
- define choice <entry[result].created_queue.determination.get[1]>
- if <[choice]> == left:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:What?$$nlWhy?"
- ~run textbox_write def.player:<player> def.queue:<queue> def.line3s:What?$$nlWhy?
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Well, look, I can't tell you that, luv.$$nl It's against Hospital Policy."
- definemap choices:
left:
@@ -45,3 +46,4 @@ dialogue_npc_kobayashi:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Indeed, luv."
- wait 1s
- disengage player
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>

View File

@@ -14,6 +14,7 @@ dialogue_npc_patchouli:
1:
click trigger:
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player
@@ -23,3 +24,4 @@ dialogue_npc_patchouli:
- wait 1s
- disengage player
- ratelimit <player> 10t
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>

View File

@@ -14,6 +14,7 @@ dialogue_npc_ryuko:
1:
click trigger:
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player
@@ -29,3 +30,4 @@ dialogue_npc_ryuko:
- wait 1s
- disengage player
- ratelimit <player> 10t
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>

View File

@@ -15,11 +15,13 @@ intro_interact_posters_task:
debug: false
type: task
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Book-related posters are on the wall."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<&o><&dq>Screw that. I'm running away.<&dq>"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<&o><&dq>Where?<&dq>"
- ~run textbox_write def.player:<player> def.queue:<queue> def.line3s:<&o><&dq>Where?<&dq>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<&o><&dq>Dunno. Do you want to come?<&dq>"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<&o><&dq>Yes,<&dq> I said without thinking."
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>
# Cirno
intro_interact_cirno:
@@ -38,8 +40,10 @@ intro_interact_cirno_task:
debug: false
type: task
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:A quality, soft plushie of a beloved$$nlcharacter."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:It seems familiar, as if there are a$$nlsubstantial amount of images circulating$$nlaround with this character."
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>
# Laptop
intro_interact_laptop:
@@ -58,6 +62,7 @@ intro_interact_laptop_task:
debug: false
type: task
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:It looks like a game is booted up.$$nlYou can see a city, and it looks like..."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:. . ."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:It's <bold>you!$$nl. . .$$nlWell, it's your character."
@@ -73,13 +78,18 @@ intro_interact_laptop_task_name_callback:
script:
- define __player <[player]>
- define name <[input].substring[1,24]>
- if <server.flag[character_rpnames].contains[<[name]>]>:
- narrate targets:<[player]> "<&c>That RP name is already taken. Try a different one!"
- wait 1s
- run anvil_input def.player:<player> "def.prompt:Character Name" def.callback:intro_interact_laptop_task_name_callback
- stop
- execute as_player player:<[player]> "rpname <[name]>"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<[name]>"
- ~run textbox_write def.player:<player> def.queue:<queue> def.line3s:<[name]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:How nice!"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Let's give them a description.$$nlDescribe their physical attributes."
- waituntil <player.has_flag[textbox_state].not> max:5s
- ~run textbox_flush def.player:<player>
- run anvil_input def.player:<player> "def.prompt:Description" def.callback:intro_interact_laptop_task_description_callback
- run anvil_input def.player:<player> def.prompt:Description def.callback:intro_interact_laptop_task_description_callback
intro_interact_laptop_task_description_callback:
debug: false
@@ -116,7 +126,7 @@ intro_interact_laptop_task_role_menu:
definitions:
player: <[player]>
input: yes
- run menu_open def.player:<[player]> "def.title:<&f>邑邑邑邑酐<&a><&sp><&b><&sp><&c><&sp>" def.size:9 def.contents:<[contents]>
- run menu_open def.player:<[player]> def.title:<&f>邑邑邑邑酐<&a><&sp><&b><&sp><&c><&sp> def.size:9 def.contents:<[contents]>
intro_interact_laptop_task_role_callback:
debug: false
@@ -196,5 +206,5 @@ intro_interact_laptop_task_role_callback:
- adjust <player> remove_effects
- adjust <player> show_to_players
- flag <player> intro:done
- execute as_player player:<player> "spawn"
- execute as_player player:<player> spawn
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>

View File

@@ -41,6 +41,7 @@ storyboard_npc_memalloc:
- define npcs <[player].flag[storyboard_state].get[npcs].if_null[<map[]>]>
- create <[type]> <[npc_id]> <[at]> registry:<[registry]> save:npc
- define npc <entry[npc].created_npc>
- playeffect at:<[npc].location.above[1]> offset:0.35,1,0.35 effect:SOUL_FIRE_FLAME quantity:20
- define npc_state <map[]>
- define assignment null
- if <[npcs].contains[<[name]>]>:
@@ -137,6 +138,14 @@ storyboard_npc_memdestroy:
- define npc <proc[storyboard_npc_by_name].context[<[player]>|<[name]>]>
- remove <[npc]>
# Checks if an NPC exists for the given player.
storyboard_npc_exists:
debug: false
type: procedure
definitions: player|name
script:
- determine <proc[storyboard_npc_by_name].context[<[player]>|<[name]>].if_null[null].equals[null].not>
# Flags the NPC by name, mapping the given key to the given value.
storyboard_npc_state_set:
debug: false
@@ -215,9 +224,11 @@ storyboard_npc_internal_auto_memory_management:
type: world
events:
after player joins:
- wait 1s
- define npcs <player.flag[storyboard_state].get[npcs].if_null[<map[]>]>
- foreach <[npcs]> key:name as:data:
- if <[data].get[allocated]> == reallocate:
- define allocated <[data].get[allocated].if_null[null]>
- if <[allocated]> == reallocate || <[allocated]>:
- define name <[data].get[name]>
- define type <[data].get[type]>
- define at <[data].get[at]>
@@ -245,7 +256,8 @@ storyboard_npc_internal_auto_display_entities:
debug: false
type: world
events:
on player joins bukkit_priority:high:
after player joins bukkit_priority:high:
- wait 1t
- foreach <server.online_players.exclude[<player>]> as:target:
- define registry registry_<[target].uuid>
- define npcs <server.npcs[<[registry]>].if_null[<list[]>]>

View File

@@ -60,6 +60,37 @@ storyboard_player_unfreeze:
- adjust <player> walk_speed:<player.flag[storyboard_freeze_speed]>
- flag <player> storyboard_freeze_speed:!
# Marks the script after this task as an atomic sequence, meaning that
# the script either fully completes or is restored back to this point.
# This task does not ensure the atomicity, instead it will block any
# futher executions of the given script (deduced from the queue) until
# storyboard_player_end_atomic_sequence is called, or until the player
# logs off (which basically negates the atomicity). The developer must
# ensure that the script enclosed by the begin and end tasks is atomic.
storyboard_player_begin_atomic_sequence:
debug: false
type: task
definitions: queue|player
script:
- if <[player].flag[storyboard_atomic].if_null[<map[]>].contains[<[queue].script.name>]>:
- queue <[queue]> stop
- stop
- flag <[player]> storyboard_atomic:<[player].flag[storyboard_atomic].if_null[<map[]>].with[<[queue].script.name>].as[<util.time_now>]>
# Ends the atomic sequence above this task. See the sibling task
# storyboard_player_begin_atomic_sequence for more details.
storyboard_player_end_atomic_sequence:
debug: false
type: task
definitions: queue|player
script:
- if !<[player].flag[storyboard_atomic].if_null[<map[]>].contains[<[queue].script.name>]>:
- debug error "Tried ending storyboard atomic sequence <[queue].script.name> before storyboard_player_begin_atomic_sequence was called! (Player UUID <[player].uuid>)"
- stop
- waituntil !<player.has_flag[textbox_state]>
- wait 5t
- flag <[player]> storyboard_atomic:<[player].flag[storyboard_atomic].if_null[<map[]>].exclude[<[queue].script.name>]>
## Internal only!
storyboard_player_freeze_check:
debug: false
@@ -68,3 +99,12 @@ storyboard_player_freeze_check:
on player joins:
- if <player.has_flag[storyboard_freeze_speed]>:
- run storyboard_player_unfreeze def.player:<player>
storyboard_player_atomic_sequence_disconnect_handler:
debug: false
type: world
events:
on player quit:
- flag <player> storyboard_atomic:!
on player joins:
- flag <player> storyboard_atomic:!

View File

@@ -4,7 +4,10 @@ tabcomplete_config:
groups:
default:
commands:
# please keep these here...
- plugins
- denizenclickable
# anything else
- sit
- lay
- crawl

View File

@@ -3,6 +3,3 @@ timebar_worlds:
type: data
world: Atarashikibo
atarashikibo: Atarashikibo
matsuhama: Matsuhama [ DEBUG ]
noshoko: Noshoko
pussyschool: Pussy

View File

@@ -58,11 +58,32 @@ vehicles_world:
- adjust <context.entity> passenger:<player>
# vehicle control
on player steers armor_stand:
- if <player.viaversion_protocol> >= 767:
# >=1.21 uses player input event instead
- stop
- if <context.entity.flag[vehicles].if_null[null]> != driver:
- stop
- define vehicle <context.entity.flag[vehicles_data]>
- flag <[vehicle]> vehicles_player_input:<map[].with[forward].as[<context.forward>].with[sideways].as[<context.sideways>]>
# place vehicle down
on player input:
- if <player.viaversion_protocol> < 767:
# <1.21 uses player steers event instead
- stop
- if <player.vehicle.flag[vehicles].if_null[null]> != driver:
- stop
- define forward_backward 0
- if <context.forward>:
- define forward_backward 1
- if <context.backward>:
- define forward_backward -1
- define left_right 0
- if <context.left>:
- define left_right 1
- if <context.right>:
- define left_right -1
- define vehicle <player.vehicle.flag[vehicles_data]>
- flag <[vehicle]> vehicles_player_input:<map[].with[forward].as[<[forward_backward]>].with[sideways].as[<[left_right]>]>
on player right clicks block:
- if <player.item_in_hand.has_flag[vehicles]>:
- determine cancelled passively
@@ -135,7 +156,8 @@ vehicle_world_parallel_loop:
- teleport <[vehicle]> <[new_location]> cause:plugin offthread_repeat:8
- flag <[vehicle]> vehicles_speed:<[speed]>
- if <[vehicle].flag[vehicles_data].get[driver_entity].has_passenger>:
- playsound <[new_location]> custom sound:vehicle.engine pitch:<element[0.5].add[<[speed].abs.mul[32].mod[24].round_down.div[18]>]>
- foreach <[vehicle].location.find_players_within[15]> as:listener:
- playsound <[new_location]> <[listener]> custom sound:vehicle.engine pitch:<element[0.5].add[<[speed].abs.mul[32].mod[24].round_down.div[18]>]> volume:<proc[settings_get].context[<[listener]>|sound_vehicles_volume].div[200]>
- if <[vehicle].flag[vehicles_last_location]> == <[new_location]>:
- stop
- define driver_entity <[vehicle].flag[vehicles_data].get[driver_entity]>

View File

@@ -28,6 +28,13 @@ wardrobe_skull_texture_update_single:
##
wardrobe_skin_texture_base64:
debug: false
type: procedure
definitions: player
script:
- determine <[player].flag[wardrobe_current].split[;].get[1].if_null[<[player].flag[wardrobe_latest].split[;].get[1].if_null[null]>]>
wardrobe_max_skins:
debug: false
type: procedure