コード例 #1
0
        public async Task Leave(IFieldObj obj, Func <IPacket> getLeavePacket = null)
        {
            if (obj is FieldUser user)
            {
                await user.Dispose();
                await BroadcastPacket(user, user.GetLeaveFieldPacket());

                await Task.WhenAll(user.Owned.Select(Leave));
            }
            else
            {
                await BroadcastPacket(getLeavePacket?.Invoke() ?? obj.GetLeaveFieldPacket());
            }

            if (obj is IFieldGeneratedObj g && g.Generator != null)
            {
                await g.Generator.Reset();
            }
            if (obj is IFieldControlledObj c)
            {
                c.Controller?.Controlled.Remove(c);
            }

            await GetPool(obj.Type).Leave(obj);

            UpdateControlledObjects();
        }
コード例 #2
0
ファイル: FieldSplit.cs プロジェクト: Kaioru/Edelstein
        public async Task Leave(IFieldObj obj, Func <IPacket> getLeavePacket = null)
        {
            await LeaveQuietly(obj);
            await Dispatch(obj, getLeavePacket?.Invoke() ?? obj.GetLeaveFieldPacket());

            UpdateControlledObjects();
        }
コード例 #3
0
        public async Task Leave(IFieldObj obj, Func <IPacket> getLeavePacket)
        {
            if (obj is FieldUser user)
            {
                if (user.Dialog != null)
                {
                    if (user.Dialog is TradingRoom trade)
                    {
                        await trade.Close();
                    }
                    else if (user.Dialog is IMiniRoom room)
                    {
                        await room.Leave(user);
                    }
                    else
                    {
                        await user.Interact(user.Dialog, true);
                    }
                }

                user.ConversationContext?.Cancel();

                await BroadcastPacket(user, user.GetLeaveFieldPacket());
            }
            else
            {
                await BroadcastPacket(getLeavePacket?.Invoke() ?? obj.GetLeaveFieldPacket());
            }

            await GetPool(obj.Type).Leave(obj);

            UpdateControlledObjects();
        }
コード例 #4
0
        public IPacket GetEnterFieldPacket(
            byte enterType,
            IFieldObj source = null,
            short delay      = 0
            )
        {
            using var p = new Packet(SendPacketOperations.DropEnterField);
            p.Encode <byte>(enterType); // nEnterType
            p.Encode <int>(ID);

            p.Encode <bool>(IsMoney);
            p.Encode <int>(Info);
            p.Encode <int>(0);                                         // dwOwnerID
            p.Encode <byte>(0x2);                                      // nOwnType
            p.Encode <Point>(Position);
            p.Encode <int>(source is FieldUser ? 0 : source?.ID ?? 0); // dwSourceID

            if (enterType == 0x0 ||
                enterType == 0x1 ||
                enterType == 0x3 ||
                enterType == 0x4)
            {
                p.Encode <Point>(source?.Position ?? new Point(0, 0));
                p.Encode <short>(delay);
            }

            if (!IsMoney)
            {
                p.Encode <long>(0);
            }

            p.Encode <bool>(false);
            p.Encode <bool>(false);
            return(p);
        }
コード例 #5
0
ファイル: FieldSplit.cs プロジェクト: Kaioru/Edelstein
 public Task Dispatch(IFieldObj source, IPacket packet)
 {
     if (source is IFieldObjUser)
     {
         return(Task.WhenAll(GetWatchers().Where(u => u.ID != source.ID).Select(u => u.Dispatch(packet))));
     }
     return(Task.WhenAll(GetWatchers().Select(u => u.Dispatch(packet))));
 }
コード例 #6
0
ファイル: FieldPool.cs プロジェクト: Kaioru/Edelstein
        public Task Leave(IFieldObj obj)
        {
            lock (_lock)
            {
                _objects.Remove(obj.ID);
            }

            return(Task.CompletedTask);
        }
