// Server
    private IEnumerator GameTimerRoutine()
    {
        // Set initial values
        this.currentGameTime  = this.gameTime;
        this.lastSentGameTime = (int)this.gameTime;

        yield return(new WaitUntil(() => this.isPlayingGame == true));

        // Main loop
        while (this.isPlayingGame)
        {
            this.currentGameTime -= Time.deltaTime;

            if (this.currentGameTime < this.lastSentGameTime)
            {
                //Debug.Log("Send time update");
                this.lastSentGameTime = (int)this.currentGameTime;

                // Send msg
                GameTimeMessage msg = new GameTimeMessage();
                msg.gameTime = this.lastSentGameTime;
                NetworkServer.SendToAll(CustomMsgType.GameTime, msg);

                if (this.currentGameTime <= 0)
                {
                    this.isPlayingGame = false;
                    this.GameEnding();
                }
            }

            yield return(null);
        }

        yield return(null);
    }
    // Client
    public void OnGameTimeMessage(NetworkMessage _networkMessage)
    {
        // Read msg
        GameTimeMessage msg = _networkMessage.ReadMessage <GameTimeMessage>();

        // Update canvas
        this.canvasManager.OnGameTimeUpdate(msg.gameTime);
    }
Exemple #3
0
        /// <summary>
        /// </summary>
        /// <param name="charID">
        /// </param>
        /// <param name="client">
        /// </param>
        public void Read(int charID, ZoneClient client)
        {
            // Don't edit anything in this region
            // unless you are 300% sure you know what you're doing

            // Character is created and read when Client connects in Client.cs->CreateCharacter
            // client.CreateCharacter(charID);
            client.Server.Info(
                client,
                "Client connected. ID: {0} IP: {1} Character name: {2}",
                client.Character.Identity.Instance,
                client.ClientAddress,
                client.Character.Name);

            // now we have to start sending packets like
            // character stats, inventory, playfield info
            // and so on. I will put some packets here just
            // to get us in game. We have to start moving
            // these packets somewhere else and make packet
            // builders instead of sending (half) hardcoded
            // packets.

            /* send chat server info to client */
            ChatServerInfo.Send(client);

            /* send playfield info to client */
            PlayfieldAnarchyF.Send(client);

            var sendSCFUs = new IMSendPlayerSCFUs {
                toClient = client
            };

            ((Playfield)client.Playfield).SendSCFUsToClient(sendSCFUs);

            /* set SocialStatus to 0 */
            client.Character.Stats[521].BaseValue = 0;

            // Stat.SendDirect(client, 521, 0, false);

            var identity = new Identity {
                Type = IdentityType.CanbeAffected, Instance = charID
            };

            /* Action 167 Animation and Stance Data maybe? */
            var message = new CharacterActionMessage
            {
                Identity   = identity,
                Action     = CharacterActionType.ChangeAnimationAndStance,
                Target     = Identity.None,
                Parameter1 = 0x00000000,
                Parameter2 = 0x00000001
            };

            client.SendCompressed(message);

            var gameTimeMessage = new GameTimeMessage
            {
                Identity = identity,
                Unknown1 = 30024.0f,
                Unknown3 = 185408,
                Unknown4 = 80183.3125f
            };

            client.SendCompressed(gameTimeMessage);

            /* set SocialStatus to 0 */
            // Stat.SendDirect(client, 521, 0, false);

            /* again */
            // Stat.SendDirect(client, 521, 0, false);

            /* visual */
            SimpleCharFullUpdate.SendToPlayfield(client);

            /* inventory, items and all that */
            FullCharacter.Send(client);

            var specials = new[]
            {
                new SpecialAttackInfo
                {
                    Unknown1 = 0x0000AAC0,
                    Unknown2 = 0x00023569,
                    Unknown3 = 0x00000064,
                    Unknown4 = "MAAT"
                },
                new SpecialAttackInfo
                {
                    Unknown1 = 0x0000A431,
                    Unknown2 = 0x0000A430,
                    Unknown3 = 0x00000090,
                    Unknown4 = "DIIT"
                },
                new SpecialAttackInfo
                {
                    Unknown1 = 0x00011294,
                    Unknown2 = 0x00011295,
                    Unknown3 = 0x0000008E,
                    Unknown4 = "BRAW"
                }
            };
            var specialAttackWeaponMessage = new SpecialAttackWeaponMessage {
                Identity = identity, Specials = specials
            };

            client.SendCompressed(specialAttackWeaponMessage);

            // done

            // Timers are allowed to update client stats now.
            client.Character.DoNotDoTimers = false;

            // spawn all active monsters to client
            // TODO: Implement NonPlayerCharacterHandler
            // NonPlayerCharacterHandler.SpawnMonstersInPlayfieldToClient(client, client.Character.PlayField);

            // TODO: Implement VendorHandler
            // if (VendorHandler.GetNumberofVendorsinPlayfield(client.Character.PlayField) > 0)
            // {
            // Shops
            // VendorHandler.GetVendorsInPF(client);
            // }

            // WeaponItemFullCharUpdate  Maybe the right location , First Check if weapons present usually in equipment
            // Packets.WeaponItemFullUpdate.Send(client, client.Character);

            // TODO: create a better alternative to ProcessTimers
            // client.Character.ProcessTimers(DateTime.Now + TimeSpan.FromMilliseconds(200));
            client.Character.CalculateSkills();

            AppearanceUpdate.AnnounceAppearanceUpdate((Character)client.Character);

            // done, so we call a hook.
            // Call all OnConnect script Methods
            Program.csc.CallMethod("OnConnect", (Character)client.Character);
        }