public void ClientConnected(MultiplayerClient client) { Player player = (Player)CreateAvatar("player_remote", Graphics.TilePositionToVector3(GetPlayerResetPosition())); player.resetPosition = GetPlayerResetPosition(); FillPlayerInventory(player.inventory); client.id = player.objectId; MultiplayerAction initialDataAction = new MultiplayerAction(MultiplayerAction.Action.INITIAL_DATA, GetInitialData(client, player)); client.AddAction(initialDataAction); //Send others avatars foreach (Avatar avatar in world.avatarManager.Avatars) { if (avatar.objectId != player.objectId) { client.AddAction(new MultiplayerAction( MultiplayerAction.Action.AVATAR_CREATE, new String[] { avatar.objectId.ToString(), "player_remote", avatar.position.x.ToString(), avatar.position.y.ToString(), avatar.position.z.ToString(), avatar.rotation.x.ToString(), avatar.rotation.y.ToString(), avatar.rotation.z.ToString() })); } } stats.multiplayerConnectedClients++; }
static public byte[] Serialize(MultiplayerAction action) { byte[] data = new byte[1 + action.extraData.Length]; data[0] = (byte) action.action; Array.ConstrainedCopy(action.extraData, 0, data, 1, action.extraData.Length); return data; }
static public MultiplayerAction Deserialize(byte[] data) { MultiplayerAction.Action action = (MultiplayerAction.Action) data[0]; byte[] extraData = new byte[data.Length - 1]; Array.ConstrainedCopy(data, 1, extraData, 0, extraData.Length); MultiplayerAction ma = new MultiplayerAction(action, extraData); return ma; }
public void ClientActionReceived(MultiplayerClient client, MultiplayerAction action) { switch (action.action) { case MultiplayerAction.Action.AVATAR_MOVE: { int objectId = Int32.Parse(action.GetParameter(0)); Vector3 pos = new Vector3( Single.Parse(action.GetParameter(1)), Single.Parse(action.GetParameter(2)), Single.Parse(action.GetParameter(3))); Vector3 rot = new Vector3( Single.Parse(action.GetParameter(4)), Single.Parse(action.GetParameter(5)), Single.Parse(action.GetParameter(6))); if (objectId == client.id) { Avatar avatar = world.avatarManager.GetAvatarByObjectId(objectId); avatar.position = pos; avatar.rotation = rot; server.SendToEveryone(action, client.id); } break; } case MultiplayerAction.Action.TILE_CREATE: { byte tileType = byte.Parse(action.GetParameter(0)); TilePosition pos = new TilePosition( Int32.Parse(action.GetParameter(1)), Int32.Parse(action.GetParameter(2)), Int32.Parse(action.GetParameter(3))); CreateTile(pos, tileType); break; } case MultiplayerAction.Action.TILE_CLICKED: { TilePosition pos = new TilePosition( Int32.Parse(action.GetParameter(0)), Int32.Parse(action.GetParameter(1)), Int32.Parse(action.GetParameter(2))); this.TileClicked(pos); break; } case MultiplayerAction.Action.TILE_HIT: { string itemId = action.GetParameter(0); TilePosition pos = new TilePosition( Int32.Parse(action.GetParameter(1)), Int32.Parse(action.GetParameter(2)), Int32.Parse(action.GetParameter(3))); this.TileHit(pos, world.itemManager.GetItemDefinitionById(itemId)); break; } } }
public void ClientConnected(MultiplayerClient client) { Player player = (Player) CreateAvatar("player_remote", Graphics.TilePositionToVector3(GetPlayerResetPosition())); player.resetPosition = GetPlayerResetPosition(); FillPlayerInventory(player.inventory); client.id = player.objectId; MultiplayerAction initialDataAction = new MultiplayerAction(MultiplayerAction.Action.INITIAL_DATA, GetInitialData(client, player)); client.AddAction(initialDataAction); //Send others avatars foreach (Avatar avatar in world.avatarManager.Avatars) { if (avatar.objectId != player.objectId) { client.AddAction(new MultiplayerAction( MultiplayerAction.Action.AVATAR_CREATE, new String[] { avatar.objectId.ToString(), "player_remote", avatar.position.x.ToString(), avatar.position.y.ToString(), avatar.position.z.ToString(), avatar.rotation.x.ToString(), avatar.rotation.y.ToString(), avatar.rotation.z.ToString() })); } } stats.multiplayerConnectedClients++; }
public void ClientActionReceived(MultiplayerClient client, MultiplayerAction action) { switch (action.action) { case MultiplayerAction.Action.INITIAL_DATA: initializationDataReceived = true; initializationData = action.extraData; break; case MultiplayerAction.Action.AVATAR_MOVE: { int objectId = Int32.Parse(action.GetParameter(0)); Vector3 pos = new Vector3( Single.Parse(action.GetParameter(1)), Single.Parse(action.GetParameter(2)), Single.Parse(action.GetParameter(3))); Vector3 rot = new Vector3( Single.Parse(action.GetParameter(4)), Single.Parse(action.GetParameter(5)), Single.Parse(action.GetParameter(6))); Avatar avatar = world.avatarManager.GetAvatarByObjectId(objectId); avatar.position = pos; avatar.rotation = rot; break; } case MultiplayerAction.Action.AVATAR_CREATE: { int objectId = Int32.Parse(action.GetParameter(0)); string avatarDefinitionId = action.GetParameter(1); Vector3 pos = new Vector3( Single.Parse(action.GetParameter(2)), Single.Parse(action.GetParameter(3)), Single.Parse(action.GetParameter(4))); Vector3 rot = new Vector3( Single.Parse(action.GetParameter(5)), Single.Parse(action.GetParameter(6)), Single.Parse(action.GetParameter(7))); Avatar avatar = world.avatarManager.CreateAvatar(world.avatarManager.GetAvatarDefinitionById(avatarDefinitionId), objectId, pos, true); avatar.rotation = rot; break; } case MultiplayerAction.Action.AVATAR_DESTROY: { int objectId = Int32.Parse(action.GetParameter(0)); world.avatarManager.DestroyAvatar(world.avatarManager.GetAvatarByObjectId(objectId)); break; } case MultiplayerAction.Action.TILE_INVALIDATED: { MemoryStream ms = new MemoryStream(action.extraData); BinaryReader br = new BinaryReader(ms); int n = br.ReadInt32(); Tile tile = new Tile(); for (int i = 0; i < n; i++) { TilePosition pos = SerializationUtils.ReadTilePosition(br); tile.Deserialize(br.ReadUInt32()); if (tile.tileType != world.tileManager.GetTileType(pos)) { world.tileManager.SetTileType(pos, tile.tileType); } if (tile.OnFire != world.tileManager.GetTileOnFire(pos)) { world.tileManager.SetTileOnFire(pos, tile.OnFire); } if (tile.ExtraData != world.tileManager.GetTileExtraData(pos)) { world.tileManager.SetTileExtraData(pos, tile.ExtraData); } if (tile.Energy != world.tileManager.GetTileEnergy(pos)) { world.tileManager.SetTileEnergy(pos, tile.Energy); } } break; } } }
public void AddAction(MultiplayerAction action) { actionsQueue.Add(action); }
public void SendToOne(MultiplayerAction action, int idClient) { foreach (MultiplayerClient client in clients) { if (client.id == idClient) { client.AddAction(action); break; } } }
public void SendToEveryone(MultiplayerAction action, int idClientToIgnore) { foreach (MultiplayerClient client in clients) if (client.id != idClientToIgnore && client.id >= 0) client.AddAction(action); }
public void ClientActionReceived(MultiplayerClient client, MultiplayerAction action) { switch (action.action) { case MultiplayerAction.Action.INITIAL_DATA: initializationDataReceived = true; initializationData = action.extraData; break; case MultiplayerAction.Action.AVATAR_MOVE: { int objectId = Int32.Parse(action.GetParameter(0)); Vector3 pos = new Vector3( Single.Parse(action.GetParameter(1)), Single.Parse(action.GetParameter(2)), Single.Parse(action.GetParameter(3))); Vector3 rot = new Vector3( Single.Parse(action.GetParameter(4)), Single.Parse(action.GetParameter(5)), Single.Parse(action.GetParameter(6))); Avatar avatar = world.avatarManager.GetAvatarByObjectId(objectId); avatar.position = pos; avatar.rotation = rot; break; } case MultiplayerAction.Action.AVATAR_CREATE: { int objectId = Int32.Parse(action.GetParameter(0)); string avatarDefinitionId = action.GetParameter(1); Vector3 pos = new Vector3( Single.Parse(action.GetParameter(2)), Single.Parse(action.GetParameter(3)), Single.Parse(action.GetParameter(4))); Vector3 rot = new Vector3( Single.Parse(action.GetParameter(5)), Single.Parse(action.GetParameter(6)), Single.Parse(action.GetParameter(7))); Avatar avatar = world.avatarManager.CreateAvatar(world.avatarManager.GetAvatarDefinitionById(avatarDefinitionId), objectId, pos, true); avatar.rotation = rot; break; } case MultiplayerAction.Action.AVATAR_DESTROY: { int objectId = Int32.Parse(action.GetParameter(0)); world.avatarManager.DestroyAvatar(world.avatarManager.GetAvatarByObjectId(objectId)); break; } case MultiplayerAction.Action.TILE_INVALIDATED: { MemoryStream ms = new MemoryStream(action.extraData); BinaryReader br = new BinaryReader(ms); int n = br.ReadInt32(); Tile tile = new Tile(); for (int i = 0; i < n; i++) { TilePosition pos = SerializationUtils.ReadTilePosition(br); tile.Deserialize(br.ReadUInt32()); if (tile.tileType != world.tileManager.GetTileType(pos)) world.tileManager.SetTileType(pos, tile.tileType); if (tile.OnFire != world.tileManager.GetTileOnFire(pos)) world.tileManager.SetTileOnFire(pos, tile.OnFire); if (tile.ExtraData != world.tileManager.GetTileExtraData(pos)) world.tileManager.SetTileExtraData(pos, tile.ExtraData); if (tile.Energy != world.tileManager.GetTileEnergy(pos)) world.tileManager.SetTileEnergy(pos, tile.Energy); } break; } } }