コード例 #7
0
ファイル: FieldSplit.cs プロジェクト: Kaioru/Edelstein
        public Task LeaveQuietly(IFieldObj obj)
        {
            lock (_objectLock)
            {
                _objects.Remove(obj);
                obj.FieldSplit = null;
            }

            return(Task.CompletedTask);
        }
コード例 #8
0
ファイル: FieldSplit.cs プロジェクト: Kaioru/Edelstein
        public Task EnterQuietly(IFieldObj obj)
        {
            lock (_objectLock)
            {
                _objects.Add(obj);
                obj.FieldSplit = this;
            }

            return(Task.CompletedTask);
        }
コード例 #9
0
ファイル: Character.cs プロジェクト: zhuomingliang/WvsGlobal
        public bool IsShownTo(IFieldObj Object)
        {
            if (GMHideEnabled)
            {
                var player = Object as Character;
                if (player != null && player.IsGM)
                {
                    return(true);
                }
                return(false);
            }

            return(true);
        }
コード例 #10
0
        public async Task Enter(IFieldObj obj, Func <IPacket> getEnterPacket)
        {
            var pool = GetPool(obj.Type);

            obj.Field?.Leave(obj);
            obj.Field = this;
            await pool.Enter(obj);

            if (obj is FieldUser user)
            {
                var portal = Template.Portals.Values.FirstOrDefault(p => p.ID == user.Character.FieldPortal) ??
                             Template.Portals.Values.First(p => p.Type == FieldPortalType.Spawn);

                user.ID = user.Character.ID;
                user.Character.FieldID = ID;
                user.Position          = portal.Position;
                user.Foothold          = (short)(portal.Type != FieldPortalType.Spawn
                    ? Template.Footholds.Values
                                                 .Where(f => f.X1 <= portal.Position.X && f.X2 >= portal.Position.X)
                                                 .First(f => f.X1 < f.X2).ID
                    : 0);

                await user.SendPacket(user.GetSetFieldPacket());
                await BroadcastPacket(user, getEnterPacket?.Invoke() ?? user.GetEnterFieldPacket());

                if (!user.Socket.IsInstantiated)
                {
                    user.Socket.IsInstantiated = true;
                }

                await user.ResetForcedStats();

                GetObjects()
                .Where(o => o != user)
                .ForEach(o => user.SendPacket(o.GetEnterFieldPacket()));

                if (ParentFieldSet != null)
                {
                    await user.Message($"Currently in the {ParentFieldSet.SetTemplate.Name} field set.");
                }
            }
            else
            {
                await BroadcastPacket(getEnterPacket?.Invoke() ?? obj.GetEnterFieldPacket());
            }

            UpdateControlledObjects();
        }
コード例 #11
0
ファイル: FieldPool.cs プロジェクト: Kaioru/Edelstein
        public Task Enter(IFieldObj obj)
        {
            lock (_lock)
            {
                obj.ID = _runningObjectID++;

                if (_runningObjectID > int.MaxValue - 1)
                {
                    _runningObjectID = 1;
                }

                _objects[obj.ID] = obj;
            }

            return(Task.CompletedTask);
        }
