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(); }
public async Task Leave(IFieldObj obj, Func <IPacket> getLeavePacket = null) { await LeaveQuietly(obj); await Dispatch(obj, getLeavePacket?.Invoke() ?? obj.GetLeaveFieldPacket()); UpdateControlledObjects(); }
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(); }
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); }
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)))); }
public Task Leave(IFieldObj obj) { lock (_lock) { _objects.Remove(obj.ID); } return(Task.CompletedTask); }
public Task LeaveQuietly(IFieldObj obj) { lock (_objectLock) { _objects.Remove(obj); obj.FieldSplit = null; } return(Task.CompletedTask); }
public Task EnterQuietly(IFieldObj obj) { lock (_objectLock) { _objects.Add(obj); obj.FieldSplit = this; } return(Task.CompletedTask); }
public bool IsShownTo(IFieldObj Object) { if (GMHideEnabled) { var player = Object as Character; if (player != null && player.IsGM) { return(true); } return(false); } return(true); }
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(); }
public Task Enter(IFieldObj obj) { lock (_lock) { obj.ID = _runningObjectID++; if (_runningObjectID > int.MaxValue - 1) { _runningObjectID = 1; } _objects[obj.ID] = obj; } return(Task.CompletedTask); }
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(); }
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); }
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); }
public Task Enter(IFieldObj obj, Func <IPacket> getEnterPacket) => Fields.FirstOrDefault()?.Enter(obj, getEnterPacket);
public Task Enter(IFieldObj obj) => Fields.FirstOrDefault()?.Enter(obj);
public Task Leave(IFieldObj obj, Func <IPacket> getLeavePacket) => Fields.FirstOrDefault()?.Leave(obj, getLeavePacket);
public Task Dispatch(IFieldObj source, IPacket packet) => Task.WhenAll(GetObjects <IFieldObjUser>().Where(u => u.ID != source.ID).Select(u => u.Dispatch(packet)));
public bool IsShownTo(IFieldObj Obj) => true;
public Task BroadcastPacket(IFieldObj source, IPacket packet) => Task.WhenAll(Fields.Select(f => BroadcastPacket(source, packet)));
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(); }
public Task BroadcastPacket(IFieldObj source, IPacket packet) => Task.WhenAll( GetObjects <IFieldUser>() .Where(u => u != source) .Select(u => u.SendPacket(packet)) );
public Task Leave(IFieldObj obj) => Leave(obj, null);
public Task Enter(IFieldObj obj) => Enter(obj, null, null);
public Task Leave(IFieldObj obj) => Fields.FirstOrDefault()?.Leave(obj);