diff --git a/Assets/GameData/Action/Abilities/Vector Fence.asset b/Assets/GameData/Action/Abilities/Vector Fence.asset
new file mode 100644
index 0000000..6d809ec
--- /dev/null
+++ b/Assets/GameData/Action/Abilities/Vector Fence.asset
@@ -0,0 +1,25 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 71c78dee15b407d4183dd799c1b1a39f, type: 3}
+ m_Name: Vector Fence
+ m_EditorClassIdentifier:
+ abilityKey: VectorFence
+ abilityName: Vector Fence
+ abilityRadius: 0
+ abilityMagnitude: 0
+ abilityDuration: 10
+ abilityCooldownTime: 3
+ prefab: {fileID: 9694722736535169, guid: 9b94ed8895919e84aa669628b0761eaf, type: 3}
+ wallLength: 5
+ wallWidth: 0.5
+ wallHeight: 1
+ scaleUpDuration: 1
diff --git a/Assets/GameData/Action/Abilities/Vector Fence.asset.meta b/Assets/GameData/Action/Abilities/Vector Fence.asset.meta
new file mode 100644
index 0000000..dd81b14
--- /dev/null
+++ b/Assets/GameData/Action/Abilities/Vector Fence.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 834f18926d3364d40ab9894f716b4e3b
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GameData/NetworkPrefabs.asset b/Assets/GameData/NetworkPrefabs.asset
index ca9799d..8360ccf 100644
--- a/Assets/GameData/NetworkPrefabs.asset
+++ b/Assets/GameData/NetworkPrefabs.asset
@@ -79,3 +79,8 @@ MonoBehaviour:
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
+ - Override: 0
+ Prefab: {fileID: 9694722736535169, guid: 9b94ed8895919e84aa669628b0761eaf, type: 3}
+ SourcePrefabToOverride: {fileID: 0}
+ SourceHashToOverride: 0
+ OverridingTargetPrefab: {fileID: 0}
diff --git a/Assets/Prefabs/Abilities/VectorFencePrefab.prefab b/Assets/Prefabs/Abilities/VectorFencePrefab.prefab
new file mode 100644
index 0000000..dcbe94f
--- /dev/null
+++ b/Assets/Prefabs/Abilities/VectorFencePrefab.prefab
@@ -0,0 +1,160 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &9694722736535169
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1756252046645169901}
+ - component: {fileID: 7200474853122004856}
+ - component: {fileID: 5290524345172392442}
+ - component: {fileID: 550742182908126467}
+ - component: {fileID: 8921202503349013827}
+ - component: {fileID: 5807442085122568602}
+ - component: {fileID: -7009867759405921325}
+ m_Layer: 0
+ m_Name: VectorFencePrefab
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1756252046645169901
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9694722736535169}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 8, y: 1, z: 0.5}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &7200474853122004856
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9694722736535169}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &5290524345172392442
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9694722736535169}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!65 &550742182908126467
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9694722736535169}
+ m_Material: {fileID: 0}
+ m_IncludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_ExcludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_LayerOverridePriority: 0
+ m_IsTrigger: 0
+ m_ProvidesContacts: 0
+ m_Enabled: 1
+ serializedVersion: 3
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!208 &8921202503349013827
+NavMeshObstacle:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9694722736535169}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_Shape: 1
+ m_Extents: {x: 0.5, y: 0.5, z: 0.5}
+ m_MoveThreshold: 0.1
+ m_Carve: 1
+ m_CarveOnlyStationary: 1
+ m_Center: {x: 0, y: 0, z: 0}
+ m_TimeToStationary: 0.5
+--- !u!114 &5807442085122568602
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9694722736535169}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ GlobalObjectIdHash: 3892629208
+ InScenePlacedSourceGlobalObjectIdHash: 0
+ AlwaysReplicateAsRoot: 0
+ SynchronizeTransform: 1
+ ActiveSceneSynchronization: 0
+ SceneMigrationSynchronization: 1
+ SpawnWithObservers: 1
+ DontDestroyWithOwner: 0
+ AutoObjectParentSync: 1
+--- !u!114 &-7009867759405921325
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9694722736535169}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9a951069c9ff70a479b426f4310ca775, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ Ability: {fileID: 11400000, guid: 834f18926d3364d40ab9894f716b4e3b, type: 2}
diff --git a/Assets/Prefabs/Abilities/VectorFencePrefab.prefab.meta b/Assets/Prefabs/Abilities/VectorFencePrefab.prefab.meta
new file mode 100644
index 0000000..f38c681
--- /dev/null
+++ b/Assets/Prefabs/Abilities/VectorFencePrefab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9b94ed8895919e84aa669628b0761eaf
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Prefabs/Abilities/WallAbilityIndicator.prefab b/Assets/Prefabs/Abilities/WallAbilityIndicator.prefab
new file mode 100644
index 0000000..d68c6d6
--- /dev/null
+++ b/Assets/Prefabs/Abilities/WallAbilityIndicator.prefab
@@ -0,0 +1,85 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &3894374618083898175
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3764456690617734740}
+ - component: {fileID: 2500946308868101064}
+ - component: {fileID: 1322199249233456991}
+ m_Layer: 0
+ m_Name: WallAbilityIndicator
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 0
+--- !u!4 &3764456690617734740
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3894374618083898175}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: 0.5913096, z: -0, w: 0.8064447}
+ m_LocalPosition: {x: 7.958935, y: 3.7648613e-17, z: 6.871315}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &2500946308868101064
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3894374618083898175}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1322199249233456991
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3894374618083898175}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 3a415e4b90d5e7346a544b94fa0f34bd, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
diff --git a/Assets/Prefabs/Abilities/WallAbilityIndicator.prefab.meta b/Assets/Prefabs/Abilities/WallAbilityIndicator.prefab.meta
new file mode 100644
index 0000000..8589de5
--- /dev/null
+++ b/Assets/Prefabs/Abilities/WallAbilityIndicator.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: bfc4217c8584ae04385dcac0be33d77e
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Prefabs/Character/PlayerAvatar.prefab b/Assets/Prefabs/Character/PlayerAvatar.prefab
index a4a6cff..d75bab0 100644
--- a/Assets/Prefabs/Character/PlayerAvatar.prefab
+++ b/Assets/Prefabs/Character/PlayerAvatar.prefab
@@ -68,6 +68,77 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_ClientVisualsAnimator: {fileID: 1829276847453002016}
m_VisualizationConfiguration: {fileID: 11400000, guid: 9504973cdecd65749889771972fa0117, type: 2}
+--- !u!1001 &2846064494856670853
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 6009713983291384766}
+ m_Modifications:
+ - target: {fileID: 3764456690617734740, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3764456690617734740, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3764456690617734740, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3764456690617734740, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 3764456690617734740, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3764456690617734740, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3764456690617734740, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3764456690617734740, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3764456690617734740, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3764456690617734740, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3894374618083898175, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ propertyPath: m_Name
+ value: WallAbilityIndicator
+ objectReference: {fileID: 0}
+ - target: {fileID: 3894374618083898175, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ propertyPath: m_IsActive
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+--- !u!1 &1257869342993333690 stripped
+GameObject:
+ m_CorrespondingSourceObject: {fileID: 3894374618083898175, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ m_PrefabInstance: {fileID: 2846064494856670853}
+ m_PrefabAsset: {fileID: 0}
+--- !u!4 &1387471517613578449 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 3764456690617734740, guid: bfc4217c8584ae04385dcac0be33d77e, type: 3}
+ m_PrefabInstance: {fileID: 2846064494856670853}
+ m_PrefabAsset: {fileID: 0}
--- !u!1001 &3984775118419009769
PrefabInstance:
m_ObjectHideFlags: 0
@@ -193,7 +264,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 4600110157238723790, guid: 0d2d836e2e83b754fa1a1c4022d6d65d, type: 3}
propertyPath: GlobalObjectIdHash
- value: 3737985212
+ value: 3177087589
objectReference: {fileID: 0}
- target: {fileID: 4600110157238723790, guid: 0d2d836e2e83b754fa1a1c4022d6d65d, type: 3}
propertyPath: PrefabHashGenerator
@@ -278,6 +349,9 @@ PrefabInstance:
- targetCorrespondingSourceObject: {fileID: 4600110157238723791, guid: 0d2d836e2e83b754fa1a1c4022d6d65d, type: 3}
insertIndex: -1
addedObject: {fileID: 248483794971195069}
+ - targetCorrespondingSourceObject: {fileID: 4600110157238723791, guid: 0d2d836e2e83b754fa1a1c4022d6d65d, type: 3}
+ insertIndex: -1
+ addedObject: {fileID: 1387471517613578449}
m_AddedComponents:
- targetCorrespondingSourceObject: {fileID: 4600110157238723781, guid: 0d2d836e2e83b754fa1a1c4022d6d65d, type: 3}
insertIndex: -1
@@ -763,7 +837,9 @@ MonoBehaviour:
abilities:
- {fileID: 11400000, guid: e4794e2f71f66a74486c797344695ce7, type: 2}
- {fileID: 11400000, guid: 6c697d5efda1b0147b0c3f4088ee62f9, type: 2}
+ - {fileID: 11400000, guid: 834f18926d3364d40ab9894f716b4e3b, type: 2}
currentAbilityIndicator: {fileID: 92142163933926358}
+ wallIndicator: {fileID: 1257869342993333690}
--- !u!114 &4321537148236331373
MonoBehaviour:
m_ObjectHideFlags: 0
diff --git a/Assets/Scenes/Startup.unity b/Assets/Scenes/Startup.unity
index f29fa43..00cefd6 100644
--- a/Assets/Scenes/Startup.unity
+++ b/Assets/Scenes/Startup.unity
@@ -1528,6 +1528,10 @@ PrefabInstance:
propertyPath: SlowDownAbilityKey
value: DashNCrash
objectReference: {fileID: 0}
+ - target: {fileID: 370034730102636685, guid: 4512c09d24f3fa147afb198fa90d63c6, type: 3}
+ propertyPath: VectorWallAbilityKey
+ value: VectorFence
+ objectReference: {fileID: 0}
- target: {fileID: 370034730102636685, guid: 4512c09d24f3fa147afb198fa90d63c6, type: 3}
propertyPath: m_GeneralSwapActionPrototype
value:
diff --git a/Assets/Scripts/Gameplay/Ability.cs b/Assets/Scripts/Gameplay/Ability.cs
index 01c562e..21c3757 100644
--- a/Assets/Scripts/Gameplay/Ability.cs
+++ b/Assets/Scripts/Gameplay/Ability.cs
@@ -17,7 +17,7 @@ public abstract class Ability : ScriptableObject
///
/// Executes the ability's specific behavior.
///
- public abstract void Execute(ServerCharacter character, Vector3 targetPosition);
+ public abstract void Execute(ServerCharacter character, Vector3 targetPosition, Vector3 targetRotation);
///
/// Retrieves the prefab associated with this ability.
diff --git a/Assets/Scripts/Gameplay/AbilitySystem.cs b/Assets/Scripts/Gameplay/AbilitySystem.cs
index 14f7d35..7f4c938 100644
--- a/Assets/Scripts/Gameplay/AbilitySystem.cs
+++ b/Assets/Scripts/Gameplay/AbilitySystem.cs
@@ -14,18 +14,82 @@ public class AbilitySystem : NetworkBehaviour
private bool isAbilityActive = false;
private HashSet abilitiesOnCooldown = new HashSet();
[SerializeField] private GameObject currentAbilityIndicator;
+ [SerializeField] private GameObject wallIndicator; // Separate indicator for the wall
+
void Update()
{
if (isAbilityActive)
{
- UpdateIndicatorPosition();
+ if (activeAbility.abilityKey == "VectorFence")
+ {
+ // Use wallIndicator for VectorFence
+ if (!wallIndicator.activeSelf)
+ {
+ wallIndicator.SetActive(true);
+ currentAbilityIndicator.SetActive(false);
+ }
- if (Input.GetMouseButtonDown(0))
+ if (Input.GetMouseButtonDown(0))
+ {
+ // Save the spawn position for the wall
+ Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
+ if (Physics.Raycast(ray, out RaycastHit hit))
+ {
+ wallIndicator.transform.position = hit.point;
+ // wallIndicator.transform.rotation = Quaternion.identity; // Reset rotation
+ wallIndicator.transform.localScale = new Vector3(((VectorFenceAbility) activeAbility).wallLength,
+ ((VectorFenceAbility) activeAbility).wallHeight,
+ ((VectorFenceAbility) activeAbility).wallWidth);
+ }
+ }
+
+ if (Input.GetMouseButton(0))
+ {
+ // Rotate the wall using Mouse X for Y-axis rotation
+ float mouseX = Input.GetAxis("Mouse X");
+ wallIndicator.transform.Rotate(Vector3.up, mouseX); // Adjust rotation speed if needed
+ }
+
+ if (Input.GetMouseButtonUp(0))
+ {
+ // Place the wall at the saved position and rotation
+ UseActiveAbility();
+ }
+ }
+ else
{
- UseActiveAbility();
+ // Use currentAbilityIndicator for all other abilities
+ if (!currentAbilityIndicator.activeSelf)
+ {
+ currentAbilityIndicator.SetActive(true);
+ wallIndicator.SetActive(false);
+ }
+
+ UpdateIndicatorPosition();
+
+ if (Input.GetMouseButtonDown(0))
+ {
+ UseActiveAbility();
+ }
}
}
+ else
+ {
+ // Deactivate both indicators when ability mode is inactive
+ currentAbilityIndicator.SetActive(false);
+ wallIndicator.SetActive(false);
+ }
+ }
+
+ private void UpdateIndicatorForVectorFence(Vector3 center, Vector3 direction, float length)
+ {
+ if (wallIndicator != null)
+ {
+ wallIndicator.transform.position = center;
+ wallIndicator.transform.rotation = Quaternion.LookRotation(direction);
+ wallIndicator.transform.localScale = new Vector3(length, 1, 0.2f); // Adjust wall width & height
+ }
}
public void ActivateAbilityByKey(string key)
@@ -69,7 +133,6 @@ public class AbilitySystem : NetworkBehaviour
{
isAbilityActive = true;
activeAbility = ability;
- currentAbilityIndicator?.SetActive(true);
Debug.Log($"Ability {ability.abilityName} activated! Click to use.");
}
@@ -77,7 +140,6 @@ public class AbilitySystem : NetworkBehaviour
{
isAbilityActive = false;
activeAbility = null;
- currentAbilityIndicator?.SetActive(false);
Debug.Log("Ability mode deactivated.");
}
@@ -86,8 +148,22 @@ public class AbilitySystem : NetworkBehaviour
if (activeAbility != null)
{
Debug.Log($"[AbilitySystem] Using active ability {activeAbility.abilityName}.");
- Vector3 targetPosition = currentAbilityIndicator.transform.position;
- RequestAbilityActivationServerRpc(activeAbility.abilityKey, targetPosition);
+
+ Vector3 targetPosition;
+ Vector3 targetRotation;
+
+ if (activeAbility.abilityKey == "VectorFence")
+ {
+ targetPosition = wallIndicator.transform.position;
+ targetRotation = wallIndicator.transform.eulerAngles;
+ }
+ else
+ {
+ targetPosition = currentAbilityIndicator.transform.position;
+ targetRotation = currentAbilityIndicator.transform.eulerAngles; // Optional, depending on other abilities
+ }
+
+ RequestAbilityActivationServerRpc(activeAbility.abilityKey, targetPosition, targetRotation);
StartCoroutine(StartCooldown(activeAbility));
DeactivateAbilityMode();
}
@@ -97,17 +173,18 @@ public class AbilitySystem : NetworkBehaviour
}
}
+
[ServerRpc(RequireOwnership = false)]
- private void RequestAbilityActivationServerRpc(string abilityKey, Vector3 targetPosition, ServerRpcParams rpcParams = default)
+ private void RequestAbilityActivationServerRpc(string abilityKey, Vector3 targetPosition, Vector3 targetRotation, ServerRpcParams rpcParams = default)
{
ulong ownerClientId = rpcParams.Receive.SenderClientId;
- Debug.Log($"[AbilitySystem] Received activation request for ability '{abilityKey}' from client {ownerClientId} at position {targetPosition}.");
+ Debug.Log($"[AbilitySystem] Received activation request for ability '{abilityKey}' from client {ownerClientId} at position {targetPosition} with rotation {targetRotation}.");
- ExecuteAbilityOnServer(abilityKey, ownerClientId, targetPosition);
+ ExecuteAbilityOnServer(abilityKey, ownerClientId, targetPosition, targetRotation);
}
- private void ExecuteAbilityOnServer(string abilityKey, ulong ownerClientId, Vector3 targetPosition)
+ private void ExecuteAbilityOnServer(string abilityKey, ulong ownerClientId, Vector3 targetPosition, Vector3 targetRotation)
{
// Find the player's ServerCharacter
var playerObject = NetworkManager.Singleton.SpawnManager.SpawnedObjectsList
@@ -128,8 +205,8 @@ public class AbilitySystem : NetworkBehaviour
}
// Activate the ability
- Debug.Log($"[AbilitySystem] Activating ability {ability.abilityName} for player {ownerClientId} at {targetPosition}.");
- ability.Execute(character, targetPosition);
+ Debug.Log($"[AbilitySystem] Activating ability {ability.abilityName} for player {ownerClientId} at {targetPosition} with rotation {targetRotation}.");
+ ability.Execute(character, targetPosition, targetRotation);
}
private IEnumerator StartCooldown(Ability ability)
diff --git a/Assets/Scripts/Gameplay/DashNCrashAbility.cs b/Assets/Scripts/Gameplay/DashNCrashAbility.cs
index fbc9c6d..b1f96ab 100644
--- a/Assets/Scripts/Gameplay/DashNCrashAbility.cs
+++ b/Assets/Scripts/Gameplay/DashNCrashAbility.cs
@@ -11,7 +11,7 @@ public class DashNCrashAbility : Ability
public float dashDuration = 0.5f;
- public override void Execute(ServerCharacter character, Vector3 targetPosition)
+ public override void Execute(ServerCharacter character, Vector3 targetPosition, Vector3 targetRotation)
{
Debug.Log($"Executing DashNCrash for character {character.OwnerClientId} at {targetPosition}.");
diff --git a/Assets/Scripts/Gameplay/FreezeThrowAbility.cs b/Assets/Scripts/Gameplay/FreezeThrowAbility.cs
index d1c1243..0cd7e82 100644
--- a/Assets/Scripts/Gameplay/FreezeThrowAbility.cs
+++ b/Assets/Scripts/Gameplay/FreezeThrowAbility.cs
@@ -8,7 +8,7 @@ public class FreezeThrowAbility : Ability
[Header("FreezeThrow Settings")]
public float projectileSpeed = 10f;
- public override void Execute(ServerCharacter character, Vector3 targetPosition)
+ public override void Execute(ServerCharacter character, Vector3 targetPosition, Vector3 targetRotation)
{
if (!NetworkManager.Singleton.IsServer)
{
diff --git a/Assets/Scripts/Gameplay/GameplayObjects/RuntimeDataContainers/GameDataSource.cs b/Assets/Scripts/Gameplay/GameplayObjects/RuntimeDataContainers/GameDataSource.cs
index e2492c5..0c5dc78 100644
--- a/Assets/Scripts/Gameplay/GameplayObjects/RuntimeDataContainers/GameDataSource.cs
+++ b/Assets/Scripts/Gameplay/GameplayObjects/RuntimeDataContainers/GameDataSource.cs
@@ -84,6 +84,7 @@ namespace Unity.BossRoom.Gameplay.GameplayObjects
public string DashNCrashAbilityKey = "DashNCrash";
public string FreezeThrowAbilityKey = "FreezeThrow";
+ public string VectorWallAbilityKey = "VectorWall";
List m_AllActions;
diff --git a/Assets/Scripts/Gameplay/UserInput/ClientInputSender.cs b/Assets/Scripts/Gameplay/UserInput/ClientInputSender.cs
index d97e0ef..7218edc 100644
--- a/Assets/Scripts/Gameplay/UserInput/ClientInputSender.cs
+++ b/Assets/Scripts/Gameplay/UserInput/ClientInputSender.cs
@@ -527,6 +527,18 @@ namespace Unity.BossRoom.Gameplay.UserInput
Debug.Log("Cannot activate ability mode while swap mode is active.");
}
}
+ if (Input.GetKeyDown(KeyCode.F))
+ {
+ if (!IsSwapModeActive) // Prevent ability mode if swap mode is active
+ {
+ m_UIMessageFeed.DisplayMessage("Activated Ability mode");
+ m_AbilitySystem.ActivateAbilityByKey(GameDataSource.Instance.VectorWallAbilityKey);
+ }
+ else
+ {
+ Debug.Log("Cannot activate ability mode while swap mode is active.");
+ }
+ }
if (m_AbilitySystem.IsAbilityModeActive()) return;
if (!IsSwapModeActive) // Prevent other inputs if swap mode is active
{
diff --git a/Assets/Scripts/Gameplay/VectorFenceAbility.cs b/Assets/Scripts/Gameplay/VectorFenceAbility.cs
new file mode 100644
index 0000000..ed08e59
--- /dev/null
+++ b/Assets/Scripts/Gameplay/VectorFenceAbility.cs
@@ -0,0 +1,40 @@
+using Unity.BossRoom.Gameplay.GameplayObjects.Character;
+using Unity.Netcode;
+using UnityEngine;
+using UnityEngine.AI;
+
+[CreateAssetMenu(menuName = "Abilities/Vector Fence Ability")]
+public class VectorFenceAbility : Ability
+{
+ [Header("Vector Fence Settings")]
+ public float wallLength = 8f;
+ public float wallWidth = 0.5f;
+ public float wallHeight = 1f;
+ public float scaleUpDuration = 1.0f;
+ public override void Execute(ServerCharacter character, Vector3 targetPosition, Vector3 targetRotation)
+ {
+ if (!NetworkManager.Singleton.IsServer)
+ {
+ Debug.LogError("[VectorFenceAbility] Execute should only be called on the server.");
+ return;
+ }
+
+ if (character == null)
+ {
+ Debug.LogError("[VectorFenceAbility] ServerCharacter is null.");
+ return;
+ }
+
+ // Calculate wall placement based on target position and forward direction
+ Vector3 forward = character.transform.forward;
+ Vector3 wallCenter = targetPosition;
+
+ GameObject wallInstance = Instantiate(prefab, wallCenter, Quaternion.identity);
+ wallInstance.transform.eulerAngles = targetRotation;
+ if (wallInstance.TryGetComponent(out NetworkObject networkObject))
+ {
+ networkObject.Spawn();
+ Debug.Log($"[VectorFenceAbility] Wall spawned at {wallCenter} facing {forward}.");
+ }
+ }
+}
diff --git a/Assets/Scripts/Gameplay/VectorFenceAbility.cs.meta b/Assets/Scripts/Gameplay/VectorFenceAbility.cs.meta
new file mode 100644
index 0000000..0acecf5
--- /dev/null
+++ b/Assets/Scripts/Gameplay/VectorFenceAbility.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 71c78dee15b407d4183dd799c1b1a39f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Gameplay/VectorFencePrefab.cs b/Assets/Scripts/Gameplay/VectorFencePrefab.cs
new file mode 100644
index 0000000..bdc9ef8
--- /dev/null
+++ b/Assets/Scripts/Gameplay/VectorFencePrefab.cs
@@ -0,0 +1,75 @@
+using System.Collections;
+using Unity.Netcode;
+using UnityEngine;
+using UnityEngine.AI;
+
+public class VectorFencePrefab : NetworkBehaviour
+{
+ [Header("Fence Settings")]
+ public VectorFenceAbility Ability;
+ private NavMeshObstacle navMeshObstacle;
+
+ private void Awake()
+ {
+ navMeshObstacle = GetComponent();
+ if (navMeshObstacle == null)
+ {
+ Debug.LogError("[VectorFencePrefab] NavMeshObstacle is missing on the prefab!");
+ }
+
+ transform.localScale = new Vector3(Ability.wallLength, 0, Ability.wallWidth); // Start with zero height
+ }
+
+ public override void OnNetworkSpawn()
+ {
+ if (IsServer)
+ {
+ StartCoroutine(ScaleUp());
+ StartCoroutine(DestroyAfterLifetime());
+ }
+ }
+
+ private IEnumerator ScaleUp()
+ {
+ float elapsedTime = 0f;
+ Vector3 originalScale = transform.localScale;
+ Vector3 targetScale = new Vector3(Ability.wallLength, Ability.wallHeight, Ability.wallWidth); // Target full height scale
+
+ while (elapsedTime < Ability.scaleUpDuration)
+ {
+ transform.localScale = Vector3.Lerp(originalScale, targetScale, elapsedTime / Ability.scaleUpDuration);
+ elapsedTime += Time.deltaTime;
+ yield return null;
+ }
+
+ transform.localScale = targetScale;
+
+ // Enable the NavMeshObstacle after scaling is complete
+ if (navMeshObstacle != null)
+ {
+ navMeshObstacle.enabled = true;
+ navMeshObstacle.carving = true;
+ navMeshObstacle.center = Vector3.zero; // Adjust center if needed
+ navMeshObstacle.shape = NavMeshObstacleShape.Box;
+ }
+ }
+
+ private IEnumerator DestroyAfterLifetime()
+ {
+ yield return new WaitForSeconds(Ability.abilityDuration);
+
+ if (IsServer)
+ {
+ if (NetworkObject != null)
+ {
+ NetworkObject.Despawn(true);
+ }
+ else
+ {
+ Destroy(gameObject);
+ }
+
+ Debug.Log("[VectorFencePrefab] Fence destroyed.");
+ }
+ }
+}
diff --git a/Assets/Scripts/Gameplay/VectorFencePrefab.cs.meta b/Assets/Scripts/Gameplay/VectorFencePrefab.cs.meta
new file mode 100644
index 0000000..0d4502d
--- /dev/null
+++ b/Assets/Scripts/Gameplay/VectorFencePrefab.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9a951069c9ff70a479b426f4310ca775
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: