void HandleInstantiationPacket(NetInboundPacket packet) { string eventName = packet.ReadString(); ushort id = packet.ReadUInt16(); bool isOwner = packet.ReadBool(); NetInstantiationCallback callback; if (instCallbacks.TryGetValue(eventName, out callback)) { if (netObjects.Creatables.ContainsKey(id)) { DashCMD.WriteError("[ObjectNC] Creatable with id {0} is already instantiated!", id); return; } //DashCMD.WriteLine("[ObjectNC] Instantiating creatable with id {0}...", id); INetCreatable creatable = callback(id, isOwner, packet); NetCreatableInfo info = new NetCreatableInfo(packet.Sender, creatable, id, isOwner); netObjects.Add(id, info); INetEntity entity = creatable as INetEntity; if (entity != null && snapshotComponent.WorldSnapshot != null) { NetEntityListSnapshot entList = snapshotComponent.WorldSnapshot.NetEntityListSnapshot; entList.AddNetEntity(info, entity); } creatable.OnNetworkInstantiated(info); if (OnCreatableInstantiated != null) { OnCreatableInstantiated(this, info); } } else { DashCMD.WriteError("[ObjectNC] Received instantiation for unknown type: {0}", eventName); } }
public void NetworkInstantiate(INetCreatable creatable, string instEventName, NetConnection clientOwner, params object[] args) { ushort netId = lastNetEntId++; if (netId == 0) { netId++; } NetCreatableInfo info = new NetCreatableInfo(clientOwner, creatable, netId, true); INetEntity entity = creatable as INetEntity; if (entity != null) { foreach (NetConnectionSnapshotState state in snapshotComponent.ConnectionStates.Values) { state.WorldSnapshot.NetEntityListSnapshot.AddNetEntity(info, entity); } } creatable.OnNetworkInstantiated(info); if (OnCreatableInstantiated != null) { OnCreatableInstantiated(this, info); } netObjects.Add(netId, info); foreach (NetConnection conn in server.Connections.Values) { NetOutboundPacket packet = new NetOutboundPacket(NetDeliveryMethod.Reliable); packet.Write((byte)CustomPacketType.Instantiate); packet.Write(instEventName); packet.Write(netId); packet.Write(conn == clientOwner); for (int i = 0; i < args.Length; i++) { packet.WriteDynamic(args[i]); } conn.SendPacket(packet); } NetOutboundPacket epacket = new NetOutboundPacket(NetDeliveryMethod.Reliable); epacket.Write((byte)CustomPacketType.Instantiate); epacket.Write(instEventName); epacket.Write(netId); epacket.Write(false); for (int i = 0; i < args.Length; i++) { epacket.WriteDynamic(args[i]); } instPackets.Add(netId, epacket); }