CrabBattleServer.CrabBehavior.CalculateHealth C# (CSharp) Method

CalculateHealth() public method

public CalculateHealth ( ) : void
return void
        public void CalculateHealth()
        {
            MaxHealth = 800 + 700 * GameServer.players.Count * GameServer.healthMod;
            CurrentHealth = MaxHealth;
        }

Usage Example

Esempio n. 1
0
        public void HandleMessages(object fromPlayer)
        {
            if ((inmsg = ((NetServer)fromPlayer).ReadMessage()) == null)
            {
                return;
            }

            NetOutgoingMessage outmsg;

            switch (inmsg.MessageType)
            {
            /*
             * case NetIncomingMessageType.DebugMessage:
             * case NetIncomingMessageType.VerboseDebugMessage:
             * case NetIncomingMessageType.WarningMessage:
             */
            case NetIncomingMessageType.ConnectionApproval:
            {
                if (players.Count == 0)
                {
                    idCount = 0;
                }
                Console.WriteLine("Incoming login request. " + inmsg.SenderConnection.ToString());
                AddNewPlayer(inmsg);

                if (gamePhase == (int)GameState.InGame || gamePhase == (int)GameState.Intro)
                {
                    // Auto Join Game
                    StartGame(players.Find(p => p.Connection == inmsg.SenderConnection));
                }
            }
            break;

            case NetIncomingMessageType.Data:

                PlayerObject player = players.Find(p => p.Connection == inmsg.SenderConnection);
                if (player == null || inmsg.LengthBytes < 1)
                {
                    break;         //Don't accept data from connections that don't have a player attached.
                }
                switch ((PacketTypes)inmsg.ReadByte())
                {
                case PacketTypes.LobbyMessage:
                {
                    string msg = inmsg.ReadString();
                    SendLobbyMessage(player.Name, msg);
                    Console.WriteLine("Chat " + player.Name + ": " + msg);
                }
                break;

                case PacketTypes.SettingsChange:
                {
                    if (inmsg.LengthBytes < 2)
                    {
                        break;
                    }
                    //Difficulty or health mod changed, broadcast changes to all clients.
                    gameDifficulty = inmsg.ReadInt16();
                    healthMod      = inmsg.ReadInt16();
                    crab.CalculateHealth();
                    Console.WriteLine(player.Name + " (Id" + player.Id + ") changed difficulty/healthmod to " + gameDifficulty + "/" + healthMod + ".");

                    outmsg = server.CreateMessage();
                    outmsg.Write((byte)PacketTypes.SettingsChange);
                    outmsg.Write((Int16)gameDifficulty);
                    outmsg.Write((Int16)healthMod);
                    server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 5);
                }
                break;

                case PacketTypes.KeepAlive:
                {
                    // one way heartbeat from client. Server sets a timestamp.
                    // Unity can potentially keep unstable client threads open that waist server resources
                    player.keepAlive = NetTime.Now;
                }
                break;

                case PacketTypes.Beat:
                {
                    if (inmsg.LengthBytes < 2)
                    {
                        break;                                                                         // .PeekInt16()) break;
                    }
                    //if (!player.Ready) break;
                    player.LastBeat = inmsg.ReadInt16();
                    player.X        = inmsg.ReadFloat();
                    player.Y        = inmsg.ReadFloat();

                    if (crab.CurrentTarget == player.Id)
                    {
                        float CrabX = inmsg.ReadFloat();
                        float CrabZ = inmsg.ReadFloat();

                        crab.RealPosition.X = CrabX;
                        crab.RealPosition.Z = CrabZ;

                        if (crab.random.Next(0, 10) > 8)
                        {
                            crab.Direction = !crab.Direction;
                        }

                        //Crab position and target sync.
                        outmsg = server.CreateMessage();
                        outmsg.Write((byte)PacketTypes.EnemySync);
                        outmsg.Write((Int16)player.Id);      //Id of the current crab controller.
                        outmsg.Write(CrabX);                 //EnemyX
                        outmsg.Write(CrabZ);                 //EnemyZ
                        outmsg.Write(player.X);
                        outmsg.Write(player.Y);
                        outmsg.Write(crab.Direction);
                        outmsg.Write(player.Connection.AverageRoundtripTime / 2f);               //Divide by 2 to get trip time.
                        server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 3);
                    }
                }
                break;

                case PacketTypes.Ready:
                {
                    //Player is ready to start the game.
                    player.Ready = inmsg.ReadBoolean();

                    Console.WriteLine(player.Name + " (Id" + player.Id + ") changed their ready status to " + player.Ready);
                    if (player.Ready)
                    {
                        SendLobbyMessage("Server", player.Name + " is now Ready.");
                    }
                    else
                    {
                        SendLobbyMessage("Server", player.Name + " is no longer ready.");
                    }
                }
                break;

                case PacketTypes.PlayIntro:
                {
                    if (gamePhase == (int)GameState.InGame || gamePhase == (int)GameState.Intro)
                    {
                        SendConsoleMessage("cannot change intro while game is in play", inmsg.SenderConnection);
                        outmsg = server.CreateMessage();
                        outmsg.Write((byte)PacketTypes.PlayIntro);
                        outmsg.Write(false);
                        server.SendMessage(outmsg, inmsg.SenderConnection, NetDeliveryMethod.ReliableOrdered, 5);
                        break;
                    }
                    //Player changed the status of Play Intro
                    playintro = inmsg.ReadBoolean();
                    if (playintro)
                    {
                        introlength = new TimeSpan(0, 0, 21);
                    }
                    else
                    {
                        introlength = new TimeSpan(0, 0, 7);
                    }

                    Console.WriteLine(player.Name + " (Id" + player.Id + ") changed PlayInto to " + playintro);
                    if (playintro)
                    {
                        SendLobbyMessage("Server", player.Name + " enabled play intro.");
                    }
                    else
                    {
                        SendLobbyMessage("Server", player.Name + " skipped play intro.");
                    }

                    // Now sync everyone up.
                    outmsg = server.CreateMessage();
                    outmsg.Write((byte)PacketTypes.PlayIntro);
                    outmsg.Write(playintro);
                    server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 5);
                }
                break;

                case PacketTypes.UpdateName:
                {
                    //Player changed their name.  Since the clients aren't aware of each other until the game starts,
                    //there's no need to broadcast this message to other users.
                    string newname = inmsg.ReadString();
                    Console.WriteLine(player.Name + " (Id" + player.Id + ") changed their name to '" + newname + "'.");
                    SendLobbyMessage("Server", player.Name + " (Id" + player.Id + ") changed their name to '" + newname + "'.");
                    player.Name = newname;

                    // let all other clients know that player changed his/her name
                    outmsg = server.CreateMessage();
                    outmsg.Write((byte)PacketTypes.UpdateName);
                    outmsg.Write(player.Name);
                    outmsg.Write(player.Id);
                    server.SendToAll(outmsg, inmsg.SenderConnection, NetDeliveryMethod.ReliableOrdered, 5);
                }
                break;

                case PacketTypes.Disconnect:
                {
                    //Player requests to disconnect from the server.
                    Console.WriteLine(player.Name + " (Id" + player.Id + ") has disconnected, removing player object.");

                    outmsg = server.CreateMessage();
                    outmsg.Write((byte)PacketTypes.RemovePlayer);
                    outmsg.Write((Int16)player.Id);
                    server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 1);

                    players.Remove(player);

                    outmsg = server.CreateMessage();
                    outmsg.Write((byte)PacketTypes.PlayerCount);
                    outmsg.Write((Int16)players.Count);
                    server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 6);
                }
                break;

                case PacketTypes.StartGame:
                {
                    StartGame(player);
                }
                break;

                case PacketTypes.PlayerSpecial:
                {
                    int shottype = inmsg.ReadInt16();

                    outmsg = server.CreateMessage();
                    outmsg.Write((byte)PacketTypes.PlayerSpecial);
                    outmsg.Write((Int16)player.Id);
                    outmsg.Write((Int16)shottype);
                    server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableUnordered, 2);
                    //Console.WriteLine("Relaying Special Action Message for " + player.Name + ".");
                }
                break;

                case PacketTypes.PlayerAction:
                {
                    if (inmsg.LengthBytes < 2)
                    {
                        break;
                    }
                    //Player hit a key or something!  Change their status, broadcast to other users.

                    //Set player values
                    //inmsg.ReadInt16(); //Player id is submitted, but not used.
                    player.X         = inmsg.ReadFloat();
                    player.Y         = inmsg.ReadFloat();
                    player.VelocityX = inmsg.ReadFloat();
                    player.VelocityY = inmsg.ReadFloat();
                    player.Firing    = inmsg.ReadBoolean();

                    //Broadcast them to everyone else
                    outmsg = server.CreateMessage();
                    outmsg.Write((byte)PacketTypes.PlayerAction);
                    outmsg.Write((Int16)player.Id);
                    outmsg.Write(player.X);
                    outmsg.Write(player.Y);
                    outmsg.Write(player.VelocityX);
                    outmsg.Write(player.VelocityY);
                    outmsg.Write(player.Firing);
                    outmsg.Write(player.Connection.AverageRoundtripTime / 2f);               //Not an exact science, but we'll use this to predict their position.
                    server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 2);

                    //Console.WriteLine("Relaying Action Message for " + player.Name + ". "+player.VelocityX + " " + player.VelocityY);
                }
                break;

                case PacketTypes.HurtTarget:
                {
                    int damage = inmsg.ReadInt16();

                    crab.CurrentHealth -= damage;
                    bool hittype = inmsg.ReadBoolean();

                    if (!hittype)
                    {
                        player.dmgnormal += damage;
                    }
                    else
                    {
                        player.dmgweakpoint += damage;
                    }

                    outmsg = server.CreateMessage();
                    outmsg.Write((byte)PacketTypes.EnemyHealth);
                    outmsg.Write((Int16)crab.CurrentHealth);
                    server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableUnordered, 3);
                }
                break;

                case PacketTypes.PlayerHit:
                {
                    player.hitstaken += 1;

                    outmsg = server.CreateMessage();
                    outmsg.Write((byte)PacketTypes.PlayerHit);
                    outmsg.Write((Int16)player.Id);
                    server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableUnordered, 2);
                }
                break;
                }
                break;

            case NetIncomingMessageType.StatusChanged:
            {
                player = players.Find(p => p.Connection == inmsg.SenderConnection);
                if (player == null)
                {
                    break;             //Don't accept data from connections that don't have a player attached.
                }
                NetConnectionStatus status = (NetConnectionStatus)inmsg.ReadByte();
                string reason = inmsg.ReadString();

                if (player.Connection.Status == NetConnectionStatus.Disconnected || player.Connection.Status == NetConnectionStatus.Disconnecting)
                {
                    SendLobbyMessage("Server", player.Name + " (Id" + player.Id + ") has disconnected.");

                    outmsg = server.CreateMessage();
                    outmsg.Write((byte)PacketTypes.RemovePlayer);
                    outmsg.Write((Int16)player.Id);
                    server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 1);

                    players.Remove(player);

                    outmsg = server.CreateMessage();
                    outmsg.Write((byte)PacketTypes.PlayerCount);
                    outmsg.Write((Int16)players.Count);
                    server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 6);
                }
                Console.WriteLine(player.Name + " (Id" + player.Id + ") status changed to " + status + " (" + reason + ") " + players.Count);
            }
            break;

            default:
                break;
            }
        }