Exemple #1
0
    // 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);
    }
Exemple #2
0
    /// 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);
    }
Exemple #3
0
    /// 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);
    }
Exemple #4
0
    /// 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;
        }
    }