# Copyright Epic Games, Inc. All Rights Reserved.
using { /Fortnite.com/Devices }
using { /Fortnite.com/Teams }
using { /Verse.org/Simulation }
using { /Verse.org/Simulation/Tags }
# Copyright Epic Games, Inc. All Rights Reserved.
using { /Verse.org/Simulation/Tags }
DominationSpawnTags<public> := module:
Tag_SpawnGroup<public>:= class(tag){}
Tag_SpawnGroup_Initial<public>:= class(Tag_SpawnGroup){}
Tag_SpawnGroup_GroupA<public>:= class(Tag_SpawnGroup){}
Tag_SpawnGroup_GroupB<public>:= class(Tag_SpawnGroup){}
Tag_SpawnGroup_GroupC<public>:= class(Tag_SpawnGroup){}
Tag_TeamOwnership<public>:= class(tag){}
Tag_TeamOwnership_Team1<public>:= class(Tag_TeamOwnership){}
Tag_TeamOwnership_Team2<public>:= class(Tag_TeamOwnership){}
## この仕掛けはプレイヤー スポナーを管理します
## 一連の初期スポナーが有効になります
## しばらくすると、初期のスポナーは無効になります
## そこから、各キャプチャー ポイントに関連付けられているチーム スポーンが、重み付けスコアに基づいて有効/無効になります
## ポイントを所有すると、重み付けスコアに 1 が加算されます (チーム 2 の場合は -1)
## エリア内に味方がいる場合、重み付けスコアに 1 が加算されます (チーム 2 の場合は -1)
## 重み付けスコアが 0 より大きい場合、チーム 1 はそのポイントの近くでスポーンすることができます。
## 重み付けスコアが 0 未満の場合、チーム 2 はポイントの近くでスポーンすることができます
##################################################################
## イベント ハンドラ クラス - キャプチャー ポイントごとに 1 つスポーンし、そのキャプチャー ポイントを使用してイベントをバインドします
##################################################################
capture_point_event_handler := class:
CapturePointIndex:int
DominationSpawnManagerRef:domination_spawn_manager
TeamCollectionRef:fort_team_collection
var CaptureWeightOfThisPoint:int = 0
var PlayerWeightOfThisPoint:float = 0.0
WeightForEachPlayer:float = 0.5
# チーム 1 の場合は 1 を返します。チーム 2 の場合は -1 を返します。
GetTeamDirectionOfAgent<private>(MyAgent:agent)<transacts>:int=
if (FirstTeam := TeamCollectionRef.GetTeams()[0]):
if (TeamCollectionRef.IsOnTeam[MyAgent, FirstTeam]):
return 1
return -1
# キャプチャー ポイントの状態を設定します
OnCaptured(MyAgent:agent):void=
set CaptureWeightOfThisPoint = GetTeamDirectionOfAgent(MyAgent)
DominationSpawnManagerRef.CalculateWeightForPoint(CapturePointIndex)
# プレイヤーの出入りに応じて、ポイントのプレイヤーの重み付けを変えます
PlayerEnteredLargeZone(MyAgent:agent):void=
set PlayerWeightOfThisPoint = PlayerWeightOfThisPoint + (GetTeamDirectionOfAgent(MyAgent) * WeightForEachPlayer)
DominationSpawnManagerRef.CalculateWeightForPoint(CapturePointIndex)
PlayerLeftLargeZone(MyAgent:agent):void=
set PlayerWeightOfThisPoint = PlayerWeightOfThisPoint - (GetTeamDirectionOfAgent(MyAgent) * WeightForEachPlayer)
DominationSpawnManagerRef.CalculateWeightForPoint(CapturePointIndex)
##################################################################
## ドミネーション スポーン マネージャー クラス
##################################################################
domination_spawn_manager := class(creative_device):
# プレイヤー スポナーの仕掛けグループ - Verse タグを検索して追加します
var SpawnPointGroupInitial:[]player_spawner_device = array{}
var SpawnPointGroupsCapPoint:[][]player_spawner_device = array{array{}, array{}, array{}}
# キャプチャー ゾーン
@editable
CapturePoints:[]capture_area_device = array{}
@editable
LargeZones:[]player_counter_device = array{}
# 初期スポナーは、この秒数が経過した後に無効になります
InitialGroupDisableTime:float = 5.0
# キャプチャー ポイント イベント ハンドラ クラスの参照
var CapturePointListeners:[]capture_point_event_handler = array{}
# OnBegin がゲーム開始時に実行されます
OnBegin<override>()<suspends>:void=
BeginPlayEventSubscriptions()
FindAndCacheSpawnDevices()
DisableInitialSpawnGroup()
# 属性トリガーからイベントをサブスクライブします
BeginPlayEventSubscriptions<private>():void=
for (I -> EachCapPoint:CapturePoints):
MyHandler := capture_point_event_handler:
CapturePointIndex := I
DominationSpawnManagerRef := Self
TeamCollectionRef := Self.GetPlayspace().GetTeamCollection()
set CapturePointListeners = CapturePointListeners + array{MyHandler}
EachCapPoint.ControlChangeEvent.Subscribe(MyHandler.OnCaptured)
if (EachLargeZone := LargeZones[I]):
EachLargeZone.CountedEvent.Subscribe(MyHandler.PlayerEnteredLargeZone)
EachLargeZone.RemovedEvent.Subscribe(MyHandler.PlayerLeftLargeZone)
# さまざまなプレイヤー スポナーの仕掛けをすべて取得し、適切な配列に格納します
FindAndCacheSpawnDevices<private>():void=
InitialSpawnPoints:[]creative_object_interface = GetCreativeObjectsWithTag(DominationSpawnTags.Tag_SpawnGroup_Initial{})
for (FoundDevice : InitialSpawnPoints, DeviceAsSpawner:= player_spawner_device[FoundDevice]):
set SpawnPointGroupInitial = SpawnPointGroupInitial + array{DeviceAsSpawner}
GroupTags:[]tag = array:
DominationSpawnTags.Tag_SpawnGroup_GroupA{}
DominationSpawnTags.Tag_SpawnGroup_GroupB{}
DominationSpawnTags.Tag_SpawnGroup_GroupC{}
for (I -> GroupTag:GroupTags):
FoundSpawnGroup:[]creative_object_interface := GetCreativeObjectsWithTag(GroupTag)
for (FoundDevice : FoundSpawnGroup, DeviceAsSpawner:= player_spawner_device[FoundDevice]):
if:
set SpawnPointGroupsCapPoint[I] = SpawnPointGroupsCapPoint[I] + array{DeviceAsSpawner}
# 初期スポーン ポイントをオフにします
DisableInitialSpawnGroup<private>()<suspends>:void=
Sleep(InitialGroupDisableTime)
for (SpawnPoint : SpawnPointGroupInitial):
SpawnPoint.Disable()
# ポイントの CapPointCaptureWeight または CapPointPlayerWeight が変更されるたびに、これを実行して、関連付けられているスポーン グループからスポーンすることが許可される必要のある人物を確認します
CalculateWeightForPoint(PointIndex:int):void=
var WeightOfPoint:int = 0
if:
CapPointData := CapturePointListeners[PointIndex]
CapPlayerWeightToInt := Floor[CapPointData.PlayerWeightOfThisPoint]
then:
set WeightOfPoint = CapPointData.CaptureWeightOfThisPoint + CapPlayerWeightToInt
for (SpawnDevice:SpawnPointGroupsCapPoint[PointIndex]):
var DeviceIsTeam1:logic = false
DeviceTags := SpawnDevice.GetTags()
if (DeviceTags.Has[DominationSpawnTags.Tag_TeamOwnership_Team1{}]):
set DeviceIsTeam1 = true
if (DeviceIsTeam1?):
if (WeightOfPoint > 0):
SpawnDevice.Enable()
else:
SpawnDevice.Disable()
else:
if (WeightOfPoint < 0):
SpawnDevice.Enable()
else:
SpawnDevice.Disable()
URL:Deserted:Domination テンプレート | Unreal Editor for Fortnite ドキュメンテーション | Epic Developer Community
I’m using this as a reference.
Adding and customizing the Core Devices
Player Spawn Pad Devices
↑now
What is missing from this code?
I don’t see any errors, but I do see a warning message.
I’ve just started, so I’d be very happy to learn how to study too.
/WorldSetting.verse(251,83, 251,86) : Script warning 2011: This expression in the right operand of 'set ... = ...' can fail, but the meaning of failure here will change in a future version of Verse. To preserve the current meaning of this code in future versions of Verse, you should move the expression that can fail outside the 'set'.
For example, if you have the expression:
set Variable = ExpressionThatMightFail[],
you can change it to the following two expressions to preserve the meaning:
Value := ExpressionThatMightFail[]