#### ## GENERAL STUFF #### phones_get_owner: debug: false type: procedure definitions: player|receiver script: - define receiver <[receiver].replace[(].with[].replace[)].with[].replace[-].with[]> - define isnumber <[receiver].regex_matches[^[0-9]+$]> - define target null - if <[isnumber]>: - define target ].if_null[null]> - else: - define target <[player].flag[phones].get[contacts].get[<[receiver]>].if_null[null]> - determine <[target]> phones_has_phone: debug: false type: procedure definitions: player script: - if !<[player].is_online>: - determine false - foreach <[player].inventory.map_slots> key:slot as:item: - if <[item].flag[phones].if_null[false]>: - determine true - determine false phones_relative_name: debug: false type: procedure definitions: player|who script: - if <[player].flag[phones].get[contacts].values.contains[<[who]>].if_null[false]>: - determine <[player].flag[phones].get[contacts].filter_tag[<[filter_value].equals[<[who]>]>].keys.get[1]> - determine <[who].flag[phones].get[number]> phones_clean_message: debug: false type: procedure definitions: message script: - define clean # remove channel marker - if <[message].starts_with[#]>: - define message <[message].substring[3]> # format actions - foreach <[message].split[*]> as:section: - if <[section].trim.length> == 0: - foreach next - if <[loop_index].is_odd>: - define clean "<[clean]> <&f><&dq><[section].trim><&f><&dq>" - else: - define clean "<[clean]> <&e><[section].trim>" # good - determine <[clean].trim> phones_get_contact_state: debug: false type: procedure definitions: player|target script: - if <[target].flag[phones].get[contacts].values.contains[<[player]>].if_null[false]>: - if <[target].is_online>: - if ]>: - determine online - determine offline - determine invisible phones_nicer_format: debug: false type: procedure definitions: number script: - determine "<&7>(+81) <&e>(<[number].substring[1,3]>)-<[number].substring[4,6]>-<[number].substring[7,10]>" phones_get_number: debug: false type: procedure definitions: player script: - determine <[player].flag[phones].get[number]> #### ## GUIS #### phones_gui_home: debug: false type: task definitions: player script: - define inventory "邑邑邑邑鄀<&0>邒]]>" # settings - define settings - adjust def:settings "display:<&6>Settings" - inventory set destination:<[inventory]> slot:13 origin:<[settings]> # contacts - define contacts - adjust def:contacts "display:<&6>Contacts" - inventory set destination:<[inventory]> slot:14 origin:<[contacts]> # texts - define texts - 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: - define notifications_textmessages 99+ - adjust texts lore:● <&7>You have <&6><[notifications_textmessages]> <&7>unread|<&7>text conversations.]> - inventory set destination:<[inventory]> slot:15 origin:<[texts]> # music - define music - adjust def:music "display:<&6>Blocky Music <&3>♫" - adjust def:music "lore:<&7>(music from <&e>noteblock.world<&7>)" - inventory set destination:<[inventory]> slot:22 origin:<[music]> # number - define number - adjust def:number "display:<&6>Your Number" - adjust def:number lore:]>||<&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 open player:<[player]> destination:<[inventory]> - run phones_target_skulls_update def.player:<[player]> # --- # --- contacts related # --- phones_contacts_print: debug: false type: task definitions: player|page script: - define contacts <[player].flag[phones].get[contacts].if_null[]> - if <[contacts].is_empty>: - narrate targets:<[player]> format:formats_prefix "You don't have any contacts." - stop - define contactslist <[contacts].keys.get[<[page].mul[6].add[1]>].to[<[page].add[1].mul[6]>].if_null[]> - narrate targets:<[player]> format:formats_prefix "<&e>OpenPhones Contacts<&nl>" # show contacts - foreach <[contactslist]> as:receiver: - define target <[contacts].get[<[receiver]>]> # state - define contactstate |<[target]>]> - if <[contactstate]> == invisible: - define contactstate <&7>⏺ - else if <[contactstate]> == online: - define contactstate <&a>⏺ - else if <[contactstate]> == offline: - define contactstate <&c>⏺ # - define contact "<[contactstate]> <&e>]>]> <&7><&o>(<[receiver]>)" - narrate <[contact]> # page buttons - define prevpage <&7><<>-- - define nextpage <&7>--<>> - if <[page]> > 0: - clickable usages:1 until:60s save:prev: - execute as_player "phonecontacts <[page]>" - define prevpage "<<>--].on_click[]>" - if <[contacts].size> > <[page].add[1].mul[6]>: - clickable usages:1 until:60s save:next: - execute as_player "phonecontacts <[page].add[2]>" - define nextpage "--<>>].on_click[]>" - narrate targets:<[player]> "<&nl><[prevpage]> <&6>Page <[page].add[1]>/<[contacts].size.sub[1].div[6].round_down.add[1]> <[nextpage]>" # --- # --- texts related # --- phones_texts_store: debug: false type: task definitions: player|target|contents script: - narrate targets:<[player]> format:formats_prefix "Sending..." # - define playertexts phones_texts_<[player].uuid>_<[target].uuid> - if _<[target].uuid>.yml]>: - ~yaml id:<[playertexts]> load:data/phones/texts/<[player].uuid>_<[target].uuid>.yml - else: - ~yaml id:<[playertexts]> create - yaml id:<[playertexts]> set messages.:]> - ~yaml savefile:data/phones/texts/<[player].uuid>_<[target].uuid>.yml id:<[playertexts]> - ~yaml id:phones_texts_<[player].uuid>_<[target].uuid> unload # - define targettexts phones_texts_<[target].uuid>_<[player].uuid> - if _<[player].uuid>.yml]>: - ~yaml id:<[targettexts]> load:data/phones/texts/<[target].uuid>_<[player].uuid>.yml - else: - ~yaml id:<[targettexts]> create - yaml id:<[targettexts]> set messages.:]> - ~yaml savefile:data/phones/texts/<[target].uuid>_<[player].uuid>.yml id:<[targettexts]> - ~yaml id:phones_texts_<[target].uuid>_<[player].uuid> unload # send - define relative |<[target]>]> - narrate targets:<[player]> "<&6>[<&7>T<&6>] <&e>You ➠ <[relative]> <&2>sent '<[contents]>' via text" # notify or send - if <[target].is_online>: - if <[target].item_in_hand.has_flag[phones]>: - define inverserelative |<[player]>]> - narrate targets:<[target]> "<&6>[<&7>T<&6>] <&e><[inverserelative]> ➠ You <&2>sent '<[contents]>' via text" - else: - narrate targets:<[target]> "<&6>[<&7>T<&6>] <&e>You received a text message." - else: - define notifications <[target].flag[phones_notifications].if_null[]> - define textnotifications <[notifications].get[textmessages].if_null[]> - define textnotifications <[textnotifications].with[<[player]>].as[<[textnotifications].get[<[player]>].if_null[0].add[1]>]> - define notifications <[notifications].with[textmessages].as[<[textnotifications]>]> - flag <[target]> phones_notifications:<[notifications]> phones_texts_print: debug: false type: task definitions: player|target|page script: - 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 - define messages_size ].read[messages].size> - define message_keys ].read[messages].keys.reverse.get[<[page].mul[5].add[1]>].to[<[page].add[1].mul[5]>].if_null[]> - define messages - foreach <[message_keys]> as:timestamp: - define messages <[messages].with[]>].as[].read[messages.<[timestamp]>]>]> - ~yaml id:phones_texts_<[player].uuid>_<[target].uuid> unload # - define relative |<[target]>]> - narrate targets:<[player]> format:formats_prefix "<&e>Messages with <[relative]><&nl>" - foreach <[messages]> key:timestamp as:message: - define when ].formatted> - if <[message].get[origin]> == sender: - narrate targets:<[player]> "<&7>You: <&f><[message].get[value]> <&7>(<[when]> ago)" - else: - narrate targets:<[player]> "<&e><[relative]><&7>: <&f><[message].get[value]> <&7>(<[when]> ago)" # page buttons - define prevpage <&7><<>-- - define nextpage <&7>--<>> - 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 "<<>--].on_click[]>" - 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 "--<>>].on_click[]>" - 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: - define notifications <[player].flag[phones_notifications].if_null[]> - define textnotifications <[notifications].get[textmessages].if_null[]> - define textnotifications <[textnotifications].exclude[<[target]>]> - define notifications <[notifications].with[textmessages].as[<[textnotifications]>]> - flag <[player]> phones_notifications:<[notifications]> phones_gui_texts: debug: false type: task definitions: player|page script: - define inventory "邑邑邑邑鄀<&1>邒]]>" - define textslist ]].parse[split[_].get[2].split[.].get[1]].parse_tag[]>].get[<[page].mul[16].add[1]>].to[<[page].add[1].mul[16]>].if_null[]> # show contacts/numbers - foreach <[textslist]> as:target: - define receiver |<[target]>]> - define textsender - adjust def:textsender display:<&e><[receiver]> - adjust def:textsender "lore: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.]>" # - 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]> # back - define back - adjust def:back display:<&7>Back - inventory set destination:<[inventory]> slot:50 origin:<[back]> # page buttons - if <[page]> > 0: - define prevpage - adjust def:prevpage "display:<&a>Previous Page" - inventory set destination:<[inventory]> slot:49 origin:<[prevpage]> - if <[textslist].size> > <[page].add[1].mul[16]>: - define nextpage - adjust def:nextpage "display:<&a>Next Page" - 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[].is_empty>: - stop - define uuid <[item].flag[phones_target_skull_uuid]> - inventory adjust slot:<[slot]> skull_skin:<[uuid]>|].skin_blob.if_null[0000]>|].name> destination:<[inventory]> #### ## NOTIFICATIONS #### phones_notify_text_messages: debug: false type: task definitions: player|delayseconds script: - wait <[delayseconds]>s - if !<[player].is_online>: - stop - define notifications_textmessages <[player].flag[phones_notifications].get[textmessages].values.filter[equals[0].not].sum.if_null[null]> - if <[notifications_textmessages]> == null || <[notifications_textmessages]> == 0: - stop - if <[notifications_textmessages]> > 99: - define notifications_textmessages 99+ - narrate targets:<[player]> format:formats_prefix "You have <&6><[notifications_textmessages]> <&7>unread text conversations." #### ## MUSIC APP #### phones_music_play: debug: false type: task definitions: player|songfile script: - if <[player].nbs_is_playing>: - nbs stop targets:<[player]> - nbs file:data/phones/songs/<[songfile]> play targets:<[player]> - narrate targets:<[player]> format:formats_prefix "Playing song..." phones_music_stop: debug: false type: task definitions: player script: - if !<[player].nbs_is_playing>: - narrate targets:<[player]> format:formats_prefix "No song is playing right now." - stop - nbs stop targets:<[player]> - narrate targets:<[player]> format:formats_prefix "Stopped song." phones_gui_music: debug: false type: task definitions: player|page|ringtone script: # ringtone selection mode? - define ringtone <[ringtone].if_null[false]> # make inventory - define inventory "邑邑邑邑鄀<&2>邒]]>" - if <[ringtone]>: - define inventory "邑邑邑邑鄀<&4>邒]]>" - define songsize - define songsonpage ].pass[15].fail[14]> - define songlist ].add[1]>].to[<[page].add[1].mul[<[songsonpage]>]>].if_null[]> # show songs - foreach <[songlist]> as:songname: - define song - adjust def:song display:<&e><[songname]> - adjust def:song "lore: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 - if !<[ringtone]>: - define stop - adjust def:stop display:<&c>Stop - inventory set destination:<[inventory]> slot:42 origin:<[stop]> # back - define back - adjust def:back display:<&7>Back - inventory set destination:<[inventory]> slot:50 origin:<[back]> # page buttons - if <[page]> > 0: - define prevpage - adjust def:prevpage "display:<&a>Previous Page" - inventory set destination:<[inventory]> slot:49 origin:<[prevpage]> - if <[songsize]> > <[page].add[1].mul[<[songsonpage]>]>: - define nextpage - adjust def:nextpage "display:<&a>Next Page" - inventory set destination:<[inventory]> slot:51 origin:<[nextpage]> # - inventory open player:<[player]> destination:<[inventory]> ### ## SETTINGS ### phones_gui_settings: debug: false type: task definitions: player script: - define inventory "邑邑邑邑鄀<&3>邒]]>" # ringtone - define ringtone - adjust def:ringtone display:<&6>Ringtone - adjust def:ringtone "lore:<&7>(music from <&e>noteblock.world<&7>)" - inventory set destination:<[inventory]> slot:4 origin:<[ringtone]> # blocked - define blocked - adjust def:blocked "display:<&6>Blocked Numbers" - inventory set destination:<[inventory]> slot:5 origin:<[blocked]> # back - define back - adjust def:back display:<&7>Back - inventory set destination:<[inventory]> slot:50 origin:<[back]> # - inventory open player:<[player]> destination:<[inventory]> phones_gui_settings_blocked: debug: false type: task definitions: player|page script: - define inventory "邑邑邑邑鄀<&5>邒]]>" - define blockedlist <[player].flag[phones].get[blocked].get[<[page].mul[16].add[1]>].to[<[page].add[1].mul[16]>].if_null[]> # show blocked numbers - foreach <[blockedlist]> as:target: - define blockednumber ]> - define blocked - adjust def:blocked display:<&e><[blockednumber]> - adjust def:blocked lore:You may use /phoneunblock to unblock this number.]> - flag <[blocked]> 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:<[blocked]> # back - define back - adjust def:back display:<&7>Back - inventory set destination:<[inventory]> slot:50 origin:<[back]> # page buttons - if <[page]> > 0: - define prevpage - adjust def:prevpage "display:<&a>Previous Page" - inventory set destination:<[inventory]> slot:49 origin:<[prevpage]> - if <[blockedlist].size> > <[page].add[1].mul[16]>: - define nextpage - adjust def:nextpage "display:<&a>Next Page" - inventory set destination:<[inventory]> slot:51 origin:<[nextpage]> # - inventory open player:<[player]> destination:<[inventory]> - run phones_target_skulls_update def.player:<[player]>