public override void Use(ClientSession session, ref ItemInstance inv, bool delay = false, string[] packetsplit = null) { switch (Effect) { // airwaves - eventitems case 0: if (ItemType == ItemType.Event) { session.CurrentMapInstance?.Broadcast(session.Character.GenerateEff(EffectValue)); if (MappingHelper.GuriItemEffects.ContainsKey(EffectValue)) { session.CurrentMapInstance?.Broadcast(session.Character.GenerateGuri(19, 1, MappingHelper.GuriItemEffects[EffectValue]), session.Character.MapX, session.Character.MapY); } session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } break; //respawn objects case 1: if (session.Character.MapInstance.MapInstanceType != MapInstanceType.BaseInstance) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_USE_THAT"), 10)); return; } int x1; int x2; int x3; int x4; if (packetsplit != null && int.TryParse(packetsplit[2], out x1) && int.TryParse(packetsplit[3], out x2) && int.TryParse(packetsplit[4], out x3) && int.TryParse(packetsplit[5], out x4)) { int x5; switch (EffectValue) { case 0: if (!delay) { session.SendPacket(session.Character.GenerateDialog($"#u_i^{x1}^{x2}^{x3}^{x4}^1 #u_i^{x1}^{x2}^{x3}^{x4}^2 {Language.Instance.GetMessageFromKey("WANT_TO_SAVE_POSITION")}")); } else { if (int.TryParse(packetsplit[6], out x5)) { switch (x5) { case 1: session.SendPacket(session.Character.GenerateDelay(5000, 7, $"#u_i^{x1}^{x2}^{x3}^{x4}^3")); break; case 2: session.SendPacket(session.Character.GenerateDelay(5000, 7, $"#u_i^{x1}^{x2}^{x3}^{x4}^4")); break; case 3: session.Character.SetReturnPoint(session.Character.MapId, session.Character.MapX, session.Character.MapY); RespawnMapTypeDTO resp = session.Character.Respawn; if (resp.DefaultX != 0 && resp.DefaultY != 0 && resp.DefaultMapId != 0) { ServerManager.Instance.LeaveMap(session.Character.CharacterId); ServerManager.Instance.ChangeMap(session.Character.CharacterId, resp.DefaultMapId, (short)(resp.DefaultX + ServerManager.RandomNumber(-5, 5)), (short)(resp.DefaultY + ServerManager.RandomNumber(-5, 5))); } session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); break; case 4: RespawnMapTypeDTO respa = session.Character.Respawn; if (respa.DefaultX != 0 && respa.DefaultY != 0 && respa.DefaultMapId != 0) { ServerManager.Instance.LeaveMap(session.Character.CharacterId); ServerManager.Instance.ChangeMap(session.Character.CharacterId, respa.DefaultMapId, (short)(respa.DefaultX + ServerManager.RandomNumber(-5, 5)), (short)(respa.DefaultY + ServerManager.RandomNumber(-5, 5))); } session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); break; } } } break; case 1: if (int.TryParse(packetsplit[6], out x5)) { RespawnMapTypeDTO resp = session.Character.Return; switch (x5) { case 0: if (resp.DefaultX != 0 && resp.DefaultY != 0 && resp.DefaultMapId != 0) { session.SendPacket(session.Character.GenerateRp(resp.DefaultMapId, resp.DefaultX, resp.DefaultY, $"#u_i^{x1}^{x2}^{x3}^{x4}^1")); } break; case 1: session.SendPacket(session.Character.GenerateDelay(5000, 7, $"#u_i^{x1}^{x2}^{x3}^{x4}^2")); break; case 2: if (resp.DefaultX != 0 && resp.DefaultY != 0 && resp.DefaultMapId != 0) { ServerManager.Instance.LeaveMap(session.Character.CharacterId); ServerManager.Instance.ChangeMap(session.Character.CharacterId, resp.DefaultMapId, resp.DefaultX, resp.DefaultY); } session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); break; } } break; case 2: if (!delay) { session.SendPacket(session.Character.GenerateDelay(5000, 7, $"#u_i^{x1}^{x2}^{x3}^{x4}^1")); } else { ServerManager.Instance.LeaveMap(session.Character.CharacterId); ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, session.Character.MinilandId, 3, 8); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } break; } } break; // dyes or waxes case 10: case 11: if (!session.Character.IsVehicled) { if (Effect == 10) { if (EffectValue == 99) { byte nextValue = (byte)ServerManager.RandomNumber(0, 127); session.Character.HairColor = Enum.IsDefined(typeof(HairColorType), nextValue) ? (HairColorType)nextValue : 0; } else { session.Character.HairColor = Enum.IsDefined(typeof(HairColorType), (byte)EffectValue) ? (HairColorType)EffectValue : 0; } } else { if (session.Character.Class == (byte)ClassType.Adventurer && EffectValue > 1) { session.SendPacket(session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("ADVENTURERS_CANT_USE"), 10)); return; } session.Character.HairStyle = Enum.IsDefined(typeof(HairStyleType), (byte)EffectValue) ? (HairStyleType)EffectValue : 0; } session.SendPacket(session.Character.GenerateEq()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx()); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } break; // dignity restoration case 14: if ((EffectValue == 100 || EffectValue == 200) && session.Character.Dignity < 100 && !session.Character.IsVehicled) { session.Character.Dignity += EffectValue; if (session.Character.Dignity > 100) { session.Character.Dignity = 100; } session.SendPacket(session.Character.GenerateFd()); session.SendPacket(session.Character.GenerateEff(49 - session.Character.Faction)); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn(), ReceiverType.AllExceptMe); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx(), ReceiverType.AllExceptMe); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } else if (EffectValue == 2000 && session.Character.Dignity < 100 && !session.Character.IsVehicled) { session.Character.Dignity = 100; session.SendPacket(session.Character.GenerateFd()); session.SendPacket(session.Character.GenerateEff(49 - session.Character.Faction)); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn(), ReceiverType.AllExceptMe); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx(), ReceiverType.AllExceptMe); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } break; // speakers case 15: if (!session.Character.IsVehicled) { if (!delay) { session.SendPacket(session.Character.GenerateGuri(10, 3, 1)); } } break; // bubbles case 16: if (!session.Character.IsVehicled) { if (!delay) { session.SendPacket(session.Character.GenerateGuri(10, 4, 1)); } } break; // wigs case 30: if (!session.Character.IsVehicled) { WearableInstance wig = session.Character.Inventory.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Hat, InventoryType.Wear); if (wig != null) { wig.Design = (byte)ServerManager.RandomNumber(0, 15); session.SendPacket(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateIn()); session.CurrentMapInstance?.Broadcast(session, session.Character.GenerateGidx()); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } else { session.SendPacket(session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("NO_WIG"), 0)); } } break; default: Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType())); break; } }
public override void Use(ClientSession session, ref ItemInstance inv, byte option = 0, string[] packetsplit = null) { switch (Effect) { case 0: if (option == 0) { if (packetsplit != null && packetsplit.Length == 9) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.Item.ItemSubType == 3) { session.SendPacket($"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_OPEN_BOX")}"); } else if (box.HoldingVNum == 0) { session.SendPacket($"qna #guri^300^8023^{inv.Slot}^{packetsplit[3]} {Language.Instance.GetMessageFromKey("ASK_STORE_PET")}"); } else { session.SendPacket($"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_RELEASE_PET")}"); } } } } else { //u_i 2 2000000 0 21 0 0 BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.Item.ItemSubType == 3) { List <RollGeneratedItemDTO> roll = box.Item.RollGeneratedItems.Where(s => s.MinimumOriginalItemRare <= box.Rare && s.MaximumOriginalItemRare >= box.Rare && s.OriginalItemDesign == box.Design).ToList(); int probabilities = roll.Sum(s => s.Probability); int rnd = ServerManager.Instance.RandomNumber(0, probabilities); int currentrnd = 0; List <ItemInstance> newInv = null; foreach (RollGeneratedItemDTO rollitem in roll) { if (newInv != null) { continue; } currentrnd += rollitem.Probability; if (currentrnd < rnd) { continue; } newInv = session.Character.Inventory.AddNewToInventory(rollitem.ItemGeneratedVNum, rollitem.ItemGeneratedAmount, Rare: box.Rare, Upgrade: rollitem.ItemGeneratedUpgrade); if (!newInv.Any()) { continue; } short slot = inv.Slot; if (slot == -1) { continue; } session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {newInv.First().Item.Name} x {rollitem.ItemGeneratedAmount})", 12)); session.SendPacket($"rdi {rollitem.ItemGeneratedVNum} {rollitem.ItemGeneratedAmount}"); newInv.ForEach(s => session.SendPacket(s.GenerateInventoryAdd())); session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else if (box.HoldingVNum == 0) { if (packetsplit != null && packetsplit.Length == 1) { if (int.TryParse(packetsplit[0], out int petId)) { Mate mate = session.Character.Mates.FirstOrDefault(s => s.MateTransportId == petId); if (mate != null) { box.HoldingVNum = mate.NpcMonsterVNum; box.SpLevel = mate.Level; box.SpDamage = mate.Attack; box.SpDefence = mate.Defence; session.Character.Mates.Remove(mate); session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("PET_STORED"))); session.SendPacket(UserInterfaceHelper.Instance.GeneratePClear()); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); session.CurrentMapInstance?.Broadcast(mate.GenerateOut()); } } } } else { NpcMonster heldMonster = ServerManager.Instance.GetNpc(box.HoldingVNum); if (heldMonster != null) { Mate mate = new Mate(session.Character, heldMonster, 1, MateType.Pet) { Attack = box.SpDamage, Defence = box.SpDefence }; if (session.Character.AddPet(mate)) { session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("PET_LEAVE_BEAD"))); } } } } } break; case 1: if (option == 0) { session.SendPacket($"qna #guri^300^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_RELEASE_PET")}"); } else { NpcMonster heldMonster = ServerManager.Instance.GetNpc((short)EffectValue); if (session.CurrentMapInstance == session.Character.Miniland && heldMonster != null) { Mate mate = new Mate(session.Character, heldMonster, LevelMinimum, ItemSubType == 1 ? MateType.Partner : MateType.Pet); if (session.Character.AddPet(mate)) { session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("PET_LEAVE_BEAD"))); } } else { //TODO ADD MINILAND SENDPACKET } } break; case 69: if (EffectValue == 1 || EffectValue == 2) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"wopen 44 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Any()) { ItemInstance itemInstance = newInv.First(); SpecialistInstance specialist = session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>(itemInstance.Slot, itemInstance.Type); if (specialist != null) { specialist.SlDamage = box.SlDamage; specialist.SlDefence = box.SlDefence; specialist.SlElement = box.SlElement; specialist.SlHP = box.SlHP; specialist.SpDamage = box.SpDamage; specialist.SpDark = box.SpDark; specialist.SpDefence = box.SpDefence; specialist.SpElement = box.SpElement; specialist.SpFire = box.SpFire; specialist.SpHP = box.SpHP; specialist.SpLevel = box.SpLevel; specialist.SpLight = box.SpLight; specialist.SpStoneUpgrade = box.SpStoneUpgrade; specialist.SpWater = box.SpWater; specialist.Upgrade = box.Upgrade; specialist.XP = box.XP; } short slot = inv.Slot; if (slot != -1) { if (specialist != null) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {specialist.Item.Name} + {specialist.Upgrade}", 12)); newInv.ForEach(s => session.SendPacket(specialist.GenerateInventoryAdd())); } session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 3) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 26 0 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Any()) { ItemInstance itemInstance = newInv.First(); WearableInstance fairy = session.Character.Inventory.LoadBySlotAndType <WearableInstance>(itemInstance.Slot, itemInstance.Type); if (fairy != null) { fairy.ElementRate = box.ElementRate; } short slot = inv.Slot; if (slot != -1) { if (fairy != null) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {fairy.Item.Name} ({fairy.ElementRate}%)", 12)); newInv.ForEach(s => session.SendPacket(fairy.GenerateInventoryAdd())); } session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 4) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 24 0 {inv.Slot}"); } else { List <ItemInstance> newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv.Any()) { short slot = inv.Slot; if (slot != -1) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {newInv.First().Item.Name} x 1)", 12)); newInv.ForEach(s => session.SendPacket(s.GenerateInventoryAdd())); session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } break; default: Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType())); break; } }
public override void Use(ClientSession Session, ref Inventory Inv, bool DelayUsed = false) { Random random = new Random(); switch (Effect) { // dyes case 10: if (this != null && !Session.Character.IsVehicled) { if (EffectValue == 99) { Session.Character.HairColor = (byte)random.Next(0, 127); } else { Session.Character.HairColor = (byte)EffectValue; } Session.SendPacket(Session.Character.GenerateEq()); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.All); Inv.ItemInstance.Amount--; if (Inv.ItemInstance.Amount > 0) { Session.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemInstance.ItemVNum, Inv.ItemInstance.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.InventoryList.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } break; // waxes case 11: if (this != null && !Session.Character.IsVehicled) { if (Session.Character.Class == (byte)ClassType.Adventurer && EffectValue > 1) { Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("ADVENTURERS_CANT_USE"), 10)); } else { Session.Character.HairStyle = Session.Character.HairStyle != (byte)EffectValue ? (byte)EffectValue : (byte)1; Session.SendPacket(Session.Character.GenerateEq()); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.All); Inv.ItemInstance.Amount--; if (Inv.ItemInstance.Amount > 0) { Session.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemInstance.ItemVNum, Inv.ItemInstance.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.InventoryList.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } } break; case 14: switch (this.VNum) { // It's not good we need to parse it. Asap case 2156: if (Session.Character.Dignity < 100 && !Session.Character.IsVehicled) { Session.Character.Dignity += 100; if (Session.Character.Dignity > 100) { Session.Character.Dignity = 100; } Session.SendPacket(Session.Character.GenerateFd()); Session.SendPacket(Session.Character.GenerateEff(48)); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.AllExceptMe); Inv.ItemInstance.Amount--; if (Inv.ItemInstance.Amount > 0) { Session.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemInstance.ItemVNum, Inv.ItemInstance.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.InventoryList.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } break; } break; // speakers case 15: if (this != null && !Session.Character.IsVehicled) { if (!DelayUsed) { Session.SendPacket(Session.Character.GenerateGuri(10, 3, 1)); } } break; // bubbles case 16: if (this != null && !Session.Character.IsVehicled) { if (!DelayUsed) { Session.SendPacket(Session.Character.GenerateGuri(10, 4, 1)); } } break; // wigs case 30: if (this != null && !Session.Character.IsVehicled) { WearableInstance wig = Session.Character.EquipmentList.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Hat, InventoryType.Equipment); if (wig != null) { wig.Design = (byte)random.Next(0, 15); Session.SendPacket(Session.Character.GenerateEq()); Session.SendPacket(Session.Character.GenerateEquipment()); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.All); Inv.ItemInstance.Amount--; if (Inv.ItemInstance.Amount > 0) { Session.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemInstance.ItemVNum, Inv.ItemInstance.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.InventoryList.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } else { Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("NO_WIG"), 0)); return; } } break; // presentation messages case 203: if (this != null && !Session.Character.IsVehicled) { if (!DelayUsed) { Session.SendPacket(Session.Character.GenerateGuri(10, 2, 2)); } } break; default: Logger.Debug("NO_HANDLER_ITEM"); break; } }
public void LoadCharacters(string packet) { string[] loginPacketParts = packet.Split(' '); // Load account by given SessionId if (Session.Account == null) { bool hasRegisteredAccountLogin = true; try { hasRegisteredAccountLogin = ServiceFactory.Instance.CommunicationService.HasRegisteredAccountLogin(loginPacketParts[4], Session.SessionId); } catch (Exception ex) { Logger.Log.Error("WCF Communication Failed.", ex); } if (loginPacketParts.Length > 4 && hasRegisteredAccountLogin) { AccountDTO accountDTO = DAOFactory.AccountDAO.LoadByName(loginPacketParts[4]); if (accountDTO != null) { if (accountDTO.Password.ToLower().Equals(EncryptionBase.Sha512(loginPacketParts[6]))) { var account = new Account() { AccountId = accountDTO.AccountId, Name = accountDTO.Name, Password = accountDTO.Password.ToLower(), Authority = accountDTO.Authority, LastCompliment = accountDTO.LastCompliment, }; account.Initialize(); foreach (PenaltyLogDTO penalty in DAOFactory.PenaltyLogDAO.LoadByAccount(accountDTO.AccountId)) { account.PenaltyLogs.Add(new PenaltyLogDTO() { AccountId = penalty.AccountId, DateEnd = penalty.DateEnd, DateStart = penalty.DateStart, Reason = penalty.Reason, Penalty = penalty.Penalty, PenaltyLogId = penalty.PenaltyLogId }); } foreach (GeneralLogDTO general in DAOFactory.GeneralLogDAO.LoadByAccount(accountDTO.AccountId)) { account.GeneralLogs.Add(new GeneralLogDTO() { AccountId = general.AccountId, LogData = general.LogData, IpAddress = general.IpAddress, LogType = general.LogType, LogId = general.LogId, Timestamp = general.Timestamp, CharacterId = general.CharacterId }); } Session.InitializeAccount(account); } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid Password or SessionId."); Session.Disconnect(); } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid AccountName."); Session.Disconnect(); } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, login has not been registered or Account is already logged in."); Session.Disconnect(); return; } } // TODO: Wrap Database access up to GO IList<CharacterDTO> characters = DAOFactory.CharacterDAO.LoadByAccount(Session.Account.AccountId); Logger.Log.InfoFormat(Language.Instance.GetMessageFromKey("ACCOUNT_ARRIVED"), Session.SessionId); // load characterlist packet for each character in CharacterDTO Session.SendPacket("clist_start 0"); foreach (CharacterDTO character in characters) { IEnumerable<ItemInstanceDTO> inventory = DAOFactory.ItemInstanceDAO.LoadByType(character.CharacterId, InventoryType.Wear); WearableInstance[] equipment = new WearableInstance[16]; foreach (ItemInstanceDTO equipmentEntry in inventory) { // explicit load of iteminstance WearableInstance currentInstance = equipmentEntry as WearableInstance; equipment[(short)currentInstance.Item.EquipmentSlot] = currentInstance; } // 1 1 before long string of -1.-1 = act completion Session.SendPacket($"clist {character.Slot} {character.Name} 0 {(byte)character.Gender} {(byte)character.HairStyle} {(byte)character.HairColor} 0 {(byte)character.Class} {character.Level} {character.HeroLevel} {(equipment[(byte)EquipmentType.Hat] != null ? equipment[(byte)EquipmentType.Hat].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.Armor] != null ? equipment[(byte)EquipmentType.Armor].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.WeaponSkin] != null ? equipment[(byte)EquipmentType.WeaponSkin].ItemVNum : equipment[(byte)EquipmentType.MainWeapon] != null ? equipment[(byte)EquipmentType.MainWeapon].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.SecondaryWeapon] != null ? equipment[(byte)EquipmentType.SecondaryWeapon].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.Mask] != null ? equipment[(byte)EquipmentType.Mask].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.Fairy] != null ? equipment[(byte)EquipmentType.Fairy].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.CostumeSuit] != null ? equipment[(byte)EquipmentType.CostumeSuit].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.CostumeHat] != null ? equipment[(byte)EquipmentType.CostumeHat].ItemVNum : -1)} {character.JobLevel} 1 1 -1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1 {(equipment[(byte)EquipmentType.Hat] != null && equipment[(byte)EquipmentType.Hat].Item.IsColored ? equipment[(byte)EquipmentType.Hat].Design : 0)} 0"); } Session.SendPacket("clist_end"); }
public override void Use(ClientSession session, ref ItemInstance inv, bool delay = false, string[] packetsplit = null) { switch (Effect) { case 69: if (EffectValue == 1 || EffectValue == 2) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"wopen 44 {inv.Slot}"); } else { ItemInstance newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv != null) { SpecialistInstance specialist = session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>(newInv.Slot, newInv.Type); if (specialist != null) { specialist.SlDamage = box.SlDamage; specialist.SlDefence = box.SlDefence; specialist.SlElement = box.SlElement; specialist.SlHP = box.SlHP; specialist.SpDamage = box.SpDamage; specialist.SpDark = box.SpDark; specialist.SpDefence = box.SpDefence; specialist.SpElement = box.SpElement; specialist.SpFire = box.SpFire; specialist.SpHP = box.SpHP; specialist.SpLevel = box.SpLevel; specialist.SpLight = box.SpLight; specialist.SpStoneUpgrade = box.SpStoneUpgrade; specialist.SpWater = box.SpWater; specialist.Upgrade = box.Upgrade; specialist.XP = box.XP; } short Slot = inv.Slot; if (Slot != -1) { if (specialist != null) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {specialist.Item.Name} + {specialist.Upgrade}", 12)); session.SendPacket(session.Character.GenerateInventoryAdd(specialist.ItemVNum, newInv.Amount, specialist.Type, newInv.Slot, 0, 0, specialist.Upgrade, 0)); } session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else { session.SendPacket(session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 3) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 26 0 {inv.Slot}"); } else { ItemInstance newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv != null) { WearableInstance fairy = session.Character.Inventory.LoadBySlotAndType <WearableInstance>(newInv.Slot, newInv.Type); if (fairy != null) { fairy.ElementRate = box.ElementRate; } short Slot = inv.Slot; if (Slot != -1) { if (fairy != null) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {fairy.Item.Name} ({fairy.ElementRate}%)", 12)); session.SendPacket(session.Character.GenerateInventoryAdd(fairy.ItemVNum, newInv.Amount, fairy.Type, newInv.Slot, 0, 0, fairy.Upgrade, 0)); } session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else { session.SendPacket(session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 4) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 24 0 {inv.Slot}"); } else { ItemInstance newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv != null) { short Slot = inv.Slot; if (Slot != -1) { session.SendPacket(session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {newInv.Item.Name} x 1)", 12)); session.SendPacket(session.Character.GenerateInventoryAdd(newInv.ItemVNum, newInv.Amount, newInv.Type, newInv.Slot, 0, 0, newInv.Upgrade, 0)); session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else { session.SendPacket(session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } break; default: Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType())); break; } }
public void LoadCharacters(string packet) { string[] loginPacketParts = packet.Split(' '); // Load account by given SessionId bool isCrossServerLogin = false; if (Session.Account == null) { bool hasRegisteredAccountLogin = true; AccountDTO account = null; if (loginPacketParts.Length > 4) { if (loginPacketParts.Length > 7 && loginPacketParts[4] == "DAC" && loginPacketParts[8] == "CrossServerAuthenticate") { isCrossServerLogin = true; string name = loginPacketParts[5]; account = DAOFactory.AccountDAO.FirstOrDefault(s => s.Name == name); } else { string name = loginPacketParts[4]; account = DAOFactory.AccountDAO.FirstOrDefault(s => s.Name == name); } } try { if (account != null) { hasRegisteredAccountLogin = isCrossServerLogin ? CommunicationServiceClient.Instance.IsCrossServerLoginPermitted(account.AccountId, Session.SessionId) : CommunicationServiceClient.Instance.IsLoginPermitted(account.AccountId, Session.SessionId); } } catch (Exception ex) { Logger.Log.Error("MS Communication Failed.", ex); Session.Disconnect(); return; } if (loginPacketParts.Length > 4 && hasRegisteredAccountLogin) { if (account != null) { if (account.Password.ToLower().Equals(EncryptionBase.Sha512(loginPacketParts[6])) || isCrossServerLogin) { PenaltyLogDTO penalty = DAOFactory.PenaltyLogDAO.FirstOrDefault(s => s.AccountId == account.AccountId && s.DateEnd > DateTime.Now && s.Penalty == PenaltyType.Banned); if (penalty != null) { Session.SendPacket($"failc {(byte)LoginFailType.Banned}"); Logger.Log.Info($"[LOG] {account.Name} connected from {Session.IpAddress} while being banned"); Session.Disconnect(); return; } // TODO MAINTENANCE MODE if (ServerManager.Instance.Sessions.Count() >= ServerManager.Instance.AccountLimit) { if (account.Authority < AuthorityType.Moderator) { Session.Disconnect(); return; } } Account accountobject = new Account { AccountId = account.AccountId, Name = account.Name, Password = account.Password.ToLower(), Authority = account.Authority }; accountobject.Initialize(); Session.InitializeAccount(accountobject, isCrossServerLogin); } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid Password or SessionId."); Session.Disconnect(); return; } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid AccountName."); Session.Disconnect(); return; } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, login has not been registered or Account is already logged in."); Session.Disconnect(); return; } } // TODO: Wrap Database access up to GO if (Session.Account == null) { return; } if (isCrossServerLogin) { if (byte.TryParse(loginPacketParts[6], out byte slot)) { SelectCharacter(new SelectPacket { Slot = slot }); } } else { IEnumerable <CharacterDTO> characters = DAOFactory.CharacterDAO.Where(s => s.AccountId == Session.Account.AccountId && s.State == (byte)CharacterState.Active); Logger.Log.InfoFormat(Language.Instance.GetMessageFromKey("ACCOUNT_ARRIVED"), Session.Account.Name); // load characterlist packet for each character in CharacterDTO Session.SendPacket("clist_start 0"); foreach (CharacterDTO character in characters) { IEnumerable <ItemInstanceDTO> inventory = DAOFactory.IteminstanceDAO.Where(s => s.CharacterId == character.CharacterId && s.Type == (byte)InventoryType.Wear); WearableInstance[] equipment = new WearableInstance[16]; foreach (ItemInstanceDTO equipmentEntry in inventory) { // explicit load of iteminstance WearableInstance currentInstance = equipmentEntry as WearableInstance; equipment[(short)currentInstance.Item.EquipmentSlot] = currentInstance; } string petlist = string.Empty; List <MateDTO> mates = DAOFactory.MateDAO.Where(s => s.CharacterId == character.CharacterId).ToList(); for (int i = 0; i < 26; i++) { //0.2105.1102.319.0.632.0.333.0.318.0.317.0.9.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1 petlist += $"{(i != 0 ? "." : "")}{(mates.Count > i ? $"{mates.ElementAt(i).Skin}.{mates.ElementAt(i).NpcMonsterVNum}" : "-1")}"; } // 1 1 before long string of -1.-1 = act completion Session.SendPacket($"clist {character.Slot} {character.Name} 0 {(byte)character.Gender} {(byte)character.HairStyle} {(byte)character.HairColor} 0 {(byte)character.Class} {character.Level} {character.HeroLevel} {equipment[(byte)EquipmentType.Hat]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.Armor]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.WeaponSkin]?.ItemVNum ?? (equipment[(byte)EquipmentType.MainWeapon]?.ItemVNum ?? -1)}.{equipment[(byte)EquipmentType.SecondaryWeapon]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.Mask]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.Fairy]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.CostumeSuit]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.CostumeHat]?.ItemVNum ?? -1} {character.JobLevel} 1 1 {petlist} {(equipment[(byte)EquipmentType.Hat] != null && equipment[(byte)EquipmentType.Hat].Item.IsColored ? equipment[(byte)EquipmentType.Hat].Design : 0)} 0"); } Session.SendPacket("clist_end"); } }
public override void Use(ClientSession session, ref ItemInstance inv, byte Option = 0, string[] packetsplit = null) { if (Effect == 0) { if (EffectValue != 0) { if (session.Character.IsSitting) { session.Character.IsSitting = false; session.SendPacket(session.Character.GenerateRest()); } session.SendPacket(UserInterfaceHelper.Instance.GenerateGuri(12, 1, session.Character.CharacterId, EffectValue)); } else if (EffectValue == 0) { if (packetsplit == null || packetsplit.Length <= 9) { return; } if (!byte.TryParse(packetsplit[8], out byte TypeEquip) || !short.TryParse(packetsplit[9], out short SlotEquip)) { return; } if (session.Character.IsSitting) { session.Character.IsSitting = false; session.SendPacket(session.Character.GenerateRest()); } if (Option != 0) { bool isUsed = false; switch (inv.ItemVNum) { case 1219: WearableInstance equip = session.Character.Inventory.LoadBySlotAndType <WearableInstance>(SlotEquip, (InventoryType)TypeEquip); if (equip != null && equip.IsFixed) { equip.IsFixed = false; session.SendPacket(session.Character.GenerateEff(3003)); session.SendPacket(UserInterfaceHelper.Instance.GenerateGuri(17, 1, session.Character.CharacterId, SlotEquip)); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ITEM_UNFIXED"), 12)); isUsed = true; } break; case 1365: case 9039: SpecialistInstance specialist = session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>(SlotEquip, (InventoryType)TypeEquip); if (specialist != null && specialist.Rare == -2) { specialist.Rare = 0; session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SP_RESURRECTED"), 0)); session.SendPacket(UserInterfaceHelper.Instance.GenerateGuri(13, 1, session.Character.CharacterId, 1)); session.Character.SpPoint = 10000; if (session.Character.SpPoint > 10000) { session.Character.SpPoint = 10000; } session.SendPacket(session.Character.GenerateSpPoint()); session.SendPacket(specialist.GenerateInventoryAdd()); isUsed = true; } break; } if (!isUsed) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ITEM_IS_NOT_FIXED"), 11)); } else { session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } } else { session.SendPacket($"qna #u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^0^1^{TypeEquip}^{SlotEquip} {Language.Instance.GetMessageFromKey("QNA_ITEM")}"); } } } else { Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType())); } }
public void UpgradeSp(ClientSession Session, UpgradeProtection protect) { short[] upsuccess = { 100, 100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 30 }; short[] upfail = { 20, 25, 25, 30, 35, 40, 40, 40, 40, 40, 45, 43, 40, 37, 29 }; int[] goldprice = { 200000, 200000, 200000, 200000, 200000, 500000, 500000, 500000, 500000, 500000, 1000000, 1000000, 1000000, 1000000, 1000000 }; short[] feather = { 3, 5, 8, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70 }; short[] fullmoon = { 1, 3, 5, 7, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 }; short[] soul = { 2, 4, 6, 8, 10, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 }; short featherVnum = 2282; short fullmoonVnum = 1030; short greenSoulVnum = 2283; short redSoulVnum = 2284; short blueSoulVnum = 2285; short dragonSkinVnum = 2511; short dragonBloodVnum = 2512; short dragonHeartVnum = 2513; short blueScrollVnum = 1363; short redScrollVnum = 1364; if (this.IsFixed) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ITEM_IS_FIXED"), 10)); return; } if (Session.Character.Inventory.CountItem(fullmoonVnum) < fullmoon[this.Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(String.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.GetItem(fullmoonVnum).Name, fullmoon[this.Upgrade])), 10)); return; } if (Session.Character.Inventory.CountItem(featherVnum) < feather[this.Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(String.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.GetItem(featherVnum).Name, feather[this.Upgrade])), 10)); return; } if (Session.Character.Gold < goldprice[this.Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } if (this.Upgrade < 5) { if (this.SpLevel > 20) { if (this.Item.Morph <= 16) { if (Session.Character.Inventory.CountItem(greenSoulVnum) < soul[this.Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(String.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.GetItem(greenSoulVnum).Name, soul[this.Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (Session.Character.Inventory.CountItem(blueScrollVnum) < 1) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(String.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.GetItem(blueScrollVnum).Name, 1)), 10)); return; } Session.Character.Inventory.RemoveItemAmount(blueScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(greenSoulVnum, (soul[this.Upgrade])); } else { if (Session.Character.Inventory.CountItem(dragonSkinVnum) < soul[this.Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(String.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.GetItem(dragonSkinVnum).Name, soul[this.Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (Session.Character.Inventory.CountItem(blueScrollVnum) < 1) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(String.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.GetItem(blueScrollVnum).Name, 1)), 10)); return; } Session.Character.Inventory.RemoveItemAmount(blueScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(dragonSkinVnum, (soul[this.Upgrade])); } } else { Session.SendPacket(Session.Character.GenerateSay(String.Format(Language.Instance.GetMessageFromKey("LVL_REQUIRED"), 21), 11)); return; } } else if (this.Upgrade < 10) { if (this.SpLevel > 40) { if (this.Item.Morph <= 16) { if (Session.Character.Inventory.CountItem(redSoulVnum) < soul[this.Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(String.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.GetItem(redSoulVnum).Name, soul[this.Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (Session.Character.Inventory.CountItem(blueScrollVnum) < 1) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(String.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.GetItem(blueScrollVnum).Name, 1)), 10)); return; } Session.Character.Inventory.RemoveItemAmount(blueScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(redSoulVnum, (soul[this.Upgrade])); } else { if (Session.Character.Inventory.CountItem(dragonBloodVnum) < soul[this.Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(String.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.GetItem(dragonBloodVnum).Name, soul[this.Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (Session.Character.Inventory.CountItem(blueScrollVnum) < 1) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(String.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.GetItem(blueScrollVnum).Name, 1)), 10)); return; } Session.Character.Inventory.RemoveItemAmount(blueScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(dragonBloodVnum, (soul[this.Upgrade])); } } else { Session.SendPacket(Session.Character.GenerateSay(String.Format(Language.Instance.GetMessageFromKey("LVL_REQUIRED"), 41), 11)); return; } } else if (this.Upgrade < 15) { if (this.SpLevel > 50) { if (this.Item.Morph <= 16) { if (Session.Character.Inventory.CountItem(blueSoulVnum) < soul[this.Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(String.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.GetItem(blueSoulVnum).Name, soul[this.Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected && this.Upgrade > 9) { if (Session.Character.Inventory.CountItem(redScrollVnum) < 1) { return; } Session.Character.Inventory.RemoveItemAmount(redScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(blueSoulVnum, (soul[this.Upgrade])); } else { if (Session.Character.Inventory.CountItem(dragonHeartVnum) < soul[this.Upgrade]) { return; } if (protect == UpgradeProtection.Protected && this.Upgrade > 9) { if (Session.Character.Inventory.CountItem(redScrollVnum) < 1) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(String.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.GetItem(redScrollVnum).Name, 1)), 10)); return; } Session.Character.Inventory.RemoveItemAmount(redScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(dragonHeartVnum, (soul[this.Upgrade])); } } else { Session.SendPacket(Session.Character.GenerateSay(String.Format(Language.Instance.GetMessageFromKey("LVL_REQUIRED"), 51), 11)); return; } } Session.Character.Gold -= goldprice[this.Upgrade]; // remove feather and fullmoon before upgrading Session.Character.Inventory.RemoveItemAmount(featherVnum, (feather[this.Upgrade])); Session.Character.Inventory.RemoveItemAmount(fullmoonVnum, (fullmoon[this.Upgrade])); WearableInstance wearable = Session.Character.Inventory.LoadByItemInstance <WearableInstance>(this.Id); ItemInstance inventory = Session.Character.Inventory.GetItemInstanceById(this.Id); int rnd = _random.Next(100); if (rnd <= upfail[this.Upgrade]) { if (protect == UpgradeProtection.Protected) { Session.CurrentMap.Broadcast(Session.Character.GenerateEff(3004), Session.Character.MapX, Session.Character.MapY); } Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED"), 11)); Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED"), 0)); } else if (rnd <= upsuccess[this.Upgrade]) { if (protect == UpgradeProtection.Protected) { Session.CurrentMap.Broadcast(Session.Character.GenerateEff(3004), Session.Character.MapX, Session.Character.MapY); } Session.CurrentMap.Broadcast(Session.Character.GenerateEff(3005), Session.Character.MapX, Session.Character.MapY); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_SUCCESS"), 12)); Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_SUCCESS"), 0)); wearable.Upgrade++; Session.SendPacket(Session.Character.GenerateInventoryAdd(this.ItemVNum, 1, inventory.Type, inventory.Slot, wearable.Rare, wearable.Design, wearable.Upgrade, this.SpStoneUpgrade)); } else { if (protect == UpgradeProtection.Protected) { Session.CurrentMap.Broadcast(Session.Character.GenerateEff(3004), Session.Character.MapX, Session.Character.MapY); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED_SAVED"), 11)); Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED_SAVED"), 0)); } else { wearable.Rare = (sbyte)-2; Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_DESTROYED"), 11)); Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_DESTROYED"), 0)); Session.SendPacket(Session.Character.GenerateInventoryAdd(this.ItemVNum, 1, inventory.Type, inventory.Slot, wearable.Rare, wearable.Design, wearable.Upgrade, this.SpStoneUpgrade)); } } Session.SendPacket(Session.Character.GenerateGold()); Session.SendPacket(Session.Character.GenerateEq()); Session.SendPacket("shop_end 1"); }
public override void Use(ClientSession Session, ref Inventory Inv) { Item iteminfo = ServerManager.GetItem(Inv.ItemInstance.ItemVNum); Random rnd = new Random(); switch (Effect) { case 10: if (iteminfo != null) { if (EffectValue == 99) { Session.Character.HairColor = (byte)rnd.Next(0, 127); } else { Session.Character.HairColor = (byte)EffectValue; } Session.Client.SendPacket(Session.Character.GenerateEq()); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.All); Inv.ItemInstance.Amount--; if (Inv.ItemInstance.Amount > 0) { Session.Client.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemInstance.ItemVNum, Inv.ItemInstance.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.InventoryList.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.Client.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } break; case 11: if (iteminfo != null) { if (Session.Character.Class == (byte)ClassType.Adventurer && EffectValue > 1) { Session.Client.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("ADVENTURERS_CANT_USE"), 10)); } else { Session.Character.HairStyle = Session.Character.HairStyle != (byte)EffectValue ? (byte)EffectValue : (byte)1; Session.Client.SendPacket(Session.Character.GenerateEq()); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.All); Inv.ItemInstance.Amount--; if (Inv.ItemInstance.Amount > 0) { Session.Client.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemInstance.ItemVNum, Inv.ItemInstance.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.InventoryList.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.Client.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } } break; case 30: if (iteminfo != null) { WearableInstance wig = Session.Character.EquipmentList.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Hat, (byte)InventoryType.Equipment); if (wig != null) { wig.Design = (byte)rnd.Next(0, 15); Session.Client.SendPacket(Session.Character.GenerateEq()); Session.Client.SendPacket(Session.Character.GenerateEquipment()); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.All); Inv.ItemInstance.Amount--; if (Inv.ItemInstance.Amount > 0) { Session.Client.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemInstance.ItemVNum, Inv.ItemInstance.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.InventoryList.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.Client.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } else { Session.Client.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("NO_WIG"), 0)); return; } } break; default: Logger.Log.Warn(String.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), this.GetType().ToString())); break; } }
public override void Use(ClientSession Session, ref ItemInstance Inv, bool DelayUsed = false, string[] packetsplit = null) { if (EffectValue != 0) { if (Session.Character.IsSitting) { Session.Character.IsSitting = false; Session.SendPacket(Session.Character.GenerateRest()); } Session.SendPacket(Session.Character.GenerateGuri(12, 1, EffectValue)); } else if (EffectValue == 0) { if (packetsplit != null) { byte TypeEquip = 0; short SlotEquip = -1; if (byte.TryParse(packetsplit[8], out TypeEquip) && short.TryParse(packetsplit[9], out SlotEquip)) { if (Session.Character.IsSitting) { Session.Character.IsSitting = false; Session.SendPacket(Session.Character.GenerateRest()); } if (DelayUsed) { bool isUsed = false; switch (Inv.ItemVNum) { case 1219: WearableInstance equip = Session.Character.Inventory.LoadBySlotAndType <WearableInstance>(SlotEquip, (Domain.InventoryType)TypeEquip); if (equip != null && equip.IsFixed) { equip.IsFixed = false; Session.SendPacket(Session.Character.GenerateEff(3003)); Session.SendPacket(Session.Character.GenerateGuri(17, 1, SlotEquip)); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ITEM_UNFIXED"), 12)); isUsed = true; } break; case 1365: SpecialistInstance specialist = Session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>(SlotEquip, (Domain.InventoryType)TypeEquip); if (specialist != null && specialist.Rare == -2) { specialist.Rare = 0; Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("SP_RESURRECTED"), 0)); Session.CurrentMap?.Broadcast(Session.Character.GenerateGuri(13, 1, 1)); Session.Character.SpPoint = 10000; Session.SendPacket(Session.Character.GenerateSpPoint()); Session.SendPacket(Session.Character.GenerateInventoryAdd(specialist.ItemVNum, 1, (Domain.InventoryType)TypeEquip, SlotEquip, specialist.Rare, specialist.Design, specialist.Upgrade, 0)); isUsed = true; } break; } switch (Inv.ItemVNum) { case 9039: SpecialistInstance specialist = Session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>(SlotEquip, (Domain.InventoryType)TypeEquip); if (specialist != null && specialist.Rare == -2) { specialist.Rare = 0; Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("SP_RESURRECTED"), 0)); Session.CurrentMap?.Broadcast(Session.Character.GenerateGuri(13, 1, 1)); Session.Character.SpPoint = 10000; Session.SendPacket(Session.Character.GenerateSpPoint()); Session.SendPacket(Session.Character.GenerateInventoryAdd(specialist.ItemVNum, 1, (Domain.InventoryType)TypeEquip, SlotEquip, specialist.Rare, specialist.Design, specialist.Upgrade, 0)); isUsed = true; } break; } if (!isUsed) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ITEM_IS_NOT_FIXED"), 11)); } else { Inv.Amount--; if (Inv.Amount > 0) { Session.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemVNum, Inv.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.Inventory.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } } else { Session.SendPacket($"qna #u_i^1^{Session.Character.CharacterId}^{(byte)Inv.Type}^{Inv.Slot}^0^1^{TypeEquip}^{SlotEquip} {Language.Instance.GetMessageFromKey("QNA_ITEM")}"); } } } } else { Logger.Log.Warn(String.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), this.GetType().ToString())); } }
/// <summary> /// Generate the Monster -> Character Damage /// </summary> /// <param name="targetCharacter"></param> /// <param name="skill"></param> /// <param name="hitmode"></param> /// <returns></returns> internal int GenerateDamage(Character targetCharacter, Skill skill, ref int hitmode) { //Warning: This code contains a huge amount of copypasta! #region Definitions if (targetCharacter == null) { return(0); } short distanceX = (short)(MapX - targetCharacter.MapX); short distanceY = (short)(MapY - targetCharacter.MapY); Random random = new Random(); int generated = random.Next(0, 100); int playerDefense = 0; byte playerDefenseUpgrade = 0; int playerDodge = 0; WearableInstance playerArmor = targetCharacter.Inventory.LoadBySlotAndType <WearableInstance>((byte)Domain.EquipmentType.Armor, Domain.InventoryType.Wear); if (playerArmor != null) { playerDefenseUpgrade = playerArmor.Upgrade; } short mainUpgrade = Monster.AttackUpgrade; int mainCritChance = Monster.CriticalChance; int mainCritHit = Monster.CriticalRate; int mainMinDmg = Monster.DamageMinimum; int mainMaxDmg = Monster.DamageMaximum; int mainHitRate = Monster.Concentrate; //probably missnamed, check later if (mainMaxDmg == 0) { mainMinDmg = Monster.Level * 8; mainMaxDmg = Monster.Level * 12; mainCritChance = 10; mainCritHit = 120; mainHitRate = (Monster.Level / 2) + 1; } #endregion #region Get Player defense switch (Monster.AttackClass) { case 0: playerDefense = targetCharacter.Defence; playerDodge = targetCharacter.DefenceRate; break; case 1: playerDefense = targetCharacter.DistanceDefence; playerDodge = targetCharacter.DistanceDefenceRate; break; case 2: playerDefense = targetCharacter.MagicalDefence; break; default: throw new Exception(String.Format("Monster.AttackClass {0} not implemented", Monster.AttackClass)); } #endregion #region Basic Damage Data Calculation #warning TODO: Implement BCard damage boosts, see Issue mainUpgrade -= playerDefenseUpgrade; if (mainUpgrade < -10) { mainUpgrade = -10; } else if (mainUpgrade > 10) { mainUpgrade = 10; } #endregion #region Detailed Calculation #region Dodge double multiplier = playerDodge / mainHitRate; if (multiplier > 5) { multiplier = 5; } double chance = -0.25 * Math.Pow(multiplier, 3) - 0.57 * Math.Pow(multiplier, 2) + 25.3 * multiplier - 1.41; if (chance <= 1) { chance = 1; } if (Monster.AttackClass == 0 || Monster.AttackClass == 1) { if (random.Next(0, 100) <= chance) { hitmode = 1; return(0); } } #endregion #region Base Damage int baseDamage = new Random().Next(mainMinDmg, mainMaxDmg + 1); int elementalDamage = 0; // placeholder for BCard etc... if (skill != null) { baseDamage += (skill.Damage / 4); elementalDamage += (skill.ElementalDamage / 4); } switch (mainUpgrade) { case -10: playerDefense += (int)(playerDefense * 2); break; case -9: playerDefense += (int)(playerDefense * 1.2); break; case -8: playerDefense += (int)(playerDefense * 0.9); break; case -7: playerDefense += (int)(playerDefense * 0.65); break; case -6: playerDefense += (int)(playerDefense * 0.54); break; case -5: playerDefense += (int)(playerDefense * 0.43); break; case -4: playerDefense += (int)(playerDefense * 0.32); break; case -3: playerDefense += (int)(playerDefense * 0.22); break; case -2: playerDefense += (int)(playerDefense * 0.15); break; case -1: playerDefense += (int)(playerDefense * 0.1); break; case 0: break; case 1: baseDamage += (int)(baseDamage * 0.1); break; case 2: baseDamage += (int)(baseDamage * 0.15); break; case 3: baseDamage += (int)(baseDamage * 0.22); break; case 4: baseDamage += (int)(baseDamage * 0.32); break; case 5: baseDamage += (int)(baseDamage * 0.43); break; case 6: baseDamage += (int)(baseDamage * 0.54); break; case 7: baseDamage += (int)(baseDamage * 0.65); break; case 8: baseDamage += (int)(baseDamage * 0.9); break; case 9: baseDamage += (int)(baseDamage * 1.2); break; case 10: baseDamage += (int)(baseDamage * 2); break; } #endregion #region Elementary Damage #region Calculate Elemental Boost + Rate double elementalBoost = 0; int playerRessistance = 0; switch (Monster.Element) { case 0: break; case 1: playerRessistance = targetCharacter.FireResistance; switch (targetCharacter.Element) { case 0: elementalBoost = 1.3; // Damage vs no element break; case 1: elementalBoost = 1; // Damage vs fire break; case 2: elementalBoost = 2; // Damage vs water break; case 3: elementalBoost = 1; // Damage vs light break; case 4: elementalBoost = 1.5; // Damage vs darkness break; } break; case 2: playerRessistance = targetCharacter.WaterResistance; switch (targetCharacter.Element) { case 0: elementalBoost = 1.3; break; case 1: elementalBoost = 2; break; case 2: elementalBoost = 1; break; case 3: elementalBoost = 1.5; break; case 4: elementalBoost = 1; break; } break; case 3: playerRessistance = targetCharacter.LightResistance; switch (targetCharacter.Element) { case 0: elementalBoost = 1.3; break; case 1: elementalBoost = 1.5; break; case 2: elementalBoost = 1; break; case 3: elementalBoost = 1; break; case 4: elementalBoost = 3; break; } break; case 4: playerRessistance = targetCharacter.DarkResistance; switch (targetCharacter.Element) { case 0: elementalBoost = 1.3; break; case 1: elementalBoost = 1; break; case 2: elementalBoost = 1.5; break; case 3: elementalBoost = 3; break; case 4: elementalBoost = 1; break; } break; } #endregion ; if (Monster.Element == 0) { if (elementalBoost == 0.5) { elementalBoost = 0; } else if (elementalBoost == 1) { elementalBoost = 0.05; } else if (elementalBoost == 1.3) { elementalBoost = 0; } else if (elementalBoost == 1.5) { elementalBoost = 0.15; } else if (elementalBoost == 2) { elementalBoost = 0.2; } else if (elementalBoost == 3) { elementalBoost = 0.2; } } elementalDamage = (int)((elementalDamage + ((elementalDamage + baseDamage) * ((Monster.ElementRate) / 100D))) * elementalBoost); elementalDamage = elementalDamage / 100 * (100 - playerRessistance); #endregion #region Critical Damage if (random.Next(100) <= mainCritChance) { if (Monster.AttackClass == 2) { } else { baseDamage += (int)(baseDamage * ((mainCritHit / 100D))); hitmode = 3; } } #endregion #region Total Damage int totalDamage = baseDamage + elementalDamage - playerDefense; if (totalDamage < 5) { totalDamage = random.Next(1, 6); } #endregion #endregion #region Minimum damage if (Monster.Level < 45) { //no minimum damage } else if (Monster.Level < 55) { totalDamage += Monster.Level; } else if (Monster.Level < 60) { totalDamage += Monster.Level * 2; } else if (Monster.Level < 65) { totalDamage += Monster.Level * 3; } else if (Monster.Level < 70) { totalDamage += Monster.Level * 4; } else { totalDamage += Monster.Level * 5; } #endregion return(totalDamage); }
public override void Use(ClientSession session, ref ItemInstance inv, bool delay = false, string[] packetsplit = null) { S_RaidBoxItem rand_item; switch (Effect) { case 0: if (VNum == 302) { BoxInstance raidBox = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); ItemInstance newInv; byte numberOfItem = 1; switch (raidBox.Design) { case 1: //XYXY rand_item = generateRandomRaidBoxItem(xyxy_loots); numberOfItem = rand_item.amount; newInv = session.Character.Inventory.AddNewToInventory(rand_item.itemvnum, rand_item.amount); break; case 2: //CASTRA rand_item = generateRandomRaidBoxItem(castra_loots); numberOfItem = rand_item.amount; newInv = session.Character.Inventory.AddNewToInventory(rand_item.itemvnum, rand_item.amount); break; case 3: //JACK rand_item = generateRandomRaidBoxItem(jack_loots); numberOfItem = rand_item.amount; newInv = session.Character.Inventory.AddNewToInventory(rand_item.itemvnum, rand_item.amount); break; case 4: //SLADE rand_item = generateRandomRaidBoxItem(slade_loots); numberOfItem = rand_item.amount; newInv = session.Character.Inventory.AddNewToInventory(rand_item.itemvnum, rand_item.amount); break; case 9: //IBRAHIM rand_item = generateRandomRaidBoxItem(ibra_loots); numberOfItem = rand_item.amount; newInv = session.Character.Inventory.AddNewToInventory(rand_item.itemvnum, rand_item.amount); break; case 13: //KERTOS rand_item = generateRandomRaidBoxItem(kertos_loots); numberOfItem = rand_item.amount; newInv = session.Character.Inventory.AddNewToInventory(rand_item.itemvnum, rand_item.amount); break; case 14: //VALAKUS rand_item = generateRandomRaidBoxItem(valakus_loots); numberOfItem = rand_item.amount; newInv = session.Character.Inventory.AddNewToInventory(rand_item.itemvnum, rand_item.amount); break; case 15: //GRENIGAS rand_item = generateRandomRaidBoxItem(grenigas_loots); numberOfItem = rand_item.amount; newInv = session.Character.Inventory.AddNewToInventory(rand_item.itemvnum, rand_item.amount); break; case 16: //DRACO rand_item = generateRandomRaidBoxItem(draco_loots); numberOfItem = rand_item.amount; newInv = session.Character.Inventory.AddNewToInventory(rand_item.itemvnum, rand_item.amount); break; case 17: //GLAGLA rand_item = generateRandomRaidBoxItem(glagla_loots); numberOfItem = rand_item.amount; newInv = session.Character.Inventory.AddNewToInventory(rand_item.itemvnum, rand_item.amount); break; default: //CUBY rand_item = generateRandomRaidBoxItem(cuby_loots); numberOfItem = rand_item.amount; newInv = session.Character.Inventory.AddNewToInventory(rand_item.itemvnum, rand_item.amount); break; } if (newInv != null) { dynamic raidBoxItem; if (newInv.Type == InventoryType.Equipment) { if (newInv.Item.EquipmentSlot == EquipmentType.Armor || newInv.Item.EquipmentSlot == EquipmentType.MainWeapon || newInv.Item.EquipmentSlot == EquipmentType.SecondaryWeapon) { newInv.Rare = raidBox.Rare; if (newInv.ItemVNum == 4905 || newInv.ItemVNum == 4902 || newInv.ItemVNum == 4908 || newInv.ItemVNum == 4917 || newInv.ItemVNum == 4914 || newInv.ItemVNum == 4934 || newInv.ItemVNum == 4926 || newInv.ItemVNum == 4920 || newInv.ItemVNum == 4923) { newInv.Upgrade = 10; } } if (newInv.Item.EquipmentSlot == EquipmentType.Sp) { raidBoxItem = session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>(newInv.Slot, newInv.Type); } else { raidBoxItem = session.Character.Inventory.LoadBySlotAndType <WearableInstance>(newInv.Slot, newInv.Type); } if (raidBoxItem != null && (raidBoxItem.Item.EquipmentSlot == EquipmentType.Armor || raidBoxItem.Item.EquipmentSlot == EquipmentType.MainWeapon || raidBoxItem.Item.EquipmentSlot == EquipmentType.SecondaryWeapon)) { raidBoxItem.SetRarityPoint(); } } else { raidBoxItem = session.Character.Inventory.LoadBySlotAndType <ItemInstance>(newInv.Slot, newInv.Type); } short slot = inv.Slot; if (slot != -1) { session.SendPacket($"rdi {raidBoxItem.Item.VNum} {numberOfItem}"); session.SendPacket( session.Character.GenerateSay( $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {raidBoxItem.Item.Name} x {rand_item.amount}", 12)); session.SendPacket(session.Character.GenerateInventoryAdd(raidBoxItem.ItemVNum, newInv.Amount, raidBoxItem.Type, newInv.Slot, raidBoxItem.Rare, 0, newInv.Upgrade, 0)); session.Character.Inventory.RemoveItemAmountFromInventory(1, raidBox.Id); } } } break; case 69: if (EffectValue == 1 || EffectValue == 2) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"wopen 44 {inv.Slot}"); } else { ItemInstance newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv != null) { SpecialistInstance specialist = session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>(newInv.Slot, newInv.Type); if (specialist != null) { specialist.SlDamage = box.SlDamage; specialist.SlDefence = box.SlDefence; specialist.SlElement = box.SlElement; specialist.SlHP = box.SlHP; specialist.SpDamage = box.SpDamage; specialist.SpDark = box.SpDark; specialist.SpDefence = box.SpDefence; specialist.SpElement = box.SpElement; specialist.SpFire = box.SpFire; specialist.SpHP = box.SpHP; specialist.SpLevel = box.SpLevel; specialist.SpLight = box.SpLight; specialist.SpStoneUpgrade = box.SpStoneUpgrade; specialist.SpWater = box.SpWater; specialist.Upgrade = box.Upgrade; specialist.XP = box.XP; } short Slot = inv.Slot; if (Slot != -1) { session.SendPacket( session.Character.GenerateSay( $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {specialist.Item.Name} + {specialist.Upgrade}", 12)); session.SendPacket(session.Character.GenerateInventoryAdd(specialist.ItemVNum, newInv.Amount, specialist.Type, newInv.Slot, 0, 0, specialist.Upgrade, 0)); session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else { session.SendPacket( session.Character.GenerateMsg( Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 3) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 26 0 {inv.Slot}"); } else { ItemInstance newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv != null) { WearableInstance fairy = session.Character.Inventory.LoadBySlotAndType <WearableInstance>(newInv.Slot, newInv.Type); if (fairy != null) { fairy.ElementRate = box.ElementRate; } short Slot = inv.Slot; if (Slot != -1) { session.SendPacket( session.Character.GenerateSay( $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {fairy.Item.Name} ({fairy.ElementRate}%)", 12)); session.SendPacket(session.Character.GenerateInventoryAdd(fairy.ItemVNum, newInv.Amount, fairy.Type, newInv.Slot, 0, 0, fairy.Upgrade, 0)); session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else { session.SendPacket( session.Character.GenerateMsg( Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } if (EffectValue == 4) { BoxInstance box = session.Character.Inventory.LoadBySlotAndType <BoxInstance>(inv.Slot, InventoryType.Equipment); if (box != null) { if (box.HoldingVNum == 0) { session.SendPacket($"guri 24 0 {inv.Slot}"); } else { ItemInstance newInv = session.Character.Inventory.AddNewToInventory(box.HoldingVNum); if (newInv != null) { short Slot = inv.Slot; if (Slot != -1) { session.SendPacket( session.Character.GenerateSay( $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {newInv.Item.Name} x 1)", 12)); session.SendPacket(session.Character.GenerateInventoryAdd(newInv.ItemVNum, newInv.Amount, newInv.Type, newInv.Slot, 0, 0, newInv.Upgrade, 0)); session.Character.Inventory.RemoveItemAmountFromInventory(1, box.Id); } } else { session.SendPacket( session.Character.GenerateMsg( Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0)); } } } } break; default: Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType())); break; } }
public void UpgradeItem(ClientSession Session, UpgradeMode mode, UpgradeProtection protection, bool isCommand = false) { if (this.Upgrade < 10) { short[] upsuccess = { 100, 100, 100, 95, 80, 60, 40, 30, 20, 11 }; short[] upfix = { 0, 0, 10, 15, 20, 20, 20, 20, 15, 10 }; // short itempricevnum1 = 0; short itempricevnum2 = 0; int[] goldprice = { 500, 1500, 3000, 10000, 30000, 80000, 150000, 400000, 700000, 1000000 }; short[] cella = { 20, 50, 80, 120, 160, 220, 280, 380, 480, 600 }; short[] gem = { 1, 1, 2, 2, 3, 1, 1, 2, 2, 3 }; short cellaVnum = 1014; short gemVnum = 1015; short gemFullVnum = 1016; double reducedpricefactor = 0.5; short normalScrollVnum = 1218; short goldScrollVnum = 5369; if (this.IsFixed) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ITEM_IS_FIXED"), 10)); Session.SendPacket("shop_end 1"); return; } switch (mode) { case UpgradeMode.Free: break; case UpgradeMode.Reduced: // TODO: Reduced Item Amount if (Session.Character.Gold < (long)(goldprice[this.Upgrade] * reducedpricefactor)) { return; } if (Session.Character.Inventory.CountItem(cellaVnum) < cella[this.Upgrade] * reducedpricefactor) { return; } if (protection == UpgradeProtection.Protected && !isCommand && Session.Character.Inventory.CountItem(goldScrollVnum) < 1) { return; } if (this.Upgrade <= 5) { if (Session.Character.Inventory.CountItem(gemVnum) < gem[this.Upgrade]) { return; } Session.Character.Inventory.RemoveItemAmount(gemVnum, gem[this.Upgrade]); } else { if (Session.Character.Inventory.CountItem(gemFullVnum) < gem[this.Upgrade]) { return; } Session.Character.Inventory.RemoveItemAmount(gemFullVnum, gem[this.Upgrade]); } if (protection == UpgradeProtection.Protected && !isCommand) { Session.Character.Inventory.RemoveItemAmount(goldScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Gold -= (long)(goldprice[this.Upgrade] * reducedpricefactor); Session.Character.Inventory.RemoveItemAmount(cellaVnum, (int)(cella[this.Upgrade] * reducedpricefactor)); Session.SendPacket(Session.Character.GenerateGold()); break; case UpgradeMode.Normal: // TODO: Normal Item Amount if (Session.Character.Inventory.CountItem(cellaVnum) < cella[this.Upgrade]) { return; } if (Session.Character.Gold < goldprice[this.Upgrade]) { return; } if (protection == UpgradeProtection.Protected && !isCommand && Session.Character.Inventory.CountItem(normalScrollVnum) < 1) { return; } if (this.Upgrade < 5) { if (Session.Character.Inventory.CountItem(gemVnum) < gem[this.Upgrade]) { return; } Session.Character.Inventory.RemoveItemAmount(gemVnum, (gem[this.Upgrade])); } else { if (Session.Character.Inventory.CountItem(gemFullVnum) < gem[this.Upgrade]) { return; } Session.Character.Inventory.RemoveItemAmount(gemFullVnum, (gem[this.Upgrade])); } if (protection == UpgradeProtection.Protected && !isCommand) { Session.Character.Inventory.RemoveItemAmount(normalScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(cellaVnum, (cella[this.Upgrade])); Session.Character.Gold -= goldprice[this.Upgrade]; Session.SendPacket(Session.Character.GenerateGold()); break; } WearableInstance wearable = Session.Character.Inventory.LoadByItemInstance <WearableInstance>(this.Id); ItemInstance inventory = Session.Character.Inventory.GetItemInstanceById(this.Id); int rnd = _random.Next(100); if (rnd <= upfix[this.Upgrade]) { Session.CurrentMap.Broadcast(Session.Character.GenerateEff(3004), Session.Character.MapX, Session.Character.MapY); wearable.IsFixed = true; Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADE_FIXED"), 11)); Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_FIXED"), 0)); } else if (rnd <= upsuccess[this.Upgrade]) { Session.CurrentMap.Broadcast(Session.Character.GenerateEff(3005), Session.Character.MapX, Session.Character.MapY); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADE_SUCCESS"), 12)); Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_SUCCESS"), 0)); wearable.Upgrade++; Session.SendPacket(Session.Character.GenerateInventoryAdd(this.ItemVNum, 1, inventory.Type, inventory.Slot, wearable.Rare, 0, wearable.Upgrade, 0)); } else { if (protection == UpgradeProtection.None) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADE_FAILED"), 11)); Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_FAILED"), 0)); Session.Character.DeleteItemByItemInstanceId(this.Id); } else { Session.CurrentMap.Broadcast(Session.Character.GenerateEff(3004), Session.Character.MapX, Session.Character.MapY); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SCROLL_PROTECT_USED"), 11)); Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_FAILED_ITEM_SAVED"), 0)); } } } else { Session.CurrentMap.Broadcast(Session.Character.GenerateEff(3004), Session.Character.MapX, Session.Character.MapY); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SCROLL_PROTECT_USED"), 11)); Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_FAILED_ITEM_SAVED"), 0)); } Session.SendPacket("shop_end 1"); }
public override void Use(ClientSession session, ref ItemInstance inv, byte option = 0, string[] packetsplit = null) { switch (Effect) { default: bool delay = false; if (option == 255) { delay = true; option = 0; } Mate mate = null; if (option != 0) { mate = session.Character.Mates.FirstOrDefault(s => s.MateType == MateType.Partner && s.PetId == (option - 1)); } short slot = inv.Slot; InventoryType equipment = InventoryType.Wear; switch (option) { case 1: equipment = InventoryType.FirstPartnerInventory; break; case 2: equipment = InventoryType.SecondPartnerInventory; break; case 3: equipment = InventoryType.ThirdPartnerInventory; break; } InventoryType itemToWearType = inv.Type; if (inv == null) { return; } if (ItemValidTime > 0 && inv.IsBound) { inv.ItemDeleteTime = DateTime.Now.AddSeconds(ItemValidTime); } if (!inv.IsBound) { if (!delay && (EquipmentSlot == EquipmentType.Fairy && (MaxElementRate == 70 || MaxElementRate == 80) || EquipmentSlot == EquipmentType.CostumeHat || EquipmentSlot == EquipmentType.CostumeSuit || EquipmentSlot == EquipmentType.WeaponSkin)) { session.SendPacket($"qna #u_i^1^{session.Character.CharacterId}^{(byte)itemToWearType}^{slot}^1 {Language.Instance.GetMessageFromKey("ASK_BIND")}"); return; } if (delay) { inv.BoundCharacterId = session.Character.CharacterId; } } double timeSpanSinceLastSpUsage = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds - session.Character.LastSp; if (EquipmentSlot == EquipmentType.Sp && inv.Rare == -2) { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("CANT_EQUIP_DESTROYED_SP"), 0)); return; } if (option == 0) { if (EquipmentSlot == EquipmentType.Sp && timeSpanSinceLastSpUsage <= session.Character.SpCooldown && session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>((byte)EquipmentType.Sp, InventoryType.Specialist) != null) { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("SP_INLOADING"), session.Character.SpCooldown - (int)Math.Round(timeSpanSinceLastSpUsage)), 0)); return; } if (ItemType != ItemType.Weapon && ItemType != ItemType.Armor && ItemType != ItemType.Fashion && ItemType != ItemType.Jewelery && ItemType != ItemType.Specialist || LevelMinimum > (IsHeroic ? session.Character.HeroLevel : session.Character.Level) || Sex != 0 && Sex != (byte)session.Character.Gender + 1 || ItemType != ItemType.Jewelery && EquipmentSlot != EquipmentType.Boots && EquipmentSlot != EquipmentType.Gloves && ((Class >> (byte)session.Character.Class) & 1) != 1) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } if (session.Character.UseSp) { SpecialistInstance sp = session.Character.Inventory.LoadBySlotAndType <SpecialistInstance>((byte)EquipmentType.Sp, equipment); if (sp != null && sp.Item.Element != 0 && EquipmentSlot == EquipmentType.Fairy && Element != sp.Item.Element && Element != sp.Item.SecondaryElement) { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("BAD_FAIRY"), 0)); return; } } if (session.Character.UseSp && EquipmentSlot == EquipmentType.Sp) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SP_BLOCKED"), 10)); return; } if (session.Character.JobLevel < LevelJobMinimum) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("LOW_JOB_LVL"), 10)); return; } } else if (mate != null) { if (mate.Level < LevelMinimum) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } switch (EquipmentSlot) { case EquipmentType.Armor: if (ItemSubType == 4) { mate.ArmorInstance = inv; break; } else { goto default; } case EquipmentType.MainWeapon: if (ItemSubType == 12) { mate.WeaponInstance = inv; break; } else { goto default; } case EquipmentType.Gloves: mate.GlovesInstance = inv; break; case EquipmentType.Boots: mate.BootsInstance = inv; break; case EquipmentType.Sp: if (ItemSubType == 4) { mate.SpInstance = inv; break; } else { goto default; } default: session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } } ItemInstance currentlyEquippedItem = session.Character.Inventory.LoadBySlotAndType((short)EquipmentSlot, equipment); if (currentlyEquippedItem == null) { // move from equipment to wear session.Character.Inventory.MoveInInventory(inv.Slot, itemToWearType, equipment); session.SendPacket(UserInterfaceHelper.Instance.GenerateInventoryRemove(itemToWearType, slot)); } else { // move from wear to equipment and back session.Character.Inventory.MoveInInventory(currentlyEquippedItem.Slot, equipment, itemToWearType, inv.Slot); session.SendPacket(currentlyEquippedItem.GenerateInventoryAdd()); session.Character.EquipmentBCards = session.Character.EquipmentBCards.Where(o => o.ItemVNum != currentlyEquippedItem.ItemVNum); switch (currentlyEquippedItem.Slot) { case (byte)EquipmentType.Armor: session.Character.Inventory.Armor = null; break; case (byte)EquipmentType.MainWeapon: session.Character.Inventory.PrimaryWeapon = null; break; case (byte)EquipmentType.SecondaryWeapon: session.Character.Inventory.SecondaryWeapon = null; break; } } inv.Item.BCards.ForEach(s => session.Character.EquipmentBCards.Add(s)); if (inv is WearableInstance wearableInstance) { if (wearableInstance.EquipmentOptions != null) { switch (wearableInstance.Item.ItemType) { case ItemType.Armor: case ItemType.Weapon: switch (wearableInstance.Slot) { case (byte)EquipmentType.Armor: session.Character.Inventory.Armor = wearableInstance; break; case (byte)EquipmentType.MainWeapon: session.Character.Inventory.PrimaryWeapon = wearableInstance; break; case (byte)EquipmentType.SecondaryWeapon: session.Character.Inventory.SecondaryWeapon = wearableInstance; break; } EquipmentOptionHelper.Instance.ShellToBCards(wearableInstance.EquipmentOptions, wearableInstance.ItemVNum).ForEach(s => session.Character.EquipmentBCards.Add(s)); break; case ItemType.Jewelery: EquipmentOptionHelper.Instance.CellonToBCards(wearableInstance.EquipmentOptions, wearableInstance.ItemVNum).ForEach(s => session.Character.EquipmentBCards.Add(s)); break; } } } if (option == 0) { session.SendPacket(session.Character.GenerateStatChar()); session.CurrentMapInstance?.Broadcast(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.CurrentMapInstance?.Broadcast(session.Character.GeneratePairy()); switch (EquipmentSlot) { case EquipmentType.Fairy: WearableInstance fairy = session.Character.Inventory.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Fairy, equipment); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("FAIRYSTATS"), fairy.XP, CharacterHelper.LoadFairyXpData(fairy.ElementRate + fairy.Item.ElementRate)), 10)); break; case EquipmentType.Amulet: session.SendPacket(session.Character.GenerateEff(39)); inv.BoundCharacterId = session.Character.CharacterId; break; } } else if (mate != null) { session.SendPacket(mate.GenerateScPacket()); } break; } }
public override void Use(ClientSession Session, ref ItemInstance Inv, bool DelayUsed = false, string[] packetsplit = null) { Random random = new Random(); switch (Effect) { // airwaves - eventitems case 0: if (this != null && this.ItemType == Domain.ItemType.Event) { Session.CurrentMap?.Broadcast(Session.Character.GenerateEff(EffectValue)); if (MappingHelper.GuriItemEffects.ContainsKey(EffectValue)) { Session.CurrentMap?.Broadcast(Session.Character.GenerateGuri(19, 1, MappingHelper.GuriItemEffects[EffectValue]), Session.Character.MapX, Session.Character.MapY); } Inv.Amount--; if (Inv.Amount > 0) { Session.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemVNum, Inv.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.Inventory.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } break; // dyes case 10: if (this != null && !Session.Character.IsVehicled) { if (EffectValue == 99) { byte nextValue = (byte)random.Next(0, 127); Session.Character.HairColor = Enum.IsDefined(typeof(HairColorType), (byte)nextValue) ? (HairColorType)nextValue : 0; } else { Session.Character.HairColor = Enum.IsDefined(typeof(HairColorType), (byte)EffectValue) ? (HairColorType)EffectValue : 0; } Session.SendPacket(Session.Character.GenerateEq()); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.All); Inv.Amount--; if (Inv.Amount > 0) { Session.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemVNum, Inv.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.Inventory.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } break; // waxes case 11: if (this != null && !Session.Character.IsVehicled) { if (Session.Character.Class == (byte)ClassType.Adventurer && EffectValue > 1) { Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("ADVENTURERS_CANT_USE"), 10)); } else { // TODO better handling of waxes combined with hairstyle Session.Character.HairStyle = Enum.IsDefined(typeof(HairStyleType), (byte)EffectValue) ? (HairStyleType)EffectValue : 0; Session.SendPacket(Session.Character.GenerateEq()); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.All); Inv.Amount--; if (Inv.Amount > 0) { Session.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemVNum, Inv.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.Inventory.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } } break; // dignity restoration case 14: if ((EffectValue == 100 || EffectValue == 200) && Session.Character.Dignity < 100 && !Session.Character.IsVehicled) { Session.Character.Dignity += EffectValue; if (Session.Character.Dignity > 100) { Session.Character.Dignity = 100; } Session.SendPacket(Session.Character.GenerateFd()); Session.SendPacket(Session.Character.GenerateEff(48)); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.AllExceptMe); Inv.Amount--; if (Inv.Amount > 0) { Session.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemVNum, Inv.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.Inventory.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } else if (EffectValue == 2000 && Session.Character.Dignity < 100 && !Session.Character.IsVehicled) { Session.Character.Dignity = 100; Session.SendPacket(Session.Character.GenerateFd()); Session.SendPacket(Session.Character.GenerateEff(48)); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.AllExceptMe); Inv.Amount--; if (Inv.Amount > 0) { Session.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemVNum, Inv.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.Inventory.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } break; // speakers case 15: if (this != null && !Session.Character.IsVehicled) { if (!DelayUsed) { Session.SendPacket(Session.Character.GenerateGuri(10, 3, 1)); } } break; // bubbles case 16: if (this != null && !Session.Character.IsVehicled) { if (!DelayUsed) { Session.SendPacket(Session.Character.GenerateGuri(10, 4, 1)); } } break; // wigs case 30: if (this != null && !Session.Character.IsVehicled) { WearableInstance wig = Session.Character.Inventory.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Hat, InventoryType.Wear); if (wig != null) { wig.Design = (byte)random.Next(0, 15); Session.SendPacket(Session.Character.GenerateEq()); Session.SendPacket(Session.Character.GenerateEquipment()); Session.CurrentMap?.Broadcast(Session, Session.Character.GenerateIn(), ReceiverType.All); Inv.Amount--; if (Inv.Amount > 0) { Session.SendPacket(Session.Character.GenerateInventoryAdd(Inv.ItemVNum, Inv.Amount, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } else { Session.Character.Inventory.DeleteFromSlotAndType(Inv.Slot, Inv.Type); Session.SendPacket(Session.Character.GenerateInventoryAdd(-1, 0, Inv.Type, Inv.Slot, 0, 0, 0, 0)); } } else { Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("NO_WIG"), 0)); return; } } break; default: Logger.Log.Warn(String.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), this.GetType().ToString())); break; } }
/// <summary> /// Generate the Monster -> Character Damage /// </summary> /// <param name="targetCharacter"></param> /// <param name="skill"></param> /// <param name="hitmode"></param> /// <returns></returns> private int GenerateDamage(Character targetCharacter, Skill skill, ref int hitmode) { //Warning: This code contains a huge amount of copypasta! #region Definitions if (targetCharacter == null) { return(0); } int playerDefense = targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.DefenceLevelDecreased, false)[0]; byte playerDefenseUpgrade = (byte)targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.DefenceLevelIncreased, false)[0]; int playerDodge = targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.DefenceLevelIncreased, false)[0]; WearableInstance playerArmor = targetCharacter.Inventory.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Armor, InventoryType.Wear); if (playerArmor != null) { playerDefenseUpgrade += playerArmor.Upgrade; } short mainUpgrade = Monster.AttackUpgrade; int mainCritChance = Monster.CriticalChance; int mainCritHit = Monster.CriticalRate - 30; int mainMinDmg = Monster.DamageMinimum; int mainMaxDmg = Monster.DamageMaximum; int mainHitRate = Monster.Concentrate; //probably missnamed, check later if (mainMaxDmg == 0) { mainMinDmg = Monster.Level * 8; mainMaxDmg = Monster.Level * 12; mainCritChance = 10; mainCritHit = 120; mainHitRate = Monster.Level / 2 + 1; } #endregion #region Get Player defense int boostpercentage; switch (Monster.AttackClass) { case 0: playerDefense += targetCharacter.Defence + targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.MeleeDecreased, false)[0]; playerDodge += targetCharacter.DefenceRate + targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.RangedDecreased, false)[0]; boostpercentage = targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.MeleeDecreased, false)[0]; playerDefense = (int)(playerDefense * (1 + boostpercentage / 100D)); boostpercentage = targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.MagicalDecreased, false)[0]; playerDodge = (int)(playerDodge * (1 + boostpercentage / 100D)); break; case 1: playerDefense += targetCharacter.DistanceDefence + targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.RangedIncreased, false)[0]; playerDodge += targetCharacter.DistanceDefenceRate + targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.RangedIncreased, false)[0]; boostpercentage = targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.RangedIncreased, false)[0]; playerDefense = (int)(playerDefense * (1 + boostpercentage / 100D)); boostpercentage = targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.RangedIncreased, false)[0]; playerDodge = (int)(playerDodge * (1 + boostpercentage / 100D)); break; case 2: playerDefense += targetCharacter.MagicalDefence + targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.MagicalDecreased, false)[0]; boostpercentage = targetCharacter.GetBuff(CardType.Defence, (byte)AdditionalTypes.Defence.MagicalDecreased, false)[0]; playerDefense = (int)(playerDefense * (1 + boostpercentage / 100D)); break; default: throw new Exception($"Monster.AttackClass {Monster.AttackClass} not implemented"); } #endregion #region Basic Damage Data Calculation mainCritChance += targetCharacter.GetBuff(CardType.Critical, (byte)AdditionalTypes.Critical.ReceivingIncreased, false)[0]; mainCritChance -= targetCharacter.GetBuff(CardType.Critical, (byte)AdditionalTypes.Critical.ReceivingDecreased, false)[0]; mainCritHit += targetCharacter.GetBuff(CardType.Critical, (byte)AdditionalTypes.Critical.DamageFromCriticalIncreased, false)[0]; mainCritHit -= targetCharacter.GetBuff(CardType.Critical, (byte)AdditionalTypes.Critical.DamageFromCriticalDecreased, false)[0]; mainUpgrade -= playerDefenseUpgrade; if (mainUpgrade < -10) { mainUpgrade = -10; } else if (mainUpgrade > 10) { mainUpgrade = 10; } #endregion #region Detailed Calculation #region Dodge double multiplier = playerDodge / (double)mainHitRate; if (multiplier > 5) { multiplier = 5; } double chance = -0.25 * Math.Pow(multiplier, 3) - 0.57 * Math.Pow(multiplier, 2) + 25.3 * multiplier - 1.41; if (chance <= 1) { chance = 1; } if (Monster.AttackClass == 0 || Monster.AttackClass == 1) { if (ServerManager.Instance.RandomNumber() <= chance) { hitmode = 1; return(0); } } #endregion #region Base Damage int baseDamage = ServerManager.Instance.RandomNumber(mainMinDmg, mainMaxDmg + 1); baseDamage += Monster.Level - targetCharacter.Level; int elementalDamage = 0; // placeholder for BCard etc... if (skill != null) { // baseDamage += skill.Damage / 4; it's a bcard need a skillbcardload // elementalDamage += skill.ElementalDamage / 4; it's a bcard need a skillbcardload } switch (mainUpgrade) { case -10: playerDefense += playerDefense * 2; break; case -9: playerDefense += (int)(playerDefense * 1.2); break; case -8: playerDefense += (int)(playerDefense * 0.9); break; case -7: playerDefense += (int)(playerDefense * 0.65); break; case -6: playerDefense += (int)(playerDefense * 0.54); break; case -5: playerDefense += (int)(playerDefense * 0.43); break; case -4: playerDefense += (int)(playerDefense * 0.32); break; case -3: playerDefense += (int)(playerDefense * 0.22); break; case -2: playerDefense += (int)(playerDefense * 0.15); break; case -1: playerDefense += (int)(playerDefense * 0.1); break; case 0: break; case 1: baseDamage += (int)(baseDamage * 0.1); break; case 2: baseDamage += (int)(baseDamage * 0.15); break; case 3: baseDamage += (int)(baseDamage * 0.22); break; case 4: baseDamage += (int)(baseDamage * 0.32); break; case 5: baseDamage += (int)(baseDamage * 0.43); break; case 6: baseDamage += (int)(baseDamage * 0.54); break; case 7: baseDamage += (int)(baseDamage * 0.65); break; case 8: baseDamage += (int)(baseDamage * 0.9); break; case 9: baseDamage += (int)(baseDamage * 1.2); break; case 10: baseDamage += baseDamage * 2; break; // sush don't tell ciapa default: if (mainUpgrade > 10) { baseDamage += baseDamage * (mainUpgrade / 5); } break; } #endregion #region Elementary Damage int bonusrez = targetCharacter.GetBuff(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.AllIncreased, false)[0]; #region Calculate Elemental Boost + Rate double elementalBoost = 0; int playerRessistance = 0; switch (Monster.Element) { case 0: break; case 1: bonusrez += targetCharacter.GetBuff(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.FireIncreased, false)[0]; playerRessistance = targetCharacter.FireResistance; switch (targetCharacter.Element) { case 0: elementalBoost = 1.3; // Damage vs no element break; case 1: elementalBoost = 1; // Damage vs fire break; case 2: elementalBoost = 2; // Damage vs water break; case 3: elementalBoost = 1; // Damage vs light break; case 4: elementalBoost = 1.5; // Damage vs darkness break; } break; case 2: bonusrez += targetCharacter.GetBuff(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.WaterIncreased, false)[0]; playerRessistance = targetCharacter.WaterResistance; switch (targetCharacter.Element) { case 0: elementalBoost = 1.3; break; case 1: elementalBoost = 2; break; case 2: elementalBoost = 1; break; case 3: elementalBoost = 1.5; break; case 4: elementalBoost = 1; break; } break; case 3: bonusrez += targetCharacter.GetBuff(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.LightIncreased, false)[0]; playerRessistance = targetCharacter.LightResistance; switch (targetCharacter.Element) { case 0: elementalBoost = 1.3; break; case 1: elementalBoost = 1.5; break; case 2: elementalBoost = 1; break; case 3: elementalBoost = 1; break; case 4: elementalBoost = 3; break; } break; case 4: bonusrez += targetCharacter.GetBuff(CardType.ElementResistance, (byte)AdditionalTypes.ElementResistance.DarkIncreased, false)[0]; playerRessistance = targetCharacter.DarkResistance; switch (targetCharacter.Element) { case 0: elementalBoost = 1.3; break; case 1: elementalBoost = 1; break; case 2: elementalBoost = 1.5; break; case 3: elementalBoost = 3; break; case 4: elementalBoost = 1; break; } break; } #endregion ; if (Monster.Element == 0) { if (elementalBoost == 0.5) { elementalBoost = 0; } else if (elementalBoost == 1) { elementalBoost = 0.05; } else if (elementalBoost == 1.3) { elementalBoost = 0; } else if (elementalBoost == 1.5) { elementalBoost = 0.15; } else if (elementalBoost == 2) { elementalBoost = 0.2; } else if (elementalBoost == 3) { elementalBoost = 0.2; } } elementalDamage = (int)((elementalDamage + (elementalDamage + baseDamage) * (Monster.ElementRate / 100D)) * elementalBoost); elementalDamage = elementalDamage / 100 * (100 - playerRessistance - bonusrez); if (elementalDamage < 0) { elementalDamage = 0; } #endregion #region Critical Damage if (ServerManager.Instance.RandomNumber() <= mainCritChance) { if (Monster.AttackClass == 2) { } else { baseDamage += (int)(baseDamage * (mainCritHit / 100D)); hitmode = 3; } } #endregion #region Total Damage int totalDamage = baseDamage + elementalDamage - playerDefense; if (totalDamage < 5) { totalDamage = ServerManager.Instance.RandomNumber(1, 6); } #endregion #endregion #region Minimum damage if (Monster.Level < 45) { //no minimum damage } else if (Monster.Level < 55) { totalDamage += Monster.Level; } else if (Monster.Level < 60) { totalDamage += Monster.Level * 2; } else if (Monster.Level < 65) { totalDamage += Monster.Level * 3; } else if (Monster.Level < 70) { totalDamage += Monster.Level * 4; } else { totalDamage += Monster.Level * 5; } #endregion return(totalDamage); }
public void UpgradeSp(ClientSession Session, UpgradeProtection protect) { if (Upgrade >= 15) { return; } short[] upfail = { 20, 25, 30, 40, 50, 60, 65, 70, 75, 80, 90, 93, 95, 97, 99 }; short[] destroy = { 0, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70 }; int[] goldprice = { 200000, 200000, 200000, 200000, 200000, 500000, 500000, 500000, 500000, 500000, 1000000, 1000000, 1000000, 1000000, 1000000 }; short[] feather = { 3, 5, 8, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70 }; short[] fullmoon = { 1, 3, 5, 7, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 }; short[] soul = { 2, 4, 6, 8, 10, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 }; const short featherVnum = 2282; const short fullmoonVnum = 1030; const short greenSoulVnum = 2283; const short redSoulVnum = 2284; const short blueSoulVnum = 2285; const short dragonSkinVnum = 2511; const short dragonBloodVnum = 2512; const short dragonHeartVnum = 2513; const short blueScrollVnum = 1363; const short redScrollVnum = 1364; if (!Session.HasCurrentMapInstance) { return; } if (Session.Character.Inventory.CountItem(fullmoonVnum) < fullmoon[Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(fullmoonVnum).Name, fullmoon[Upgrade])), 10)); return; } if (Session.Character.Inventory.CountItem(featherVnum) < feather[Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(featherVnum).Name, feather[Upgrade])), 10)); return; } if (Session.Character.Gold < goldprice[Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } if (Upgrade < 5) { if (SpLevel > 20) { if (Item.Morph <= 16) { if (Session.Character.Inventory.CountItem(greenSoulVnum) < soul[Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(greenSoulVnum).Name, soul[Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (Session.Character.Inventory.CountItem(blueScrollVnum) < 1) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueScrollVnum).Name, 1)), 10)); return; } Session.Character.Inventory.RemoveItemAmount(blueScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(greenSoulVnum, soul[Upgrade]); } else { if (Session.Character.Inventory.CountItem(dragonSkinVnum) < soul[Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(dragonSkinVnum).Name, soul[Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (Session.Character.Inventory.CountItem(blueScrollVnum) < 1) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueScrollVnum).Name, 1)), 10)); return; } Session.Character.Inventory.RemoveItemAmount(blueScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(dragonSkinVnum, soul[Upgrade]); } } else { Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("LVL_REQUIRED"), 21), 11)); return; } } else if (Upgrade < 10) { if (SpLevel > 40) { if (Item.Morph <= 16) { if (Session.Character.Inventory.CountItem(redSoulVnum) < soul[Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(redSoulVnum).Name, soul[Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (Session.Character.Inventory.CountItem(blueScrollVnum) < 1) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueScrollVnum).Name, 1)), 10)); return; } Session.Character.Inventory.RemoveItemAmount(blueScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(redSoulVnum, soul[Upgrade]); } else { if (Session.Character.Inventory.CountItem(dragonBloodVnum) < soul[Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(dragonBloodVnum).Name, soul[Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (Session.Character.Inventory.CountItem(blueScrollVnum) < 1) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueScrollVnum).Name, 1)), 10)); return; } Session.Character.Inventory.RemoveItemAmount(blueScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(dragonBloodVnum, soul[Upgrade]); } } else { Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("LVL_REQUIRED"), 41), 11)); return; } } else if (Upgrade < 15) { if (SpLevel > 50) { if (Item.Morph <= 16) { if (Session.Character.Inventory.CountItem(blueSoulVnum) < soul[Upgrade]) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueSoulVnum).Name, soul[Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected && Upgrade > 9) { if (Session.Character.Inventory.CountItem(redScrollVnum) < 1) { return; } Session.Character.Inventory.RemoveItemAmount(redScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(blueSoulVnum, soul[Upgrade]); } else { if (Session.Character.Inventory.CountItem(dragonHeartVnum) < soul[Upgrade]) { return; } if (protect == UpgradeProtection.Protected && Upgrade > 9) { if (Session.Character.Inventory.CountItem(redScrollVnum) < 1) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(redScrollVnum).Name, 1)), 10)); return; } Session.Character.Inventory.RemoveItemAmount(redScrollVnum); Session.SendPacket("shop_end 2"); } Session.Character.Inventory.RemoveItemAmount(dragonHeartVnum, soul[Upgrade]); } } else { Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("LVL_REQUIRED"), 51), 11)); return; } } Session.Character.Gold -= goldprice[Upgrade]; // remove feather and fullmoon before upgrading Session.Character.Inventory.RemoveItemAmount(featherVnum, feather[Upgrade]); Session.Character.Inventory.RemoveItemAmount(fullmoonVnum, fullmoon[Upgrade]); WearableInstance wearable = Session.Character.Inventory.LoadByItemInstance <WearableInstance>(Id); ItemInstance inventory = Session.Character.Inventory.GetItemInstanceById(Id); int rnd = ServerManager.Instance.RandomNumber(); if (rnd < destroy[Upgrade]) { if (protect == UpgradeProtection.Protected) { Session.CurrentMapInstance.Broadcast(Session.Character.GenerateEff(3004), Session.Character.MapX, Session.Character.MapY); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED_SAVED"), 11)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED_SAVED"), 0)); } else { wearable.Rare = -2; Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_DESTROYED"), 11)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_DESTROYED"), 0)); Session.SendPacket(wearable.GenerateInventoryAdd()); } } else if (rnd < upfail[Upgrade]) { if (protect == UpgradeProtection.Protected) { Session.CurrentMapInstance.Broadcast(Session.Character.GenerateEff(3004), Session.Character.MapX, Session.Character.MapY); } Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED"), 11)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED"), 0)); } else { if (protect == UpgradeProtection.Protected) { Session.CurrentMapInstance.Broadcast(Session.Character.GenerateEff(3004), Session.Character.MapX, Session.Character.MapY); } Session.CurrentMapInstance.Broadcast(Session.Character.GenerateEff(3005), Session.Character.MapX, Session.Character.MapY); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_SUCCESS"), 12)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_SUCCESS"), 0)); wearable.Upgrade++; Session.Character.Family?.InsertFamilyLog(FamilyLogType.ItemUpgraded, Session.Character.Name, itemVNum: wearable.ItemVNum, upgrade: wearable.Upgrade); Session.SendPacket(wearable.GenerateInventoryAdd()); } Session.SendPacket(Session.Character.GenerateGold()); Session.SendPacket(Session.Character.GenerateEq()); Session.SendPacket("shop_end 1"); }
public string GenerateEInfo(WearableInstance item) { Item iteminfo = item.Item; EquipmentType equipmentslot = iteminfo.EquipmentSlot; ItemType itemType = iteminfo.ItemType; byte classe = iteminfo.Class; byte subtype = iteminfo.ItemSubType; DateTime test = item.ItemDeleteTime ?? DateTime.Now; long time = item.ItemDeleteTime != null ? (long)test.Subtract(DateTime.Now).TotalSeconds : 0; long seconds = item.IsBound ? time : iteminfo.ItemValidTime; if (seconds < 0) { seconds = 0; } switch (itemType) { case ItemType.Weapon: switch (equipmentslot) { case EquipmentType.MainWeapon: switch (classe) { case 4: return $"e_info 1 {item.ItemVNum} {item.Rare} {item.Upgrade} {(item.IsFixed ? 1 : 0)} {iteminfo.LevelMinimum} {iteminfo.DamageMinimum + item.DamageMinimum} {iteminfo.DamageMaximum + item.DamageMaximum} {iteminfo.HitRate + item.HitRate} {iteminfo.CriticalLuckRate + item.CriticalLuckRate} {iteminfo.CriticalRate + item.CriticalRate} {item.Ammo} {iteminfo.MaximumAmmo} {iteminfo.Price} -1 0 0 0"; // -1 = {item.ShellEffectValue} {item.FirstShell}... case 8: return $"e_info 5 {item.ItemVNum} {item.Rare} {item.Upgrade} {(item.IsFixed ? 1 : 0)} {iteminfo.LevelMinimum} {iteminfo.DamageMinimum + item.DamageMinimum} {iteminfo.DamageMaximum + item.DamageMaximum} {iteminfo.HitRate + item.HitRate} {iteminfo.CriticalLuckRate + item.CriticalLuckRate} {iteminfo.CriticalRate + item.CriticalRate} {item.Ammo} {iteminfo.MaximumAmmo} {iteminfo.Price} -1 0 0 0"; default: return $"e_info 0 {item.ItemVNum} {item.Rare} {item.Upgrade} {(item.IsFixed ? 1 : 0)} {iteminfo.LevelMinimum} {iteminfo.DamageMinimum + item.DamageMinimum} {iteminfo.DamageMaximum + item.DamageMaximum} {iteminfo.HitRate + item.HitRate} {iteminfo.CriticalLuckRate + item.CriticalLuckRate} {iteminfo.CriticalRate + item.CriticalRate} {item.Ammo} {iteminfo.MaximumAmmo} {iteminfo.Price} -1 0 0 0"; } case EquipmentType.SecondaryWeapon: switch (classe) { case 1: return $"e_info 1 {item.ItemVNum} {item.Rare} {item.Upgrade} {(item.IsFixed ? 1 : 0)} {iteminfo.LevelMinimum} {iteminfo.DamageMinimum + item.DamageMinimum} {iteminfo.DamageMaximum + item.DamageMaximum} {iteminfo.HitRate + item.HitRate} {iteminfo.CriticalLuckRate + item.CriticalLuckRate} {iteminfo.CriticalRate + item.CriticalRate} {item.Ammo} {iteminfo.MaximumAmmo} {iteminfo.Price} -1 0 0 0"; case 2: return $"e_info 1 {item.ItemVNum} {item.Rare} {item.Upgrade} {(item.IsFixed ? 1 : 0)} {iteminfo.LevelMinimum} {iteminfo.DamageMinimum + item.DamageMinimum} {iteminfo.DamageMaximum + item.DamageMaximum} {iteminfo.HitRate + item.HitRate} {iteminfo.CriticalLuckRate + item.CriticalLuckRate} {iteminfo.CriticalRate + item.CriticalRate} {item.Ammo} {iteminfo.MaximumAmmo} {iteminfo.Price} -1 0 0 0"; default: return $"e_info 0 {item.ItemVNum} {item.Rare} {item.Upgrade} {(item.IsFixed ? 1 : 0)} {iteminfo.LevelMinimum} {iteminfo.DamageMinimum + item.DamageMinimum} {iteminfo.DamageMaximum + item.DamageMaximum} {iteminfo.HitRate + item.HitRate} {iteminfo.CriticalLuckRate + item.CriticalLuckRate} {iteminfo.CriticalRate + item.CriticalRate} {item.Ammo} {iteminfo.MaximumAmmo} {iteminfo.Price} -1 0 0 0"; } } break; case ItemType.Armor: return $"e_info 2 {item.ItemVNum} {item.Rare} {item.Upgrade} {(item.IsFixed ? 1 : 0)} {iteminfo.LevelMinimum} {iteminfo.CloseDefence + item.CloseDefence} {iteminfo.DistanceDefence + item.DistanceDefence} {iteminfo.MagicDefence + item.MagicDefence} {iteminfo.DefenceDodge + item.DefenceDodge} {iteminfo.Price} -1 0 0 0"; case ItemType.Fashion: switch (equipmentslot) { case EquipmentType.CostumeHat: return $"e_info 3 {item.ItemVNum} {iteminfo.LevelMinimum} {iteminfo.CloseDefence + item.CloseDefence} {iteminfo.DistanceDefence + item.DistanceDefence} {iteminfo.MagicDefence + item.MagicDefence} {iteminfo.DefenceDodge + item.DefenceDodge} {iteminfo.FireResistance + item.FireResistance} {iteminfo.WaterResistance + item.WaterResistance} {iteminfo.LightResistance + item.LightResistance} {iteminfo.DarkResistance + item.DarkResistance} {iteminfo.Price} {(iteminfo.ItemValidTime == 0 ? -1 : 0)} 2 {(iteminfo.ItemValidTime == 0 ? -1 : seconds / (3600))}"; case EquipmentType.CostumeSuit: return $"e_info 2 {item.ItemVNum} {item.Rare} {item.Upgrade} {(item.IsFixed ? 1 : 0)} {iteminfo.LevelMinimum} {iteminfo.CloseDefence + item.CloseDefence} {iteminfo.DistanceDefence + item.DistanceDefence} {iteminfo.MagicDefence + item.MagicDefence} {iteminfo.DefenceDodge + item.DefenceDodge} {iteminfo.Price} {(iteminfo.ItemValidTime == 0 ? -1 : 0)} 1 {(iteminfo.ItemValidTime == 0 ? -1 : seconds / (3600))}"; // 1 = IsCosmetic -1 = no shells default: return $"e_info 3 {item.ItemVNum} {iteminfo.LevelMinimum} {iteminfo.CloseDefence + item.CloseDefence} {iteminfo.DistanceDefence + item.DistanceDefence} {iteminfo.MagicDefence + item.MagicDefence} {iteminfo.DefenceDodge + item.DefenceDodge} {iteminfo.FireResistance + item.FireResistance} {iteminfo.WaterResistance + item.WaterResistance} {iteminfo.LightResistance + item.LightResistance} {iteminfo.DarkResistance + item.DarkResistance} {iteminfo.Price} {item.Upgrade} 0 -1"; // after iteminfo.Price theres TimesConnected {(iteminfo.ItemValidTime == 0 ? -1 : iteminfo.ItemValidTime / (3600))} } case ItemType.Jewelery: switch (equipmentslot) { case EquipmentType.Amulet: return $"e_info 4 {item.ItemVNum} {iteminfo.LevelMinimum} {seconds * 10} 0 0 {iteminfo.Price}"; case EquipmentType.Fairy: return $"e_info 4 {item.ItemVNum} {iteminfo.Element} {item.ElementRate + iteminfo.ElementRate} 0 0 0 0 0"; // last IsNosmall default: return $"e_info 4 {item.ItemVNum} {iteminfo.LevelMinimum} {iteminfo.MaxCellonLvl} {iteminfo.MaxCellon} {item.Cellon} {iteminfo.Price}"; } case ItemType.Box: if (Inventory != null) { SpecialistInstance specialist = Inventory.LoadBySlotAndType<SpecialistInstance>((byte)EquipmentType.Sp, InventoryType.Wear); // 0 = NOSMATE pearl 1= npc pearl 2 = sp box 3 = raid box 4= VEHICLE pearl // 5=fairy pearl switch (subtype) { case 2: return $"e_info 7 {item.ItemVNum} {(item.IsEmpty ? 1 : 0)} {item.Design} {specialist.SpLevel} {CharacterHelper.SPXPData[JobLevelXp]} {CharacterHelper.SPXPData[JobLevel - 1]} {item.Upgrade} {specialist.SlDamage} {specialist.SlDefence} {specialist.SlElement} {specialist.SlHP} {CharacterHelper.SPPoint(specialist.SpLevel, item.Upgrade) - specialist.SlDamage - specialist.SlHP - specialist.SlElement - specialist.SlDefence} {item.FireResistance} {item.WaterResistance} {item.LightResistance} {item.DarkResistance} {specialist.SpStoneUpgrade} {specialist.SpDamage} {specialist.SpDefence} {specialist.SpElement} {specialist.SpHP} {specialist.SpFire} {specialist.SpWater} {specialist.SpLight} {specialist.SpDark}"; default: return $"e_info 8 {item.ItemVNum} {item.Design} {item.Rare}"; } } break; case ItemType.Shell: return $"e_info 4 {item.ItemVNum} {iteminfo.LevelMinimum} {item.Rare} {iteminfo.Price} 0"; // 0 = Number of effects } return string.Empty; }
public void UpgradeItem(ClientSession session, UpgradeMode mode, UpgradeProtection protection, bool isCommand = false) { if (!session.HasCurrentMapInstance) { return; } if (Upgrade < 10) { short[] upfail; short[] upfix; int[] goldprice; short[] cella; short[] gem; if (Rare == 8) { upfix = new short[] { 50, 40, 70, 65, 80, 90, 95, 97, 98, 99 }; upfail = new short[] { 50, 40, 60, 50, 60, 70, 75, 77, 83, 89 }; goldprice = new[] { 5000, 15000, 30000, 100000, 300000, 800000, 1500000, 4000000, 7000000, 10000000 }; cella = new short[] { 40, 100, 160, 240, 320, 440, 560, 760, 960, 1200 }; gem = new short[] { 2, 2, 4, 4, 6, 2, 2, 4, 4, 6 }; } else { upfix = new short[] { 0, 0, 10, 15, 20, 20, 20, 20, 15, 14 }; upfail = new short[] { 0, 0, 0, 5, 20, 40, 60, 70, 80, 85 }; goldprice = new[] { 500, 1500, 3000, 10000, 30000, 80000, 150000, 400000, 700000, 1000000 }; cella = new short[] { 20, 50, 80, 120, 160, 220, 280, 380, 480, 600 }; gem = new short[] { 1, 1, 2, 2, 3, 1, 1, 2, 2, 3 }; } const short cellaVnum = 1014; const short gemVnum = 1015; const short gemFullVnum = 1016; const double reducedpricefactor = 0.5; const short normalScrollVnum = 1218; const short goldScrollVnum = 5369; if (IsFixed) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ITEM_IS_FIXED"), 10)); session.SendPacket("shop_end 1"); return; } switch (mode) { case UpgradeMode.Free: break; case UpgradeMode.Reduced: // TODO: Reduced Item Amount if (session.Character.Gold < (long)(goldprice[Upgrade] * reducedpricefactor)) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } if (session.Character.Inventory.CountItem(cellaVnum) < cella[Upgrade] * reducedpricefactor) { session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(cellaVnum).Name, cella[Upgrade] * reducedpricefactor), 10)); return; } if (protection == UpgradeProtection.Protected && !isCommand && session.Character.Inventory.CountItem(goldScrollVnum) < 1) { session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(goldScrollVnum).Name, cella[Upgrade] * reducedpricefactor), 10)); return; } if (Upgrade < 5) { if (session.Character.Inventory.CountItem(gemVnum) < gem[Upgrade]) { session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(gemVnum).Name, gem[Upgrade]), 10)); return; } session.Character.Inventory.RemoveItemAmount(gemVnum, gem[Upgrade]); } else { if (session.Character.Inventory.CountItem(gemFullVnum) < gem[Upgrade]) { session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(gemFullVnum).Name, gem[Upgrade]), 10)); return; } session.Character.Inventory.RemoveItemAmount(gemFullVnum, gem[Upgrade]); } if (protection == UpgradeProtection.Protected && !isCommand) { session.Character.Inventory.RemoveItemAmount(goldScrollVnum); session.SendPacket("shop_end 2"); } session.Character.Gold -= (long)(goldprice[Upgrade] * reducedpricefactor); session.Character.Inventory.RemoveItemAmount(cellaVnum, (int)(cella[Upgrade] * reducedpricefactor)); session.SendPacket(session.Character.GenerateGold()); break; case UpgradeMode.Normal: // TODO: Normal Item Amount if (session.Character.Inventory.CountItem(cellaVnum) < cella[Upgrade]) { return; } if (session.Character.Gold < goldprice[Upgrade]) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } if (protection == UpgradeProtection.Protected && !isCommand && session.Character.Inventory.CountItem(normalScrollVnum) < 1) { session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(normalScrollVnum).Name, 1), 10)); return; } if (Upgrade < 5) { if (session.Character.Inventory.CountItem(gemVnum) < gem[Upgrade]) { session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(gemVnum).Name, gem[Upgrade]), 10)); return; } session.Character.Inventory.RemoveItemAmount(gemVnum, gem[Upgrade]); } else { if (session.Character.Inventory.CountItem(gemFullVnum) < gem[Upgrade]) { session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(gemFullVnum).Name, gem[Upgrade]), 10)); return; } session.Character.Inventory.RemoveItemAmount(gemFullVnum, gem[Upgrade]); } if (protection == UpgradeProtection.Protected && !isCommand) { session.Character.Inventory.RemoveItemAmount(normalScrollVnum); session.SendPacket("shop_end 2"); } session.Character.Inventory.RemoveItemAmount(cellaVnum, cella[Upgrade]); session.Character.Gold -= goldprice[Upgrade]; session.SendPacket(session.Character.GenerateGold()); break; } WearableInstance wearable = session.Character.Inventory.LoadByItemInstance <WearableInstance>(Id); ItemInstance inventory = session.Character.Inventory.GetItemInstanceById(Id); int rnd = ServerManager.Instance.RandomNumber(); if (Rare == 8) { if (rnd < upfail[Upgrade]) { if (protection == UpgradeProtection.None) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADE_FAILED"), 11)); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_FAILED"), 0)); session.Character.DeleteItemByItemInstanceId(Id); } else { session.CurrentMapInstance.Broadcast(session.Character.GenerateEff(3004), session.Character.MapX, session.Character.MapY); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SCROLL_PROTECT_USED"), 11)); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_FAILED_ITEM_SAVED"), 0)); } } else if (rnd < upfix[Upgrade]) { session.CurrentMapInstance.Broadcast(session.Character.GenerateEff(3004), session.Character.MapX, session.Character.MapY); wearable.IsFixed = true; session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADE_FIXED"), 11)); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_FIXED"), 0)); } else { session.CurrentMapInstance.Broadcast(session.Character.GenerateEff(3005), session.Character.MapX, session.Character.MapY); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADE_SUCCESS"), 12)); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_SUCCESS"), 0)); wearable.Upgrade++; session.Character.Family?.InsertFamilyLog(FamilyLogType.ItemUpgraded, session.Character.Name, itemVNum: wearable.ItemVNum, upgrade: wearable.Upgrade); session.SendPacket(wearable.GenerateInventoryAdd()); } } else { if (rnd < upfix[Upgrade]) { session.CurrentMapInstance.Broadcast(session.Character.GenerateEff(3004), session.Character.MapX, session.Character.MapY); wearable.IsFixed = true; session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADE_FIXED"), 11)); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_FIXED"), 0)); } else if (rnd < upfail[Upgrade] + upfix[Upgrade]) { if (protection == UpgradeProtection.None) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADE_FAILED"), 11)); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_FAILED"), 0)); session.Character.DeleteItemByItemInstanceId(Id); } else { session.CurrentMapInstance.Broadcast(session.Character.GenerateEff(3004), session.Character.MapX, session.Character.MapY); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SCROLL_PROTECT_USED"), 11)); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_FAILED_ITEM_SAVED"), 0)); } } else { session.CurrentMapInstance.Broadcast(session.Character.GenerateEff(3005), session.Character.MapX, session.Character.MapY); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADE_SUCCESS"), 12)); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADE_SUCCESS"), 0)); wearable.Upgrade++; session.Character.Family?.InsertFamilyLog(FamilyLogType.ItemUpgraded, session.Character.Name, itemVNum: wearable.ItemVNum, upgrade: wearable.Upgrade); session.SendPacket(wearable.GenerateInventoryAdd()); } } session.SendPacket("shop_end 1"); } }
public override void Use(ClientSession session, ref ItemInstance inv, byte option = 0, string[] packetsplit = null) { inv.Item.BCards.ForEach(c => c.ApplyBCards(session.Character)); switch (Effect) { case 0: switch (VNum) { case 1428: session.SendPacket("guri 18 1"); break; case 1429: session.SendPacket("guri 18 0"); break; case 1430: if (packetsplit == null) { return; } if (packetsplit.Length < 9) { // MODIFIED PACKET return; } if (!short.TryParse(packetsplit[9], out short eqSlot) || !Enum.TryParse(packetsplit[8], out InventoryType eqType)) { return; } WearableInstance eq = session.Character.Inventory.LoadBySlotAndType <WearableInstance>(eqSlot, eqType); if (eq == null) { // PACKET MODIFIED return; } if (eq.Item.ItemType != ItemType.Armor && eq.Item.ItemType != ItemType.Weapon) { return; } eq.EquipmentOptions.Clear(); eq.ShellRarity = null; session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SHELL_ERASED"), 0)); session.SendPacket(UserInterfaceHelper.Instance.GenerateGuri(17, 1, session.Character.CharacterId)); break; case 1904: short[] items = { 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1972, 1973 }; for (int i = 0; i < 5; i++) { session.Character.GiftAdd(items[ServerManager.Instance.RandomNumber(0, items.Length)], 1); } session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); break; case 5916: session.Character.AddStaticBuff(new StaticBuffDTO { CardId = 340, CharacterId = session.Character.CharacterId, RemainingTime = 7200 }); session.Character.RemoveBuff(339); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); break; case 5929: session.Character.AddStaticBuff(new StaticBuffDTO { CardId = 340, CharacterId = session.Character.CharacterId, RemainingTime = 600 }); session.Character.RemoveBuff(339); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); break; default: IEnumerable <RollGeneratedItemDTO> roll = DAOFactory.RollGeneratedItemDAO.Where(s => s.OriginalItemVNum == VNum); IEnumerable <RollGeneratedItemDTO> rollGeneratedItemDtos = roll as IList <RollGeneratedItemDTO> ?? roll.ToList(); if (!rollGeneratedItemDtos.Any()) { return; } int probabilities = rollGeneratedItemDtos.Sum(s => s.Probability); int rnd = ServerManager.Instance.RandomNumber(0, probabilities); int currentrnd = 0; foreach (RollGeneratedItemDTO rollitem in rollGeneratedItemDtos) { if (rollitem.Probability == 10000) { session.Character.GiftAdd(rollitem.ItemGeneratedVNum, rollitem.ItemGeneratedAmount); continue; } currentrnd += rollitem.Probability; if (currentrnd < rnd) { continue; } if (rollitem.IsSuperReward) { CommunicationServiceClient.Instance.SendMessageToCharacter(new SCSCharacterMessage { DestinationCharacterId = null, SourceCharacterId = session.Character.CharacterId, SourceWorldId = ServerManager.Instance.WorldId, Message = Language.Instance.GetMessageFromKey("SUPER_REWARD"), Type = MessageType.Shout }); } session.Character.GiftAdd(rollitem.ItemGeneratedVNum, rollitem.ItemGeneratedAmount, 0, rollitem.ItemGeneratedUpgrade); break; } session.Character.Inventory.RemoveItemAmount(VNum); break; } break; // sp point potions case 150: case 151: session.Character.SpAdditionPoint += EffectValue; if (session.Character.SpAdditionPoint > 1000000) { session.Character.SpAdditionPoint = 1000000; } session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("SP_POINTSADDED"), EffectValue), 0)); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.SendPacket(session.Character.GenerateSpPoint()); break; case 204: session.Character.SpPoint += EffectValue; session.Character.SpAdditionPoint += EffectValue * 3; if (session.Character.SpAdditionPoint > 1000000) { session.Character.SpAdditionPoint = 1000000; } if (session.Character.SpPoint > 10000) { session.Character.SpPoint = 10000; } session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("SP_POINTSADDEDBOTH"), EffectValue, EffectValue * 3), 0)); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.SendPacket(session.Character.GenerateSpPoint()); break; case 250: if (session.Character.Buff.Any(s => s.Card.CardId == 131)) { //TODO ADD MESSAGE ALREADY GOT BUFF return; } session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.Character.AddStaticBuff(new StaticBuffDTO { CardId = 131 }); session.CurrentMapInstance.Broadcast(session.Character.GeneratePairy()); session.SendPacket(session.Character.GeneratePairy()); break; case 208: if (session.Character.Buff.Any(s => s.Card.CardId == 121)) { //TODO ADD MESSAGE ALREADY GOT BUFF return; } session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.Character.AddStaticBuff(new StaticBuffDTO { CardId = 121, CharacterId = session.Character.CharacterId, RemainingTime = 3600 }); break; case 301: if (ServerManager.Instance.IsCharacterMemberOfGroup(session.Character.CharacterId)) { //TODO you are in group return; } ItemInstance raidSeal = session.Character.Inventory.LoadBySlotAndType <ItemInstance>(inv.Slot, InventoryType.Main); ScriptedInstance raid = ServerManager.Instance.Raids.FirstOrDefault(s => s.RequieredItems.Any(obj => obj.VNum == raidSeal.ItemVNum))?.GetClone(); if (raid != null) { session.Character.Inventory.RemoveItemAmountFromInventory(1, raidSeal.Id); Group group = new Group(GroupType.Team); group.Raid = raid; group.JoinGroup(session.Character.CharacterId); ServerManager.Instance.AddGroup(group); session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("YOU_ARE_RAID_CHIEF"), session.Character.Name), 0)); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("YOU_ARE_RAID_CHIEF"), session.Character.Name), 10)); if (session.Character.Level > raid.LevelMaximum || session.Character.Level < raid.LevelMinimum) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("RAID_LEVEL_INCORRECT"), 10)); } session.SendPacket(session.Character.GenerateRaid(2, false)); session.SendPacket(session.Character.GenerateRaid(0, false)); session.SendPacket(session.Character.GenerateRaid(1, false)); session.SendPacket(group.GenerateRdlst()); } break; case 305: if (packetsplit == null || packetsplit.Length < 3) { return; } Mate mate = session.Character.Mates.FirstOrDefault(s => s.MateTransportId == int.Parse(packetsplit[3])); if (mate != null && EffectValue == mate.NpcMonsterVNum && mate.Skin == 0) { mate.Skin = Morph; session.SendPacket(mate.GenerateCMode(mate.Skin)); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } break; //Atk/Def/HP/Exp potions case 6600: session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); break; // Divorce letter case 6969: // this is imaginary number I = √(-1) CharacterRelationDTO rel = session.Character.CharacterRelations.FirstOrDefault(s => s.RelationType == CharacterRelationType.Spouse); if (rel != null) { session.Character.DeleteRelation(rel.CharacterId == session.Character.CharacterId ? rel.RelatedCharacterId : rel.CharacterId); session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("DIVORCED"))); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } break; // Cupid's arrow case 34: // this is imaginary number I = √(-1) if (packetsplit != null && packetsplit.Length > 3) { if (long.TryParse(packetsplit[3], out long characterId)) { if (session.Character.CharacterRelations.Any(s => s.RelationType == CharacterRelationType.Spouse)) { session.SendPacket($"info {Language.Instance.GetMessageFromKey("ALREADY_MARRIED")}"); return; } if (session.Character.IsFriendOfCharacter(characterId)) { ClientSession otherSession = ServerManager.Instance.GetSessionByCharacterId(characterId); if (otherSession != null) { otherSession.SendPacket(UserInterfaceHelper.Instance.GenerateDialog( $"#fins^-34^{session.Character.CharacterId} #fins^-69^{session.Character.CharacterId} {string.Format(Language.Instance.GetMessageFromKey("MARRY_REQUEST"), session.Character.Name)}")); session.Character.FriendRequestCharacters.Add(characterId); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } } else { session.SendPacket($"info {Language.Instance.GetMessageFromKey("NOT_FRIEND")}"); } } } break; case 570: if (session.Character.Faction == (FactionType)EffectValue) { return; } session.SendPacket(session.Character.Family == null ? $"qna #guri^750^{EffectValue} {Language.Instance.GetMessageFromKey($"ASK_CHANGE_FACTION{EffectValue}")}" : UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("IN_FAMILY"), 0)); break; // wings case 650: if (session.Character.UseSp && session.Character.SpInstance != null) { if (option == 0) { session.SendPacket($"qna #u_i^1^{session.Character.CharacterId}^{(byte) inv.Type}^{inv.Slot}^3 {Language.Instance.GetMessageFromKey("ASK_WINGS_CHANGE")}"); } else { session.Character.SpInstance.Design = (byte)EffectValue; session.Character.MorphUpgrade2 = EffectValue; session.CurrentMapInstance?.Broadcast(session.Character.GenerateCMode()); session.SendPacket(session.Character.GenerateStat()); session.SendPacket(session.Character.GenerateStatChar()); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } } else { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NO_SP"), 0)); } break; // presentation messages case 203: if (!session.Character.IsVehicled) { if (option == 0) { session.SendPacket(UserInterfaceHelper.Instance.GenerateGuri(10, 2, session.Character.CharacterId, 1)); } } break; // magic lamps case 651: if (session.Character.Inventory.All(i => i.Value.Type != InventoryType.Wear)) { if (option == 0) { session.SendPacket($"qna #u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^3 {Language.Instance.GetMessageFromKey("ASK_USE")}"); } else { session.Character.ChangeSex(); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } } else { session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } break; // vehicles case 1000: if (session.Character.HasShopOpened) { return; } if (Morph > 0) { if (option == 0 && !session.Character.IsVehicled) { if (session.Character.IsSitting) { session.Character.IsSitting = false; session.CurrentMapInstance?.Broadcast(session.Character.GenerateRest()); } session.Character.LastDelay = DateTime.Now; session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 3, $"#u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^2")); } else { if (!session.Character.IsVehicled && option != 0) { DateTime delay = DateTime.Now.AddSeconds(-4); if (session.Character.LastDelay > delay && session.Character.LastDelay < delay.AddSeconds(2)) { session.Character.Speed = Speed; session.Character.IsVehicled = true; session.Character.VehicleSpeed = Speed; session.Character.MorphUpgrade = 0; session.Character.MorphUpgrade2 = 0; session.Character.Morph = Morph + (byte)session.Character.Gender; session.Character.Mates?.ForEach(x => session.CurrentMapInstance?.Broadcast(x.GenerateOut())); session.CurrentMapInstance?.Broadcast(session.Character.GenerateEff(196), session.Character.MapX, session.Character.MapY); session.CurrentMapInstance?.Broadcast(session.Character.GenerateCMode()); session.SendPacket(session.Character.GenerateCond()); session.Character.LastSpeedChange = DateTime.Now; } } else if (session.Character.IsVehicled) { session.Character.Mates?.ForEach(x => { x.PositionX = session.Character.PositionX; x.PositionY = session.Character.PositionY; session.CurrentMapInstance?.Broadcast(x.GenerateIn()); }); session.Character.RemoveVehicle(); } } } break; case 1002: // TODO REVIEW THIS /* * if (EffectValue == 69) * { * int rnd = ServerManager.Instance.RandomNumber(0, 1000); * if (rnd < 5) * { * short[] vnums = * { * 5560, 5591, 4099, 907, 1160, 4705, 4706, 4707, 4708, 4709, 4710, 4711, 4712, 4713, 4714, * 4715, 4716 * }; * byte[] counts = {1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; * int item = ServerManager.Instance.RandomNumber(0, 17); * * session.Character.GiftAdd(vnums[item], counts[item]); * } * else if (rnd < 30) * { * short[] vnums = {361, 362, 363, 366, 367, 368, 371, 372, 373}; * session.Character.GiftAdd(vnums[ServerManager.Instance.RandomNumber(0, 9)], 1); * } * else * { * short[] vnums = * { * 1161, 2282, 1030, 1244, 1218, 5369, 1012, 1363, 1364, 2160, 2173, 5959, 5983, 2514, * 2515, 2516, 2517, 2518, 2519, 2520, 2521, 1685, 1686, 5087, 5203, 2418, 2310, 2303, * 2169, 2280, 5892, 5893, 5894, 5895, 5896, 5897, 5898, 5899, 5332, 5105, 2161, 2162 * }; * byte[] counts = * { * 10, 10, 20, 5, 1, 1, 99, 1, 1, 5, 5, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 5, 20, * 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 * }; * int item = ServerManager.Instance.RandomNumber(0, 42); * session.Character.GiftAdd(vnums[item], counts[item]); * } * session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); * } */ if (session.HasCurrentMapInstance) { if (session.CurrentMapInstance.Map.MapTypes.All(m => m.MapTypeId != (short)MapTypeEnum.Act4)) { short[] vnums = { 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405 }; short vnum = vnums[ServerManager.Instance.RandomNumber(0, 20)]; NpcMonster npcmonster = ServerManager.Instance.GetNpc(vnum); if (npcmonster == null) { return; } MapMonster monster = new MapMonster { MonsterVNum = vnum, MapY = session.Character.MapY, MapX = session.Character.MapX, MapId = session.Character.MapInstance.Map.MapId, Position = (byte)session.Character.Direction, IsMoving = true, MapMonsterId = session.CurrentMapInstance.GetNextMonsterId(), ShouldRespawn = false }; monster.Initialize(session.CurrentMapInstance); session.CurrentMapInstance.AddMonster(monster); session.CurrentMapInstance.Broadcast(monster.GenerateIn()); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } } break; case 69: session.Character.GetReput(ReputPrice); session.SendPacket(session.Character.GenerateFd()); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); break; case 789: session.Character.GiftAdd((short)inv.Item.EffectValue, 1); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); break; case 790: break; case 1003: if (!session.Character.StaticBonusList.Any(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver)) { session.Character.StaticBonusList.Add(new StaticBonusDTO { CharacterId = session.Character.CharacterId, DateEnd = DateTime.Now.AddDays(EffectValue), StaticBonusType = StaticBonusType.BazaarMedalGold }); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; case 1004: if (!session.Character.StaticBonusList.Any(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalGold)) { session.Character.StaticBonusList.Add(new StaticBonusDTO { CharacterId = session.Character.CharacterId, DateEnd = DateTime.Now.AddDays(EffectValue), StaticBonusType = StaticBonusType.BazaarMedalSilver }); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; case 1005: if (session.Character.StaticBonusList.All(s => s.StaticBonusType != StaticBonusType.BackPack)) { session.Character.StaticBonusList.Add(new StaticBonusDTO { CharacterId = session.Character.CharacterId, DateEnd = DateTime.Now.AddDays(EffectValue), StaticBonusType = StaticBonusType.BackPack }); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.SendPacket(session.Character.GenerateExts()); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; case 1006: if (option == 0) { session.SendPacket($"qna #u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^2 {Language.Instance.GetMessageFromKey("ASK_PET_MAX")}"); } else { if (session.Character.MaxMateCount < 30) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("GET_PET_PLACES"), 10)); session.SendPacket(session.Character.GenerateScpStc()); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); } } break; case 1007: if (session.Character.StaticBonusList.All(s => s.StaticBonusType != StaticBonusType.PetBasket)) { session.Character.StaticBonusList.Add(new StaticBonusDTO { CharacterId = session.Character.CharacterId, DateEnd = DateTime.Now.AddDays(EffectValue), StaticBonusType = StaticBonusType.PetBasket }); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.SendPacket(session.Character.GenerateExts()); session.SendPacket("ib 1278 1"); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; case 1008: if (session.Character.StaticBonusList.All(s => s.StaticBonusType != StaticBonusType.PetBackPack)) { session.Character.StaticBonusList.Add(new StaticBonusDTO { CharacterId = session.Character.CharacterId, DateEnd = DateTime.Now.AddDays(EffectValue), StaticBonusType = StaticBonusType.PetBackPack }); session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id); session.SendPacket(session.Character.GenerateExts()); session.SendPacket(session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12)); } break; default: Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType())); break; } }
public void Sum(ClientSession session, WearableInstance itemToSum) { if (!session.HasCurrentMap) { return; } // cannot sum higher than 5 if (Upgrade < 6) { short[] upsuccess = { 100, 100, 85, 70, 50, 20 }; int[] goldprice = { 1500, 3000, 6000, 12000, 24000, 48000 }; short[] sand = { 5, 10, 15, 20, 25, 30 }; int sandVnum = 1027; if ((Upgrade + itemToSum.Upgrade) < 6 && ((((itemToSum.Item.EquipmentSlot == EquipmentType.Gloves) && (Item.EquipmentSlot == EquipmentType.Gloves)) || ((Item.EquipmentSlot == EquipmentType.Boots) && (itemToSum.Item.EquipmentSlot == EquipmentType.Boots))))) { if (session.Character.Gold < goldprice[Upgrade]) { return; } if (session.Character.Inventory.CountItem(sandVnum) < sand[Upgrade]) { return; } session.Character.Inventory.RemoveItemAmount(sandVnum, (byte)(sand[Upgrade])); session.Character.Gold -= goldprice[Upgrade]; int rnd = _random.Next(100); if (rnd <= upsuccess[Upgrade + itemToSum.Upgrade]) { Upgrade += (byte)(itemToSum.Upgrade + 1); DarkResistance += (short)(itemToSum.DarkResistance + itemToSum.Item.DarkResistance); LightResistance += (short)(itemToSum.LightResistance + itemToSum.Item.LightResistance); WaterResistance += (short)(itemToSum.WaterResistance + itemToSum.Item.WaterResistance); FireResistance += (short)(itemToSum.FireResistance + itemToSum.Item.FireResistance); session.Character.DeleteItemByItemInstanceId(itemToSum.Id); session.SendPacket($"pdti 10 {ItemVNum} 1 27 {Upgrade} 0"); session.SendPacket(session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("SUM_SUCCESS"), 0)); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SUM_SUCCESS"), 12)); session.SendPacket(session.Character.GenerateGuri(19, 1, 1324)); ItemInstance itemInstnace = session.Character.Inventory.GetItemInstanceById(Id); session.SendPacket(session.Character.GenerateInventoryAdd(itemInstnace.ItemVNum, 1, itemInstnace.Type, itemInstnace.Slot, 0, 0, Upgrade, 0)); } else { session.SendPacket(session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("SUM_FAILED"), 0)); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SUM_FAILED"), 11)); session.SendPacket(session.Character.GenerateGuri(19, 1, 1332)); session.Character.DeleteItemByItemInstanceId(itemToSum.Id); session.Character.DeleteItemByItemInstanceId(Id); } session.CurrentMap?.Broadcast(session.Character.GenerateGuri(6, 1), session.Character.MapX, session.Character.MapY); session.SendPacket(session.Character.GenerateGold()); session.SendPacket("shop_end 1"); } } }
private void CharacterLifeManager() { try { List <Task> NpcLifeTask = new List <Task>(); for (int i = Sessions.Where(s => s.HasSelectedCharacter).Count() - 1; i >= 0; i--) { ClientSession Session = Sessions.Where(s => s?.Character != null).ElementAt(i); if (Session.Character.LastMailRefresh.AddSeconds(30) < DateTime.Now) { Session.Character.RefreshMail(); } int x = 1; bool change = false; if (Session.Character.Hp == 0 && Session.Character.LastHealth.AddSeconds(2) <= DateTime.Now) { Session.Character.Mp = 0; Session.SendPacket(Session.Character.GenerateStat()); Session.Character.LastHealth = DateTime.Now; } else { WearableInstance amulet = Session.Character.Inventory.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Amulet, InventoryType.Wear); if (Session.Character.LastEffect.AddSeconds(5) <= DateTime.Now && amulet != null) { if (amulet.ItemVNum == 4503 || amulet.ItemVNum == 4504) { Session.CurrentMap?.Broadcast(Session.Character.GenerateEff(amulet.Item.EffectValue + (Session.Character.Class == ClassType.Adventurer ? 0 : (byte)Session.Character.Class - 1)), Session.Character.MapX, Session.Character.MapY); } else { Session.CurrentMap?.Broadcast(Session.Character.GenerateEff(amulet.Item.EffectValue), Session.Character.MapX, Session.Character.MapY); } Session.Character.LastEffect = DateTime.Now; } if ((Session.Character.LastHealth.AddSeconds(2) <= DateTime.Now) || (Session.Character.IsSitting && Session.Character.LastHealth.AddSeconds(1.5) <= DateTime.Now)) { Session.Character.LastHealth = DateTime.Now; if (Session.HealthStop) { Session.HealthStop = false; return; } if (Session.Character.LastDefence.AddSeconds(2) <= DateTime.Now && Session.Character.LastSkillUse.AddSeconds(2) <= DateTime.Now && Session.Character.Hp > 0) { if (x == 0) { x = 1; } if (Session.Character.Hp + Session.Character.HealthHPLoad() < Session.Character.HPLoad()) { change = true; Session.Character.Hp += Session.Character.HealthHPLoad(); } else { if (Session.Character.Hp != (int)Session.Character.HPLoad()) { change = true; } Session.Character.Hp = (int)Session.Character.HPLoad(); } if (x == 1) { if (Session.Character.Mp + Session.Character.HealthMPLoad() < Session.Character.MPLoad()) { Session.Character.Mp += Session.Character.HealthMPLoad(); change = true; } else { if (Session.Character.Mp != (int)Session.Character.MPLoad()) { change = true; } Session.Character.Mp = (int)Session.Character.MPLoad(); } x = 0; } if (change) { Session.SendPacket(Session.Character.GenerateStat()); } } } } } } catch (Exception e) { Logger.Error(e); } }
public void CreateCharacter(string packet) { Logger.Debug(packet, Session.SessionId); if (Session.HasCurrentMap) { return; } // TODO: Hold Account Information in Authorized object long accountId = Session.Account.AccountId; string[] packetsplit = packet.Split(' '); byte slot = Convert.ToByte(packetsplit[3]); string characterName = packetsplit[2]; Random random = new Random(); if (slot <= 2 && DAOFactory.CharacterDAO.LoadBySlot(accountId, slot) == null) { if (characterName.Length > 3 && characterName.Length < 15) { int isIllegalCharacter = 0; System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex(@"^[\u0021-\u007E\u00A1-\u00AC\u00AE-\u00FF\u4E00-\u9FA5\u0E01-\u0E3A\u0E3F-\u0E5B]*$"); isIllegalCharacter = rg.Matches(characterName).Count; if (isIllegalCharacter == 1) { if (DAOFactory.CharacterDAO.LoadByName(characterName) == null) { if (Convert.ToByte(packetsplit[3]) > 2) { return; } CharacterDTO newCharacter = new CharacterDTO() { Class = (byte)ClassType.Adventurer, Gender = (GenderType)Enum.Parse(typeof(GenderType), packetsplit[4]), HairColor = (HairColorType)Enum.Parse(typeof(HairColorType), packetsplit[6]), HairStyle = (HairStyleType)Enum.Parse(typeof(HairStyleType), packetsplit[5]), Hp = 221, JobLevel = 1, Level = 1, MapId = 1, MapX = (short)(random.Next(78, 81)), MapY = (short)(random.Next(114, 118)), Mp = 221, SpPoint = 10000, SpAdditionPoint = 0, Name = characterName, Slot = slot, AccountId = accountId, State = CharacterState.Active, }; SaveResult insertResult = DAOFactory.CharacterDAO.InsertOrUpdate(ref newCharacter); CharacterSkillDTO sk1 = new CharacterSkillDTO { CharacterId = newCharacter.CharacterId, SkillVNum = 200 }; CharacterSkillDTO sk2 = new CharacterSkillDTO { CharacterId = newCharacter.CharacterId, SkillVNum = 201 }; CharacterSkillDTO sk3 = new CharacterSkillDTO { CharacterId = newCharacter.CharacterId, SkillVNum = 209 }; QuicklistEntryDTO qlst1 = new QuicklistEntryDTO { CharacterId = newCharacter.CharacterId, Type = 1, Slot = 1, Pos = 1 }; QuicklistEntryDTO qlst2 = new QuicklistEntryDTO { CharacterId = newCharacter.CharacterId, Q2 = 1, Slot = 2, }; QuicklistEntryDTO qlst3 = new QuicklistEntryDTO { CharacterId = newCharacter.CharacterId, Q2 = 8, Type = 1, Slot = 1, Pos = 16 }; QuicklistEntryDTO qlst4 = new QuicklistEntryDTO { CharacterId = newCharacter.CharacterId, Q2 = 9, Type = 1, Slot = 3, Pos = 1 }; qlst1 = DAOFactory.QuicklistEntryDAO.InsertOrUpdate(qlst1); qlst2 = DAOFactory.QuicklistEntryDAO.InsertOrUpdate(qlst2); qlst3 = DAOFactory.QuicklistEntryDAO.InsertOrUpdate(qlst3); qlst4 = DAOFactory.QuicklistEntryDAO.InsertOrUpdate(qlst4); sk1 = DAOFactory.CharacterSkillDAO.InsertOrUpdate(sk1); sk2 = DAOFactory.CharacterSkillDAO.InsertOrUpdate(sk2); sk3 = DAOFactory.CharacterSkillDAO.InsertOrUpdate(sk3); IList<ItemInstanceDTO> startupInventory = new List<ItemInstanceDTO>(); ItemInstance inventory = new WearableInstance() // first weapon { CharacterId = newCharacter.CharacterId, Slot = (byte)EquipmentType.MainWeapon, Type = InventoryType.Wear, Amount = 1, ItemVNum = 1, }; startupInventory.Add(inventory); inventory = new WearableInstance() // second weapon { CharacterId = newCharacter.CharacterId, Slot = (byte)EquipmentType.SecondaryWeapon, Type = InventoryType.Wear, Amount = 1, ItemVNum = 8 }; startupInventory.Add(inventory); inventory = new WearableInstance() // armor { CharacterId = newCharacter.CharacterId, Slot = (byte)EquipmentType.Armor, Type = InventoryType.Wear, Amount = 1, ItemVNum = 12 }; startupInventory.Add(inventory); inventory = new ItemInstance() // snack { CharacterId = newCharacter.CharacterId, Type = InventoryType.Etc, Amount = 10, ItemVNum = 2024 }; startupInventory.Add(inventory); inventory = new ItemInstance() // ammo { CharacterId = newCharacter.CharacterId, Slot = 1, Type = InventoryType.Etc, Amount = 1, ItemVNum = 2081 }; startupInventory.Add(inventory); DAOFactory.ItemInstanceDAO.InsertOrUpdate(startupInventory); LoadCharacters(packet); } else { Session.SendPacketFormat($"info {Language.Instance.GetMessageFromKey("ALREADY_TAKEN")}"); } } else { Session.SendPacketFormat($"info {Language.Instance.GetMessageFromKey("INVALID_CHARNAME")}"); } } } }
public override void Use(ClientSession session, ref Inventory inventory, bool DelayUsed = false) { switch (Effect) { default: short slot = inventory.Slot; InventoryType type = inventory.Type; if (inventory == null) { return; } if (ItemValidTime > 0 && ((ItemInstance)inventory.ItemInstance).IsBound) { inventory.ItemInstance.ItemDeleteTime = DateTime.Now.AddSeconds(ItemValidTime); } if (!((ItemInstance)inventory.ItemInstance).IsBound) { if (!DelayUsed && ((EquipmentSlot == (byte)EquipmentType.Fairy && (MaxElementRate == 70 || MaxElementRate == 80)) || (EquipmentSlot == (byte)EquipmentType.CostumeHat || EquipmentSlot == (byte)EquipmentType.CostumeSuit || EquipmentSlot == (byte)EquipmentType.WeaponSkin))) { session.SendPacket($"qna #u_i^1^{session.Character.CharacterId}^{(byte)type}^{slot}^1 {Language.Instance.GetMessageFromKey("ASK_BIND")}"); return; } else if (DelayUsed) { inventory.ItemInstance.BoundCharacterId = session.Character.CharacterId; } } double timeSpanSinceLastSpUsage = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds - session.Character.LastSp; if (EquipmentSlot == (byte)EquipmentType.Sp && inventory.ItemInstance.Rare == -2) { session.SendPacket(session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("CANT_EQUIP_DESTROYED_SP"), 0)); return; } if (EquipmentSlot == (byte)EquipmentType.Sp && timeSpanSinceLastSpUsage <= session.Character.SpCooldown && session.Character.EquipmentList.LoadInventoryBySlotAndType((byte)EquipmentType.Sp, InventoryType.Sp) != null) { session.SendPacket(session.Character.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("SP_INLOADING"), session.Character.SpCooldown - (int)Math.Round(timeSpanSinceLastSpUsage)), 0)); return; } if ((ItemType != (byte)Domain.ItemType.Weapon && ItemType != (byte)Domain.ItemType.Armor && ItemType != (byte)Domain.ItemType.Fashion && ItemType != (byte)Domain.ItemType.Jewelery && ItemType != (byte)Domain.ItemType.Specialist) || LevelMinimum > (IsHeroic ? session.Character.HeroLevel : session.Character.Level) || (Sex != 0 && Sex != session.Character.Gender + 1) || ((ItemType != (byte)Domain.ItemType.Jewelery && EquipmentSlot != (byte)EquipmentType.Boots && EquipmentSlot != (byte)EquipmentType.Gloves) && ((Class >> session.Character.Class) & 1) != 1)) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("BAD_EQUIPMENT"), 10)); return; } if (session.Character.UseSp) { SpecialistInstance sp = session.Character.EquipmentList.LoadBySlotAndType <SpecialistInstance>( (byte)EquipmentType.Sp, InventoryType.Equipment); if (sp.Item.Element != 0 && EquipmentSlot == (byte)EquipmentType.Fairy && Element != sp.Item.Element && Element != sp.Item.SecondaryElement) { session.SendPacket(session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("BAD_FAIRY"), 0)); return; } } if (session.Character.UseSp && EquipmentSlot == (byte)EquipmentType.Sp) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SP_BLOCKED"), 10)); return; } if (session.Character.JobLevel < LevelJobMinimum) { session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("LOW_JOB_LVL"), 10)); return; } Inventory equip = session.Character.EquipmentList.LoadInventoryBySlotAndType(EquipmentSlot, InventoryType.Equipment); if (EquipmentSlot == (byte)EquipmentType.Amulet) { session.SendPacket(session.Character.GenerateEff(39)); inventory.ItemInstance.BoundCharacterId = session.Character.CharacterId; } if (equip == null) { session.Character.EquipmentList.AddToInventoryWithSlotAndType(inventory.ItemInstance as ItemInstance, InventoryType.Equipment, EquipmentSlot); session.SendPacket(session.Character.GenerateInventoryAdd(-1, 0, type, slot, 0, 0, 0, 0)); session.Character.InventoryList.DeleteFromSlotAndType(inventory.Slot, inventory.Type); session.SendPacket(session.Character.GenerateStatChar()); session.CurrentMap?.Broadcast(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.CurrentMap?.Broadcast(session.Character.GeneratePairy()); } else { session.Character.InventoryList.DeleteFromSlotAndType(inventory.Slot, inventory.Type); session.Character.EquipmentList.DeleteFromSlotAndType(equip.Slot, equip.Type); session.SendPacket(session.Character.GenerateInventoryAdd(-1, 0, type, slot, 0, 0, 0, 0)); session.Character.EquipmentList.AddToInventoryWithSlotAndType(inventory.ItemInstance as ItemInstance, InventoryType.Equipment, EquipmentSlot); session.Character.InventoryList.AddToInventoryWithSlotAndType(equip.ItemInstance as ItemInstance, type, slot); session.SendPacket(session.Character.GenerateInventoryAdd(equip.ItemInstance.ItemVNum, equip.ItemInstance.Amount, type, slot, equip.ItemInstance.Rare, equip.ItemInstance.Design, equip.ItemInstance.Upgrade, 0)); session.SendPacket(session.Character.GenerateStatChar()); session.CurrentMap?.Broadcast(session.Character.GenerateEq()); session.SendPacket(session.Character.GenerateEquipment()); session.CurrentMap?.Broadcast(session.Character.GeneratePairy()); } if (EquipmentSlot == (byte)EquipmentType.Fairy) { WearableInstance fairy = session.Character.EquipmentList.LoadBySlotAndType <WearableInstance>((byte)EquipmentType.Fairy, InventoryType.Equipment); session.SendPacket(session.Character.GenerateSay(String.Format(Language.Instance.GetMessageFromKey("FAIRYSTATS"), fairy.XP, CharacterHelper.LoadFairyXpData((fairy.ElementRate + fairy.Item.ElementRate))), 10)); } break; } }