示例#1
0
        public override void DoAction(IEventArgs args)
        {
            FreeRuleEventArgs fr     = (FreeRuleEventArgs)args;
            IGameUnit         player = GetPlayer(args);

            if (StringUtil.IsNullOrEmpty(count) || count.Equals("0"))
            {
                count = "0";
            }
            method = new SelectMethod(FreeUtil.ReplaceVar(exp, args));
            if (player != null)
            {
                FreeData       fd           = (FreeData)player;
                ItemPosition[] currentItems = fd.freeInventory.Select(method);
                fr.TempUse("current", fd);
                int c = FreeUtil.ReplaceInt(count, args);
                for (int i = 0; i < currentItems.Length; i++)
                {
                    ItemPosition ip = currentItems[i];
                    ip.SetCount(c);
                    ip.GetKey().SetCount(c);
                    ip.GetInventory().GetInventoryUI().UpdateItem(fr, ip.GetInventory(), ip);
                }
                fr.Resume("current");
            }
        }
示例#2
0
        private static float ReduceDamage(IEventArgs args, FreeData fd, PlayerDamageInfo damage, ItemPosition ip, int percent, ItemType itemType)
        {
            if (ip != null)
            {
                float realDamage = damage.damage;
                float reduce     = damage.damage * percent / 100;
                float realReduce = reduce;

                damage.damage -= realReduce;
                fd.Player.statisticsData.Statistics.DefenseDamage += reduce;

                // 普通帽子不减少
                if (reduce > 0)
                {
                    ip.SetCount(ip.GetCount() - (int)realDamage);
                    UpdateGamePlayData(fd, ip, itemType);

                    args.TempUse("current", fd);

                    if (ip.GetCount() <= 0)
                    {
                        ip.GetInventory().RemoveItem((FreeRuleEventArgs)args, ip);
                        FuntionUtil.Call(args, "showBottomTip", "msg", "{desc:10075," + ip.key.GetName() + "}");
                    }
                    else
                    {
                        ip.GetInventory().GetInventoryUI().UpdateItem((FreeRuleEventArgs)args, ip.GetInventory(), ip);
                    }

                    args.Resume("current");
                }
            }

            return(damage.damage);
        }
示例#3
0
        public void Handle(ServerRoom room, PlayerEntity player, SimpleProto message)
        {
            FreeData fd = (FreeData)player.freeData.FreeData;

            room.FreeArgs.TempUse(PARA_PLAYER_CURRENT, fd);

            string key   = message.Ss[0];
            int    count = message.Ins[0];

            if (key.StartsWith(ChickenConstant.BagDefault))
            {
                ItemPosition ip   = FreeItemManager.GetItemPosition(room.FreeArgs, key, fd.GetFreeInventory().GetInventoryManager());
                FreeItemInfo info = FreeItemConfig.GetItemInfo(ip.key.GetKey());

                if (ip.GetCount() > count)
                {
                    ip.SetCount(ip.GetCount() - count);
                    ip.GetInventory().GetInventoryUI().ReDraw((ISkillArgs)room.FreeArgs, ip.GetInventory(), true);
                }
                else
                {
                    ip.GetInventory().RemoveItem((ISkillArgs)room.FreeArgs, ip);
                }

                room.RoomContexts.session.entityFactoryObject.SceneObjectEntityFactory.CreateSimpleEquipmentEntity(
                    (Assets.XmlConfig.ECategory)info.cat,
                    info.id,
                    count,
                    fd.Player.position.Value);
            }

            room.FreeArgs.Resume(PARA_PLAYER_CURRENT);
        }
示例#4
0
        private static void ChangeItemStack(int delta, ItemInventory fromIn, ItemInventory toIn, IInventoryUI fromUI, IInventoryUI toUI, ItemPosition ip, ItemPosition old, ISkillArgs args)
        {
            if (ip.GetCount() <= delta)
            {
                RemoveItem(fromIn, ip, args);
                HandleMoveAction(fromIn, toIn, fromUI, toUI, ip, args, true);

                old.SetCount(old.GetCount() + (int)MyMath.Min(delta, ip.GetCount()));
                toUI.UpdateItem(args, toIn, old);
            }
            else
            {
                old.SetCount(old.GetKey().GetItemStack());
                ip.SetCount(ip.GetCount() - delta);
                toUI.UpdateItem(args, toIn, old);
                fromUI.UpdateItem(args, fromIn, ip);
            }
        }
