示例#1
0
    /*
     *  ProcessUserCmd
     *  Parameters:
     *  1) UserCmd cmd
     *      This is the usercmd that we're going to process, this code should only be called on the server instance of the object
     *  TODO(Jake): Allow the local player to process their own usercmd upon creation AKA Client-Sided Prediction
     *  https://en.wikipedia.org/wiki/Client-side_prediction
     */
    public void ProcessUserCmd(UserCmd cmd)
    {
        if (cmd.ActionPressed(PlayerInputSynchronization.IN_FIRE))
        {
            //Fire!
        }
        if (cmd.ActionPressed(PlayerInputSynchronization.IN_ACCELERATE))
        {
            //Accelerate!
            Debug.Log("Accelerate!");
        }

        bool moveLeft  = cmd.ActionPressed(PlayerInputSynchronization.IN_LEFT),
             moveRight = cmd.ActionPressed(PlayerInputSynchronization.IN_RIGHT);

        if (moveLeft ^ moveRight)
        {
            if (moveLeft)
            {
                m_TargetController.HorizontalMoveDirection = -1;
            }
            else
            {
                m_TargetController.HorizontalMoveDirection = 1;
            }
        }
        else
        {
            m_TargetController.HorizontalMoveDirection = 0;
        }

        if (cmd.ActionPressed(PlayerInputSynchronization.IN_RIGHT))
        {
        }
    }
示例#2
0
        public void CopyFrom(object rightComponent)
        {
            var right = rightComponent as SendUserCmdComponent;

            //Seq = right.Seq;
            FrameInterval  = right.FrameInterval;
            MoveHorizontal = right.MoveHorizontal;
            MoveUpDown     = right.MoveUpDown;
            MoveVertical   = right.MoveVertical;
            DeltaYaw       = right.DeltaYaw;
            DeltaPitch     = right.DeltaPitch;
            RenderTime     = right.RenderTime;
            ClientTime     = right.ClientTime;
            ChangedSeat    = right.ChangedSeat;
            //SnapshotId = right.SnapshotId;
            BeState      = right.BeState;
            Buttons      = right.Buttons;
            SwitchNumber = right.SwitchNumber;

            CurWeapon         = right.CurWeapon;
            UseEntityId       = right.UseEntityId;
            ManualPickUpEquip = right.ManualPickUpEquip;
            AutoPickUpEquip   = UserCmd.CopyList(AutoPickUpEquip, right.AutoPickUpEquip);
            UseVehicleSeat    = right.UseVehicleSeat;
            UseType           = right.UseType;
            ChangeChannel     = right.ChangeChannel;
            BagIndex          = right.BagIndex;
        }
        public static ReusableList <IUserCmd> FromProtoBuf(UserCmdMessage message)
        {
            ReusableList <IUserCmd> list = ReusableList <IUserCmd> .Allocate();

            var count = message.UserCmdList.Count;

            for (int i = 0; i < count; i++)
            {
                var     item = message.UserCmdList[i];
                UserCmd cmd  = UserCmd.Allocate();
                cmd.RenderTime     = item.RenderTime;
                cmd.FrameInterval  = item.FrameInterval;
                cmd.MoveHorizontal = item.MoveHorizontal;
                cmd.MoveVertical   = item.MoveVertical;
                cmd.MoveUpDown     = item.MoveUpDown;
                cmd.Seq            = item.Seq;
                cmd.DeltaPitch     = item.DeltaPitch;
                cmd.DeltaYaw       = item.DeltaYaw;
                cmd.Buttons        = item.Buttons;
                cmd.BeState        = item.BeState;
                cmd.SwitchNumber   = item.SwitchNumber;
                cmd.ChangedSeat    = item.ChangedSeat;
                cmd.ChangeChannel  = item.ChangeChannel;
                cmd.SnapshotId     = item.SnapshotId;
                cmd.CurWeapon      = item.CurWeapon;
                cmd.PickUpEquip    = item.PickUpEquip;
                cmd.UseEntityId    = item.UseVehicleId;
                cmd.UseVehicleSeat = item.UseVehicleSeat;
                cmd.UseType        = item.UseType;
                cmd.BagIndex       = item.BagIndex;
                list.Value.Add(cmd);
            }
            return(list);
        }
