예제 #1
0
            public void Test_Constructor_ConstructWithValues ()
            {
                ActionFrame frame = new ActionFrame (PhysicalAddress.Parse ("111111111111"),
                                                     PhysicalAddress.Parse ("222222222222"),
                                                     PhysicalAddress.Parse ("333333333333"));
                
                frame.FrameControl.ToDS = false;
                frame.FrameControl.FromDS = true;
                frame.FrameControl.MoreFragments = true;
                
                frame.SequenceControl.SequenceNumber = 0x77;
                frame.SequenceControl.FragmentNumber = 0x1;
                
                frame.Duration.Field = 0x1234;
                
                frame.PayloadData = new byte[]{0x01, 0x02, 0x03, 0x04, 0x05};
                
                frame.UpdateFrameCheckSequence ();
                UInt32 fcs = frame.FrameCheckSequence;
                
                //serialize the frame into a byte buffer
                var bytes = frame.Bytes;
                var bas = new ByteArraySegment (bytes);

                //create a new frame that should be identical to the original
                ActionFrame recreatedFrame = MacFrame.ParsePacket (bas) as ActionFrame;
                recreatedFrame.UpdateFrameCheckSequence();
                
                Assert.AreEqual (FrameControlField.FrameSubTypes.ManagementAction, recreatedFrame.FrameControl.SubType);
                Assert.IsFalse (recreatedFrame.FrameControl.ToDS);
                Assert.IsTrue (recreatedFrame.FrameControl.FromDS);
                Assert.IsTrue (recreatedFrame.FrameControl.MoreFragments);
                
                Assert.AreEqual (0x77, recreatedFrame.SequenceControl.SequenceNumber);
                Assert.AreEqual (0x1, recreatedFrame.SequenceControl.FragmentNumber);
                
                Assert.AreEqual ("111111111111", recreatedFrame.SourceAddress.ToString ().ToUpper ());
                Assert.AreEqual ("222222222222", recreatedFrame.DestinationAddress.ToString ().ToUpper ());
                Assert.AreEqual ("333333333333", recreatedFrame.BssId.ToString ().ToUpper ());
                
                CollectionAssert.AreEqual (new byte[]{0x01, 0x02, 0x03, 0x04, 0x05}, recreatedFrame.PayloadData);
                
                Assert.AreEqual (fcs, recreatedFrame.FrameCheckSequence);
            }
예제 #2
0
        public void Test_Constructor_ConstructWithValues()
        {
            var frame = new ActionFrame(PhysicalAddress.Parse("111111111111"),
                                        PhysicalAddress.Parse("222222222222"),
                                        PhysicalAddress.Parse("333333333333"))
            {
                FrameControl    = { ToDS = false, FromDS = true, MoreFragments = true },
                SequenceControl = { SequenceNumber = 0x77, FragmentNumber = 0x1 },
                Duration        = { Field = 0x1234 },
                PayloadData     = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05 }
            };

            frame.UpdateFrameCheckSequence();
            var fcs = frame.FrameCheckSequence;

            //serialize the frame into a byte buffer
            var bytes            = frame.Bytes;
            var byteArraySegment = new ByteArraySegment(bytes);

            //create a new frame that should be identical to the original
            var recreatedFrame = MacFrame.ParsePacket(byteArraySegment) as ActionFrame;

            recreatedFrame.UpdateFrameCheckSequence();

            Assert.AreEqual(FrameControlField.FrameSubTypes.ManagementAction, recreatedFrame.FrameControl.SubType);
            Assert.IsFalse(recreatedFrame.FrameControl.ToDS);
            Assert.IsTrue(recreatedFrame.FrameControl.FromDS);
            Assert.IsTrue(recreatedFrame.FrameControl.MoreFragments);

            Assert.AreEqual(0x77, recreatedFrame.SequenceControl.SequenceNumber);
            Assert.AreEqual(0x1, recreatedFrame.SequenceControl.FragmentNumber);

            Assert.AreEqual("111111111111", recreatedFrame.SourceAddress.ToString().ToUpper());
            Assert.AreEqual("222222222222", recreatedFrame.DestinationAddress.ToString().ToUpper());
            Assert.AreEqual("333333333333", recreatedFrame.BssId.ToString().ToUpper());

            CollectionAssert.AreEqual(new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05 }, recreatedFrame.PayloadData);

            Assert.AreEqual(fcs, recreatedFrame.FrameCheckSequence);
        }