示例#5
0
        public void Handle(ServerRoom room, PlayerEntity player, SimpleProto message)
        {
            FreeData fd = (FreeData)player.freeData.FreeData;

            room.ContextsWrapper.FreeArgs.TempUse(PARA_PLAYER_CURRENT, fd);

            string key   = message.Ss[0];
            int    count = message.Ins[0];

            if (key.StartsWith(ChickenConstant.BagDefault))
            {
                ItemPosition ip   = FreeItemManager.GetItemPosition(room.ContextsWrapper.FreeArgs, key, fd.GetFreeInventory().GetInventoryManager());
                FreeItemInfo info = FreeItemConfig.GetItemInfo(ip.key.GetKey());

                if (ip.GetCount() > count)
                {
                    if (info.cat == (int)ECategory.Weapon && SingletonManager.Get <WeaponResourceConfigManager>().GetConfigById(info.id).Type == (int)EWeaponType_Config.ThrowWeapon)
                    {
                        CarryClipUtil.DeleteGrenade(count, info.id, fd, room.ContextsWrapper.FreeArgs);
                        for (int i = 0; i < count; i++)
                        {
                            player.WeaponController().RemoveGreande(info.id);
                        }
                    }
                    else
                    {
                        ip.SetCount(ip.GetCount() - count);
                        ip.GetInventory().GetInventoryUI().ReDraw((ISkillArgs)room.ContextsWrapper.FreeArgs, ip.GetInventory(), true);
                    }
                }
                else
                {
                    ip.GetInventory().RemoveItem((ISkillArgs)room.ContextsWrapper.FreeArgs, ip);
                }

                room.RoomContexts.session.entityFactoryObject.SceneObjectEntityFactory.CreateSimpleObjectEntity(
                    (ECategory)info.cat, info.id, count, fd.Player.position.Value);

                if (info.cat == (int)ECategory.GameItem && SingletonManager.Get <GameItemConfigManager>().GetConfigById(info.id).Type == (int)GameItemType.Bullet)
                {
                    player.WeaponController().SetReservedBullet((EBulletCaliber)info.id, CarryClipUtil.GetClipCount(info.id, fd, room.ContextsWrapper.FreeArgs));
                }

                SimpleProto sp = FreePool.Allocate();
                sp.Key = FreeMessageConstant.PlaySound;
                sp.Ks.Add(2);
                sp.Ins.Add(5017);
                sp.Bs.Add(false);
                FreeMessageSender.SendMessage(fd.Player, sp);
            }

            room.ContextsWrapper.FreeArgs.Resume(PARA_PLAYER_CURRENT);
        }
示例#6
0
        public static float HandleDamage(IEventArgs args, FreeData fd, PlayerDamageInfo damage)
        {
            float readDamage = damage.damage;

            if (damage.type != (int)EUIDeadType.Weapon && damage.type != (int)EUIDeadType.Unarmed)
            {
                return(readDamage);
            }

            PlayerEntity playerEntity = fd.Player;

            if (playerEntity.gamePlay.CurHelmet > 0)
            {
                var config = SingletonManager.Get <WeaponConfigManagement>().FindConfigById(playerEntity.gamePlay.HelmetLv);
                if (config != null)
                {
                    if (config.NewWeaponCfg.ProtectivePartsList.Contains(damage.part))
                    {
                        float reduce = readDamage * config.NewWeaponCfg.DamageReduction / 100;
                        reduce = Math.Min(playerEntity.gamePlay.CurHelmet, reduce);
                        playerEntity.gamePlay.CurHelmet = Math.Max(0, playerEntity.gamePlay.CurHelmet - (int)readDamage);
                        if (reduce > 0 && playerEntity.gamePlay.CurHelmet == 0)
                        {
                            playerEntity.gamePlay.HelmetLv = playerEntity.gamePlay.MaxHelmet = 0;
                            SimpleProto msg = FreePool.Allocate();
                            msg.Key = FreeMessageConstant.ChickenTip;
                            msg.Ss.Add("word75," + config.NewWeaponCfg.Name);
                            FreeMessageSender.SendMessage(playerEntity, msg);
                        }
                        ItemPosition ip = GetHelmet(fd);
                        if (ip != null)
                        {
                            args.TempUse("current", (FreeData)playerEntity.freeData.FreeData);
                            if (playerEntity.gamePlay.CurHelmet == 0)
                            {
                                ip.GetInventory().RemoveItem((FreeRuleEventArgs)args, ip);
                            }
                            else
                            {
                                ip.SetCount(playerEntity.gamePlay.CurHelmet);
                                ip.GetInventory().GetInventoryUI().UpdateItem((FreeRuleEventArgs)args, ip.GetInventory(), ip);
                            }
                            args.Resume("current");
                        }
                        damage.damage -= reduce;
                        readDamage     = damage.damage;
                        playerEntity.statisticsData.Statistics.DefenseDamage += reduce;
                    }
                }
            }

            if (playerEntity.gamePlay.CurArmor > 0)
            {
                var config = SingletonManager.Get <WeaponConfigManagement>().FindConfigById(playerEntity.gamePlay.ArmorLv);
                if (config != null)
                {
                    if (config.NewWeaponCfg.ProtectivePartsList.Contains(damage.part))
                    {
                        float reduce = readDamage * config.NewWeaponCfg.DamageReduction / 100;
                        reduce = Math.Min(playerEntity.gamePlay.CurArmor, reduce);
                        playerEntity.gamePlay.CurArmor = Math.Max(0, playerEntity.gamePlay.CurArmor - (int)readDamage);
                        if (reduce > 0 && playerEntity.gamePlay.CurArmor == 0)
                        {
                            playerEntity.gamePlay.ArmorLv = playerEntity.gamePlay.MaxArmor = 0;
                            SimpleProto msg = FreePool.Allocate();
                            msg.Key = FreeMessageConstant.ChickenTip;
                            msg.Ss.Add("word75," + config.NewWeaponCfg.Name);
                            FreeMessageSender.SendMessage(playerEntity, msg);
                        }
                        ItemPosition ip = GetArmor(fd);
                        if (ip != null)
                        {
                            args.TempUse("current", (FreeData)playerEntity.freeData.FreeData);
                            if (playerEntity.gamePlay.CurArmor == 0)
                            {
                                ip.GetInventory().RemoveItem((FreeRuleEventArgs)args, ip);
                            }
                            else
                            {
                                ip.SetCount(playerEntity.gamePlay.CurArmor);
                                ip.GetInventory().GetInventoryUI().UpdateItem((FreeRuleEventArgs)args, ip.GetInventory(), ip);
                            }
                            args.Resume("current");
                        }
                        damage.damage -= reduce;
                        readDamage     = damage.damage;
                        playerEntity.statisticsData.Statistics.DefenseDamage += reduce;
                    }
                }
            }

            return(readDamage);
        }