示例#4
0
    void ServerReceiveCommand(NetworkMessage message)
    {
        InputSynchronizationMessage inputMessage = message.ReadMessage <InputSynchronizationMessage>();

        // Get network ID from sent object.
        NetworkInstanceId netId = new NetworkInstanceId(inputMessage.netId);

        // Find instance of local object.
        GameObject foundObj = NetworkServer.FindLocalObject(netId);

        // Verify object existance.
        if (foundObj == null)
        {
            return;
        }

        // Confirm ownership (only works for single player on one machine).
        if (message.conn.playerControllers[0].unetView.netId == netId)
        {
            // Deserialize user command.
            UserCmd inputCommand = UserCmd.DeSerialize(inputMessage.messageData);

            // Get reference to player input.
            PlayerInputSynchronization input = foundObj.GetComponent <PlayerInputSynchronization>();

            // Send user command to object.
            input.HandleUserCommand(inputCommand);
        }
    }
示例#5
0
    public GameClientPersistant()
    {
        pingSamples = new int[CConstVar.NUM_PING_SAMPLES];

        cmdqueue = new UserCmd[CConstVar.MAX_LATENT_CMDS];
        cmd      = new UserCmd();
    }
示例#6
0
        private void HandleInteractables(IPlayer player, UserCmd cmd)
        {
            var ent = cmd.HoveredEntity > 0
                ? Game.EntityManager.FindEntity(cmd.HoveredEntity) as IInteractable
                : null;

            if (_hoveredEnts.ContainsKey(player.ClientIndex) &&
                _hoveredEnts[player.ClientIndex] != cmd.HoveredEntity)
            {
                var hoveredEnt = Game.EntityManager.FindEntity(_hoveredEnts[player.ClientIndex]);
                if (hoveredEnt != null &&
                    hoveredEnt is IInteractable interactable)
                {
                    interactable.MouseExit(player.ClientIndex);
                }
                _hoveredEnts.Remove(player.ClientIndex);
            }
            else if (ent != null)
            {
                if (_hoveredEnts.ContainsKey(player.ClientIndex) &&
                    _hoveredEnts[player.ClientIndex] == cmd.HoveredEntity)
                {
                    return;
                }
                _hoveredEnts[player.ClientIndex] = cmd.HoveredEntity;
                ent.MouseEnter(player.ClientIndex);
            }
        }
示例#7
0
    public static void UpdateViewAngles(PlayerState ps, UserCmd cmd)
    {
        if (ps.pmType == PMoveType.INTERMISSION || ps.pmType == PMoveType.SPINGTERMISSION)
        {
            return;
        }

        //TODO:state
        if (ps.pmType != PMoveType.SPECTATOR && ps.states[0] <= 0)
        {
            return;
        }

        int temp;

        for (int i = 0; i < 3; i++)
        {
            temp = cmd.angles[i] + ps.delta_angles[i];
            if (i == 0)
            {
                if (temp > 16000)
                {
                    ps.delta_angles[i] = 16000 - cmd.angles[i];
                    temp = 16000;
                }
                else if (temp < -16000)
                {
                    ps.delta_angles[i] = -16000 - cmd.angles[i];
                    temp = -16000;
                }
            }
            ps.viewangles[i] = temp * 360 / 65536;
        }
    }
