Initial commit
This commit is contained in:
113
scripts/sports/football/sports_football_tasks.dsc
Normal file
113
scripts/sports/football/sports_football_tasks.dsc
Normal file
@@ -0,0 +1,113 @@
|
||||
sports_football_join:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|player|team
|
||||
script:
|
||||
- define extra <proc[sports_arena].context[<[id]>].get[extra_data]>
|
||||
- if <[team]> == red:
|
||||
- teleport <[player]> <[extra].get[red_start]>
|
||||
- else if <[team]> == blue:
|
||||
- teleport <[player]> <[extra].get[blue_start]>
|
||||
- run sports_football_update_glow def.id:<[id]>
|
||||
- define count <proc[sports_arena_player_count].context[<[id]>]>
|
||||
- if <[count]> == 2:
|
||||
- define teams <proc[sports_arena_teams].context[<[id]>]>
|
||||
- repeat 3:
|
||||
- title targets:<[teams].get[red].include[<[teams].get[blue]>]> title:<&6><element[3].sub[<[value].sub[1]>]> fade_in:0 fade_out:0 stay:1s
|
||||
- wait 1s
|
||||
- if <proc[sports_arena_player_count].context[<[id]>]> < 2:
|
||||
- stop
|
||||
- run sports_football_restart_game def.id:<[id]>
|
||||
- if <[count]> < 2:
|
||||
- run sports_football_idle_game def.id:<[id]>
|
||||
|
||||
sports_football_leave:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|player
|
||||
script:
|
||||
- define extra <proc[sports_arena].context[<[id]>].get[extra_data]>
|
||||
- teleport <[player]> <[extra].get[exit]>
|
||||
- glow <[player]> reset
|
||||
- if <proc[sports_arena_player_count].context[<[id]>]> <= 1:
|
||||
- run sports_football_idle_game def.id:<[id]>
|
||||
|
||||
sports_football_redistribute:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|player|from|to
|
||||
script:
|
||||
- define extra <proc[sports_arena].context[<[id]>].get[extra_data]>
|
||||
- if <[to]> == red:
|
||||
- teleport <[player]> <[extra].get[red_start]>
|
||||
- narrate targets:<[player]> format:formats_prefix "You were auto-balanced to the <&c>red team"
|
||||
- else if <[to]> == blue:
|
||||
- teleport <[player]> <[extra].get[blue_start]>
|
||||
- narrate targets:<[player]> format:formats_prefix "You were auto-balanced to the <&9>blue team"
|
||||
- run sports_football_update_glow def.id:<[id]>
|
||||
|
||||
sports_football_restart_game:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id
|
||||
script:
|
||||
- define arena <proc[sports_arena].context[<[id]>]>
|
||||
- define extra <[arena].get[extra_data]>
|
||||
- run sports_arena_redistribute def.id:<[id]>
|
||||
- define teams <proc[sports_arena_teams].context[<[id]>]>
|
||||
- run sports_football_update_glow def.id:<[id]>
|
||||
- foreach <[teams].get[red]> as:red_player:
|
||||
- teleport <[red_player]> <[extra].get[red_start]>
|
||||
- foreach <[teams].get[blue]> as:blue_player:
|
||||
- teleport <[blue_player]> <[extra].get[blue_start]>
|
||||
- run sports_arena_set_status def.id:<[id]> def.status:normal
|
||||
- run ball_create def.id:sports_football def.location:<[extra].get[ball_start]> def.size:<[arena].get[ball_size]> def.display_item:<[arena].get[ball_display]> def.gravity_multiplier:<[arena].get[ball_gravity]>
|
||||
- glow <proc[ball_get].context[<[id]>]> true for:<[teams].get[red].include[<[teams].get[blue]>]>
|
||||
- narrate targets:<[teams].get[red].include[<[teams].get[blue]>]> format:formats_prefix "Next round..."
|
||||
- title targets:<[teams].get[red].include[<[teams].get[blue]>]> "title:<&e>Next Round" fade_in:0 fade_out:0 stay:1s
|
||||
- playsound <[teams].get[red].include[<[teams].get[blue]>]> sound:BLOCK_NOTE_BLOCK_PLING pitch:1 volume:30
|
||||
|
||||
sports_football_update_glow:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id
|
||||
script:
|
||||
- define teams <proc[sports_arena_teams].context[<[id]>]>
|
||||
- foreach <[teams].get[red]> as:red_player:
|
||||
- glow <[red_player]> true for:<[teams].get[red]>
|
||||
- glow <[red_player]> false for:<[teams].get[blue]>
|
||||
- foreach <[teams].get[blue]> as:blue_player:
|
||||
- glow <[blue_player]> true for:<[teams].get[blue]>
|
||||
- glow <[blue_player]> false for:<[teams].get[red]>
|
||||
|
||||
sports_football_idle_game:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id
|
||||
script:
|
||||
- define extra <proc[sports_arena].context[<[id]>].get[extra_data]>
|
||||
- define teams <proc[sports_arena_teams].context[<[id]>]>
|
||||
- run sports_arena_set_status def.id:<[id]> def.status:waiting
|
||||
- run ball_remove def.id:<[id]>
|
||||
- teleport <[teams].get[red].include[<[teams].get[blue]>]> <[extra].get[ball_start]>
|
||||
- narrate targets:<[teams].get[red].include[<[teams].get[blue]>]> format:formats_prefix "Not enough players. Waiting..."
|
||||
- title targets:<[teams].get[red].include[<[teams].get[blue]>]> title:<&7>Waiting fade_in:0 fade_out:0 stay:3s
|
||||
- playsound <[teams].get[red].include[<[teams].get[blue]>]> sound:BLOCK_NOTE_BLOCK_HAT pitch:1 volume:30
|
||||
|
||||
sports_football_score_goal:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|team
|
||||
script:
|
||||
- run sports_arena_set_status def.id:<[id]> def.status:goal
|
||||
- define teams <proc[sports_arena_teams].context[<[id]>]>
|
||||
- if <[team]> == red:
|
||||
- title targets:<[teams].get[red].include[<[teams].get[blue]>]> "title:<&c>Goal for Red" fade_in:0 fade_out:0 stay:2s
|
||||
- narrate targets:<[teams].get[red].include[<[teams].get[blue]>]> format:formats_prefix "<&c>Red team <&7>scored a goal!"
|
||||
- if <[team]> == blue:
|
||||
- title targets:<[teams].get[red].include[<[teams].get[blue]>]> "title:<&9>Goal for Blue" fade_in:0 fade_out:0 stay:2s
|
||||
- narrate targets:<[teams].get[red].include[<[teams].get[blue]>]> format:formats_prefix "<&9>Blue team <&7>scored a goal!"
|
||||
- playsound <[teams].get[red].include[<[teams].get[blue]>]> sound:BLOCK_NOTE_BLOCK_PLING pitch:2 volume:30
|
||||
- playsound <[teams].get[red].include[<[teams].get[blue]>]> sound:ENTITY_FIREWORK_ROCKET_TWINKLE_FAR pitch:1 volume:30
|
||||
- wait 3s
|
||||
- run sports_football_restart_game def.id:<[id]>
|
||||
55
scripts/sports/football/sports_football_world.dsc
Normal file
55
scripts/sports/football/sports_football_world.dsc
Normal file
@@ -0,0 +1,55 @@
|
||||
sports_football_world:
|
||||
debug: false
|
||||
type: world
|
||||
events:
|
||||
## ball click
|
||||
on player damages entity bukkit_priority:low:
|
||||
- ratelimit <player> 10t
|
||||
- if !<context.entity.has_flag[ball]>:
|
||||
- stop
|
||||
- if !<context.entity.flag[ball].starts_with[sports_football]>:
|
||||
- stop
|
||||
- if !<player.has_flag[sports]>:
|
||||
- stop
|
||||
- define arena_id <player.flag[sports].get[id]>
|
||||
- if !<[arena_id].starts_with[sports_football]>:
|
||||
- stop
|
||||
- if <proc[sports_arena_get_status].context[<[arena_id]>]> != normal:
|
||||
- stop
|
||||
- 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 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]>
|
||||
## out of bounds & ball collision
|
||||
on player walks:
|
||||
- if !<player.has_flag[sports]>:
|
||||
- stop
|
||||
- define arena_id <player.flag[sports].get[id]>
|
||||
- if !<[arena_id].starts_with[sports_football]>:
|
||||
- stop
|
||||
- if <proc[sports_arena_get_status].context[<[arena_id]>]> != normal:
|
||||
- stop
|
||||
# ball collision
|
||||
- define ball <proc[ball_get].context[<[arena_id]>]>
|
||||
- if <player.location.y.add[0.1]> > <[ball].location.y>:
|
||||
- if <player.location.distance_squared[<[ball].location>]> < 0.5:
|
||||
- run ball_vector_add def.ball:<[ball]> def.vector:<[ball].location.sub[<player.location>].normalize.mul[0.5].add[0,0.05,0]>
|
||||
- ratelimit <player> 10t
|
||||
## goal scoring
|
||||
on custom event id:ball_move bukkit_priority:low:
|
||||
- if !<context.ball_id.starts_with[sports_football]>:
|
||||
- stop
|
||||
- define arena_id <context.ball_id>
|
||||
- if <proc[sports_arena_get_status].context[<[arena_id]>]> != normal:
|
||||
- stop
|
||||
- define extra <proc[sports_arena].context[<[arena_id]>].get[extra_data]>
|
||||
- if <[extra].get[red_goal].contains[<context.now>]> || <[extra].get[red_goal].contains[<context.next>]>:
|
||||
- run sports_football_score_goal def.id:<[arena_id]> def.team:blue
|
||||
- else if <[extra].get[blue_goal].contains[<context.now>]> || <[extra].get[blue_goal].contains[<context.next>]>:
|
||||
- run sports_football_score_goal def.id:<[arena_id]> def.team:red
|
||||
217
scripts/sports/sports_tasks.dsc
Normal file
217
scripts/sports/sports_tasks.dsc
Normal file
@@ -0,0 +1,217 @@
|
||||
sports_arena_register:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|cuboid|max_per_team|ball_display|ball_size|ball_gravity|on_join_task|on_leave_task|on_redistribute_task|default_status|extra_data
|
||||
script:
|
||||
- definemap arena:
|
||||
id: <[id]>
|
||||
cuboid: <[cuboid]>
|
||||
max_per_team: <[max_per_team]>
|
||||
ball_display: <[ball_display]>
|
||||
ball_size: <[ball_size]>
|
||||
ball_gravity: <[ball_gravity]>
|
||||
on_join_task: <[on_join_task]>
|
||||
on_leave_task: <[on_leave_task]>
|
||||
on_redistribute_task: <[on_redistribute_task]>
|
||||
default_status: <[default_status]>
|
||||
extra_data: <[extra_data]>
|
||||
- flag server sports_arenas:<server.flag[sports_arenas].if_null[<map[]>].with[<[id]>].as[<[arena]>]>
|
||||
- flag server sports_status:<server.flag[sports_status].if_null[<map[]>].with[<[id]>].as[<[default_status]>]>
|
||||
|
||||
sports_arena_update_property:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|property|new_value
|
||||
script:
|
||||
- define arena <server.flag[sports_arenas].if_null[<map[]>].get[<[id]>]>
|
||||
- if !<[arena].keys.contains[<[property]>]>:
|
||||
- narrate "<&c> Could not update arena property: <[property]> is an inexistent property."
|
||||
- stop
|
||||
- define arena <[arena].with[<[property]>].as[<[new_value]>]>
|
||||
- flag server sports_arenas:<server.flag[sports_arenas].if_null[<map[]>].with[<[id]>].as[<[arena]>]>
|
||||
|
||||
sports_arena_exists:
|
||||
debug: false
|
||||
type: procedure
|
||||
definitions: id
|
||||
script:
|
||||
- determine <server.flag[sports_arenas].contains[<[id]>].if_null[false]>
|
||||
|
||||
sports_arena_cleanup:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id
|
||||
script:
|
||||
- define on_leave_task <server.flag[sports_arenas].get[<[id]>].get[on_leave_task]>
|
||||
- foreach <server.flag[sports_teams].get[<[id]>].get[red].if_null[<list[]>]> as:player:
|
||||
- run <[on_leave_task]> def.id:<[id]> def.player:<[player]>
|
||||
- foreach <server.flag[sports_teams].get[<[id]>].get[blue].if_null[<list[]>]> as:player:
|
||||
- run <[on_leave_task]> def.id:<[id]> def.player:<[player]>
|
||||
- flag server sports_teams:<server.flag[sports_teams].if_null[<map[]>].exclude[<[id]>]>
|
||||
- define default_status <server.flag[sports_arenas].get[<[id]>].get[default_status]>
|
||||
- flag server sports_status:<server.flag[sports_status].if_null[<map[]>].with[<[id]>].as[<[default_status]>]>
|
||||
|
||||
sports_arena_unregister:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id
|
||||
script:
|
||||
- run sports_arena_cleanup def.id:<[id]>
|
||||
- flag server sports_arenas:<server.flag[sports_arenas].if_null[<map[]>].exclude[<[id]>]>
|
||||
- flag server sports_status:<server.flag[sports_status].if_null[<map[]>].exclude[<[id]>]>
|
||||
|
||||
sports_arena:
|
||||
debug: false
|
||||
type: procedure
|
||||
definitions: id
|
||||
script:
|
||||
- determine <server.flag[sports_arenas].if_null[<map[]>].get[<[id]>]>
|
||||
|
||||
sports_arena_can_join:
|
||||
debug: false
|
||||
type: procedure
|
||||
definitions: id|team
|
||||
script:
|
||||
- define max_per_team <server.flag[sports_arenas].get[<[id]>].get[max_per_team]>
|
||||
- define teams <server.flag[sports_teams].get[<[id]>].if_null[<map[].with[red].as[<list[]>].with[blue].as[<list[]>]>]>
|
||||
- define red <[teams].get[red]>
|
||||
- define blue <[teams].get[blue]>
|
||||
- if <[red].size> >= <[max_per_team]> && <[blue].size> >= <[max_per_team]>:
|
||||
- determine false
|
||||
- else if <[red].size> >= <[max_per_team]>:
|
||||
- determine blue
|
||||
- else if <[blue].size> >= <[max_per_team]>:
|
||||
- determine red
|
||||
- determine any
|
||||
|
||||
sports_arena_player_count:
|
||||
debug: false
|
||||
type: procedure
|
||||
definitions: id
|
||||
script:
|
||||
- define teams <server.flag[sports_teams].get[<[id]>].if_null[<map[].with[red].as[<list[]>].with[blue].as[<list[]>]>]>
|
||||
- define red <[teams].get[red]>
|
||||
- define blue <[teams].get[blue]>
|
||||
- determine <[red].size.add[<[blue].size>]>
|
||||
|
||||
sports_arena_teams:
|
||||
debug: false
|
||||
type: procedure
|
||||
definitions: id
|
||||
script:
|
||||
- define teams <server.flag[sports_teams].get[<[id]>].if_null[<map[].with[red].as[<list[]>].with[blue].as[<list[]>]>]>
|
||||
- define red <[teams].get[red]>
|
||||
- define blue <[teams].get[blue]>
|
||||
- determine <map[].with[red].as[<[red]>].with[blue].as[<[blue]>]>
|
||||
|
||||
# team is "red" or "blue"
|
||||
sports_arena_join:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|player|team
|
||||
script:
|
||||
- define teams <server.flag[sports_teams].get[<[id]>].if_null[<map[].with[red].as[<list[]>].with[blue].as[<list[]>]>]>
|
||||
- define teams <[teams].with[<[team]>].as[<[teams].get[<[team]>].include[<[player]>].deduplicate>]>
|
||||
- flag <[player]> sports:<map[].with[id].as[<[id]>].with[team].as[<[team]>]>
|
||||
- flag server sports_teams:<server.flag[sports_teams].if_null[<map[]>].with[<[id]>].as[<[teams]>]>
|
||||
- define on_join_task <server.flag[sports_arenas].get[<[id]>].get[on_join_task]>
|
||||
- run <[on_join_task]> def.id:<[id]> def.player:<[player]> def.team:<[team]>
|
||||
|
||||
sports_arena_join_auto:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|player
|
||||
script:
|
||||
- define teams <server.flag[sports_teams].get[<[id]>].if_null[<map[].with[red].as[<list[]>].with[blue].as[<list[]>]>]>
|
||||
- define red <[teams].get[red]>
|
||||
- define blue <[teams].get[blue]>
|
||||
- define on_join_task <server.flag[sports_arenas].get[<[id]>].get[on_join_task]>
|
||||
- if <[red].size> < <[blue].size>:
|
||||
- define teams <[teams].with[red].as[<[red].include[<[player]>].deduplicate>]>
|
||||
- flag <[player]> sports:<map[].with[id].as[<[id]>].with[team].as[red]>
|
||||
- flag server sports_teams:<server.flag[sports_teams].if_null[<map[]>].with[<[id]>].as[<[teams]>]>
|
||||
- run <[on_join_task]> def.id:<[id]> def.player:<[player]> def.team:red
|
||||
- else:
|
||||
- define teams <[teams].with[blue].as[<[blue].include[<[player]>].deduplicate>]>
|
||||
- flag <[player]> sports:<map[].with[id].as[<[id]>].with[team].as[blue]>
|
||||
- flag server sports_teams:<server.flag[sports_teams].if_null[<map[]>].with[<[id]>].as[<[teams]>]>
|
||||
- run <[on_join_task]> def.id:<[id]> def.player:<[player]> def.team:blue
|
||||
|
||||
sports_arena_leave:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|player
|
||||
script:
|
||||
- define teams <server.flag[sports_teams].get[<[id]>].if_null[<map[].with[red].as[<list[]>].with[blue].as[<list[]>]>]>
|
||||
- define teams <[teams].with[red].as[<[teams].get[red].exclude[<[player]>]>]>
|
||||
- define teams <[teams].with[blue].as[<[teams].get[blue].exclude[<[player]>]>]>
|
||||
- flag <[player]> sports:!
|
||||
- flag server sports_teams:<server.flag[sports_teams].if_null[<map[]>].with[<[id]>].as[<[teams]>]>
|
||||
- define on_leave_task <server.flag[sports_arenas].get[<[id]>].get[on_leave_task]>
|
||||
- run <[on_leave_task]> def.id:<[id]> def.player:<[player]>
|
||||
|
||||
sports_arena_redistribute:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id
|
||||
script:
|
||||
- define teams <server.flag[sports_teams].get[<[id]>].if_null[<map[].with[red].as[<list[]>].with[blue].as[<list[]>]>]>
|
||||
- define red <[teams].get[red]>
|
||||
- define blue <[teams].get[blue]>
|
||||
- if <[red].size.sub[1]> > <[blue].size>:
|
||||
- define random <[red].random>
|
||||
- define teams <[teams].with[red].as[<[red].exclude[<[random]>].deduplicate>]>
|
||||
- define teams <[teams].with[blue].as[<[blue].include[<[random]>].deduplicate>]>
|
||||
- flag <[random]> sports:<map[].with[id].as[<[id]>].with[team].as[red]>
|
||||
- flag server sports_teams:<server.flag[sports_teams].if_null[<map[]>].with[<[id]>].as[<[teams]>]>
|
||||
- define on_redistribute_task <server.flag[sports_arenas].get[<[id]>].get[on_redistribute_task]>
|
||||
- run <[on_redistribute_task]> def.id:<[id]> def.player:<[random]> def.from:red def.to:blue
|
||||
- determine red
|
||||
- if <[blue].size.sub[1]> > <[red].size>:
|
||||
- define random <[blue].random>
|
||||
- define teams <[teams].with[blue].as[<[blue].exclude[<[random]>].deduplicate>]>
|
||||
- define teams <[teams].with[red].as[<[red].include[<[random]>].deduplicate>]>
|
||||
- flag <[random]> sports:<map[].with[id].as[<[id]>].with[team].as[blue]>
|
||||
- flag server sports_teams:<server.flag[sports_teams].if_null[<map[]>].with[<[id]>].as[<[teams]>]>
|
||||
- define on_redistribute_task <server.flag[sports_arenas].get[<[id]>].get[on_redistribute_task]>
|
||||
- run <[on_redistribute_task]> def.id:<[id]> def.player:<[random]> def.from:blue def.to:red
|
||||
- determine blue
|
||||
- determine none
|
||||
|
||||
sports_arena_set_status:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|status
|
||||
script:
|
||||
- flag server sports_status:<server.flag[sports_status].if_null[<map[]>].with[<[id]>].as[<[status]>]>
|
||||
|
||||
sports_arena_get_status:
|
||||
debug: false
|
||||
type: procedure
|
||||
definitions: id
|
||||
script:
|
||||
- determine <server.flag[sports_status].if_null[<map[]>].get[<[id]>]>
|
||||
|
||||
sports_arena_enter_arena_prompt:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|player
|
||||
script:
|
||||
- ratelimit <[player]> 2s
|
||||
- clickable save:join_arena usages:1 until:30s:
|
||||
- if <[player].has_flag[sports]>:
|
||||
- stop
|
||||
- run sports_arena_join_auto def.id:<[id]> def.player:<[player]>
|
||||
- narrate targets:<[player]> format:formats_prefix "Join this game? <element[<&a><&l>[YES]].on_click[<entry[join_arena].command>]>"
|
||||
|
||||
sports_arena_exit_arena_prompt:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|player
|
||||
script:
|
||||
- ratelimit <[player]> 2s
|
||||
- clickable save:leave_arena usages:1 until:30s:
|
||||
- if !<[player].has_flag[sports]>:
|
||||
- stop
|
||||
- run sports_arena_leave def.id:<[id]> def.player:<[player]>
|
||||
- narrate targets:<[player]> format:formats_prefix "Leave this game? <element[<&a><&l>[YES]].on_click[<entry[leave_arena].command>]>"
|
||||
83
scripts/sports/sports_world.dsc
Normal file
83
scripts/sports/sports_world.dsc
Normal file
@@ -0,0 +1,83 @@
|
||||
sports_arena_collision_world:
|
||||
debug: false
|
||||
type: world
|
||||
events:
|
||||
on custom event id:ball_move:
|
||||
- if !<context.ball_id.starts_with[sports_]>:
|
||||
- stop
|
||||
- define arena <proc[sports_arena].context[<context.ball_id>]>
|
||||
- define cuboid <[arena].get[cuboid]>
|
||||
- define corners <[cuboid].corners>
|
||||
# axis-aligned boundary reflection algorithm
|
||||
- define min <[corners].get[1]>
|
||||
- define max <[corners].get[8]>
|
||||
- define damping 0.75
|
||||
- define new_next <context.next>
|
||||
- define new_velocity <context.velocity_t1>
|
||||
- define bounced false
|
||||
- define min_x <[min].x>
|
||||
- define max_x <[max].x>
|
||||
- define min_y <[min].y>
|
||||
- define max_y <[max].y>
|
||||
- define min_z <[min].z>
|
||||
- define max_z <[max].z>
|
||||
# X
|
||||
- if <[new_next].x> < <[min_x]>:
|
||||
- define new_next <[new_next].with_x[<[min_x]>]>
|
||||
- define new_velocity <[new_velocity].with_x[<[new_velocity].x.mul[-<[damping]>]>]>
|
||||
- define bounced true
|
||||
- if <[new_next].x> > <[max_x]>:
|
||||
- define new_next <[new_next].with_x[<[max_x]>]>
|
||||
- define new_velocity <[new_velocity].with_x[<[new_velocity].x.mul[-<[damping]>]>]>
|
||||
- define bounced true
|
||||
# Y
|
||||
- if <[new_next].y> < <[min_y]>:
|
||||
- define new_next <[new_next].with_y[<[min_y]>]>
|
||||
- define new_velocity <[new_velocity].with_y[<[new_velocity].y.mul[-<[damping]>]>]>
|
||||
- define bounced true
|
||||
- if <[new_next].y> > <[max_y]>:
|
||||
- define new_next <[new_next].with_y[<[max_y]>]>
|
||||
- define new_velocity <[new_velocity].with_y[<[new_velocity].y.mul[-<[damping]>]>]>
|
||||
- define bounced true
|
||||
# Z
|
||||
- if <[new_next].z> < <[min_z]>:
|
||||
- define new_next <[new_next].with_z[<[min_z]>]>
|
||||
- define new_velocity <[new_velocity].with_z[<[new_velocity].z.mul[-<[damping]>]>]>
|
||||
- define bounced true
|
||||
- if <[new_next].z> > <[max_z]>:
|
||||
- define new_next <[new_next].with_z[<[max_z]>]>
|
||||
- define new_velocity <[new_velocity].with_z[<[new_velocity].z.mul[-<[damping]>]>]>
|
||||
- define bounced true
|
||||
# update to bounce
|
||||
- if <[bounced]>:
|
||||
- determine output:<[new_next]> passively
|
||||
- determine output:<[new_velocity]> passively
|
||||
on player walks:
|
||||
- if !<player.has_flag[sports]>:
|
||||
- define arenas <server.flag[sports_arenas]>
|
||||
- foreach <[arenas]> as:arena:
|
||||
- if <[arena].get[cuboid].contains[<context.new_location>]> && !<[arena].get[cuboid].contains[<context.old_location>]>:
|
||||
- if <player.gamemode> == survival || <player.gamemode> == adventure:
|
||||
- determine cancelled passively
|
||||
- run sports_arena_enter_arena_prompt def.id:<[arena].get[id]> def.player:<player>
|
||||
- stop
|
||||
- else:
|
||||
- define arena_id <player.flag[sports].get[id]>
|
||||
- define arena <proc[sports_arena].context[<[arena_id]>]>
|
||||
- if !<[arena].get[cuboid].contains[<context.new_location>]> && !<[arena].get[cuboid].contains[<context.old_location>]>:
|
||||
- if <player.gamemode> == survival || <player.gamemode> == adventure:
|
||||
- determine cancelled passively
|
||||
- run sports_arena_exit_arena_prompt def.id:<[arena_id]> def.player:<player>
|
||||
on player quits:
|
||||
- if !<player.has_flag[sports]>:
|
||||
- stop
|
||||
- define arena_id <player.flag[sports].get[id]>
|
||||
- run sports_arena_leave def.id:<[arena_id]> def.player:<player>
|
||||
|
||||
sports_arena_cleanup_world:
|
||||
debug: false
|
||||
type: world
|
||||
events:
|
||||
after server start:
|
||||
- foreach <server.flag[sports_arenas]> as:arena:
|
||||
- run sports_arena_cleanup def.id:<[arena].get[id]>
|
||||
100
scripts/sports/volleyball/sports_volleyball_tasks.dsc
Normal file
100
scripts/sports/volleyball/sports_volleyball_tasks.dsc
Normal file
@@ -0,0 +1,100 @@
|
||||
sports_volleyball_join:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|player|team
|
||||
script:
|
||||
- define extra <proc[sports_arena].context[<[id]>].get[extra_data]>
|
||||
- if <[team]> == red:
|
||||
- teleport <[player]> <[extra].get[red_start]>
|
||||
- else if <[team]> == blue:
|
||||
- teleport <[player]> <[extra].get[blue_start]>
|
||||
- define count <proc[sports_arena_player_count].context[<[id]>]>
|
||||
- if <[count]> == 2:
|
||||
- define teams <proc[sports_arena_teams].context[<[id]>]>
|
||||
- repeat 3:
|
||||
- title targets:<[teams].get[red].include[<[teams].get[blue]>]> title:<&6><element[3].sub[<[value].sub[1]>]> fade_in:0 fade_out:0 stay:1s
|
||||
- wait 1s
|
||||
- if <proc[sports_arena_player_count].context[<[id]>]> < 2:
|
||||
- stop
|
||||
- run sports_volleyball_restart_game def.id:<[id]> def.side:red
|
||||
- stop
|
||||
- if <[count]> < 2:
|
||||
- run sports_volleyball_idle_game def.id:<[id]>
|
||||
|
||||
sports_volleyball_leave:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|player
|
||||
script:
|
||||
- define extra <proc[sports_arena].context[<[id]>].get[extra_data]>
|
||||
- teleport <[player]> <[extra].get[exit]>
|
||||
- glow <[player]> reset
|
||||
- define ball <proc[ball_get].context[<[id]>].if_null[null]>
|
||||
- if <proc[sports_arena_player_count].context[<[id]>]> <= 1:
|
||||
- run sports_volleyball_idle_game def.id:<[id]>
|
||||
|
||||
sports_volleyball_redistribute:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|player|from|to
|
||||
script:
|
||||
- define extra <proc[sports_arena].context[<[id]>].get[extra_data]>
|
||||
- if <[to]> == red:
|
||||
- teleport <[player]> <[extra].get[red_start]>
|
||||
- narrate targets:<[player]> format:formats_prefix "You were auto-balanced to the <&c>red team"
|
||||
- else if <[to]> == blue:
|
||||
- teleport <[player]> <[extra].get[blue_start]>
|
||||
- narrate targets:<[player]> format:formats_prefix "You were auto-balanced to the <&9>blue team"
|
||||
|
||||
sports_volleyball_restart_game:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|side
|
||||
script:
|
||||
- define arena <proc[sports_arena].context[<[id]>]>
|
||||
- define extra <[arena].get[extra_data]>
|
||||
- run sports_arena_redistribute def.id:<[id]>
|
||||
- define teams <proc[sports_arena_teams].context[<[id]>]>
|
||||
- foreach <[teams].get[red]> as:red_player:
|
||||
- teleport <[red_player]> <[extra].get[red_start]>
|
||||
- foreach <[teams].get[blue]> as:blue_player:
|
||||
- teleport <[blue_player]> <[extra].get[blue_start]>
|
||||
- run sports_arena_set_status def.id:<[id]> def.status:<tern[<[side].equals[red]>].pass[red_start].fail[blue_start]>
|
||||
- define ball_start <tern[<[side].equals[red]>].pass[<[extra].get[red_ball_start]>].fail[<[extra].get[blue_ball_start]>]>
|
||||
- run ball_create def.id:<[id]> def.location:<[ball_start]> def.size:<[arena].get[ball_size]> def.display_item:<[arena].get[ball_display]> def.gravity_multiplier:<[arena].get[ball_gravity]>
|
||||
- narrate targets:<[teams].get[red].include[<[teams].get[blue]>]> format:formats_prefix "Next round..."
|
||||
- title targets:<[teams].get[red].include[<[teams].get[blue]>]> "title:<&e>Next Round" fade_in:0 fade_out:0 stay:1s
|
||||
- playsound <[teams].get[red].include[<[teams].get[blue]>]> sound:BLOCK_NOTE_BLOCK_PLING pitch:1 volume:30
|
||||
|
||||
sports_volleyball_idle_game:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id
|
||||
script:
|
||||
- define extra <proc[sports_arena].context[<[id]>].get[extra_data]>
|
||||
- define teams <proc[sports_arena_teams].context[<[id]>]>
|
||||
- run sports_arena_set_status def.id:<[id]> def.status:waiting
|
||||
- run ball_remove def.id:<[id]>
|
||||
- teleport <[teams].get[red]> <[extra].get[red_start]>
|
||||
- teleport <[teams].get[blue]> <[extra].get[blue_start]>
|
||||
- narrate targets:<[teams].get[red].include[<[teams].get[blue]>]> format:formats_prefix "Not enough players. Waiting..."
|
||||
- title targets:<[teams].get[red].include[<[teams].get[blue]>]> title:<&7>Waiting fade_in:0 fade_out:0 stay:3s
|
||||
- playsound <[teams].get[red].include[<[teams].get[blue]>]> sound:BLOCK_NOTE_BLOCK_HAT pitch:1 volume:30
|
||||
|
||||
sports_volleyball_score_goal:
|
||||
debug: false
|
||||
type: task
|
||||
definitions: id|team
|
||||
script:
|
||||
- run sports_arena_set_status def.id:<[id]> def.status:goal
|
||||
- define teams <proc[sports_arena_teams].context[<[id]>]>
|
||||
- if <[team]> == red:
|
||||
- title targets:<[teams].get[red].include[<[teams].get[blue]>]> "title:<&c>Point for Red" fade_in:0 fade_out:0 stay:2s
|
||||
- narrate targets:<[teams].get[red].include[<[teams].get[blue]>]> format:formats_prefix "<&c>Red team <&7>scored a goal!"
|
||||
- if <[team]> == blue:
|
||||
- title targets:<[teams].get[red].include[<[teams].get[blue]>]> "title:<&9>Point for Blue" fade_in:0 fade_out:0 stay:2s
|
||||
- narrate targets:<[teams].get[red].include[<[teams].get[blue]>]> format:formats_prefix "<&9>Blue team <&7>scored a goal!"
|
||||
- playsound <[teams].get[red].include[<[teams].get[blue]>]> sound:BLOCK_NOTE_BLOCK_PLING pitch:2 volume:30
|
||||
- playsound <[teams].get[red].include[<[teams].get[blue]>]> sound:ENTITY_FIREWORK_ROCKET_TWINKLE_FAR pitch:1 volume:30
|
||||
- wait 3s
|
||||
- run sports_volleyball_restart_game def.id:<[id]> def.side:<tern[<[team].equals[red]>].pass[red].fail[blue]>
|
||||
67
scripts/sports/volleyball/sports_volleyball_world.dsc
Normal file
67
scripts/sports/volleyball/sports_volleyball_world.dsc
Normal file
@@ -0,0 +1,67 @@
|
||||
sports_volleyball_world:
|
||||
debug: false
|
||||
type: world
|
||||
events:
|
||||
## ball click
|
||||
on player damages entity bukkit_priority:low:
|
||||
- ratelimit <player> 10t
|
||||
- define ball <context.entity>
|
||||
- if !<[ball].has_flag[ball]>:
|
||||
- stop
|
||||
- if <[ball].entity_type> == armor_stand:
|
||||
- define ball <proc[ball_get].context[<[ball].flag[ball]>]>
|
||||
- if !<[ball].flag[ball].starts_with[sports_volleyball]>:
|
||||
- stop
|
||||
- if !<player.has_flag[sports]>:
|
||||
- stop
|
||||
- define arena_id <player.flag[sports].get[id]>
|
||||
- if !<[arena_id].starts_with[sports_volleyball]>:
|
||||
- stop
|
||||
- define status <proc[sports_arena_get_status].context[<[arena_id]>]>
|
||||
- if <[status]> == normal:
|
||||
- if <player.location.with_y[<[ball].location.y>].distance_squared[<[ball].location>]> > 22:
|
||||
- stop
|
||||
- define y <player.eye_location.direction.vector.y>
|
||||
- if <[y]> < 0.45:
|
||||
- define y 0.45
|
||||
- if <[y]> > 0.95:
|
||||
- define y 0.95
|
||||
- define kick <player.eye_location.direction.vector.mul[0.58].with_y[<[y]>]>
|
||||
- if <player.is_sneaking>:
|
||||
- define kick <location[0,0.525,0]>
|
||||
- if !<player.is_on_ground>:
|
||||
- define kick <location[0,0.375,0]>
|
||||
- define kick <[kick].add[<player.eye_location.direction.vector.with_y[0].mul[0.35]>]>
|
||||
- define kick <[kick].add[<location[0,0,0].sub[<[ball].flag[ball_velocity]>]>]>
|
||||
- run ball_vector_add def.ball:<[ball]> def.vector:<[kick]>
|
||||
- flag <[ball]> sports_volleyball_delay_score:!
|
||||
- else if <[status]> == blue_start || <[status]> == red_start:
|
||||
- run sports_arena_set_status def.id:<[arena_id]> def.status:normal
|
||||
- define kick <player.eye_location.direction.vector.mul[0.58].with_y[0.75]>
|
||||
- run ball_vector_add def.ball:<[ball]> def.vector:<[kick]>
|
||||
- playsound <[ball].location> sound:BLOCK_STONE_BREAK pitch:1.8
|
||||
## point scored
|
||||
on custom event id:ball_move bukkit_priority:low:
|
||||
- if !<context.ball_id.starts_with[sports_volleyball]>:
|
||||
- stop
|
||||
- define arena_id <context.ball_id>
|
||||
- if <proc[sports_arena_get_status].context[<[arena_id]>]> != normal:
|
||||
- define status <proc[sports_arena_get_status].context[<[arena_id]>]>
|
||||
- if <[status]> == blue_start || <[status]> == red_start:
|
||||
- determine cancelled
|
||||
- stop
|
||||
- if !<context.ball.has_flag[sports_volleyball_delay_score]>:
|
||||
- if !<context.bounced>:
|
||||
- stop
|
||||
- flag <context.ball> sports_volleyball_delay_score:<util.current_time_millis>
|
||||
- stop
|
||||
- else:
|
||||
- if <util.current_time_millis.sub[<context.ball.flag[sports_volleyball_delay_score]>]> < 300:
|
||||
- stop
|
||||
- define extra <proc[sports_arena].context[<[arena_id]>].get[extra_data]>
|
||||
- define red_start <[extra].get[red_start]>
|
||||
- define blue_start <[extra].get[blue_start]>
|
||||
- if <context.next.distance_squared[<[red_start]>]> < <context.next.distance_squared[<[blue_start]>]>:
|
||||
- run sports_volleyball_score_goal def.id:<[arena_id]> def.team:blue
|
||||
- else:
|
||||
- run sports_volleyball_score_goal def.id:<[arena_id]> def.team:red
|
||||
Reference in New Issue
Block a user