コード例 #12
0
ファイル: FieldSplit.cs プロジェクト: Kaioru/Edelstein
        public async Task Enter(IFieldObj obj, Func <IPacket> getEnterPacket = null, Func <IPacket> getLeavePacket = null)
        {
            var from = obj.FieldSplit;

            if (from != null)
            {
                await from.LeaveQuietly(obj);
            }
            await EnterQuietly(obj);

            var toWatchers   = GetWatchers();
            var fromWatchers = from?.GetWatchers() ?? new List <IFieldObjUser>();
            var newWatchers  = toWatchers
                               .Where(w => w != obj)
                               .Except(fromWatchers)
                               .ToImmutableList();
            var oldWatchers = fromWatchers
                              .Where(w => w != obj)
                              .Except(toWatchers)
                              .ToImmutableList();

            var enterPacket = getEnterPacket?.Invoke() ?? obj.GetEnterFieldPacket();
            var leavePacket = getLeavePacket?.Invoke() ?? obj.GetLeaveFieldPacket();

            await Task.WhenAll(newWatchers.Select(w => w.Dispatch(enterPacket)));

            await Task.WhenAll(oldWatchers.Select(w => w.Dispatch(leavePacket)));

            if (obj is IFieldObjUser user)
            {
                var enclosingSplits = user.Field.GetEnclosingSplits(this);
                var oldSplits       = user.Watching
                                      .Except(enclosingSplits)
                                      .ToImmutableList();
                var newSplits = enclosingSplits
                                .Where(s => s != null)
                                .Except(user.Watching)
                                .ToImmutableList();

                await Task.WhenAll(oldSplits.Select(s => s.Unwatch(user)));

                await Task.WhenAll(newSplits.Select(s => s.Watch(user)));
            }

            UpdateControlledObjects();
        }
コード例 #13
0
ファイル: Drop.cs プロジェクト: zhuomingliang/WvsGlobal
        public bool IsShownTo(IFieldObj Object)
        {
            var Result = false;

            if (Object is Character User && User.PrimaryStats.HP > 0 && User.MapID == Field.ID)
            {
                if (ShowMax > 0)
                {
                    var Count = User.Inventory.GetItemAmount(Reward.ItemID);

                    //TODO If quests give out cash items this needs to be changed
                    if (User.Inventory.GetEquippedItemId((short)Constants.GetBodyPartFromItem(Reward.ItemID), false) == Reward.ItemID)
                    {
                        Count++;
                    }

                    if (Count > ShowMax)
                    {
                        return(false);
                    }
                }

                if (QuestID > 0)
                {
                    if (User.Quests.HasQuest(QuestID))
                    {
                        if (OwnType == DropType.Normal && User.ID == OwnerID ||
                            OwnType == DropType.Party && User.PartyID == OwnPartyID ||
                            OwnType == DropType.FreeForAll ||
                            OwnType == DropType.Explosive)
                        {
                            Result = true;
                        }
                    }
                }
                else
                {
                    Result = true;
                }
            }

            return(Result);
        }
コード例 #14
0
        public IPacket GetLeaveFieldPacket(
            byte leaveType,
            IFieldObj source = null
            )
        {
            using var p = new Packet(SendPacketOperations.DropLeaveField);
            p.Encode <byte>(leaveType); // nLeaveType
            p.Encode <int>(ID);

            if (leaveType == 0x2 ||
                leaveType == 0x3 ||
                leaveType == 0x5)
            {
                p.Encode <int>(source?.ID ?? 0);
            }
            else if (leaveType == 0x4)
            {
                p.Encode <short>(0);
            }

            return(p);
        }
コード例 #15
0
ファイル: FieldSet.cs プロジェクト: kaokaotw/Edelstein
 public Task Enter(IFieldObj obj, Func <IPacket> getEnterPacket)
 => Fields.FirstOrDefault()?.Enter(obj, getEnterPacket);
コード例 #16
0
ファイル: FieldSet.cs プロジェクト: kaokaotw/Edelstein
 public Task Enter(IFieldObj obj)
 => Fields.FirstOrDefault()?.Enter(obj);
コード例 #17
0
ファイル: FieldSet.cs プロジェクト: kaokaotw/Edelstein
 public Task Leave(IFieldObj obj, Func <IPacket> getLeavePacket)
 => Fields.FirstOrDefault()?.Leave(obj, getLeavePacket);
コード例 #18
0
ファイル: FieldPool.cs プロジェクト: Kaioru/Edelstein
 public Task Dispatch(IFieldObj source, IPacket packet)
 => Task.WhenAll(GetObjects <IFieldObjUser>().Where(u => u.ID != source.ID).Select(u => u.Dispatch(packet)));