示例#8
0
        public static void CopyForm(UserCmd cmd, SendUserCmdComponent right)
        {
            //cmd.Seq = right.Seq;
            cmd.FrameInterval  = right.FrameInterval;
            cmd.MoveHorizontal = right.MoveHorizontal;
            cmd.MoveUpDown     = right.MoveUpDown;
            cmd.MoveVertical   = right.MoveVertical;
            cmd.DeltaYaw       = right.DeltaYaw;
            cmd.DeltaPitch     = right.DeltaPitch;
            cmd.RenderTime     = right.RenderTime;
            cmd.ClientTime     = right.ClientTime;
            cmd.ChangedSeat    = right.ChangedSeat;
            //cmd.SnapshotId = right.SnapshotId;
            cmd.BeState      = right.BeState;
            cmd.Buttons      = right.Buttons;
            cmd.SwitchNumber = right.SwitchNumber;

            cmd.CurWeapon      = right.CurWeapon;
            cmd.UseEntityId    = right.UseEntityId;
            cmd.PickUpEquip    = right.PickUpEquip;
            cmd.UseVehicleSeat = right.UseVehicleSeat;
            cmd.UseType        = right.UseType;
            cmd.ChangeChannel  = right.ChangeChannel;
            cmd.BagIndex       = right.BagIndex;
        }
示例#9
0
    public void WriteDeltaUserCmdKey(int key, ref UserCmd from, ref UserCmd to)
    {
        if (to.serverTime - from.serverTime < 256)
        {
            WriteBits(1, 1);
            WriteBits(to.serverTime - from.serverTime, 8);
        }
        else
        {
            WriteBits(0, 1);
            WriteBits(to.serverTime, 32);
        }

        if (from.angles[0] == to.angles[0] &&
            from.angles[1] == to.angles[1] &&
            from.angles[2] == to.angles[2] &&
            from.forwardmove == to.forwardmove &&
            from.rightmove == to.rightmove &&
            from.upmove == to.upmove &&
            from.buttons == to.buttons)
        {
            WriteBits(0, 1);
            return;
        }

        key ^= to.serverTime;
        WriteBits(1, 1);
        WriteDeltaKey(key, from.angles[0], to.angles[0], 16);
        WriteDeltaKey(key, from.angles[1], to.angles[1], 16);
        WriteDeltaKey(key, from.angles[2], to.angles[2], 16);
        WriteDeltaKey(key, from.forwardmove, to.forwardmove, 8);
        WriteDeltaKey(key, from.rightmove, to.rightmove, 8);
        WriteDeltaKey(key, from.upmove, to.upmove, 8);
        WriteDeltaKey(key, from.buttons, to.buttons, 16);
    }
示例#10
0
    /*
     *  ProcessUserCmd
     *  Parameters:
     *  1) UserCmd cmd
     *      This is the usercmd that we're going to process, this code should only be called on the server instance of the object
     *  TODO(Jake): Allow the local player to process their own usercmd upon creation AKA Client-Sided Prediction
     *  https://en.wikipedia.org/wiki/Client-side_prediction
     */
    public PlayerState ProcessUserCmd(UserCmd cmd, PlayerState playerState, float dt)
    {
        if (isServer)
        {
            // Check if we're trying to fire.
            if (cmd.ActionWasReleased(PlayerInputSynchronization.IN_FIRE, Input.LastUserCommand))
            {
                GameObject projectile = Instantiate(
                    m_ProjectilePrefab,
                    m_TargetController.transform.position + m_ProjectileOffset,
                    m_ProjectilePrefab.transform.rotation);

                NetworkServer.Spawn(projectile);
                audiosource.PlayOneShot(sound_shoot, 0.3f);
            }
            else
            {
                //Debug.Log("NOt fired");
            }
        }

        if (m_TargetController)
        {
            return(m_TargetController.StateUpdate(cmd, playerState, dt)); //Move our ship
        }

        return(null);
    }
示例#11
0
        private void SendUserCmds()
        {
            var last = new UserCmd();

            using (var stream = Bitstream.Create()) {
                var move = new CCLCMsg_Move();

                move.num_backup_commands = (uint)backup.Count;
                foreach (var cmd in backup)
                {
                    WriteUserCmd(cmd, last, stream);
                    last = cmd;
                }

                move.num_new_commands = (uint)next.Count;
                foreach (var cmd in next)
                {
                    WriteUserCmd(cmd, last, stream);
                    last = cmd;
                }

                backup.Clear();
                backup.AddRange(next);
                next.Clear();

                move.data = stream.ToBytes();

                var tick = new CNETMsg_Tick();
                tick.tick = client.ServerTick;

                connection.SendUnreliably(
                    Connection.ConvertProtoToMessage <CCLCMsg_Move>((uint)CLC_Messages.clc_Move, move),
                    Connection.ConvertProtoToMessage <CNETMsg_Tick>((uint)NET_Messages.net_Tick, tick));
            }
        }
