Initial commit

This commit is contained in:
Rares Bozga
2025-11-29 22:53:32 +02:00
parent e9fa13dbd3
commit 461e95114c
157 changed files with 7597 additions and 1 deletions

View File

@@ -0,0 +1,26 @@
liteprofilesutils_command_profiles:
debug: false
type: command
name: profiles
description: Manage your profiles, neatly.
aliases:
- accountmenu
- pfm
usage: /profiles
tab completions:
1: <list[]>
permission: liteprofilesutils.command.profiles
script:
- if <context.source_type> != player:
- narrate "<&c>Run this command as a player"
- stop
- define player <player>
- clickable save:accept usages:1 until:30s:
- flag <[player]> liteprofiles_legacy_menu:!
- run liteprofilesutils_show_menu def.player:<[player]>
- narrate <empty>
- narrate format:formats_prefix "Our profile system lets you own multiple 'unique accounts' by tricking the server to hand you new unique IDs, which may cause the server to incorrectly save your inventory, ranks, or other data."
- narrate <empty>
- narrate "<&c>[<&4><&l>!<&c>] <&7>Consider this feature <&6>experimental<&7>; take screenshots of your items and ranks if you are concerned."
- narrate <element[<&a><&l>[ I UNDERSTAND ]].on_click[<entry[accept].command>]>
- narrate <empty>

View File

@@ -0,0 +1,12 @@
liteprofilesutils_data:
debug: false
type: data
rank-sync:
- owner
- admin
- media
sync-op: true
join-leave:
join: <&8>[<&a>+<&8>] <&7><player.name>
leave: <&8>[<&c>-<&8>] <&7><player.name>
welcome: <&8>[<&6><&l>!<&8>] <&e>Welcome <player.name>!

View File

