// Add a new block at the given position. The intent is to allow players to immediately // reflect actions in the local game, which may eventually be replaced when the update // is returned from the server. public void placeBlock(float x, float z, float height, int type) { // Coordinates for the region block - only horizontal elements. Vector3 llbpos = new Vector3(x, 0.0f, z); LocalLevelBlock llb = findLevelBlock(llbpos); int blockHeight = (int)(height - WorldManager.minLevelHeight); if (llb != null) { Vector3 regionpos = new Vector3(x - llb.region.blockCoordX, z - llb.region.blockCoordY, blockHeight); // llb should now be valid. // Make a local copy before signalling the change to the world. //llb.region.placeSingleBlock (localBrick, regionpos, llb.gobject.transform); } else // else no region - potential problem. { Debug.Log("No level block at " + llbpos); } Debug.Log("Add at " + x + " " + z + " " + blockHeight); BlockAddMessage m = new BlockAddMessage(); m.px = x; m.pz = z; m.height = blockHeight; m.blocktype = type; NetworkManager.singleton.client.Send(LevelMsgType.LevelUpdate, m); }
/// Create a level block corresponding to the given region block and /// add this to the cache of blocks. Assumes that such a block does /// not already exist, or a duplicate will be created. public LocalLevelBlock addLevelBlock(RegionBlock rb, Vector3 position) { // Debug.Log ("New local block " + position); LocalLevelBlock llb = new LocalLevelBlock(); llb.region = rb; llb.gobject = UnityEngine.Object.Instantiate(localLevelElement, position, Quaternion.identity); levelStructure.Add(llb); return(llb); }
/// Return the value of the cell at the given position. Returns /// false if no cell exists within the local cache. public bool findBlock(Vector3 position, out int value) { LocalLevelBlock llb = findLevelBlock(position); if (llb != null) { int rx = (int)(position.x - llb.region.blockCoordX); int ry = (int)(position.z - llb.region.blockCoordY); int rz = (int)(position.y); value = llb.region.getBlock(rx, ry, rz); return(true); } value = 0; return(false); }
/// Handle incoming updates from the server. void ServerCommandHandler(NetworkMessage netMsg) { switch (netMsg.msgType) { case LevelMsgType.LevelResponse: // Received an updated region block from the server. Update // the cache, and ensure that the local visual representation // is consistent. { RegionBlock rb = netMsg.ReadMessage <RegionBlock>(); // Debug.Log ("Server Got message: " + rb.blockSize); MeshFilter mf = GetComponent <MeshFilter>(); rb.convertToMesh(mf.mesh); Vector2 rbpos = rb.getPosition(); Vector3 llbpos = new Vector3(rbpos.x, WorldManager.minLevelHeight, rbpos.y); LocalLevelBlock llb = findLevelBlock(llbpos); if (llb == null) { llb = addLevelBlock(rb, llbpos); // llb should now be valid. llb.region.placeBlocks(llb.gobject.transform); } else { // if version is newer than the one we already have, then update it. if (rb.timeLastChanged > llb.region.timeLastChanged) { llb.region = rb; // Debug.Log ("Got update ..................................>"); llb.region.placeBlocks(llb.gobject.transform); } } flushRegions(); } break; case LevelMsgType.PlayerList: /// Message containing list of active players. { } break; case LevelMsgType.EmoteSingleSender: /// Handle incoming emotes from server { SendEmoteMessageAndClientID m = netMsg.ReadMessage <SendEmoteMessageAndClientID> (); displayEmote(m.emoteType, m.netId); Debug.Log("Incoming emote to client from server from network id: " + m.netId); } break; case LevelMsgType.PlayerFlagRequest: { PlayerFlagMessage m = netMsg.ReadMessage <PlayerFlagMessage> (); if (m.removed == false) { //Do UI message to player here informing them of failure to remove flag. } if (m.removed == true) { PlayerMove player = ClientScene.localPlayers[0].gameObject.GetComponent <PlayerMove>(); player.playerFlagPlaced = false; } } break; default: { Debug.Log("Unexpected message type in LocalWorld"); } break; } }