示例#12
0
        public static void CopyForm(this SendUserCmdComponent component, IUserCmd right)
        {
            //component.Seq = right.Seq;
            component.FrameInterval  = right.FrameInterval;
            component.MoveHorizontal = right.MoveHorizontal;
            component.MoveUpDown     = right.MoveUpDown;
            component.MoveVertical   = right.MoveVertical;
            component.DeltaYaw       = right.DeltaYaw;
            component.DeltaPitch     = right.DeltaPitch;
            component.RenderTime     = right.RenderTime;
            component.ChangedSeat    = right.ChangedSeat;
            //component.SnapshotId = right.SnapshotId;
            component.BeState      = right.BeState;
            component.Buttons      = right.Buttons;
            component.SwitchNumber = right.SwitchNumber;

            component.CurWeapon         = right.CurWeapon;
            component.UseEntityId       = right.UseEntityId;
            component.ManualPickUpEquip = right.ManualPickUpEquip;
            component.AutoPickUpEquip   = UserCmd.CopyList(component.AutoPickUpEquip, right.AutoPickUpEquip);
            component.UseVehicleSeat    = right.UseVehicleSeat;
            component.UseType           = right.UseType;
            component.ChangeChannel     = right.ChangeChannel;
            component.BagIndex          = right.BagIndex;
        }
示例#13
0
    private void FixedUpdateServer()
    {
        PlayerState finalState = ServerState;
        UserCmd     nextCmd    = null;

        while (m_PlayerInput.NextUserCommand(out nextCmd))
        {
            finalState = m_TargetPlayer.ProcessUserCmd(nextCmd, finalState, Time.fixedDeltaTime);
        }

        ServerStateUpdate update = new ServerStateUpdate();

        update.netId    = m_TargetPlayer.netId.Value;
        update.Origin   = finalState.Origin;
        update.Velocity = finalState.Velocity;

        m_TargetPlayer.MoveShip(finalState.Origin);

        connectionToClient.SendByChannel(
            ServerStateUpdate.MessageID,
            update,
            Channels.DefaultReliable
            );

        ServerState = finalState;
    }
示例#14
0
    private void FixedUpdateClient()
    {
        UserCmd nextCmd = null;

        while (m_PlayerInput.NextUserCommand(out nextCmd))
        {
            //Temporary state for client prediction
            NewState = m_TargetPlayer.ProcessUserCmd(nextCmd, LastPredictedState, Time.fixedDeltaTime);

            //Client frame for this duration
            var frame = new Frame(Time.fixedDeltaTime);
            frame.DeltaPosition = NewState.Origin - LastPredictedState.Origin; //Displacement
            frame.Velocity      = NewState.Velocity;
            frame.input         = nextCmd;

            m_LagRecord.FrameHistory.Add(frame);
            m_LagRecord.HistoryDuration += Time.fixedDeltaTime; //Duration of frame

            LastPredictedState = NewState;
        }
        if (isServer)
        {
            m_TargetPlayer.MoveShip(LastPredictedState.Origin);
        }
        else
        {
            float latency = NetworkHandler.Instance.RoundTripTime;
            var   extrapolatedPosition = LastPredictedState.Origin + NewState.Velocity * latency * (1 + CONVERGENCE_MULTIPLIER);
            var   dt = Time.fixedDeltaTime;
            var   interpolationFraction = dt / (latency * (1 + CONVERGENCE_MULTIPLIER));
            var   clientStatePosition   = LastPredictedState.Origin;
            clientStatePosition += (extrapolatedPosition - clientStatePosition) * interpolationFraction;
            m_TargetPlayer.MoveShip(clientStatePosition);
        }
    }
