/// <summary> /// rmvobj packet /// </summary> /// <param name="packet"></param> public void MinilandRemoveObject(RmvobjPacket packet) { ItemInstance minilandobject = Session.Character.Inventory.LoadBySlotAndType <ItemInstance>(packet.Slot, InventoryType.Miniland); if (minilandobject == null) { return; } if (Session.Character.MinilandState == MinilandState.LOCK) { MapDesignObject minilandObject = Session.Character.MapInstance.MapDesignObjects.FirstOrDefault(s => s.ItemInstanceId == minilandobject.Id); if (minilandObject == null) { return; } if (minilandobject.Item.IsWarehouse) { Session.Character.WareHouseSize = 0; } Session.Character.MapInstance.MapDesignObjects = Session.Character.MapInstance.MapDesignObjects.Where(s => s != minilandObject); Session.SendPacket(minilandObject.GenerateEffect(true)); Session.SendPacket(Session.Character.GenerateMinilandPoint()); Session.SendPacket(minilandObject.GenerateMapDesignObject(true)); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("MINILAND_NEED_LOCK"), 0)); } }
/// <summary> /// useobj packet /// </summary> /// <param name="packet"></param> public void UseMinilandObject(UseobjPacket packet) { if (packet == null) { return; } ClientSession client = ServerManager.Instance.Sessions.FirstOrDefault(s => s.Character?.Miniland == Session.Character.MapInstance); var minilandObjectItem = client?.Character.Inventory.LoadBySlotAndType <ItemInstance>(packet.Slot, InventoryType.Miniland); if (minilandObjectItem == null) { return; } MapDesignObject minilandObject = client.Character.MapInstance.MapDesignObjects.FirstOrDefault(s => s.ItemInstanceId == minilandObjectItem.Id); if (minilandObject == null) { return; } if (!minilandObjectItem.Item.IsWarehouse) { byte game = (byte)(minilandObject.ItemInstance.Item.EquipmentSlot == 0 ? 4 + minilandObject.ItemInstance.ItemVNum % 10 : (int)minilandObject.ItemInstance.Item.EquipmentSlot / 3); bool full = false; Session.SendPacket( $"mlo_info {(client == Session ? 1 : 0)} {minilandObjectItem.ItemVNum} {packet.Slot} {Session.Character.MinilandPoint} {(minilandObjectItem.DurabilityPoint < 1000 ? 1 : 0)} {(full ? 1 : 0)} 0 {GetMinilandMaxPoint(game)[0]} {GetMinilandMaxPoint(game)[0] + 1} {GetMinilandMaxPoint(game)[1]} {GetMinilandMaxPoint(game)[1] + 1} {GetMinilandMaxPoint(game)[2]} {GetMinilandMaxPoint(game)[2] + 2} {GetMinilandMaxPoint(game)[3]} {GetMinilandMaxPoint(game)[3] + 1} {GetMinilandMaxPoint(game)[4]} {GetMinilandMaxPoint(game)[4] + 1} {GetMinilandMaxPoint(game)[5]}"); } else { Session.SendPacket(Session.Character.GenerateStashAll()); } }
public void AddMinilandObject(MapDesignObject mapObject, long characterId, InventoryItemInstance minilandobject) { var miniland = _mapInstanceProvider.GetMapInstance(_minilandIds[characterId].MapInstanceId); mapObject.Effect = (short)(minilandobject.ItemInstance.Item?.EffectValue ?? minilandobject.ItemInstance.Design); mapObject.Width = minilandobject.ItemInstance.Item.Width; mapObject.Height = minilandobject.ItemInstance.Item.Height; mapObject.DurabilityPoint = (short)minilandobject.ItemInstance.DurabilityPoint; mapObject.IsWarehouse = minilandobject.ItemInstance.Item.IsWarehouse; mapObject.InventoryItemInstanceId = minilandobject.Id; mapObject.InventoryItemInstance = minilandobject; mapObject.Slot = minilandobject.Slot; if (minilandobject.ItemInstance.Item.ItemType == ItemType.House) { switch (minilandobject.ItemInstance.Item.ItemSubType) { case 0: mapObject.MapX = 24; mapObject.MapY = 7; break; case 1: mapObject.MapX = 21; mapObject.MapY = 4; break; case 2: mapObject.MapX = 31; mapObject.MapY = 3; break; } } miniland.MapDesignObjects.TryAdd(minilandobject.Id, mapObject); }
internal static void GenerateTalentArena() { long groupid = 0; int seconds = 0; IDisposable obs = Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe(start2 => { ServerManager.Instance.ArenaMembers.Where(s => s.ArenaType == EventType.TALENTARENA).ToList().ForEach(s => { s.Time -= 1; List <long> groupids = new List <long>(); ServerManager.Instance.ArenaMembers.Where(o => o.GroupId != null).ToList().ForEach(o => { if (ServerManager.Instance.ArenaMembers.Count(g => g.GroupId == o.GroupId) != 3) { return; } if (o.GroupId != null) { groupids.Add(o.GroupId.Value); } }); if (s.Time > 0) { if (s.GroupId == null) { List <ArenaMember> members = ServerManager.Instance.ArenaMembers .Where(e => e.Session != s.Session && e.ArenaType == EventType.TALENTARENA && e.Session.Character.Level <= s.Session.Character.Level + 5 && e.Session.Character.Level >= s.Session.Character.Level - 5).ToList(); members.RemoveAll(o => o.GroupId != null && groupids.Contains(o.GroupId.Value)); ArenaMember member = members.FirstOrDefault(); if (member == null) { return; } { if (member.GroupId == null) { groupid++; member.GroupId = groupid; } s.GroupId = member.GroupId; ServerManager.Instance.ArenaMembers.Where(e => e.ArenaType == EventType.TALENTARENA && e.GroupId == member.GroupId).ToList().ForEach(o => { o.Session.SendPacket(o.Session.Character.GenerateBsInfo(1, 2, -1, 6)); o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ARENA_TEAM_FOUND"), 10)); Observable.Timer(TimeSpan.FromSeconds(1)).Subscribe(time => { s.Time = 300; if (ServerManager.Instance.ArenaMembers.Count(g => g.GroupId == s.GroupId) < 3) { o.Session.SendPacket(o.Session.Character.GenerateBsInfo(0, 2, s.Time, 8)); o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SEARCH_ARENA_TEAM"), 10)); } else { o.Session.SendPacket(o.Session.Character.GenerateBsInfo(0, 2, s.Time, 1)); o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SEARCH_RIVAL_ARENA_TEAM"), 10)); } }); }); } } else { if (ServerManager.Instance.ArenaMembers.Count(g => g.GroupId == s.GroupId) != 3) { return; } ArenaMember member = ServerManager.Instance.ArenaMembers.FirstOrDefault(o => o.GroupId != null && o.GroupId != s.GroupId && groupids.Contains(o.GroupId.Value) && o.Session.Character.Level <= s.Session.Character.Level + 5 && o.Session.Character.Level >= s.Session.Character.Level - 5); if (member == null) { return; } MapInstance map = ServerManager.Instance.GenerateMapInstance(2015, MapInstanceType.TalentArenaMapInstance, new InstanceBag()); ConcurrentBag <ArenaTeamMember> arenaTeam = new ConcurrentBag <ArenaTeamMember>(); ServerManager.Instance.ArenaTeams.Add(arenaTeam); ArenaMember[] arenamembers = ServerManager.Instance.ArenaMembers.Where(o => o.GroupId == member.GroupId || o.GroupId == s.GroupId).OrderBy(o => o.GroupId) .ToArray(); for (int i = 0; i < 6; i++) { ItemInstance item = Inventory.InstantiateItemInstance((short)(4433 + (i > 2 ? 5 - i : i)), member.Session.Character.CharacterId); item.Design = (short)(4433 + (i > 2 ? 5 - i : i)); map.MapDesignObjects.Add(new MapDesignObject { ItemInstance = item, ItemInstanceId = item.Id, CharacterId = member.Session.Character.CharacterId, MapX = (short)(i > 2 ? 120 : 19), MapY = (short)(i > 2 ? 35 + i % 3 * 4 : 36 + i % 3 * 4) }); } map.InstanceBag.Clock.BasesSecondRemaining = 60; map.InstanceBag.Clock.DeciSecondRemaining = 600; map.InstanceBag.Clock.StartClock(); IDisposable obs4 = null; IDisposable obs2 = null; IDisposable obs3 = null; IDisposable obs6 = null; Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(time2 => { obs3 = Observable.Interval(TimeSpan.FromSeconds(5)).Subscribe(effect => { arenamembers.ToList().ForEach(o => map.Broadcast(o.Session.Character.GenerateEff(o.GroupId == s.GroupId ? 3012 : 3013))); }); }); IDisposable obs5 = Observable.Interval(TimeSpan.FromMilliseconds(500)).Subscribe(start3 => { map.Broadcast(arenamembers.FirstOrDefault(o => o.Session != null)?.Session.Character.GenerateTaPs()); List <ArenaTeamMember> erenia = arenaTeam.Replace(team => team.ArenaTeamType == ArenaTeamType.ERENIA).ToList(); List <ArenaTeamMember> zenas = arenaTeam.Replace(team => team.ArenaTeamType == ArenaTeamType.ZENAS).ToList(); BuffTeam(erenia); BuffTeam(zenas); }); arenamembers.ToList().ForEach(o => { o.Session.SendPacket(o.Session.Character.GenerateBsInfo(0, 2, s.Time, 2)); o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("RIVAL_ARENA_TEAM_FOUND"), 10)); Observable.Timer(TimeSpan.FromSeconds(1)).Subscribe(time => { o.Session.SendPacket("ta_close"); Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(time2 => { o.Session.Character.Mates.Where(m => m.IsTeamMember).ToList().ForEach(m => m.IsTeamMember = false); o.Session.Character.GeneralLogs.Add(new GeneralLogDTO { AccountId = o.Session.Account.AccountId, CharacterId = o.Session.Character.CharacterId, IpAddress = o.Session.IpAddress, LogData = "Entry", LogType = "TalentArena", Timestamp = DateTime.Now }); List <BuffType> bufftodisable = new List <BuffType> { BuffType.Bad, BuffType.Good, BuffType.Neutral }; o.Session.Character.DisableBuffs(bufftodisable); int i = Array.IndexOf(arenamembers, o) + 1; o.Session.Character.Hp = (int)o.Session.Character.HPLoad(); o.Session.Character.Mp = (int)o.Session.Character.MPLoad(); ServerManager.Instance.ChangeMapInstance(o.Session.Character.CharacterId, map.MapInstanceId, o.GroupId == member.GroupId ? 125 : 14, (o.GroupId == member.GroupId ? 37 : 38) + i % 3 * 2); o.Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SELECT_ORDER_ARENA_TIME"), 0)); o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SELECT_ORDER_ARENA_TIME"), 10)); o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SELECT_ORDER_ARENA"), 10)); o.Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SELECT_ORDER_ARENA"), 0)); o.Session.SendPacket(o.Session.Character.GenerateTaM(0)); o.Session.SendPacket("ta_sv 0"); o.Session.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Watch)); o.Session.SendPacket(o.Session.Character.GenerateTaM(3)); o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(o.GroupId == s.GroupId ? "ZENAS" : "ERENIA"), 10)); arenaTeam.Add(new ArenaTeamMember(o.Session, o.GroupId == s.GroupId ? ArenaTeamType.ZENAS : ArenaTeamType.ERENIA, null)); o.Session.SendPacket(o.Session.Character.GenerateTaP(0, false)); obs2 = Observable.Interval(TimeSpan.FromMilliseconds(100)).Subscribe(start3 => { bool resettap = false; map.MapDesignObjects.ToList().ForEach(e => { if (e.ItemInstance.Design >= 4433 && e.ItemInstance.Design <= 4435) { Character chara = map.GetCharactersInRange(e.MapX, e.MapY, 0).FirstOrDefault(); if (chara != null) { resettap = true; ArenaTeamMember teammember = arenaTeam.FirstOrDefault(at => at.Session == chara.Session); if (teammember != null && !arenaTeam.Any(at => at.Order == (e.ItemInstance.ItemVNum - 4433) && at.ArenaTeamType == (e.MapX == 120 ? ArenaTeamType.ERENIA : ArenaTeamType.ZENAS))) { if (teammember.Order != null) { MapDesignObject obj = map.MapDesignObjects.FirstOrDefault(mapobj => mapobj.ItemInstance.ItemVNum == e.ItemInstance.ItemVNum && e.MapX == (teammember.ArenaTeamType == ArenaTeamType.ERENIA ? 120 : 19)); if (obj != null) { obj.ItemInstance.Design = obj.ItemInstance.ItemVNum; } } teammember.Order = (byte)(e.ItemInstance.ItemVNum - 4433); } } } else if (e.ItemInstance.Design == 4436) { if (!map.GetCharactersInRange(e.MapX, e.MapY, 0).Any()) { resettap = true; ArenaTeamMember teammember = arenaTeam.FirstOrDefault(at => at.Order == (e.ItemInstance.ItemVNum - 4433) && at.ArenaTeamType == (e.MapX == 120 ? ArenaTeamType.ERENIA : ArenaTeamType.ZENAS)); if (teammember != null) { teammember.Order = null; } } } if (!arenaTeam.Any(at => at.Order == (e.ItemInstance.ItemVNum - 4433) && at.ArenaTeamType == (e.MapX == 120 ? ArenaTeamType.ERENIA : ArenaTeamType.ZENAS))) { if (e.ItemInstance.Design != 4436) { return; } e.ItemInstance.Design = e.ItemInstance.ItemVNum; map.Broadcast(e.GenerateEffect(false)); } else if (e.ItemInstance.Design != 4436) { e.ItemInstance.Design = 4436; map.Broadcast(e.GenerateEffect(false)); } }); if (resettap) { arenaTeam.ToList().ForEach(arenauser => { arenauser.Session.SendPacket(arenauser.Session.Character.GenerateTaP(2, false)); }); } }); Observable.Timer(TimeSpan.FromSeconds(map.InstanceBag.Clock.BasesSecondRemaining)).Subscribe(start => { obs2.Dispose(); arenaTeam.ToList().ForEach(arenauser => { if (arenauser.Order == null) { for (byte x = 0; x < 3; x++) { if (!arenaTeam.Any(at => at.ArenaTeamType == arenauser.ArenaTeamType && at.Order == x)) { arenauser.Order = x; } } } arenauser.Session.SendPacket($"ta_pn {arenauser.Order + 1}"); arenauser.Session.SendPacket(arenauser.Session.Character.GenerateTaP(2, true)); }); map.MapDesignObjects.ToList().ForEach(md => map.Broadcast(md.GenerateEffect(true))); map.MapDesignObjects.Clear(); }); }); }); }); Observable.Timer(TimeSpan.FromSeconds(map.InstanceBag.Clock.BasesSecondRemaining)).Subscribe(start => { bool newround1 = true; bool newround2 = true; int count1 = 0; int count2 = 0; IDisposable obs7 = obs4; obs4 = Observable.Interval(TimeSpan.FromMilliseconds(500)).Subscribe(start3 => { int ereniacount = arenaTeam.Count(at => at.Dead && at.ArenaTeamType == ArenaTeamType.ERENIA); int zenascount = arenaTeam.Count(at => at.Dead && at.ArenaTeamType == ArenaTeamType.ZENAS); if (count1 != ereniacount || count2 != zenascount) { if (count1 != ereniacount) { newround1 = true; } if (count2 != zenascount) { newround2 = true; } count1 = ereniacount; count2 = zenascount; } ArenaTeamMember tm = arenaTeam.OrderBy(tm3 => tm3.Order).FirstOrDefault(tm3 => tm3.ArenaTeamType == ArenaTeamType.ERENIA && !tm3.Dead); ArenaTeamMember tm2 = arenaTeam.OrderBy(tm3 => tm3.Order).FirstOrDefault(tm3 => tm3.ArenaTeamType == ArenaTeamType.ZENAS && !tm3.Dead); if (!newround1 && !newround2) { return; } map.InstanceBag.Clock.BasesSecondRemaining = 300; map.InstanceBag.Clock.DeciSecondRemaining = 3000; arenaTeam.ToList().ForEach(friends => { friends.Session.SendPacket(friends.Session.Character.GenerateTaM(2)); friends.Session.SendPacket(friends.Session.Character.GenerateTaM(3)); }); map.Sessions.Except(arenaTeam.Select(ss => ss.Session)).ToList().ForEach(o => { o.SendPacket(tm2?.Session.Character.GenerateTaM(2)); o.SendPacket(tm2?.Session.Character.GenerateTaM(3)); }); obs6?.Dispose(); obs6 = Observable.Timer(TimeSpan.FromSeconds(map.InstanceBag.Clock.BasesSecondRemaining)).Subscribe(start4 => { if (tm2 != null && tm != null) { tm.Dead = true; tm2.Dead = true; tm.Session.Character.PositionX = 120; tm.Session.Character.PositionY = 39; tm2.Session.Character.PositionX = 19; tm2.Session.Character.PositionY = 40; map.Broadcast(tm2.Session, tm.Session.Character.GenerateTp()); map.Broadcast(tm2.Session, tm2.Session.Character.GenerateTp()); tm.Session.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Watch)); tm2.Session.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Watch)); arenaTeam.Replace(friends => friends.ArenaTeamType == tm.ArenaTeamType).ToList().ForEach(friends => { friends.Session.SendPacket(friends.Session.Character.GenerateTaFc(0)); }); } newround1 = true; newround2 = true; arenaTeam.ToList().ForEach(arenauser => { arenauser.Session.SendPacket(arenauser.Session.Character.GenerateTaP(2, true)); }); }); if (tm != null && tm2 != null) { map.IsPVP = false; arenaTeam.Replace(at => at.LastSummoned != null).ToList().ForEach(at => { at.LastSummoned = null; at.Session.Character.PositionX = at.ArenaTeamType == ArenaTeamType.ERENIA ? (short)120 : (short)19; at.Session.Character.PositionY = at.ArenaTeamType == ArenaTeamType.ERENIA ? (short)39 : (short)40; at.Session.CurrentMapInstance.Broadcast(at.Session.Character.GenerateTp()); at.Session.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Watch)); }); if (newround1) { map.Broadcast(tm.Session.Character.GenerateTaFc(1)); tm.Session.Character.PositionX = 87; tm.Session.Character.PositionY = 39; map.Broadcast(tm.Session, tm.Session.Character.GenerateTp()); } if (newround2) { tm2.Session.Character.PositionX = 56; tm2.Session.Character.PositionY = 40; map.Broadcast(tm2.Session, tm2.Session.Character.GenerateTp()); } arenaTeam.ToList().ForEach(friends => { friends.Session.SendPacket(friends.ArenaTeamType == ArenaTeamType.ERENIA ? tm.Session.Character.GenerateTaFc(0) : tm2.Session.Character.GenerateTaFc(0)); }); map.Sessions.Except(arenaTeam.Select(ss => ss.Session)).ToList().ForEach(ss => { ss.SendPacket(tm.Session.Character.GenerateTaFc(0)); ss.SendPacket(tm2.Session.Character.GenerateTaFc(1)); }); tm.Session.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Call)); tm2.Session.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Call)); map.Broadcast("ta_s"); Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(start4 => { map.IsPVP = true; }); } else { switch (tm) { case null when tm2 == null: map.Broadcast(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("EQUALITY"), 0)); arenaTeam.ToList().ForEach(arenauser => { arenauser.Session.SendPacket(arenauser.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("EQUALITY"), 10)); arenauser.Session.SendPacket(arenauser.Session.Character.GenerateTaF(3)); }); map.Sessions.Except(arenamembers.Select(x => x.Session)).ToList().ForEach( x => { ArenaTeamMember arenauser = arenaTeam.FirstOrDefault(se => se.Session != null); if (arenauser == null) { return; } x.SendPacket(arenauser.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("EQUALITY"), 10)); x.SendPacket(arenauser.Session.Character.GenerateTaF(0)); } ); break; case null: map.Broadcast(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("VICTORIOUS_ZENAS"), 0)); arenaTeam.ToList().ForEach(arenauser => { SendRewards(arenauser, arenauser.ArenaTeamType == ArenaTeamType.ZENAS); }); map.Sessions.Except(arenamembers.Select(x => x.Session)).ToList().ForEach(x => { ArenaTeamMember arenauser = arenaTeam.FirstOrDefault(se => se.Session != null); if (arenauser == null) { return; } x.SendPacket(arenauser.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("VICTORIOUS_ZENAS"), 10)); x.SendPacket(arenauser.Session.Character.GenerateTaF(1)); }); break; default: map.Broadcast(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("VICTORIOUS_ERENIA"), 0)); arenaTeam.ToList().ForEach(arenauser => { SendRewards(arenauser, arenauser.ArenaTeamType == ArenaTeamType.ERENIA); }); map.Sessions.Except(arenamembers.Select(x => x.Session)).ToList().ForEach( x => { ArenaTeamMember arenauser = arenaTeam.FirstOrDefault(se => se.Session != null); if (arenauser == null) { return; } x.SendPacket(arenauser.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("VICTORIOUS_ERENIA"), 10)); x.SendPacket(arenauser.Session.Character.GenerateTaF(2)); } ); break; } obs3.Dispose(); obs2.Dispose(); obs7?.Dispose(); obs5.Dispose(); Observable.Timer(TimeSpan.FromSeconds(30)).Subscribe(start4 => { map.Dispose(); arenaTeam.ToList().ForEach(o => { if (o.Session?.CurrentMapInstance?.MapInstanceType == MapInstanceType.TalentArenaMapInstance) { ServerManager.Instance.TeleportOnRandomPlaceInMap(o.Session, ServerManager.Instance.ArenaInstance.MapInstanceId); } }); }); } newround1 = false; newround2 = false; }); }); ServerManager.Instance.ArenaMembers.Where(o => o.GroupId == member.GroupId || o.GroupId == s.GroupId).ToList() .ForEach(se => { se.Session.SendPacket(se.Session.Character.GenerateBsInfo(2, 2, 0, 0)); }); ServerManager.Instance.ArenaMembers.RemoveAll(o => o.GroupId == member.GroupId || o.GroupId == s.GroupId); } } else { if (s.GroupId == null) { if (s.Time != -1) { s.Session.SendPacket(s.Session.Character.GenerateBsInfo(1, 2, s.Time, 7)); s.Session.SendPacket(s.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NO_TEAM_ARENA"), 10)); } s.Time = 300; s.Session.SendPacket(s.Session.Character.GenerateBsInfo(1, 2, s.Time, 5)); s.Session.SendPacket(s.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SEARCH_ARENA_TEAM"), 10)); } else if (ServerManager.Instance.ArenaMembers.Count(g => g.GroupId == s.GroupId) < 3) { s.Session.SendPacket(s.Session.Character.GenerateBsInfo(1, 2, -1, 4)); Observable.Timer(TimeSpan.FromSeconds(1)).Subscribe(time => { s.Time = 300; s.Session.SendPacket(s.Session.Character.GenerateBsInfo(1, 2, s.Time, 8)); s.Session.SendPacket(s.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("RETRY_SEARCH_ARENA_TEAM"), 10)); }); } else { s.Session.SendPacket(s.Session.Character.GenerateBsInfo(0, 2, -1, 3)); Observable.Timer(TimeSpan.FromSeconds(1)).Subscribe(time => { s.Time = 300; s.Session.SendPacket(s.Session.Character.GenerateBsInfo(0, 2, s.Time, 1)); s.Session.SendPacket(s.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SEARCH_RIVAL_ARENA_TEAM"), 10)); }); } } }); seconds++; }); Observable.Timer(TimeSpan.FromHours(7)).Subscribe(start2 => { ServerManager.Instance.StartedEvents.Remove(EventType.TALENTARENA); obs.Dispose(); }); }
public override void Execute(MinigamePacket minigamePacket, ClientSession clientSession) { _clientSession = clientSession; _minigamePacket = minigamePacket; _miniland = _minilandProvider.GetMiniland(clientSession.Character.CharacterId); _minilandObject = clientSession.Character.MapInstance.MapDesignObjects.Values.FirstOrDefault(s => s.Slot == minigamePacket.Id); if ((_minilandObject == null) || (_miniland == null)) { return; } if (_minilandObject.InventoryItemInstance.ItemInstance.Item.IsWarehouse) { return; } var game = (byte)(_minilandObject.InventoryItemInstance.ItemInstance.Item.EquipmentSlot == EquipmentType.MainWeapon ? (4 + _minilandObject.InventoryItemInstance.ItemInstance.ItemVNum) % 10 : (int)_minilandObject.InventoryItemInstance.ItemInstance.Item.EquipmentSlot / 3); var full = false; switch (minigamePacket.Type) { case 1: Play(game); break; case 2: BroadcastEffect(); break; case 3: ShowBoxLevels(game); break; case 4: SelectGift(); break; case 5: ShowMinilandManagment(); break; case 6: Refill(); break; case 7: ShowGifts(); break; case 8: OpenGiftBatch(); break; case 9: UseCoupon(); break; } }
/// <summary> /// mg packet /// </summary> /// <param name="packet"></param> public void MinigamePlay(MinigamePacket packet) { ClientSession client = ServerManager.Instance.Sessions.FirstOrDefault(s => s.Character?.Miniland == Session.Character.MapInstance); MapDesignObject mlobj = Session.CurrentMapInstance?.MapDesignObjects.FirstOrDefault(s => s.ItemInstance.ItemVNum == packet.MinigameVNum); if (mlobj == null) { return; } const bool full = false; byte game = (byte)(mlobj.ItemInstance.Item.EquipmentSlot == 0 ? 4 + mlobj.ItemInstance.ItemVNum % 10 : (int)mlobj.ItemInstance.Item.EquipmentSlot / 3); switch (packet.Type) { //play case 1: if (mlobj.ItemInstance.DurabilityPoint <= 0) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_DURABILITY_POINT"), 0)); return; } if (Session.Character.MinilandPoint <= 0) { Session.SendPacket($"qna #mg^1^7^3125^1^1 {Language.Instance.GetMessageFromKey("NOT_ENOUGH_MINILAND_POINT")}"); } Session.Character.MapInstance.Broadcast(UserInterfaceHelper.Instance.GenerateGuri(2, 1, Session.Character.CharacterId)); Session.Character.CurrentMinigame = (short)(game == 0 ? 5102 : game == 1 ? 5103 : game == 2 ? 5105 : game == 3 ? 5104 : game == 4 ? 5113 : 5112); Session.SendPacket($"mlo_st {game}"); break; //stop case 2: Session.Character.CurrentMinigame = 0; Session.Character.MapInstance.Broadcast(UserInterfaceHelper.Instance.GenerateGuri(6, 1, Session.Character.CharacterId)); break; case 3: Session.Character.CurrentMinigame = 0; Session.Character.MapInstance.Broadcast(UserInterfaceHelper.Instance.GenerateGuri(6, 1, Session.Character.CharacterId)); int Level = -1; for (short i = 0; i < GetMinilandMaxPoint(game).Count(); i++) { if (packet.Point > GetMinilandMaxPoint(game)[i]) { Level = i; } else { break; } } Session.SendPacket(Level != -1 ? $"mlo_lv {Level}" : $"mg 3 {game} {packet.MinigameVNum} 0 0"); break; // select gift case 4: if (Session.Character.MinilandPoint >= 100) { Gift obj = GetMinilandGift(packet.MinigameVNum, (int)packet.Point); if (obj != null) { Session.SendPacket($"mlo_rw {obj.VNum} {obj.Amount}"); Session.SendPacket(Session.Character.GenerateMinilandPoint()); List <ItemInstance> inv = Session.Character.Inventory.AddNewToInventory(obj.VNum, obj.Amount); Session.Character.MinilandPoint -= 100; if (!inv.Any()) { Session.Character.SendGift(Session.Character.CharacterId, obj.VNum, obj.Amount, 0, 0, false); } if (client != Session) { switch (packet.Point) { case 0: mlobj.Level1BoxAmount++; break; case 1: mlobj.Level2BoxAmount++; break; case 2: mlobj.Level3BoxAmount++; break; case 3: mlobj.Level4BoxAmount++; break; case 4: mlobj.Level5BoxAmount++; break; } } } } break; case 5: Session.SendPacket(Session.Character.GenerateMloMg(mlobj, packet)); break; //refill case 6: if (packet.Point == null) { return; } if (Session.Character.Gold > packet.Point) { Session.Character.Gold -= (int)packet.Point; Session.SendPacket(Session.Character.GenerateGold()); mlobj.ItemInstance.DurabilityPoint += (int)(packet.Point / 100); Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey(string.Format("REFILL_MINIGAME", (int)packet.Point / 100)))); Session.SendPacket(Session.Character.GenerateMloMg(mlobj, packet)); } break; //gift case 7: Session.SendPacket( $"mlo_pmg {packet.MinigameVNum} {Session.Character.MinilandPoint} {(mlobj.ItemInstance.DurabilityPoint < 1000 ? 1 : 0)} {(full ? 1 : 0)} {(mlobj.Level1BoxAmount > 0 ? $"392 {mlobj.Level1BoxAmount}" : "0 0")} {(mlobj.Level2BoxAmount > 0 ? $"393 {mlobj.Level2BoxAmount}" : "0 0")} {(mlobj.Level3BoxAmount > 0 ? $"394 {mlobj.Level3BoxAmount}" : "0 0")} {(mlobj.Level4BoxAmount > 0 ? $"395 {mlobj.Level4BoxAmount}" : "0 0")} {(mlobj.Level5BoxAmount > 0 ? $"396 {mlobj.Level5BoxAmount}" : "0 0")} 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"); break; //get gift case 8: int amount = 0; switch (packet.Point) { case 0: amount = mlobj.Level1BoxAmount; break; case 1: amount = mlobj.Level2BoxAmount; break; case 2: amount = mlobj.Level3BoxAmount; break; case 3: amount = mlobj.Level4BoxAmount; break; case 4: amount = mlobj.Level5BoxAmount; break; } List <Gift> gifts = new List <Gift>(); for (int i = 0; i < amount; i++) { Gift gift = GetMinilandGift(packet.MinigameVNum, (int)packet.Point); if (gift != null) { if (gifts.Any(o => o.VNum == gift.VNum)) { gifts.First(o => o.Amount == gift.Amount).Amount += gift.Amount; } else { gifts.Add(gift); } } } string str = string.Empty; for (int i = 0; i < 9; i++) { if (gifts.Count > i) { List <ItemInstance> inv = Session.Character.Inventory.AddNewToInventory(gifts.ElementAt(i).VNum, gifts.ElementAt(i).Amount); if (inv.Any()) { Session.SendPacket(Session.Character.GenerateSay( $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {ServerManager.Instance.GetItem(gifts.ElementAt(i).VNum).Name} x {gifts.ElementAt(i).Amount}", 12)); } else { Session.Character.SendGift(Session.Character.CharacterId, gifts.ElementAt(i).VNum, gifts.ElementAt(i).Amount, 0, 0, false); } str += $" {gifts.ElementAt(i).VNum} {gifts.ElementAt(i).Amount}"; } else { str += " 0 0"; } } Session.SendPacket( $"mlo_pmg {packet.MinigameVNum} {Session.Character.MinilandPoint} {(mlobj.ItemInstance.DurabilityPoint < 1000 ? 1 : 0)} {(full ? 1 : 0)} {(mlobj.Level1BoxAmount > 0 ? $"392 {mlobj.Level1BoxAmount}" : "0 0")} {(mlobj.Level2BoxAmount > 0 ? $"393 {mlobj.Level2BoxAmount}" : "0 0")} {(mlobj.Level3BoxAmount > 0 ? $"394 {mlobj.Level3BoxAmount}" : "0 0")} {(mlobj.Level4BoxAmount > 0 ? $"395 {mlobj.Level4BoxAmount}" : "0 0")} {(mlobj.Level5BoxAmount > 0 ? $"396 {mlobj.Level5BoxAmount}" : "0 0")}{str}"); break; //coupon case 9: List <ItemInstance> items = Session.Character.Inventory.Select(s => s.Value).Where(s => s.ItemVNum == 1269 || s.ItemVNum == 1271).OrderBy(s => s.Slot).ToList(); if (items.Count > 0) { Session.Character.Inventory.RemoveItemAmount(items.ElementAt(0).ItemVNum); int point = items.ElementAt(0).ItemVNum == 1269 ? 300 : 500; mlobj.ItemInstance.DurabilityPoint += point; Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey(string.Format("REFILL_MINIGAME", point)))); Session.SendPacket(Session.Character.GenerateMloMg(mlobj, packet)); } break; } }
/// <summary> /// addobj packet /// </summary> /// <param name="packet"></param> public void MinilandAddObject(AddobjPacket packet) { ItemInstance minilandobject = Session.Character.Inventory.LoadBySlotAndType <ItemInstance>(packet.Slot, InventoryType.Miniland); if (minilandobject != null) { if (Session.Character.MapInstance.MapDesignObjects.All(s => s.ItemInstanceId != minilandobject.Id)) { if (Session.Character.MinilandState == MinilandState.LOCK) { MapDesignObject minilandobj = new MapDesignObject { CharacterId = Session.Character.CharacterId, ItemInstance = minilandobject, ItemInstanceId = minilandobject.Id, MapX = packet.PositionX, MapY = packet.PositionY, Level1BoxAmount = 0, Level2BoxAmount = 0, Level3BoxAmount = 0, Level4BoxAmount = 0, Level5BoxAmount = 0 }; if (minilandobject.Item.ItemType == ItemType.House) { switch (minilandobject.Item.ItemSubType) { case 2: minilandobj.MapX = 31; minilandobj.MapY = 3; break; case 0: minilandobj.MapX = 24; minilandobj.MapY = 7; break; case 1: minilandobj.MapX = 21; minilandobj.MapY = 4; break; } MapDesignObject min = Session.Character.MapInstance.MapDesignObjects.FirstOrDefault(s => s.ItemInstance.Item.ItemType == ItemType.House && s.ItemInstance.Item.ItemSubType == minilandobject.Item.ItemSubType); if (min != null) { MinilandRemoveObject(new RmvobjPacket { Slot = min.ItemInstance.Slot }); } } if (minilandobject.Item.IsWarehouse) { Session.Character.WareHouseSize = minilandobject.Item.MinilandObjectPoint; } Session.Character.MapInstance.MapDesignObjects.Add(minilandobj); Session.SendPacket(minilandobj.GenerateEffect(false)); Session.SendPacket(Session.Character.GenerateMinilandPoint()); Session.SendPacket(minilandobj.GenerateMapDesignObject(false)); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("MINILAND_NEED_LOCK"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("ALREADY_THIS_MINILANDOBJECT"), 0)); } } }
public override async Task ExecuteAsync(AddobjPacket addobjPacket, ClientSession clientSession) { var minilandobject = clientSession.Character.InventoryService.LoadBySlotAndType(addobjPacket.Slot, NoscorePocketType.Miniland); if (minilandobject == null) { return; } if (clientSession.Character.MapInstance.MapDesignObjects.ContainsKey(minilandobject.Id)) { await clientSession.SendPacketAsync(new MsgPacket { Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.ALREADY_THIS_MINILANDOBJECT, clientSession.Account.Language) }).ConfigureAwait(false); return; } if (_minilandProvider.GetMiniland(clientSession.Character.CharacterId).State != MinilandState.Lock) { await clientSession.SendPacketAsync(new MsgPacket { Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.MINILAND_NEED_LOCK, clientSession.Account.Language) }).ConfigureAwait(false); return; } var minilandobj = new MapDesignObject { MinilandObjectId = Guid.NewGuid(), MapX = addobjPacket.PositionX, MapY = addobjPacket.PositionY, Level1BoxAmount = 0, Level2BoxAmount = 0, Level3BoxAmount = 0, Level4BoxAmount = 0, Level5BoxAmount = 0 }; if (minilandobject.ItemInstance?.Item?.ItemType == ItemType.House) { var min = clientSession.Character.MapInstance.MapDesignObjects .FirstOrDefault(s => (s.Value.InventoryItemInstance?.ItemInstance?.Item?.ItemType == ItemType.House) && (s.Value.InventoryItemInstance.ItemInstance.Item.ItemSubType == minilandobject.ItemInstance.Item.ItemSubType)).Value; if (min != null) { await clientSession.HandlePacketsAsync(new[] { new RmvobjPacket { Slot = min.InventoryItemInstance?.Slot ?? 0 } }).ConfigureAwait(false); } } _minilandProvider.AddMinilandObject(minilandobj, clientSession.Character.CharacterId, minilandobject); await clientSession.SendPacketAsync(minilandobj.GenerateEffect()).ConfigureAwait(false); await clientSession.SendPacketAsync(new MinilandPointPacket { MinilandPoint = minilandobject.ItemInstance?.Item?.MinilandObjectPoint ?? 0, Unknown = 100 }).ConfigureAwait(false); await clientSession.SendPacketAsync(minilandobj.GenerateMapDesignObject()).ConfigureAwait(false); }