@@ -0,0 +1,126 @@
liteprofilesutils_load_data:
debug: false
type: task
script:
- ~yaml load:../LiteProfiles/data.yml id:liteprofiles_data
liteprofilesutils_get_master_uuid:
debug: false
type: procedure
definitions: player
script:
- determine <placeholder[liteprofiles_masteruuid].player[<[player]>]>
liteprofilesutils_get_profile_limit:
debug: false
type: procedure
definitions: player
script:
- determine <placeholder[liteprofiles_limit].player[<[player]>]>
liteprofilesutils_get_profile_count:
debug: false
type: procedure
definitions: player
script:
- determine <placeholder[liteprofiles_count].player[<[player]>].sub[1]>
liteprofilesutils_show_menu:
debug: false
type: task
definitions: player
script:
- ~run liteprofilesutils_load_data
- define masteruuid <proc[liteprofilesutils_get_master_uuid].context[<[player]>]>
- define profilelimit <proc[liteprofilesutils_get_profile_limit].context[<[player]>]>
- define profilecount <proc[liteprofilesutils_get_profile_count].context[<[player]>]>
- define contents <list[]>
# master uuid
- define masteritem <item[emerald_block]>
- define mastername <proc[character_get_name].context[<player[<[masteruuid]>]>]>
- if <[mastername]> == null:
- define mastername "Unnamed Character"
- adjust def:masteritem display:<&f><[mastername]>
- adjust def:masteritem lore:<list[<&6>Master Profile|<&f>|<&8>UUID:|<&8><[masteruuid]>]>
- flag <[masteritem]> liteprofiles:<map[].with[type].as[master].with[value].as[<[masteruuid]>]>
- define contents <[contents].include[<[masteritem]>]>
# slave uuids
- define sortedslaveitems <list[]>
- foreach <yaml[liteprofiles_data].read[<[masteruuid]>].keys.exclude[active].exclude[<[masteruuid]>]> as:slaveuuid:
- define slaveitem <item[emerald]>
- define slavename <proc[character_get_name].context[<player[<[slaveuuid]>]>]>
- if <[slavename]> == null:
- define slavename "Unnamed Character"
- adjust def:slaveitem display:<&f><[slavename]>
- adjust def:slaveitem lore:<list[<&e>Alt Profile|<&f>|<&8>UUID:|<&8><[slaveuuid]>]>
- flag <[slaveitem]> liteprofiles:<map[].with[type].as[slave].with[value].as[<[slaveuuid]>]>
- define sortedslaveitems <[sortedslaveitems].include[<[slaveitem]>]>
- define sortedslaveitems <[sortedslaveitems].sort_by_value[display]>
- define contents <[contents].include[<[sortedslaveitems]>]>
# free slots
- if <[profilecount]> < <[profilelimit].sub[1]>:
- define freeitem <item[light_blue_dye]>
- adjust def:freeitem "display:<&b>Free Slot"
- adjust def:freeitem lore:<list[<&f>Click here to create a new profile]>
- flag <[freeitem]> liteprofiles:<map[].with[type].as[free]>
- define contents <[contents].include[<[freeitem]>]>
- repeat <[profilelimit].sub[<[profilecount]>]>:
- define unuseditem <item[gray_dye]>
- adjust def:unuseditem "display:<&7>Free Slot"
- define contents <[contents].include[<[unuseditem]>]>
# show
- run liteprofiles_legacy_menus_open def.player:<[player]> def.id:liteprofiles def.page:0 def.contents:<[contents]>
# # # # # # # # # # # # # # # # # # # # # # # # #
# LEGACY MENU LIBRARY PROVIDED IN LITEPROFILES #
# # # # # # # # # # # # # # # # # # # # # # # # #
# buttons
liteprofiles_legacy_menus_button_previous:
debug: false
type: item
material: ender_pearl
display name: <&a><&lt><&lt>
liteprofiles_legacy_menus_button_next:
debug: false
type: item
material: ender_eye
display name: <&a><&gt><&gt>
# generate menu
liteprofiles_legacy_menus_open:
debug: false
type: task
definitions: player|id|page|contents
script:
- define inventory <inventory[generic[title=<&f>邑邑邑邑鄈;size=18]]>
- foreach <[contents].get[<[page].mul[9].add[1]>].to[<[page].add[1].mul[9]>].if_null[<list[]>]> as:item:
- inventory set origin:<[item]> destination:<[inventory]> slot:<[loop_index]>
- if <[page]> > 0:
- inventory set origin:<item[liteprofiles_legacy_menus_button_previous]> destination:<[inventory]> slot:13
- if <[contents].size> > <[page].add[1].mul[9]>:
- inventory set origin:<item[liteprofiles_legacy_menus_button_next]> destination:<[inventory]> slot:15
- flag <[player]> liteprofiles_legacy_menu:<map[].with[id].as[<[id]>].with[page].as[<[page]>].with[contents].as[<[contents]>]>
- define profilelimit <proc[liteprofilesutils_get_profile_limit].context[<[player]>]>
- inventory set origin:<item[paper[display=<&6>How to use;lore=<&7>Your master profile is your original UUID (your main account).|<&7>You will see your other profiles in the menu. Click on any button|<&7>to change to that profile.|<&f>|<&7>You may also create new profiles if you have free slots.|<&7>You currently own <&e><[profilelimit]> profiles<&7>. You may obtain more|<&7>with donation ranks or for animal characters.]]> destination:<[inventory]> slot:10
- inventory open player:<[player]> destination:<[inventory]>
# menu button handler
liteprofiles_legacy_menus_button_handler:
debug: false
type: world
events:
on player clicks in inventory:
- if <context.inventory.title> != <&f>邑邑邑邑鄈:
- stop
- determine cancelled passively
# if air ignore, means button doesnt exist or is to be handled elsewhere
# 13 prev 15 next everything else ignore
- if <context.slot> == 13:
- if <context.item.material.advanced_matches[ender_pearl]>:
- define data <player.flag[liteprofiles_legacy_menu]>
- run liteprofiles_legacy_menus_open def.player:<player> def.id:<[data].get[id]> def.page:<[data].get[page].sub[1]> def.contents:<[data].get[contents]>
- if <context.slot> == 15:
- if <context.item.material.advanced_matches[ender_eye]>:
- define data <player.flag[liteprofiles_legacy_menu]>
- run liteprofiles_legacy_menus_open def.player:<player> def.id:<[data].get[id]> def.page:<[data].get[page].add[1]> def.contents:<[data].get[contents]>