示例#15
0
	public void SV_ClientThink(ClientNode cl, ref UserCmd cmd){
		cmd.CopyTo(cl.lastUserCmd);
		// CLog.Info("last ucmd time: {0}", cl.lastUserCmd.serverTime);
		if(cl.state != ClientState.ACTIVE){
			return;
		}
		CDataModel.GameSimulate.ClientThink(Array.IndexOf(clients, cl));
	}
示例#16
0
    public UserCmd CreateUserCmd()
    {
        UserCmd newCommand = new UserCmd(
            m_LastOutgoingSeq + 1
            );

        return(newCommand);
    }
示例#17
0
 public void RegisterSpecialCmdKeyInput(KeyReceiver keyReceiver, UserCmd userCmd)
 {
     keyReceiver.AddAction(UserInputKey.Switch1, (data) => userCmd.CurWeapon = (int)EWeaponSlotType.PrimeWeapon);
     keyReceiver.AddAction(UserInputKey.Switch3, (data) => userCmd.CurWeapon = (int)EWeaponSlotType.PistolWeapon);
     keyReceiver.AddAction(UserInputKey.Switch4, (data) => userCmd.CurWeapon = (int)EWeaponSlotType.MeleeWeapon);
     keyReceiver.AddAction(UserInputKey.Switch5, (data) => userCmd.CurWeapon = (int)EWeaponSlotType.ThrowingWeapon);
     //     keyReceiver.AddAction(UserInputKey.Switch6, (data) => userCmd.CurWeapon = (int)EWeaponSlotType.TacticWeapon);
 }
 public void RegisterEnvKeyInput(KeyHandler keyHandler, UserCmd userCmd)
 {
     keyHandler.BindKeyAction(UserInputKey.Switch1, (data) => userCmd.CurWeapon = (int)EWeaponSlotType.PrimeWeapon);
     keyHandler.BindKeyAction(UserInputKey.Switch2, (data) => userCmd.CurWeapon = (int)EWeaponSlotType.SecondaryWeapon);
     keyHandler.BindKeyAction(UserInputKey.Switch3, (data) => userCmd.CurWeapon = (int)EWeaponSlotType.PistolWeapon);
     keyHandler.BindKeyAction(UserInputKey.Switch4, (data) => userCmd.CurWeapon = (int)EWeaponSlotType.MeleeWeapon);
     keyHandler.BindKeyAction(UserInputKey.Switch5, (data) => userCmd.CurWeapon = (int)EWeaponSlotType.ThrowingWeapon);
     keyHandler.BindKeyAction(UserInputKey.Switch6, (data) => userCmd.CurWeapon = (int)EWeaponSlotType.TacticWeapon);
 }
示例#19
0
    public bool ActionWasReleased(ushort field, UserCmd lastCmd = null)
    {
        if (lastCmd != null)
        {
            return(lastCmd.ActionIsPressed(field) && !this.ActionIsPressed(field));
        }

        return(false);
    }
示例#20
0
        public void HandleUserCommand(IPlayer player, UserCmd cmd, bool isPrediction = false)
        {
            HandleRunCommand(player, cmd, isPrediction);

            if (Game.IsHost || isPrediction)
            {
                HandleInteractables(player, cmd);
            }
        }
示例#21
0
    public void ProcessMovement(CharacterController Controller, UserCmd CommandIn)
    {
        State.CharacterController = Controller;
        Command = CommandIn;

        PlayerMove();

        Debug.Log("ViewAngles: " + Command.ViewAngles + ", Forward: " + Command.ForwardMove + ", Side: " + Command.SideMove);
    }
    public static InputSynchronizationMessage FromUserCmd(UserCmd command)
    {
        var messageData   = command.Serialize();
        var messageLength = messageData.Length;
        //Fill our message fields to be send
        var newMessage = new InputSynchronizationMessage();

        newMessage.messageData = messageData;

        return(newMessage);
    }