コード例 #19
0
ファイル: Mist.cs プロジェクト: zhuomingliang/WvsGlobal
 public bool IsShownTo(IFieldObj Obj) => true;
コード例 #20
0
ファイル: FieldSet.cs プロジェクト: kaokaotw/Edelstein
 public Task BroadcastPacket(IFieldObj source, IPacket packet)
 => Task.WhenAll(Fields.Select(f => BroadcastPacket(source, packet)));
コード例 #21
0
        public async Task Enter(IFieldObj obj, Func <IPacket> getEnterPacket = null)
        {
            var pool  = GetPool(obj.Type);
            var first = obj is FieldUser && !pool.GetObjects().Any();

            obj.Field?.Leave(obj);
            obj.Field = this;
            await pool.Enter(obj);

            if (obj is IFieldOwnedObj owned)
            {
                owned.Position = owned.Owner.Position;
            }

            if (obj is FieldUser user)
            {
                var portal = Template.Portals.Values.FirstOrDefault(p => p.ID == user.Character.FieldPortal) ??
                             Template.Portals.Values.First(p => p.Type == FieldPortalType.StartPoint);

                user.ID = user.Character.ID;
                user.Character.FieldID = ID;
                user.Position          = portal.Position;
                user.Foothold          = (short)(portal.Type != FieldPortalType.StartPoint
                    ? Template.Footholds.Values
                                                 .Where(f => f.X1 <= portal.Position.X && f.X2 >= portal.Position.X)
                                                 .First(f => f.X1 < f.X2).ID
                    : 0);

                await user.SendPacket(user.GetSetFieldPacket());

                await Task.WhenAll(user.Pets.Select(async pet =>
                {
                    pet.Field    = user.Field;
                    pet.Position = user.Position;
                    pet.Foothold = user.Foothold;
                    await user.SendPacket(pet.GetEnterFieldPacket());
                }));
                await BroadcastPacket(user, getEnterPacket?.Invoke() ?? user.GetEnterFieldPacket());

                if (!user.IsInstantiated)
                {
                    user.IsInstantiated = true;
                }

                GetObjects()
                .Where(o => o != user)
                .ForEach(o => user.SendPacket(o.GetEnterFieldPacket()));
                await Task.WhenAll(user.Owned.Select(Enter));

                var script = first
                    ? Template.ScriptFirstUserEnter ?? Template.ScriptUserEnter
                    : Template.ScriptUserEnter;

                if (script != null)
                {
#pragma warning disable 4014
                    var context      = new ConversationContext(user.Socket);
                    var conversation = await user.Service.ConversationManager.Build(
                        script,
                        context,
                        new FieldSpeaker(context, user.Field),
                        new FieldUserSpeaker(context, user)
                        );

                    user.Converse(conversation);
#pragma warning restore 4014
                }
            }
            else
            {
                await BroadcastPacket(getEnterPacket?.Invoke() ?? obj.GetEnterFieldPacket());
            }

            UpdateControlledObjects();
        }
コード例 #22
0
 public Task BroadcastPacket(IFieldObj source, IPacket packet)
 => Task.WhenAll(
     GetObjects <IFieldUser>()
     .Where(u => u != source)
     .Select(u => u.SendPacket(packet))
     );
コード例 #23
0
ファイル: FieldSplit.cs プロジェクト: Kaioru/Edelstein
 public Task Leave(IFieldObj obj) => Leave(obj, null);
コード例 #24
0
ファイル: FieldSplit.cs プロジェクト: Kaioru/Edelstein
 public Task Enter(IFieldObj obj) => Enter(obj, null, null);
コード例 #25
0
ファイル: FieldSet.cs プロジェクト: kaokaotw/Edelstein
 public Task Leave(IFieldObj obj)
 => Fields.FirstOrDefault()?.Leave(obj);