예제 #3
0
 private bool GetSelectedTamingFrame(out int frameIndex, out ActionFrame actionFrame)
 {
     return(this.GetSelectedActionFrame(this.cmbTamingFrame, out frameIndex, out actionFrame));
 }
예제 #4
0
        private void RenderCurrentlySelectedItems(object sender, EventArgs e)
        {
            if (blockRendering)
            {
                return;
            }

            var    skinId           = 0;
            var    stance           = "stand1"; // TODO: Fix for 2h
            var    luminousLarkness = 3;        // Different weapon
            var    stanceFrame      = 0;
            var    stanceUol        = stance + "/" + stanceFrame + "/";
            var    itemNodes        = new List <ScriptNode>();
            string earType          = "normal";

            foreach (var lbi in selectedItems.Items)
            {
                var ci = (ChosenItem)lbi;
                if (ci.NodePath.Contains("Character/00"))
                {
                    skinId = ci.ID;
                }
                else
                {
                    var node = ci.GetNode(_mainNode);

                    if (node != null)
                    {
                        itemNodes.Add(node);
                    }
                    else
                    {
                        Console.WriteLine("Unable to find {0} for {1}", ci.NodePath, ci.ID);
                    }
                }
            }

            var actionFrame = new ActionFrame();

            itemNodes.Insert(0, _mainNode.GetNode(string.Format("Character/{0:D8}.img", 2000 + skinId)));
            itemNodes.Insert(1, _mainNode.GetNode(string.Format("Character/{0:D8}.img", 12000 + skinId)));

            // Load all items and their positions
            foreach (var item in itemNodes)
            {
                // TODO: For Cash Weapon covers items, get the weapon category id thingy
                // its basically the two digits after 1, eg 01[70]2557

                var nodeToRenderUOL = stanceUol;
                if (item.GetFullPath().Contains("Face/"))
                {
                    nodeToRenderUOL = "default";
                }

                ScriptNode nodeToRender = item.GetNode(nodeToRenderUOL);

                if (nodeToRender == null)
                {
                    Console.WriteLine("Unable to find {0} in {1}", nodeToRenderUOL, item.GetFullPath());
                    continue;
                }

                var infoNode = item.GetNode("info");
                if (infoNode == null)
                {
                    continue;
                }

                var larkenessColors = nodeToRender.Get("weapon2") != null;

                foreach (var _imageNode in nodeToRender)
                {
                    var imageNode = _imageNode;
                    var category  = imageNode.Name;

                    if (category == "ear" || category == "lefEar" || category == "highlefEar")
                    {
                        if (category != earType)
                        {
                            continue;
                        }
                    }

                    if (larkenessColors && category != "weapon" + luminousLarkness)
                    {
                        // Skip Luminous coloars
                        continue;
                    }

                    if (category == "hairShade")
                    {
                        // Take subnode, based on the skin color. Go figure
                        // We'll fall back to 0 if not found
                        var skinAsString = skinId.ToString();
                        var tmp          = imageNode.GetNode(skinAsString);
                        if (tmp == null)
                        {
                            tmp = imageNode.GetNode("0");
                        }
                        if (tmp == null)
                        {
                            Console.WriteLine("Unable to find skin entry for hairShade node.");
                            continue;
                        }

                        imageNode = tmp;
                    }

                    var canvas = imageNode.GetCanvas();
                    if (canvas == null)
                    {
                        continue;
                    }

                    var mapNodes = imageNode.GetNode("map");
                    if (mapNodes == null)
                    {
                        continue;
                    }

                    var vslot = infoNode.GetString("vslot");
                    var islot = infoNode.GetString("islot");

                    // TODO: Set defaults
                    if (vslot == null || islot == null)
                    {
                        continue;
                    }

                    actionFrame.Merge(islot, vslot, imageNode);
                }
            }

            actionFrame.UpdateVisibility();


            var bm = new Bitmap(pictureBox1.Width, pictureBox1.Height);

            using (var g = Graphics.FromImage(bm))
            {
                var centerX = bm.Width / 2;
                var centerY = (int)(bm.Height - (bm.Height * 0.20));

                foreach (var si in actionFrame.Sprites.Where(x => x.Visible))
                {
                    var x = si.Position.X;
                    var y = si.Position.Y;
                    Console.WriteLine("Rendering {0} {1} {2}", si.Source.Canvas.GetFullPath(), x, y);

                    x += centerX;
                    y += centerY;

                    g.DrawImage(si.Source.Canvas.Tile, x, y);
                }

                pictureBox1.Image = bm;
            }
        }