示例#23
0
 /*
  *  The client will record player input from InControl and then pipe it to the server as a UserCmd
  */
 private void LocalPlayerFixedUpdate()
 {
     PipeUserCommand(m_UserCmd);
     if (!isServer)
     {
         StoredCommands.Enqueue(m_UserCmd);
     }
     // Update user buttons.
     m_LastUserCmd.Buttons = m_UserCmd.Buttons;
     m_UserCmd             = CreateUserCmd();
 }
示例#24
0
        public UserCmd GenerateUserCmd(IUserCmdOwnAdapter player, int intverval)
        {
            UpdateLookAt(player, _userCmdProvider.LookAt);


            if (_userCmdProvider.HasPath)
            {
                var vel = player.PlayerTransform.InverseTransformVector(_userCmdProvider.DesirwdVelocity);

                vel.y = 0;
                vel   = vel.normalized;
                _userCmd.MoveVertical   = vel.z;
                _userCmd.MoveHorizontal = vel.x;



                if (_userCmd.DeltaYaw > 1)
                {
                    _userCmd.IsSlightWalk = true;
                }
                else if (_userCmdProvider.DesirwdVelocity.magnitude > 2)
                {
                    _userCmd.IsRun = true;
                }
                else if (_userCmdProvider.DesirwdVelocity.magnitude > 0.5)
                {
                }
                else
                {
                    _userCmd.IsSlightWalk = true;
                }
            }

            _userCmd.IsCrouch     = _userCmdProvider.IsCrouch;
            _userCmd.IsJump       = _userCmdProvider.IsJump;
            _userCmd.IsProne      = _userCmdProvider.IsProne;
            _userCmd.IsPeekLeft   = _userCmdProvider.IsPeekLeft;
            _userCmd.IsPeekRight  = _userCmdProvider.IsPeekRight;
            _userCmd.IsF          = _userCmdProvider.IsF;
            _userCmd.IsLeftAttack = _userCmdProvider.IsLeftAttack;
            _userCmd.IsReload     = _userCmdProvider.IsReload;


            //_userCmdProvider.Reset();
//            _userCmdProvider.LookAt = Quaternion.Euler(0,0,
//                 0);
            _userCmd.FrameInterval = intverval;
            _userCmd.Seq           = _seq++;
            var rc = UserCmd.Allocate();

            _userCmd.CopyTo(rc);
            _userCmd.Reset();
            return(rc);
        }
示例#25
0
 public void CopyTo(UserCmd cmd)
 {
     cmd.serverTime  = serverTime;
     cmd.angles[0]   = angles[0];
     cmd.angles[1]   = angles[1];
     cmd.angles[2]   = angles[2];
     cmd.buttons     = buttons;
     cmd.forwardmove = forwardmove;
     cmd.rightmove   = rightmove;
     cmd.upmove      = upmove;
     cmd.skillID     = skillID;
 }
示例#26
0
        public UserCmd GenerateUserCmd(IUserCmdOwnAdapter player, int intverval)
        {
            _userCmd.Seq           = _seq++;
            _userCmd.FrameInterval = intverval;
            _userCmd.ChangedSeat   = ChangeSeat();
            _userCmd.ChangeChannel = ChangeChannel();
            var rc = UserCmd.Allocate();

            _userCmd.CopyTo(rc);
            _userCmd.Reset();
            return(rc);
        }
    void Start()
    {
        if (isClient)
        {
            m_InputBindings = new PlayerInputBindings(); //Initialize our client-sided input bindings
            m_InputBindings.InitializeBindings();
            m_UserCmd     = CreateUserCmd();
            m_LastUserCmd = CreateUserCmd();
        }

        m_StoredCmds   = new Queue <UserCmd>();
        m_TargetPlayer = GetComponent <Player>();
    }
