gg.easy.airship 0.1.2128 → 0.1.2130
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Editor/Artifacts/AirshipLocalArtifactDatabase.cs +17 -17
- package/Editor/Artifacts/AirshipReconciliationService.cs +3 -3
- package/Runtime/Code/Luau/AirshipComponent.cs +8 -3
- package/Runtime/Code/Network/StateSystem/AirshipNetworkedStateManager.cs +8 -5
- package/Runtime/Code/Player/Character/MovementSystems/Character/CharacterMovement.cs +111 -31
- package/Runtime/Code/VoiceChat/AirshipUniVoiceNetwork.cs +21 -0
- package/Runtime/Code/VoxelWorld/Editor/VoxelBuilderEditorWindow.cs +49 -62
- package/Runtime/Code/VoxelWorld/Editor/VoxelWorldEditor.cs +296 -251
- package/Runtime/Code/VoxelWorld/VoxelWorldChunk.cs +218 -190
- package/Runtime/Plugins/Android/libLuauPlugin.so +0 -0
- package/Runtime/Plugins/Linux/libLuauPlugin.so +0 -0
- package/Runtime/Plugins/Mac/LuauPlugin.bundle/Contents/MacOS/LuauPlugin +0 -0
- package/Runtime/Plugins/Windows/x64/LuauPlugin.dll +0 -0
- package/Runtime/Plugins/Windows/x64/LuauPlugin.pdb +0 -0
- package/Runtime/Plugins/iOS/LuauPluginIos.a +0 -0
- package/package.json +1 -1
|
@@ -51,17 +51,17 @@ namespace Airship.Editor {
|
|
|
51
51
|
|
|
52
52
|
[CanBeNull] public GameObject Prefab => asset != null ? AssetDatabase.LoadAssetAtPath<GameObject>(asset) : null;
|
|
53
53
|
|
|
54
|
-
/// <summary>
|
|
55
|
-
/// Will return if the given component is synchronized with this data
|
|
56
|
-
/// </summary>
|
|
57
|
-
/// <param name="component">The component</param>
|
|
58
|
-
/// <returns>True if the component matches this data</returns>
|
|
59
|
-
public bool IsSyncedWith(AirshipComponent component) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
54
|
+
// /// <summary>
|
|
55
|
+
// /// Will return if the given component is synchronized with this data
|
|
56
|
+
// /// </summary>
|
|
57
|
+
// /// <param name="component">The component</param>
|
|
58
|
+
// /// <returns>True if the component matches this data</returns>
|
|
59
|
+
// public bool IsSyncedWith(AirshipComponent component) {
|
|
60
|
+
// if (guid != component.guid) return false;
|
|
61
|
+
// if (metadata == null) return false;
|
|
62
|
+
//
|
|
63
|
+
// return component.componentHash == metadata.hash;
|
|
64
|
+
// }
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
[Serializable]
|
|
@@ -94,12 +94,12 @@ namespace Airship.Editor {
|
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
|
|
97
|
-
/// <summary>
|
|
98
|
-
/// Will return true if the hash of the component isn't the same as the DB stored script hash
|
|
99
|
-
/// </summary>
|
|
100
|
-
public bool IsNotSameHashAsComponent(AirshipComponent component) {
|
|
101
|
-
|
|
102
|
-
}
|
|
97
|
+
// /// <summary>
|
|
98
|
+
// /// Will return true if the hash of the component isn't the same as the DB stored script hash
|
|
99
|
+
// /// </summary>
|
|
100
|
+
// public bool IsNotSameHashAsComponent(AirshipComponent component) {
|
|
101
|
+
// return component.componentHash != metadata.hash;
|
|
102
|
+
// }
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
/// <summary>
|
|
@@ -192,7 +192,7 @@ namespace Airship.Editor {
|
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
194
|
#endif
|
|
195
|
-
component.componentHash = component.script.sourceFileHash;
|
|
195
|
+
// component.componentHash = component.script.sourceFileHash;
|
|
196
196
|
return true;
|
|
197
197
|
}
|
|
198
198
|
|
|
@@ -328,7 +328,7 @@ namespace Airship.Editor {
|
|
|
328
328
|
// We can run a default reconcile, it wont matter tbh.
|
|
329
329
|
var component = eventData.Component;
|
|
330
330
|
ReconcileComponent(component);
|
|
331
|
-
component.componentHash = component.scriptHash;
|
|
331
|
+
//component.componentHash = component.scriptHash;
|
|
332
332
|
return;
|
|
333
333
|
}
|
|
334
334
|
|
|
@@ -374,7 +374,7 @@ namespace Airship.Editor {
|
|
|
374
374
|
else {
|
|
375
375
|
var component = eventData.Component;
|
|
376
376
|
ReconcileComponent(component);
|
|
377
|
-
component.componentHash = component.scriptHash;
|
|
377
|
+
//component.componentHash = component.scriptHash;
|
|
378
378
|
}
|
|
379
379
|
}
|
|
380
380
|
}
|
|
@@ -72,11 +72,16 @@ public class AirshipComponent : MonoBehaviour {
|
|
|
72
72
|
#if UNITY_EDITOR
|
|
73
73
|
internal static event ReconcileAirshipComponent Reconcile;
|
|
74
74
|
[SerializeField] internal string guid;
|
|
75
|
-
[SerializeField] private string hash;
|
|
75
|
+
// [SerializeField] private string hash;
|
|
76
76
|
|
|
77
|
+
[Obsolete]
|
|
77
78
|
internal string componentHash {
|
|
78
|
-
get
|
|
79
|
-
|
|
79
|
+
get {
|
|
80
|
+
return "";
|
|
81
|
+
}
|
|
82
|
+
set {
|
|
83
|
+
_ = value;
|
|
84
|
+
}
|
|
80
85
|
}
|
|
81
86
|
|
|
82
87
|
internal string scriptHash => script.sourceFileHash;
|
|
@@ -6,6 +6,7 @@ using Code.Network.StateSystem.Structures;
|
|
|
6
6
|
using Code.Player.Character.Net;
|
|
7
7
|
using Mirror;
|
|
8
8
|
using RSG.Promises;
|
|
9
|
+
using Unity.Mathematics;
|
|
9
10
|
using Unity.VisualScripting;
|
|
10
11
|
using UnityEngine;
|
|
11
12
|
using UnityEngine.Serialization;
|
|
@@ -423,8 +424,8 @@ namespace Code.Network.StateSystem
|
|
|
423
424
|
// TODO: We treat estimatedCommandDelay as a constant, but we should determine this by calculating how long the command that triggered the lag comp was buffered
|
|
424
425
|
// we would need to pass that into lag comp event as an additional parameter since it would need to be calculated in the predicted character component that generated the command.
|
|
425
426
|
// That may prove difficult, so we use a constant for now.
|
|
426
|
-
var estimatedCommandDelay = this.serverCommandBufferTargetSize * Time.fixedDeltaTime;
|
|
427
|
-
var clientBufferTime = NetworkServer.connections[clientId].bufferTime;
|
|
427
|
+
var estimatedCommandDelay = this.serverCommandBufferTargetSize * Time.fixedDeltaTime;
|
|
428
|
+
var clientBufferTime = NetworkServer.connections[clientId].bufferTime / Math.Min(Time.timeScale, 1); // client buffers more when timescale is set lower than 1
|
|
428
429
|
// Debug.Log("Calculated rollback time for " + this.gameObject.name + " as ping: " + ping + " buffer time: " + clientBufferTime + " command delay: " + estimatedCommandDelay + " for a result of: " + (- ping -
|
|
429
430
|
// clientBufferTime - estimatedCommandDelay));
|
|
430
431
|
var lagCompensatedTickTime =
|
|
@@ -845,14 +846,16 @@ namespace Code.Network.StateSystem
|
|
|
845
846
|
if (this.observerHistory.Values.Count == 0) return;
|
|
846
847
|
|
|
847
848
|
// Get the time we should render on the client.
|
|
848
|
-
var clientTime = (float)NetworkTime.time - NetworkClient.bufferTime;
|
|
849
|
+
var clientTime = (float)NetworkTime.time - (NetworkClient.bufferTime / Math.Min(Time.timeScale, 1)); // Don't reduce buffer on TS higher than one since send rate is unaffected
|
|
849
850
|
|
|
850
851
|
// Get the state history around the time that's currently being rendered.
|
|
851
852
|
if (!this.observerHistory.GetAround(clientTime, out State prevState, out State nextState))
|
|
852
853
|
{
|
|
853
|
-
|
|
854
|
+
if (clientTime < this.observerHistory.Keys[0]) return; // Our local time hasn't advanced enough to render the positions reported.
|
|
855
|
+
Debug.LogWarning("Frame " + Time.frameCount + " not enough state history for rendering. " + this.observerHistory.Keys.Count +
|
|
854
856
|
" entries. First " + this.observerHistory.Keys[0] + " Last " +
|
|
855
|
-
this.observerHistory.Keys[^1] + " Target " + clientTime)
|
|
857
|
+
this.observerHistory.Keys[^1] + " Target " + clientTime + " Buffer is: " + NetworkClient.bufferTime + " Estimated Latency (1 way): " +
|
|
858
|
+
(NetworkTime.rtt / 2) + " Network Time: " + NetworkTime.time + " TScale: " + Time.timeScale);
|
|
856
859
|
return;
|
|
857
860
|
}
|
|
858
861
|
|
|
@@ -6,6 +6,7 @@ using Code.Network.StateSystem;
|
|
|
6
6
|
using Code.Player.Character.NetworkedMovement;
|
|
7
7
|
using Mirror;
|
|
8
8
|
using UnityEngine;
|
|
9
|
+
using UnityEngine.Serialization;
|
|
9
10
|
|
|
10
11
|
namespace Code.Player.Character.MovementSystems.Character
|
|
11
12
|
{
|
|
@@ -47,7 +48,10 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
47
48
|
|
|
48
49
|
[Header("Visual Variables")]
|
|
49
50
|
public bool autoCalibrateSkiddingSpeed = true;
|
|
50
|
-
|
|
51
|
+
|
|
52
|
+
[Tooltip("Controls the speed in which local character rotates to face look direction.")]
|
|
53
|
+
public float ownerRotationLerpMod = 6;
|
|
54
|
+
|
|
51
55
|
[Tooltip("If true animations will be played on the server. This should be true if you care about character movement animations server-side (like for hit boxes).")]
|
|
52
56
|
public bool playAnimationOnServer = true;
|
|
53
57
|
|
|
@@ -112,33 +116,34 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
112
116
|
public event Action<object> OnInterpolateReachedState;
|
|
113
117
|
|
|
114
118
|
public event Action<object, object> OnCompareSnapshots;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Fired when lag compensated checks should occur. ID of check is passed as the event parameter.
|
|
122
|
+
*/
|
|
123
|
+
public event Action<object> OnLagCompensationCheck;
|
|
124
|
+
/**
|
|
125
|
+
* Fired when lag compensated check is over and physics can be modified. ID of check is passed as the event parameter.
|
|
126
|
+
*/
|
|
127
|
+
public event Action<object> OnLagCompensationComplete;
|
|
128
|
+
|
|
129
|
+
public event Action<object> OnMoveDirectionChanged;
|
|
115
130
|
|
|
116
131
|
/// <summary>
|
|
117
|
-
///
|
|
132
|
+
/// Called when the look vector is externally set
|
|
133
|
+
/// Params: Vector3 currentLookVector
|
|
118
134
|
/// </summary>
|
|
119
|
-
public event Action<object
|
|
120
|
-
|
|
121
|
-
|
|
135
|
+
public event Action<object> OnNewLookVector;
|
|
136
|
+
|
|
122
137
|
/// <summary>
|
|
123
138
|
/// Called when movement processes a new jump
|
|
124
139
|
/// Params: Vector3 velocity
|
|
125
140
|
/// </summary>
|
|
126
141
|
public event Action<object> OnJumped;
|
|
127
|
-
|
|
142
|
+
|
|
128
143
|
/// <summary>
|
|
129
|
-
///
|
|
130
|
-
/// Params: Vector3 currentLookVector
|
|
144
|
+
/// Params: Vector3 velocity, RaycastHit hitInfo
|
|
131
145
|
/// </summary>
|
|
132
|
-
public event Action<object>
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Fired when lag compensated checks should occur. ID of check is passed as the event parameter.
|
|
136
|
-
*/
|
|
137
|
-
public event Action<object> OnLagCompensationCheck;
|
|
138
|
-
/**
|
|
139
|
-
* Fired when lag compensated check is over and physics can be modified. ID of check is passed as the event parameter.
|
|
140
|
-
*/
|
|
141
|
-
public event Action<object> OnLagCompensationComplete;
|
|
146
|
+
public event Action<object, object> OnImpactWithGround;
|
|
142
147
|
|
|
143
148
|
#endregion
|
|
144
149
|
|
|
@@ -153,6 +158,8 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
153
158
|
private Vector3 lookVector;
|
|
154
159
|
private BinaryBlob customInputData;
|
|
155
160
|
|
|
161
|
+
[SyncVar] public Vector3 startingLookVector;
|
|
162
|
+
|
|
156
163
|
// State information
|
|
157
164
|
public CharacterSnapshotData currentMoveSnapshot = new CharacterSnapshotData() {};
|
|
158
165
|
public CharacterAnimationSyncData currentAnimState = new CharacterAnimationSyncData() {};
|
|
@@ -181,9 +188,19 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
181
188
|
_cameraTransform = Camera.main.transform;
|
|
182
189
|
}
|
|
183
190
|
|
|
191
|
+
public override void OnStartClient() {
|
|
192
|
+
base.OnStartClient();
|
|
193
|
+
this.lookVector = this.startingLookVector;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public override void OnStartServer() {
|
|
197
|
+
base.OnStartServer();
|
|
198
|
+
this.lookVector = this.startingLookVector;
|
|
199
|
+
}
|
|
200
|
+
|
|
184
201
|
public override void SetMode(NetworkedStateSystemMode mode)
|
|
185
202
|
{
|
|
186
|
-
Debug.Log("Running movement in " + mode + " mode.");
|
|
203
|
+
Debug.Log("Running movement in " + mode + " mode for " + this.name + ".");
|
|
187
204
|
if (mode == NetworkedStateSystemMode.Observer)
|
|
188
205
|
{
|
|
189
206
|
rigidbody.isKinematic = true;
|
|
@@ -300,8 +317,7 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
300
317
|
{
|
|
301
318
|
grounded = true;
|
|
302
319
|
}
|
|
303
|
-
|
|
304
|
-
currentMoveSnapshot.isGrounded = grounded;
|
|
320
|
+
|
|
305
321
|
this.groundedRaycastHit = groundHit;
|
|
306
322
|
|
|
307
323
|
if (grounded)
|
|
@@ -335,6 +351,13 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
335
351
|
currentMoveSnapshot.jumpCount = 0;
|
|
336
352
|
currentMoveSnapshot.timeSinceBecameGrounded = 0f;
|
|
337
353
|
this.OnImpactWithGround?.Invoke(currentVelocity, groundHit);
|
|
354
|
+
if (this.mode == NetworkedStateSystemMode.Authority && isServer)
|
|
355
|
+
{
|
|
356
|
+
SAuthImpactEvent(currentVelocity, groundHit);
|
|
357
|
+
} else if (this.mode == NetworkedStateSystemMode.Authority && isClient)
|
|
358
|
+
{
|
|
359
|
+
CAuthImpactEvent(currentVelocity, groundHit);
|
|
360
|
+
}
|
|
338
361
|
}
|
|
339
362
|
else
|
|
340
363
|
{
|
|
@@ -442,6 +465,14 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
442
465
|
newVelocity.y = movementSettings.jumpSpeed;
|
|
443
466
|
currentMoveSnapshot.airborneFromImpulse = false;
|
|
444
467
|
OnJumped?.Invoke(newVelocity);
|
|
468
|
+
if (mode == NetworkedStateSystemMode.Authority && isServer)
|
|
469
|
+
{
|
|
470
|
+
SAuthJumpedEvent(newVelocity);
|
|
471
|
+
}
|
|
472
|
+
else if (mode == NetworkedStateSystemMode.Authority && isClient)
|
|
473
|
+
{
|
|
474
|
+
CAuthJumpedEvent(newVelocity);
|
|
475
|
+
}
|
|
445
476
|
}
|
|
446
477
|
}
|
|
447
478
|
|
|
@@ -826,7 +857,7 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
826
857
|
|
|
827
858
|
//Instantly move at the desired speed
|
|
828
859
|
var moveMagnitude = characterMoveVelocity.magnitude;
|
|
829
|
-
var
|
|
860
|
+
var flatVelMagnitude = flatVelocity.magnitude;
|
|
830
861
|
|
|
831
862
|
//Don't move character in direction its already moveing
|
|
832
863
|
//Positive dot means we are already moving in this direction. Negative dot means we are moving opposite of velocity.
|
|
@@ -844,13 +875,13 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
844
875
|
newVelocity.z = command.moveDir.z * currentMoveSnapshot.currentSpeed;
|
|
845
876
|
}
|
|
846
877
|
else if (!isImpulsing && !currentMoveSnapshot.airborneFromImpulse && //Not impulsing AND under our max speed
|
|
847
|
-
(
|
|
878
|
+
(flatVelMagnitude < (movementSettings.useAccelerationMovement
|
|
848
879
|
? currentMoveSnapshot.currentSpeed
|
|
849
880
|
: Mathf.Max(movementSettings.sprintSpeed, currentMoveSnapshot.currentSpeed) + 1)))
|
|
850
881
|
{
|
|
851
882
|
if (movementSettings.useAccelerationMovement)
|
|
852
883
|
{
|
|
853
|
-
newVelocity += Vector3.ClampMagnitude(characterMoveVelocity, currentMoveSnapshot.currentSpeed -
|
|
884
|
+
newVelocity += Vector3.ClampMagnitude(characterMoveVelocity, currentMoveSnapshot.currentSpeed - flatVelMagnitude);
|
|
854
885
|
}
|
|
855
886
|
else
|
|
856
887
|
{
|
|
@@ -860,7 +891,7 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
860
891
|
// if(Mathf.Abs(characterMoveVelocity.z) > Mathf.Abs(newVelocity.z)){
|
|
861
892
|
// newVelocity.z = characterMoveVelocity.z;
|
|
862
893
|
// }
|
|
863
|
-
if (moveMagnitude + .5f >=
|
|
894
|
+
if (moveMagnitude + .5f >= flatVelMagnitude)
|
|
864
895
|
{
|
|
865
896
|
newVelocity.x = characterMoveVelocity.x;
|
|
866
897
|
newVelocity.z = characterMoveVelocity.z;
|
|
@@ -869,11 +900,30 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
869
900
|
}
|
|
870
901
|
else
|
|
871
902
|
{
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
903
|
+
if(this.movementSettings.useAccelerationMovement){
|
|
904
|
+
//Using acceleration movement
|
|
905
|
+
newVelocity += normalizedMoveDir * (dirDot * dirDot / 2) *
|
|
906
|
+
(groundedState == CharacterState.Sprinting
|
|
907
|
+
? this.movementSettings.sprintAccelerationForce
|
|
908
|
+
: movementSettings.accelerationForce);
|
|
909
|
+
}else{
|
|
910
|
+
//Impulsing
|
|
911
|
+
var forwardMod = Mathf.Max(0, dirDot);
|
|
912
|
+
var addedForce = groundedState == CharacterState.Sprinting
|
|
913
|
+
? this.movementSettings.sprintAccelerationForce
|
|
914
|
+
: movementSettings.accelerationForce;
|
|
915
|
+
if(flatVelMagnitude+addedForce < currentMoveSnapshot.currentSpeed){
|
|
916
|
+
forwardMod = 1;
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
//Apply the force
|
|
920
|
+
newVelocity += normalizedMoveDir * forwardMod * addedForce;
|
|
921
|
+
|
|
922
|
+
//Never get faster than you've been impulsed
|
|
923
|
+
var flatVel = Vector3.ClampMagnitude(new Vector3(newVelocity.x, 0, newVelocity.z), Mathf.Max(addedForce, flatVelMagnitude));
|
|
924
|
+
newVelocity.x = flatVel.x;
|
|
925
|
+
newVelocity.z = flatVel.z;
|
|
926
|
+
}
|
|
877
927
|
}
|
|
878
928
|
|
|
879
929
|
//print("isreplay: " + replaying + " didHitForward: " + didHitForward + " moveVec: " + characterMoveVector + " colliderDot: " + colliderDot + " for: " + forwardHit.collider?.gameObject.name + " point: " + forwardHit.point);
|
|
@@ -1070,7 +1120,7 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
1070
1120
|
airshipTransform.rotation = Quaternion.Lerp(
|
|
1071
1121
|
airshipTransform.rotation,
|
|
1072
1122
|
Quaternion.LookRotation(lookTarget),
|
|
1073
|
-
|
|
1123
|
+
ownerRotationLerpMod * Time.deltaTime);
|
|
1074
1124
|
}
|
|
1075
1125
|
}
|
|
1076
1126
|
|
|
@@ -1400,6 +1450,36 @@ namespace Code.Player.Character.MovementSystems.Character
|
|
|
1400
1450
|
#endregion
|
|
1401
1451
|
|
|
1402
1452
|
#region RPCs
|
|
1453
|
+
|
|
1454
|
+
[Command]
|
|
1455
|
+
public void CAuthJumpedEvent(Vector3 velocity)
|
|
1456
|
+
{
|
|
1457
|
+
// Only used in the client authoritative networking mode.
|
|
1458
|
+
if (mode != NetworkedStateSystemMode.Observer) return;
|
|
1459
|
+
OnJumped?.Invoke(velocity);
|
|
1460
|
+
SAuthJumpedEvent(velocity);
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
[Command]
|
|
1464
|
+
public void CAuthImpactEvent(Vector3 velocity, RaycastHit hitInfo)
|
|
1465
|
+
{
|
|
1466
|
+
// Only used in the client authoritative networking mode.
|
|
1467
|
+
if (mode != NetworkedStateSystemMode.Observer) return;
|
|
1468
|
+
OnImpactWithGround(velocity, hitInfo);
|
|
1469
|
+
SAuthImpactEvent(velocity, hitInfo);
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1472
|
+
[ClientRpc(includeOwner = false)]
|
|
1473
|
+
public void SAuthJumpedEvent(Vector3 velocity)
|
|
1474
|
+
{
|
|
1475
|
+
OnJumped?.Invoke(velocity);
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
[ClientRpc(includeOwner = false)]
|
|
1479
|
+
public void SAuthImpactEvent(Vector3 velocity, RaycastHit hitInfo)
|
|
1480
|
+
{
|
|
1481
|
+
OnImpactWithGround?.Invoke(velocity, hitInfo);
|
|
1482
|
+
}
|
|
1403
1483
|
|
|
1404
1484
|
/**
|
|
1405
1485
|
* RPCs are used in client authoritative networking to allow server side code to move clients. These
|
|
@@ -300,10 +300,31 @@ namespace Code.VoiceChat {
|
|
|
300
300
|
// print($"[client] received audio from server for peer {senderPeerId}. Frame={Time.frameCount} Nonce={nonce}");
|
|
301
301
|
this.EmitAudioInScene(senderPeerId, bytes);
|
|
302
302
|
}
|
|
303
|
+
|
|
304
|
+
private void PreProcessAudio(ChatroomAudioSegment segment) {
|
|
305
|
+
const float maxAmplitude = 0.25f;
|
|
306
|
+
|
|
307
|
+
// find peak
|
|
308
|
+
float peak = 0f;
|
|
309
|
+
for (int i = 0; i < segment.samples.Length; i++) {
|
|
310
|
+
float absSample = Math.Abs(segment.samples[i]);
|
|
311
|
+
if (absSample > peak) peak = absSample;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// if too loud, scale down
|
|
315
|
+
if (peak > maxAmplitude) {
|
|
316
|
+
float scale = maxAmplitude / peak;
|
|
317
|
+
for (int i = 0; i < segment.samples.Length; i++) {
|
|
318
|
+
segment.samples[i] *= scale;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
303
322
|
|
|
304
323
|
private void EmitAudioInScene(short senderPeerId, byte[] bytes) {
|
|
305
324
|
var segment = FromByteArray<ChatroomAudioSegment>(bytes);
|
|
306
325
|
|
|
326
|
+
this.PreProcessAudio(segment);
|
|
327
|
+
|
|
307
328
|
if (senderPeerId == LocalPeerId && RunCore.IsClient() && NetworkClient.isConnected) {
|
|
308
329
|
// Local speaking
|
|
309
330
|
var speakingLevel = this.ComputeSpeakingLevel(segment.samples);
|
|
@@ -4,30 +4,27 @@ using UnityEngine;
|
|
|
4
4
|
|
|
5
5
|
namespace Code.Airship.Resources.VoxelRenderer.Editor {
|
|
6
6
|
public class VoxelBuilderEditorWindow : EditorWindow {
|
|
7
|
-
|
|
8
|
-
Vector2 scrollPos;
|
|
7
|
+
private Vector2 scrollPos;
|
|
9
8
|
|
|
10
9
|
// Enum to represent the different modes
|
|
11
|
-
enum Mode
|
|
12
|
-
{
|
|
10
|
+
private enum Mode {
|
|
13
11
|
Add,
|
|
14
|
-
Delete
|
|
12
|
+
Delete
|
|
15
13
|
}
|
|
16
14
|
|
|
17
|
-
int gridWidth = 4;
|
|
18
|
-
bool[,] grid;
|
|
15
|
+
private int gridWidth = 4;
|
|
16
|
+
private bool[,] grid;
|
|
19
17
|
|
|
20
18
|
// The current mode
|
|
21
|
-
Mode currentMode;
|
|
19
|
+
private Mode currentMode;
|
|
22
20
|
public static bool active = true;
|
|
23
21
|
|
|
24
22
|
[MenuItem("Airship/Misc/VoxelEditor")]
|
|
25
|
-
static void Init() {
|
|
23
|
+
private static void Init() {
|
|
26
24
|
ShowWindow();
|
|
27
25
|
}
|
|
28
26
|
|
|
29
27
|
public static void ForceRepaint() {
|
|
30
|
-
|
|
31
28
|
if (active) {
|
|
32
29
|
GetWindow<VoxelBuilderEditorWindow>().Repaint();
|
|
33
30
|
}
|
|
@@ -38,25 +35,22 @@ namespace Code.Airship.Resources.VoxelRenderer.Editor {
|
|
|
38
35
|
|
|
39
36
|
if (HasOpenInstances<VoxelBuilderEditorWindow>()) {
|
|
40
37
|
GetWindow<VoxelBuilderEditorWindow>().Close();
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
38
|
+
} else {
|
|
43
39
|
var myWindow = GetWindow<VoxelBuilderEditorWindow>();
|
|
44
40
|
myWindow.titleContent = new GUIContent("Voxel Editor");
|
|
45
41
|
}
|
|
46
42
|
}
|
|
47
|
-
|
|
43
|
+
|
|
48
44
|
public static bool Enabled() {
|
|
49
45
|
return active && HasOpenInstances<VoxelBuilderEditorWindow>();
|
|
50
46
|
}
|
|
51
47
|
|
|
52
|
-
VoxelWorld GetVoxelWorld() {
|
|
53
|
-
|
|
48
|
+
private VoxelWorld GetVoxelWorld() {
|
|
54
49
|
//See if the currently selected object in the world is a voxelworld
|
|
55
50
|
var selectedObject = Selection.activeGameObject;
|
|
56
51
|
if (selectedObject) {
|
|
57
52
|
var voxelWorld = selectedObject.GetComponent<VoxelWorld>();
|
|
58
53
|
if (voxelWorld) {
|
|
59
|
-
|
|
60
54
|
return voxelWorld;
|
|
61
55
|
}
|
|
62
56
|
}
|
|
@@ -70,25 +64,22 @@ namespace Code.Airship.Resources.VoxelRenderer.Editor {
|
|
|
70
64
|
|
|
71
65
|
return null;
|
|
72
66
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
void ShowSelectionGui() {
|
|
76
67
|
|
|
68
|
+
|
|
69
|
+
private void ShowSelectionGui() {
|
|
77
70
|
//Label
|
|
78
71
|
GUILayout.Label("Select VoxelWorld", EditorStyles.boldLabel);
|
|
79
72
|
|
|
80
73
|
//Shows a list of all the VoxelWorld objects in the scene as clickable buttons
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
for (int i = 0; i < voxelWorlds.Length; i++) {
|
|
74
|
+
var voxelWorlds = FindObjectsOfType<VoxelWorld>();
|
|
84
75
|
|
|
76
|
+
for (var i = 0; i < voxelWorlds.Length; i++) {
|
|
77
|
+
var selectionZone = voxelWorlds[i].GetComponentInChildren<SelectionZone>();
|
|
85
78
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
if (Selection.activeGameObject == voxelWorlds[i].gameObject || (selectionZone!=null && Selection.activeGameObject == selectionZone.gameObject)) {
|
|
79
|
+
if (Selection.activeGameObject == voxelWorlds[i].gameObject || (selectionZone != null &&
|
|
80
|
+
Selection.activeGameObject == selectionZone.gameObject)) {
|
|
89
81
|
GUI.backgroundColor = Color.green;
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
82
|
+
} else {
|
|
92
83
|
GUI.backgroundColor = Color.white;
|
|
93
84
|
}
|
|
94
85
|
|
|
@@ -104,9 +95,9 @@ namespace Code.Airship.Resources.VoxelRenderer.Editor {
|
|
|
104
95
|
|
|
105
96
|
GUI.backgroundColor = Color.white;
|
|
106
97
|
}
|
|
107
|
-
|
|
108
98
|
|
|
109
|
-
|
|
99
|
+
|
|
100
|
+
private void OnGUI() {
|
|
110
101
|
//Create an active toggle as a button that toggles on and off
|
|
111
102
|
active = GUILayout.Toggle(active, "Voxel Editor Active");
|
|
112
103
|
|
|
@@ -115,14 +106,14 @@ namespace Code.Airship.Resources.VoxelRenderer.Editor {
|
|
|
115
106
|
}
|
|
116
107
|
|
|
117
108
|
ShowSelectionGui();
|
|
118
|
-
|
|
119
|
-
|
|
109
|
+
|
|
110
|
+
var world = GetVoxelWorld();
|
|
120
111
|
SelectionZone selection = null;
|
|
121
112
|
if (world == null || world.voxelBlocks == null) {
|
|
122
113
|
GUI.enabled = true; //cleanup from above
|
|
123
|
-
return;
|
|
114
|
+
return;
|
|
124
115
|
}
|
|
125
|
-
|
|
116
|
+
|
|
126
117
|
//See if we're in the selection mode
|
|
127
118
|
if (VoxelWorldSelectionToolBase.buttonActive == true) {
|
|
128
119
|
//Find or create the SelectionZone for this voxelWorld
|
|
@@ -136,30 +127,32 @@ namespace Code.Airship.Resources.VoxelRenderer.Editor {
|
|
|
136
127
|
selection.transform.localScale = Vector3.one;
|
|
137
128
|
selection.voxelWorld = world;
|
|
138
129
|
}
|
|
130
|
+
|
|
139
131
|
//Select this
|
|
140
132
|
selection.gameObject.SetActive(true);
|
|
141
133
|
Selection.activeGameObject = selection.gameObject;
|
|
142
|
-
|
|
143
134
|
}
|
|
135
|
+
|
|
144
136
|
if (VoxelWorldEditorToolBase.buttonActive == true) {
|
|
145
|
-
|
|
146
137
|
//If we're not in selection mode, disable the selection zone
|
|
147
138
|
selection = world.GetComponentInChildren<SelectionZone>();
|
|
148
|
-
|
|
139
|
+
|
|
149
140
|
if (selection) {
|
|
150
141
|
//Select the world
|
|
151
142
|
Selection.activeGameObject = world.gameObject;
|
|
152
143
|
//disable it
|
|
153
144
|
selection.gameObject.SetActive(false);
|
|
154
|
-
|
|
145
|
+
|
|
155
146
|
//we used to destroy it
|
|
156
147
|
//DestroyImmediate(selection.gameObject);
|
|
157
148
|
}
|
|
158
149
|
}
|
|
159
150
|
|
|
160
151
|
//Show a foldable help box
|
|
161
|
-
EditorGUILayout.HelpBox(
|
|
162
|
-
|
|
152
|
+
EditorGUILayout.HelpBox(
|
|
153
|
+
"Left click to add\nShift+click to delete\nCtrl+click for repeat placement\nA to rotate highlighted block",
|
|
154
|
+
MessageType.Info);
|
|
155
|
+
|
|
163
156
|
//active = EditorGUILayout.Toggle("Active", active);
|
|
164
157
|
|
|
165
158
|
//gap
|
|
@@ -167,23 +160,24 @@ namespace Code.Airship.Resources.VoxelRenderer.Editor {
|
|
|
167
160
|
|
|
168
161
|
//Prefab
|
|
169
162
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
163
|
+
var prefab = world.GetPrefabAt(world.highlightedBlockPos);
|
|
164
|
+
|
|
165
|
+
var blockData = world.GetVoxelAt(world.highlightedBlockPos);
|
|
173
166
|
|
|
174
167
|
GUILayout.Label("Highlighted Block");
|
|
175
168
|
|
|
176
169
|
if (VoxelWorld.VoxelDataToBlockId(blockData) == 0) {
|
|
177
170
|
GUI.enabled = false;
|
|
178
171
|
}
|
|
179
|
-
int flipBits = VoxelWorld.GetVoxelFlippedBits(blockData);
|
|
180
172
|
|
|
181
|
-
|
|
173
|
+
var flipBits = VoxelWorld.GetVoxelFlippedBits(blockData);
|
|
174
|
+
|
|
175
|
+
var def = GUI.backgroundColor;
|
|
182
176
|
|
|
183
177
|
GUILayout.BeginHorizontal();
|
|
184
178
|
|
|
185
179
|
GUILayout.Label("Rotation: " + VoxelWorld.flipNames[flipBits]);
|
|
186
|
-
|
|
180
|
+
|
|
187
181
|
GUI.backgroundColor = def;
|
|
188
182
|
GUILayout.EndHorizontal();
|
|
189
183
|
GUI.enabled = true;
|
|
@@ -199,13 +193,12 @@ namespace Code.Airship.Resources.VoxelRenderer.Editor {
|
|
|
199
193
|
GUILayout.Label("If no blocks are visible, re-load the Voxel World.");
|
|
200
194
|
}
|
|
201
195
|
|
|
202
|
-
|
|
196
|
+
var selectedStyle = new GUIStyle(GUI.skin.button);
|
|
203
197
|
selectedStyle.normal.textColor = Color.green;
|
|
204
198
|
selectedStyle.hover.textColor = Color.green;
|
|
205
|
-
|
|
206
|
-
foreach (var pair in world.voxelBlocks.loadedBlocks) {
|
|
207
199
|
|
|
208
|
-
|
|
200
|
+
foreach (var pair in world.voxelBlocks.loadedBlocks) {
|
|
201
|
+
var name = pair.Value.definition.name;
|
|
209
202
|
if (name == "") {
|
|
210
203
|
name = "Air";
|
|
211
204
|
}
|
|
@@ -218,27 +211,21 @@ namespace Code.Airship.Resources.VoxelRenderer.Editor {
|
|
|
218
211
|
}
|
|
219
212
|
}
|
|
220
213
|
}
|
|
214
|
+
|
|
221
215
|
GUILayout.EndScrollView();
|
|
222
216
|
GUI.enabled = true;
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
void onSceneGUIDelegate(SceneView sceneView) {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
217
|
}
|
|
232
218
|
|
|
233
|
-
void
|
|
234
|
-
|
|
219
|
+
private void onSceneGUIDelegate(SceneView sceneView) { }
|
|
220
|
+
|
|
221
|
+
private void OnEnable() {
|
|
222
|
+
autoRepaintOnSceneChange = true;
|
|
235
223
|
SceneView.duringSceneGui += onSceneGUIDelegate;
|
|
236
|
-
|
|
237
|
-
|
|
224
|
+
}
|
|
225
|
+
|
|
238
226
|
private void OnDisable() {
|
|
239
227
|
SceneView.duringSceneGui -= onSceneGUIDelegate;
|
|
240
228
|
}
|
|
241
229
|
}
|
|
242
|
-
|
|
243
230
|
}
|
|
244
231
|
#endif
|