@@ -70,10 +70,13 @@ private void OnValidate()
70
70
{
71
71
for ( int i = 0 ; i < SpawnablePrefabs . Count ; i ++ )
72
72
{
73
- if ( SpawnablePrefabs [ i ] . GetComponentInChildren < NetworkedObject > ( ) == null )
73
+ NetworkedObject netObject = SpawnablePrefabs [ i ] . GetComponentInChildren < NetworkedObject > ( ) ;
74
+ if ( netObject == null )
74
75
{
75
76
Debug . LogWarning ( "MLAPI: All SpawnablePrefabs need a NetworkedObject component. Please add one to the prefab " + SpawnablePrefabs [ i ] . gameObject . name ) ;
77
+ continue ;
76
78
}
79
+ netObject . SpawnablePrefabIndex = i ;
77
80
}
78
81
}
79
82
@@ -86,7 +89,7 @@ internal GameObject SpawnObject(int spawnablePrefabIndex, uint networkId, int ow
86
89
Debug . LogWarning ( "MLAPI: Please add a NetworkedObject component to the root of all spawnable objects" ) ;
87
90
netObject = go . AddComponent < NetworkedObject > ( ) ;
88
91
}
89
- netObject . SpawnablePrefabId = spawnablePrefabIndex ;
92
+ netObject . SpawnablePrefabIndex = spawnablePrefabIndex ;
90
93
if ( singleton . isServer )
91
94
{
92
95
netObject . NetworkId = singleton . GetNetworkObjectId ( ) ;
@@ -125,15 +128,82 @@ internal GameObject SpawnPlayerObject(int clientId, uint networkId)
125
128
return go ;
126
129
}
127
130
128
- internal static void OnDestroyObject ( uint networkId )
131
+ internal void OnDestroyObject ( uint networkId , bool destroyGameObject )
129
132
{
130
- if ( ! singleton . isServer )
133
+ if ( ! spawnedObjects . ContainsKey ( networkId ) || ! NetworkConfig . HandleObjectSpawning )
131
134
return ;
135
+ GameObject go = spawnedObjects [ networkId ] . gameObject ;
136
+ if ( isServer )
137
+ {
138
+ releasedNetworkObjectIds . Push ( networkId ) ;
139
+ if ( ! spawnedObjects [ networkId ] . ServerOnly )
140
+ {
141
+ using ( MemoryStream stream = new MemoryStream ( ) )
142
+ {
143
+ using ( BinaryWriter writer = new BinaryWriter ( stream ) )
144
+ {
145
+ writer . Write ( networkId ) ;
146
+ }
147
+ //If we are host, send to everyone except ourselves. Otherwise, send to all
148
+ if ( isHost )
149
+ Send ( "MLAPI_DESTROY_OBJECT" , "MLAPI_RELIABLE_FRAGMENTED" , stream . ToArray ( ) , - 1 ) ;
150
+ else
151
+ Send ( "MLAPI_DESTROY_OBJECT" , "MLAPI_RELIABLE_FRAGMENTED" , stream . ToArray ( ) ) ;
152
+ }
153
+ }
154
+ }
155
+ if ( destroyGameObject )
156
+ Destroy ( go ) ;
157
+ spawnedObjects . Remove ( networkId ) ;
158
+ }
132
159
133
- if ( ! singleton . spawnedObjects . ContainsKey ( networkId ) )
160
+ internal void OnSpawnObject ( NetworkedObject netObject , int ? clientOwnerId = null )
161
+ {
162
+ if ( netObject . isSpawned )
163
+ {
164
+ Debug . LogWarning ( "MLAPI: Object already spawned" ) ;
165
+ return ;
166
+ }
167
+ else if ( ! isServer )
168
+ {
169
+ Debug . LogWarning ( "MLAPI: Only server can spawn objects" ) ;
170
+ return ;
171
+ }
172
+ else if ( netObject . SpawnablePrefabIndex == - 1 )
173
+ {
174
+ Debug . LogWarning ( "MLAPI: Invalid prefab index" ) ;
175
+ return ;
176
+ }
177
+ else if ( netObject . ServerOnly )
178
+ {
179
+ Debug . LogWarning ( "MLAPI: Server only objects does not have to be spawned" ) ;
180
+ return ;
181
+ }
182
+ else if ( NetworkConfig . HandleObjectSpawning )
183
+ {
184
+ Debug . LogWarning ( "MLAPI: NetworkingConfiguration is set to not handle object spawning" ) ;
134
185
return ;
135
- NetworkedObject netObject = singleton . spawnedObjects [ networkId ] ;
136
- singleton . releasedNetworkObjectIds . Push ( networkId ) ;
186
+ }
187
+ uint netId = GetNetworkObjectId ( ) ;
188
+ spawnedObjects . Add ( netId , netObject ) ;
189
+ netObject . isSpawned = true ;
190
+ if ( clientOwnerId != null )
191
+ netObject . OwnerClientId = ( int ) clientOwnerId ;
192
+ using ( MemoryStream stream = new MemoryStream ( ) )
193
+ {
194
+ using ( BinaryWriter writer = new BinaryWriter ( stream ) )
195
+ {
196
+ writer . Write ( false ) ;
197
+ writer . Write ( netObject . NetworkId ) ;
198
+ writer . Write ( netObject . OwnerClientId ) ;
199
+ writer . Write ( netObject . SpawnablePrefabIndex ) ;
200
+ }
201
+ //If we are host, send to everyone except ourselves. Otherwise, send to all
202
+ if ( isHost )
203
+ Send ( "MLAPI_ADD_OBJECT" , "MLAPI_RELIABLE_FRAGMENTED" , stream . ToArray ( ) , - 1 ) ;
204
+ else
205
+ Send ( "MLAPI_ADD_OBJECT" , "MLAPI_RELIABLE_FRAGMENTED" , stream . ToArray ( ) ) ;
206
+ }
137
207
}
138
208
139
209
internal void InvokeMessageHandlers ( string messageType , byte [ ] data , int clientId )
@@ -238,6 +308,7 @@ private ConnectionConfig Init(NetworkingConfiguration netConfig)
238
308
messageTypes . Add ( "MLAPI_CONNECTION_APPROVED" , 1 ) ;
239
309
messageTypes . Add ( "MLAPI_ADD_OBJECT" , 2 ) ;
240
310
messageTypes . Add ( "MLAPI_CLIENT_DISCONNECT" , 3 ) ;
311
+ messageTypes . Add ( "MLAPI_DESTROY_OBJECT" , 4 ) ;
241
312
242
313
243
314
HashSet < string > channelNames = new HashSet < string > ( ) ;
@@ -564,6 +635,20 @@ private void HandleIncomingData(int connectonId, byte[] data)
564
635
}
565
636
}
566
637
break ;
638
+ case 4 :
639
+ //Server infroms clients to destroy an object
640
+ if ( isClient )
641
+ {
642
+ using ( MemoryStream messageReadStream = new MemoryStream ( incommingData ) )
643
+ {
644
+ using ( BinaryReader messageReader = new BinaryReader ( messageReadStream ) )
645
+ {
646
+ uint netId = messageReader . ReadUInt32 ( ) ;
647
+ OnDestroyObject ( netId , true ) ;
648
+ }
649
+ }
650
+ }
651
+ break ;
567
652
}
568
653
}
569
654
}
@@ -822,7 +907,7 @@ private void HandleApproval(int clientId, bool approved)
822
907
writer . Write ( pair . Value . IsPlayerObject ) ;
823
908
writer . Write ( pair . Value . NetworkId ) ;
824
909
writer . Write ( pair . Value . OwnerClientId ) ;
825
- writer . Write ( pair . Value . SpawnablePrefabId ) ;
910
+ writer . Write ( pair . Value . SpawnablePrefabIndex ) ;
826
911
}
827
912
}
828
913
}
0 commit comments