View File

@@ -0,0 +1,95 @@
liteprofilesutils_world:
debug: false
type: world
events:
## load YAML data
after server start:
- ~run liteprofilesutils_load_data
## patch join/leave & rank sync
on player quits:
- define masteruuid <proc[liteprofilesutils_get_master_uuid].context[<player>]>
- define profilelimit <placeholder[liteprofiles_limit]>
#
- flag server liteprofilesutils_lastseengroups:<server.flag[liteprofilesutils_lastseengroups].if_null[<map[]>].with[<[masteruuid]>].as[<player.groups>]>
#
- define lastbestlimit <server.flag[liteprofilesutils_lastbestlimit].if_null[<map[]>]>
- 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>
on player joins:
- define masteruuid <proc[liteprofilesutils_get_master_uuid].context[<player>]>
# sync groups, O(scary)
- define syncgroupdata <script[liteprofilesutils_data].data_key[rank-sync]>
- define lastseengroups <server.flag[liteprofilesutils_lastseengroups].get[<[masteruuid]>].if_null[<list[]>]>
- if <[lastseengroups].is_empty>:
- goto joinmessage
- foreach <[lastseengroups].include[<player.groups>]> as:trygroup:
- define ok false
- foreach <[syncgroupdata]> as:matchgroup:
- if <[trygroup].advanced_matches[<[matchgroup]>]>:
- define ok true
- foreach stop
- if !<[ok]>:
- foreach next
- if <[lastseengroups].contains[<[trygroup]>]>:
- if !<player.in_group[<[trygroup]>]>:
- group add <[trygroup]>
- else:
- if <player.in_group[<[trygroup]>]>:
- group remove <[trygroup]>
- if !<player.in_group[default]>:
- group add default
# sync best perm level
- define bestlimit <server.flag[liteprofilesutils_lastbestlimit].get[<[masteruuid]>].if_null[1]>
- if !<player.has_permission[liteprofiles.limit.<[bestlimit]>]>:
- permission add liteprofiles.limit.<[bestlimit]>
# sync op
- if <player[<[masteruuid]>].is_op>:
- adjust <player> is_op:true
- else:
- adjust <player> is_op:false
# sync whitelist
- if <player[<[masteruuid]>].whitelisted>:
- adjust <player> whitelisted:true
- else:
- adjust <player> whitelisted:false
# adjust join message
- mark joinmessage
- define joinleavedata <script[liteprofilesutils_data].data_key[join-leave]>
- if <player.uuid> == <[masteruuid]>:
- 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>
## prevent /profile remove
on command:
- 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
- narrate "<&c>You are forbidden from performing this operation."
## GUI menu
on player clicks in inventory bukkit_priority:low:
- if <context.inventory.title> != <&f>邑邑邑邑鄈:
- stop
- if <player.flag[liteprofiles_legacy_menu].get[id].if_null[null]> != liteprofiles:
- stop
- if <context.slot> > 45:
- stop
- if <context.item.advanced_matches[air]>:
- stop
# logic
- define data <context.item.flag[liteprofiles].if_null[null]>
- if <[data]> == null:
- stop
- if <[data].get[type]> == master:
- define value <[data].get[value]>
- inventory close
- execute as_player "profile use <[value]>"
- else if <[data].get[type]> == slave:
- define value <[data].get[value]>
- inventory close
- execute as_player "profile use <[value]>"
- else if <[data].get[type]> == free:
- execute as_player "profile add"
- run liteprofilesutils_show_menu def.player:<player>