예제 #5
0
        /// <summary>
        /// 更新画布。
        /// </summary>
        private void UpdateDisplay()
        {
            if (suspendUpdate)
            {
                this.needUpdate = true;
                return;
            }

            string newPartsTag = GetAllPartsTag();

            if (this.partsTag != newPartsTag)
            {
                this.partsTag = newPartsTag;
                this.avatarContainer1.ClearAllCache();
            }

            ComboItem selectedItem;

            //同步角色动作
            selectedItem           = this.cmbActionBody.SelectedItem as ComboItem;
            this.avatar.ActionName = selectedItem != null ? selectedItem.Text : null;
            //同步表情
            selectedItem            = this.cmbEmotion.SelectedItem as ComboItem;
            this.avatar.EmotionName = selectedItem != null ? selectedItem.Text : null;
            //同步骑宠动作
            selectedItem = this.cmbActionTaming.SelectedItem as ComboItem;
            this.avatar.TamingActionName = selectedItem != null ? selectedItem.Text : null;

            //获取动作帧
            selectedItem = this.cmbBodyFrame.SelectedItem as ComboItem;
            int bodyFrame = selectedItem != null?Convert.ToInt32(selectedItem.Text) : -1;

            selectedItem = this.cmbEmotionFrame.SelectedItem as ComboItem;
            int emoFrame = selectedItem != null?Convert.ToInt32(selectedItem.Text) : -1;

            selectedItem = this.cmbTamingFrame.SelectedItem as ComboItem;
            int tamingFrame = selectedItem != null?Convert.ToInt32(selectedItem.Text) : -1;

            //获取武器状态
            selectedItem           = this.cmbWeaponType.SelectedItem as ComboItem;
            this.avatar.WeaponType = selectedItem != null?Convert.ToInt32(selectedItem.Text) : 0;

            selectedItem            = this.cmbWeaponIdx.SelectedItem as ComboItem;
            this.avatar.WeaponIndex = selectedItem != null?Convert.ToInt32(selectedItem.Text) : 0;

            //获取耳朵状态
            selectedItem        = this.cmbEar.SelectedItem as ComboItem;
            this.avatar.EarType = selectedItem != null?Convert.ToInt32(selectedItem.Text) : 0;

            string actionTag = string.Format("{0}:{1},{2}:{3},{4}:{5},{6},{7},{8},{9},{10}",
                                             this.avatar.ActionName,
                                             bodyFrame,
                                             this.avatar.EmotionName,
                                             emoFrame,
                                             this.avatar.TamingActionName,
                                             tamingFrame,
                                             this.avatar.HairCover ? 1 : 0,
                                             this.avatar.ShowHairShade ? 1 : 0,
                                             this.avatar.EarType,
                                             this.avatar.WeaponType,
                                             this.avatar.WeaponIndex);

            if (!avatarContainer1.HasCache(actionTag))
            {
                try
                {
                    var         actionFrames = avatar.GetActionFrames(avatar.ActionName);
                    ActionFrame f            = null;
                    if (bodyFrame > -1 && bodyFrame < actionFrames.Length)
                    {
                        f = actionFrames[bodyFrame];
                    }

                    var bone   = avatar.CreateFrame(bodyFrame, emoFrame, tamingFrame);
                    var layers = avatar.CreateFrameLayers(bone);
                    avatarContainer1.AddCache(actionTag, layers);
                }
                catch
                {
                }
            }

            avatarContainer1.SetKey(actionTag);
        }
