-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathomg_manager.verse
112 lines (95 loc) · 4.18 KB
/
omg_manager.verse
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Simulation/Tags }
using { /Verse.org/Random }
using { /Fortnite.com/Game }
# See https://dev.epicgames.com/documentation/en-us/uefn/create-your-own-device-in-verse for how to create a verse device.
# A Verse-authored creative device that can be placed in a level
omg_manager := class(creative_device):
var OmgPlayers:[player]omg_player = map{}
@editable IntoStasisButtons : []button_device = array{}
@editable OutOfStasisButtons : []button_device = array{}
# Runs when the device is started in a running game
OnBegin<override>()<suspends>:void =
Print("omg manager on begin!")
Print("setting up stasis button events...")
for (Button: IntoStasisButtons):
Button.InteractedWithEvent.Subscribe(OnIntoStasisButtonPressed)
for (Button: OutOfStasisButtons):
Button.InteractedWithEvent.Subscribe(OnOutOfStasisButtonPressed)
Print("setting up player events...")
# GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerRemoved)
GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerLeftServer)
InitPlayerSpawners()
OnIntoStasisButtonPressed(Agent: agent):void =
Print("Into stasis button pressed!")
if:
Player := player[Agent],
FortChar := Player.GetFortCharacter[]
then:
SpiderWeb(Player, 3.0)
# 这个spider web一定是需要严谨化
SpiderWeb(Player: agent, duration:float):void =
Print("Spider web function start...")
if:
FortChar := Player.GetFortCharacter[]
then:
FortChar.PutInStasis(stasis_args{})
spawn:
OutStasisCoroutine(Player, duration)
OutStasisCoroutine(Player: agent, duration:float)<suspends>:void =
Print("Out of stasis coroutine start...")
if:
FortChar := Player.GetFortCharacter[]
then:
Sleep(duration)
FortChar.ReleaseFromStasis()
OnOutOfStasisButtonPressed(Player: agent):void =
Print("Out of stasis button pressed!")
if:
FortChar := Player.GetFortCharacter[]
then:
FortChar.ReleaseFromStasis()
OnPlayerLeftServer(PlayerLeaving: player):void =
if:
OmgPlayer := OmgPlayers[PlayerLeaving]
then:
Print("Player left server, hp? {OmgPlayer.CurrentHealth} ")
# remove the player from the map to reduce memory usage
# first try immutable method
var NewCustomPlayerMap:[player]omg_player = map{}
for (Player -> storedOmgPlayer: OmgPlayers, Player <> PlayerLeaving):
set NewCustomPlayerMap = ConcatenateMaps(NewCustomPlayerMap, map{Player => storedOmgPlayer})
set OmgPlayers = NewCustomPlayerMap
InitPlayerSpawners():void =
Spawners := GetCreativeObjectsWithTag(tagSpawner{})
for (Obj: Spawners):
if (Spawner := player_spawner_device[Obj]):
Spawner.SpawnedEvent.Subscribe(OnPlayerSpawned)
OnPlayerSpawned(Agent: agent):void ={
Print("Player spawned! Check whether it's a respawn...")
InitPlayerAtSpawn(Agent)}
InitPlayerAtSpawn(Agent: agent):void =
Print("init player triggered from spawn event")
if:
Player := player[Agent]
Fort := Player.GetFortCharacter[]
then:
if(Existing := OmgPlayers[Player]) {}
else:
Fort.EliminatedEvent().Subscribe(OnPlayerEliminated)
NewOmgPlayer := omg_player{Player:= Player, FortChar := Fort}
if( set OmgPlayers[Player] = NewOmgPlayer):
NewOmgPlayer.Setup()
OnPlayerEliminated(Result: elimination_result):void =
Print("Player eliminated!" )
if:
Eliminator := Result.EliminatingCharacter?,
Eliminatee := Result.EliminatedCharacter,
TorAgent := Eliminator.GetAgent[],
TeeAgent := Eliminatee.GetAgent[]
then:
# OmgPlayer.Eliminated := true
#