示例#28
0
 public void HandleUserCommand(UserCmd cmd)
 {
     m_LastIncomingSeq = cmd.SequenceNumber;
     StoredCommands.Enqueue(cmd);
     if (cmd.SequenceNumber - m_LastIncomingSeq > 1)
     {
         //We are missing some commands lets start predicting
         //Run prediction code
     }
     else
     {
     }
 }
示例#29
0
    private UserCmd CreateCmd()
    {
        UserCmd cmd          = new UserCmd();
        var     clientActive = CDataModel.GameState.ClActive;
        Vector3 oldAngles    = clientActive.viewAngles;

        // AdjustAngles();

        KeyMove(ref cmd);
        cmd.serverTime = clientActive.serverTime;

        return(cmd);
    }
        public UserCmd GenerateUserCmd(IUserCmdOwnAdapter player, int intverval)
        {
            logger.DebugFormat("GenerateUserCmd:{0}", MyGameTime.seq);
            userCmd.Seq           = MyGameTime.seq;
            userCmd.FrameInterval = intverval;
            userCmd.ChangedSeat   = ChangeSeat();
            userCmd.ChangeChannel = ChangeChannel();
            var rc = UserCmd.Allocate();

            userCmd.CopyTo(rc);
            userCmd.Reset();
            return(rc);
        }
示例#31
0
 private UserCmd MakeUserCmd()
 {
     var thing = new UserCmd();
     thing.Command = commandNumber++;
     thing.Tick = state.ClientTick++; // TODO: This might be off by one.
     thing.ViewAngles = new Vector(60, 90, 0);
     thing.CrosshairTrace = new Vector(5548.375f, 3522.188f, 256);
     thing.QueryEntIndex = 1390;
     thing.MouseDx = 73;
     thing.MouseDy = 110;
     thing.OrderId = orderNumber;
     thing.Order = latestOrder;
     thing.CameraX = 6445;
     thing.CameraY = 2670;
     thing.ShopModeSomething = 15;
     thing.HudStatsDropdownCategoryIndex = 15;
     thing.HudStatsDropdownSortMethod = 2;
     return thing;
 }