예제 #6
0
            /// <summary>
            /// Parses the <see cref="Kavprot.Packets.Utils.ByteArraySegment"/> into a MacFrame.
            /// </summary>
            /// <returns>
            /// The parsed MacFrame or null if it could not be parsed.
            /// </returns>
            /// <param name='bas'>
            /// The bytes of the packet. bas.Offset should point to the first byte in the mac frame.
            /// </param>
            /// <remarks>If the provided bytes contain the FCS then call <see cref="MacFrame.ParsePacketWithFcs"/> instead. The presence of the
            /// FCS is usually determined by configuration of the device used to capture the packets.</remarks>
            public static MacFrame ParsePacket(ByteArraySegment bas)
            {
                if (bas.Length < MacFields.FrameControlLength)
                {
                    //there isn't enough data to even try and work out what type of packet it is
                    return(null);
                }
                //this is a bit ugly as we will end up parsing the framecontrol field twice, once here and once
                //inside the packet constructor. Could create the framecontrol and pass it to the packet but I think that is equally ugly
                FrameControlField frameControl = new FrameControlField(
                    EndianBitConverter.Big.ToUInt16(bas.Bytes, bas.Offset));

                MacFrame macFrame = null;

                switch (frameControl.SubType)
                {
                case FrameControlField.FrameSubTypes.ManagementAssociationRequest:
                {
                    macFrame = new AssociationRequestFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ManagementAssociationResponse:
                {
                    macFrame = new AssociationResponseFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ManagementReassociationRequest:
                {
                    macFrame = new ReassociationRequestFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ManagementReassociationResponse:
                {
                    macFrame = new AssociationResponseFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ManagementProbeRequest:
                {
                    macFrame = new ProbeRequestFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ManagementProbeResponse:
                {
                    macFrame = new ProbeResponseFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ManagementReserved0:
                    break; //TODO

                case FrameControlField.FrameSubTypes.ManagementReserved1:
                    break; //TODO

                case FrameControlField.FrameSubTypes.ManagementBeacon:
                {
                    macFrame = new BeaconFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ManagementATIM:
                    break; //TODO

                case FrameControlField.FrameSubTypes.ManagementDisassociation:
                {
                    macFrame = new DisassociationFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ManagementAuthentication:
                {
                    macFrame = new AuthenticationFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ManagementDeauthentication:
                {
                    macFrame = new DeauthenticationFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ManagementAction:
                {
                    macFrame = new ActionFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ManagementReserved3:
                    break; //TODO

                case FrameControlField.FrameSubTypes.ControlBlockAcknowledgmentRequest:
                {
                    macFrame = new BlockAcknowledgmentRequestFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ControlBlockAcknowledgment:
                {
                    macFrame = new BlockAcknowledgmentFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ControlPSPoll:
                    break; //TODO

                case FrameControlField.FrameSubTypes.ControlRTS:
                {
                    macFrame = new RtsFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ControlCTS:
                {
                    macFrame = new CtsFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ControlACK:
                {
                    macFrame = new AckFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ControlCFEnd:
                {
                    macFrame = new ContentionFreeEndFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.ControlCFEndCFACK:
                    break; //TODO

                case FrameControlField.FrameSubTypes.Data:
                case FrameControlField.FrameSubTypes.DataCFACK:
                case FrameControlField.FrameSubTypes.DataCFPoll:
                case FrameControlField.FrameSubTypes.DataCFAckCFPoll:
                {
                    macFrame = new DataDataFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.DataNullFunctionNoData:
                case FrameControlField.FrameSubTypes.DataCFAckNoData:
                case FrameControlField.FrameSubTypes.DataCFPollNoData:
                case FrameControlField.FrameSubTypes.DataCFAckCFPollNoData:
                {
                    macFrame = new NullDataFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.QosData:
                case FrameControlField.FrameSubTypes.QosDataAndCFAck:
                case FrameControlField.FrameSubTypes.QosDataAndCFPoll:
                case FrameControlField.FrameSubTypes.QosDataAndCFAckAndCFPoll:
                {
                    macFrame = new QosDataFrame(bas);
                    break;
                }

                case FrameControlField.FrameSubTypes.QosNullData:
                case FrameControlField.FrameSubTypes.QosCFAck:
                case FrameControlField.FrameSubTypes.QosCFPoll:
                case FrameControlField.FrameSubTypes.QosCFAckAndCFPoll:
                {
                    macFrame = new QosNullDataFrame(bas);
                    break;
                }

                default:
                    //this is an unsupported (and unknown) packet type
                    break;
                }

                return(macFrame);
            }
예제 #7
0
 internal abstract void Execute(Processor processor, ActionFrame frame);
예제 #8
0
			public void Test_ConstructorWithCorruptBuffer ()
			{
				//buffer is way too short for frame. We are just checking it doesn't throw
				byte[] corruptBuffer = new byte[]{0x01};
				ActionFrame frame = new ActionFrame(new ByteArraySegment(corruptBuffer));
				Assert.IsFalse(frame.FCSValid);
			}
예제 #9
0
    private void AI()
    {
        if (currentFrame.hasCompleted)
        {
            ActionFrame n = new ActionFrame(trans, 1);

            Vector3 dest = trans.position;

            if (!hasAnyAmmo)
            {
                dest = ammoNear.position;
                n    = new ActionFrame(trans, dest);
            }
            else
            {
                if (zombieNearby)
                {
                    if ((zombieNearby.trans.position - trans.position).magnitude < 5)
                    {
                        dest = trans.position - trans.forward * 5;
                    }
                    n = new ActionFrame(trans, dest, zombieNearby.head.position, Random.Range(1, 6));
                }
            }

            currentFrame = n;
        }
        if (currentFrame.typeOfAction == ActionFrame.ActionType.MoveAndLook ||
            currentFrame.typeOfAction == ActionFrame.ActionType.MoveAndStrike ||
            currentFrame.typeOfAction == ActionFrame.ActionType.MoveOnTime ||
            currentFrame.typeOfAction == ActionFrame.ActionType.OnlyMove)
        {
            PathControl();
        }
        if (currentFrame.strikesCount > 0 && savable.patrones_in[savable.currentWeapon] > 0)
        {
            if (!isHumanOnLine)
            {
                Fire();
            }
        }
        if (savable.patrones_ [savable.currentWeapon] < 1)
        {
            int more = savable.currentWeapon;
            for (int i = 0; i < savable.patrones_.Length; i++)
            {
                if (savable.patrones_ [i] > 0)
                {
                    more = i;
                    break;
                }
            }
            SetWeapon(more + 1);
        }
        if (!hasAnyAmmo)
        {
            currentFrame.strikesCount = 0;
        }
        if (!reloading)
        {
            if (savable.patrones_in [savable.currentWeapon] < 1)
            {
                Reload();
            }
        }
        flashlight.enabled = ITimecycle.night;
    }