示例#32
0
        private void WriteUserCmd(UserCmd cmd, UserCmd last, Bitstream stream)
        {
            if (cmd.Command != last.Command + 1)
            {
                stream.WriteBool(true);
                stream.WriteUInt32(cmd.Command);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.Tick != last.Tick + 1)
            {
                stream.WriteBool(true);
                stream.WriteUInt32(cmd.Tick);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.ViewAngles.X != last.ViewAngles.X)
            {
                stream.WriteBool(true);
                stream.WriteFloat(cmd.ViewAngles.X);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.ViewAngles.X != last.ViewAngles.X)
            {
                stream.WriteBool(true);
                stream.WriteFloat(cmd.ViewAngles.X);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.ViewAngles.Z != last.ViewAngles.Z)
            {
                stream.WriteBool(true);
                stream.WriteFloat(cmd.ViewAngles.Z);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.ForwardMove != last.ForwardMove)
            {
                stream.WriteBool(true);
                stream.WriteFloat(cmd.ForwardMove);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.SideMove != last.SideMove)
            {
                stream.WriteBool(true);
                stream.WriteFloat(cmd.SideMove);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.UpMove != last.UpMove)
            {
                stream.WriteBool(true);
                stream.WriteFloat(cmd.UpMove);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.Buttons != last.Buttons)
            {
                stream.WriteBool(true);
                stream.WriteUInt32(cmd.Buttons);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.Impulse != last.Impulse)
            {
                stream.WriteBool(true);
                stream.WriteByte(cmd.Impulse);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.CrosshairTrace != last.CrosshairTrace)
            {
                stream.WriteBool(true);
                stream.WriteBitVec3Coord(cmd.CrosshairTrace);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.CursorUnitEntIndex != last.CursorUnitEntIndex)
            {
                stream.WriteBool(true);
                stream.WriteBits(cmd.CursorUnitEntIndex, 11);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.QueryEntIndex != last.QueryEntIndex)
            {
                stream.WriteBool(true);
                stream.WriteBits(cmd.QueryEntIndex, 11);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.CursorUnitEntIndex != last.CursorUnitEntIndex)
            {
                stream.WriteBool(true);
                stream.WriteBits(cmd.CursorUnitEntIndex, 11);

                if (cmd.QueryEntIndex != last.QueryEntIndex)
                {
                    stream.WriteBool(true);
                    stream.WriteBits(cmd.QueryEntIndex, 11);
                }
                else
                {
                    stream.WriteBool(false);
                }
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.MouseDx != last.MouseDx)
            {
                stream.WriteBool(true);
                stream.WriteUInt16(cmd.MouseDx);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.MouseDy != last.MouseDy)
            {
                stream.WriteBool(true);
                stream.WriteUInt16(cmd.MouseDy);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.Offset3c != last.Offset3c)
            {
                stream.WriteBool(true);
                stream.WriteUInt16(cmd.Offset3c);
            }
            else
            {
                stream.WriteBool(false);
            }

            // 0x44 to 0x74 inclusive
            if (cmd.OrderId != last.OrderId)
            {
                stream.WriteBool(true);
                stream.WriteInt16(cmd.OrderId);
                stream.WriteInt16((short) cmd.Order.Value.SelectedUnits.Length);

                foreach (var entity in cmd.Order.Value.SelectedUnits)
                {
                    stream.WriteBits(entity, 11);
                }

                stream.WriteInt16(cmd.Order.Value.OrderType);
                stream.WriteInt16(cmd.Order.Value.EntityIndex1);
                stream.WriteBitVec3Coord(cmd.Order.Value.PreparedOrderPoint);
                stream.WriteBits(cmd.Order.Value.BaseNpcHandle, 11);
                stream.WriteBool(cmd.Order.Value.QueueOrder);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.CameraX != last.CameraX || cmd.CameraY != last.CameraY)
            {
                stream.WriteBool(true);
                stream.WriteUInt16(cmd.CameraX);
                stream.WriteUInt16(cmd.CameraY);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.ClickBehavior != last.ClickBehavior)
            {
                stream.WriteBool(true);
                stream.WriteByte(cmd.ClickBehavior);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.SpectatorStatsSomething != last.SpectatorStatsSomething)
            {
                stream.WriteBool(true);
                stream.WriteByte(cmd.SpectatorStatsSomething);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.ShopModeSomething != last.ShopModeSomething)
            {
                stream.WriteBool(true);
                stream.WriteByte(cmd.ShopModeSomething);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.HudStatsDropdownCategoryIndex != last.HudStatsDropdownCategoryIndex)
            {
                stream.WriteBool(true);
                stream.WriteByte(cmd.HudStatsDropdownCategoryIndex);
            }
            else
            {
                stream.WriteBool(false);
            }

            if (cmd.HudStatsDropdownSortMethod != last.HudStatsDropdownSortMethod)
            {
                stream.WriteBool(true);
                stream.WriteByte(cmd.HudStatsDropdownSortMethod);
            }
            else
            {
                stream.WriteBool(false);
            }
        }
示例#33
0
        private void SendUserCmds()
        {
            var last = new UserCmd();

            using (var stream = Bitstream.Create())
            {
                var move = new CCLCMsg_Move();

                move.num_backup_commands = (uint) backup.Count;
                foreach (var cmd in backup)
                {
                    WriteUserCmd(cmd, last, stream);
                    last = cmd;
                }

                move.num_new_commands = (uint) next.Count;
                foreach (var cmd in next)
                {
                    WriteUserCmd(cmd, last, stream);
                    last = cmd;
                }

                backup.Clear();
                backup.AddRange(next);
                next.Clear();

                move.data = stream.ToBytes();

                var tick = new CNETMsg_Tick();
                tick.tick = state.ServerTick;

                connection.SendUnreliably(
                    DotaGameConnection.ConvertProtoToMessage((uint) CLC_Messages.clc_Move, move),
                    DotaGameConnection.ConvertProtoToMessage((uint) NET_Messages.net_Tick, tick));
            }
        }