public void HandlePacket(GameClient client, GSPacketIn packet) { uint x = packet.ReadInt(); uint y = packet.ReadInt(); ushort id = packet.ReadShort(); ushort item_slot = packet.ReadShort(); if (client.Player.TargetObject == null) { client.Out.SendMessage("You must select an NPC to sell to.", eChatType.CT_Merchant, eChatLoc.CL_SystemWindow); return; } lock (client.Player.Inventory) { InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)item_slot); if (item == null) return; int itemCount = Math.Max(1, item.Count); int packSize = Math.Max(1, item.PackSize); if (client.Player.TargetObject is GameMerchant) { //Let the merchant choos how to handle the trade. ((GameMerchant)client.Player.TargetObject).OnPlayerSell(client.Player, item); } else if (client.Player.TargetObject is GameLotMarker) { ((GameLotMarker)client.Player.TargetObject).OnPlayerSell(client.Player, item); } } }
public void HandlePacket(GameClient client, GSPacketIn packet) { uint X = packet.ReadInt(); uint Y = packet.ReadInt(); ushort id = packet.ReadShort(); ushort item_slot = packet.ReadShort(); new AppraiseActionHandler(client.Player, item_slot).Start(1); }
public void HandlePacket(GameClient client, GSPacketIn packet) { var groundX = (int) packet.ReadInt(); var groundY = (int) packet.ReadInt(); var groundZ = (int) packet.ReadInt(); ushort flag = packet.ReadShort(); // ushort unk2 = packet.ReadShort(); new ChangeGroundTargetHandler(client.Player, groundX, groundY, groundZ, flag).Start(1); }
public void HandlePacket(GameClient client, GSPacketIn packet) { // packet.Skip(10); uint playerX = packet.ReadInt(); uint playerY = packet.ReadInt(); int sessionId = packet.ReadShort(); ushort targetOid = packet.ReadShort(); //TODO: utilize these client-sent coordinates to possibly check for exploits which are spoofing position packets but not spoofing them everywhere new InteractActionHandler(client.Player, targetOid).Start(1); }
public void HandlePacket(GameClient client, GSPacketIn packet) { if (client.Player == null) return; int slot = packet.ReadByte(); int unk1 = packet.ReadByte(); ushort unk2 = packet.ReadShort(); uint price = packet.ReadInt(); GameConsignmentMerchant con = client.Player.ActiveConMerchant; House house = HouseMgr.GetHouse(con.HouseNumber); if (house == null) return; if (!house.HasOwnerPermissions(client.Player)) return; int dbSlot = (int)eInventorySlot.Consignment_First + slot; InventoryItem item = GameServer.Database.SelectObject<InventoryItem>("OwnerID = '" + client.Player.DBCharacter.ObjectId + "' AND SlotPosition = '" + dbSlot.ToString() + "'"); if (item != null) { item.SellPrice = (int)price; GameServer.Database.SaveObject(item); } else { client.Player.TempProperties.setProperty(NEW_PRICE, (int)price); } // another update required here,currently the player needs to reopen the window to see the price, thats why we msg him client.Out.SendMessage("New price set! (open the merchant window again to see the price)", eChatType.CT_System, eChatLoc.CL_SystemWindow); }
public void HandlePacket(GameClient client, GSPacketIn packet) { lock (this) { string dllName = packet.ReadString(16); packet.Position = 0x50; uint upTime = packet.ReadInt(); string text = string.Format("Client crash ({0}) dll:{1} clientUptime:{2}sec", client.ToString(), dllName, upTime); if (log.IsInfoEnabled) log.Info(text); if (log.IsDebugEnabled) { log.Debug("Last client sent/received packets (from older to newer):"); foreach (IPacket prevPak in client.PacketProcessor.GetLastPackets()) { log.Info(prevPak.ToHumanReadable()); } } //Eden if(client.Player!=null) { GamePlayer player = client.Player; client.Out.SendPlayerQuit(true); client.Player.SaveIntoDatabase(); client.Player.Quit(true); client.Disconnect(); } } }
/// <summary> /// Called when the packet has been received /// </summary> /// <param name="client">Client that sent the packet</param> /// <param name="packet">Packet data</param> /// <returns>Non zero if function was successfull</returns> public void HandlePacket(GameClient client, GSPacketIn packet) { packet.Skip(4); //Skip the first 4 bytes long pingDiff = (DateTime.Now.Ticks - client.PingTime)/1000; client.PingTime = DateTime.Now.Ticks; ulong timestamp = packet.ReadInt(); client.Out.SendPingReply(timestamp,packet.Sequence); }
public void HandlePacket(GameClient client, GSPacketIn packet) { if (client.Player == null) return; uint X = packet.ReadInt(); uint Y = packet.ReadInt(); ushort id = packet.ReadShort(); ushort item_slot = packet.ReadShort(); byte item_count = (byte)packet.ReadByte(); byte menu_id = (byte)packet.ReadByte(); switch ((eMerchantWindowType)menu_id) { case eMerchantWindowType.HousingInsideShop: case eMerchantWindowType.HousingOutsideShop: case eMerchantWindowType.HousingBindstoneHookpoint: case eMerchantWindowType.HousingCraftingHookpoint: case eMerchantWindowType.HousingNPCHookpoint: case eMerchantWindowType.HousingVaultHookpoint: { HouseMgr.BuyHousingItem(client.Player, item_slot, item_count, (eMerchantWindowType)menu_id); break; } default: { if (client.Player.TargetObject == null) return; //Forward the buy process to the merchant if (client.Player.TargetObject is GameMerchant) { //Let merchant choose what happens ((GameMerchant)client.Player.TargetObject).OnPlayerBuy(client.Player, item_slot, item_count); } else if (client.Player.TargetObject is GameLotMarker) { ((GameLotMarker)client.Player.TargetObject).OnPlayerBuy(client.Player, item_slot, item_count); } break; } } }
public void HandlePacket(GameClient client, GSPacketIn packet) { if (client.Player == null) return; uint X = packet.ReadInt(); uint Y = packet.ReadInt(); ushort id = (ushort)packet.ReadShort(); ushort obj = (ushort)packet.ReadShort(); GameObject target = client.Player.TargetObject; if (target == null) { client.Out.SendMessage(LanguageMgr.GetTranslation(client, "PlayerPickUpRequestHandler.HandlePacket.Target"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (target.ObjectState != GameObject.eObjectState.Active) { client.Out.SendMessage(LanguageMgr.GetTranslation(client, "PlayerPickUpRequestHandler.HandlePacket.InvalidTarget"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } client.Player.PickupObject(target, false); }
public void HandlePacket(GameClient client, GSPacketIn packet) { if (client == null || client.Player == null) return; int slot = packet.ReadByte(); int unk1 = packet.ReadByte(); ushort unk2 = packet.ReadShort(); uint price = packet.ReadInt(); // ChatUtil.SendDebugMessage(client.Player, "PlayerSetMarketPriceHandler"); // only IGameInventoryObjects can handle set price commands if (client.Player.TargetObject == null || (client.Player.TargetObject is IGameInventoryObject) == false) return; (client.Player.TargetObject as IGameInventoryObject).SetSellPrice(client.Player, (ushort)slot, price); }
public bool HandleCommand(TankMarryLogicProcessor process, GamePlayer player, GSPacketIn packet) { if (player.CurrentMarryRoom != null /* && player.CurrentMarryRoom.RoomState == eRoomState.FREE*/) { int userID = packet.ReadInt(); int templateID = packet.ReadInt(); ItemTemplateInfo template = ItemMgr.FindItemTemplate(templateID); if (template != null) { if (player.CurrentMarryRoom.Info.IsGunsaluteUsed == false && (player.CurrentMarryRoom.Info.GroomID == player.PlayerCharacter.ID || player.CurrentMarryRoom.Info.BrideID == player.PlayerCharacter.ID)) { player.CurrentMarryRoom.ReturnPacketForScene(player, packet); player.CurrentMarryRoom.Info.IsGunsaluteUsed = true; GSPacketIn msg = player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("GunsaluteCommand.Successed1", player.PlayerCharacter.NickName)); player.CurrentMarryRoom.SendToPlayerExceptSelfForScene(msg, player); GameServer.Instance.LoginServer.SendMarryRoomInfoToPlayer(player.CurrentMarryRoom.Info.GroomID, true, player.CurrentMarryRoom.Info); GameServer.Instance.LoginServer.SendMarryRoomInfoToPlayer(player.CurrentMarryRoom.Info.BrideID, true, player.CurrentMarryRoom.Info); using (PlayerBussiness db = new PlayerBussiness()) { db.UpdateMarryRoomInfo(player.CurrentMarryRoom.Info); } return(true); } //未开始 //if(template.PayType == 0) //{ // if(player.PlayerCharacter.Gold >= template.Price1) // { // player.RemoveGold(template.Price1, GoldRemoveType.Firecrackers); // CountBussiness.InsertSystemPayCount(player.PlayerCharacter.ID, 0, template.Price1, (int)eConsumerType.Marry, (int)eSubConsumerType.Marry_Gunsalute); // //0 player.CurrentMarryRoom.ReturnPacket(player, packet); // player.CurrentMarryRoom.ReturnPacketForScene(player, packet); // GSPacketIn msg = player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("GunsaluteCommand.Successed1", player.PlayerCharacter.NickName)); // player.CurrentMarryRoom.SendToPlayerExceptSelfForScene(msg, player); // return true; // } // else // { // player.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("GunsaluteCommand.GoldNotEnough")); // } //} //else //{ // if(player.PlayerCharacter.Money >= template.Price1) // { // player.RemoveMoney(template.Price1, MoneyRemoveType.Firecrackers); // CountBussiness.InsertSystemPayCount(player.PlayerCharacter.ID, template.Price1, 0, (int)eConsumerType.Marry, (int)eSubConsumerType.Marry_Gunsalute); // //0 player.CurrentMarryRoom.ReturnPacket(player, packet); // player.CurrentMarryRoom.ReturnPacketForScene(player, packet); // GSPacketIn msg = player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("GunsaluteCommand.Successed1", player.PlayerCharacter.NickName)); // player.CurrentMarryRoom.SendToPlayerExceptSelfForScene(msg, player); // return true; // } // else // { // player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("GunsaluteCommand.MoneyNotEnough")); // } //} } } return(false); }
public void HandlePacket(GameClient client, GSPacketIn packet) { if (client.Player == null) return; string filter = packet.ReadString(64); int slot = (int)packet.ReadInt(); int skill = (int)packet.ReadInt(); int resist = (int)packet.ReadInt(); int bonus = (int)packet.ReadInt(); int hp = (int)packet.ReadInt(); int power = (int)packet.ReadInt(); int proc = (int)packet.ReadInt(); int qtyMin = (int)packet.ReadInt(); int qtyMax = (int)packet.ReadInt(); int levelMin = (int)packet.ReadInt(); int levelMax = (int)packet.ReadInt(); int priceMin = (int)packet.ReadInt(); int priceMax = (int)packet.ReadInt(); int visual = (int)packet.ReadInt(); byte page = (byte)packet.ReadByte(); byte unk1 = (byte)packet.ReadByte(); short unk2 = (short)packet.ReadShort(); if(client.Version >= GameClient.eClientVersion.Version198) { // Dunnerholl 2009-07-28 Version 1.98 introduced new options to Market search. 12 Bytes were added, but only 7 are in usage so far in my findings. // update this, when packets change and keep in mind, that this code reflects only the 1.98 changes byte armorType = page; // page is now used for the armorType (still has to be logged, i just checked that 2 means leather, 0 = standard byte damageType = (byte)packet.ReadByte(); // 1=crush, 2=slash, 3=thrust // 3 bytes unused packet.Skip(3); byte playerCrafted = (byte)packet.ReadByte(); // 1 = show only Player crafted, 0 = all // 3 bytes unused packet.Skip(3); page = (byte)packet.ReadByte(); // page is now sent here byte unknown = (byte)packet.ReadByte(); // always been 0xE5, if u page it is 0x4B, tested on alb only byte unknown2 = (byte)packet.ReadByte(); //always been 0x12, if u page it is 0x7C, tested on alb only byte unknown3 = (byte)packet.ReadByte(); //always been 0x00, if u page it is 0x1B, tested on alb only } int requestedPage = (int)page; int firstSlot = 0 + (requestedPage * 20); int lastSlot = 19 + (requestedPage * 20); StringBuilder sql = new StringBuilder(); sql.Append("SlotPosition >= 1500 AND OwnerLot != 0 "); if (filter != null && filter != "") sql.Append(" AND Name LIKE '%" + filter + "%'"); #region Slot if (slot != -1) { switch (slot) { case 0: sql.Append(" AND Item_Type = '22'"); break; case 1: sql.Append(" AND Item_Type = '23'"); break; case 2: sql.Append(" AND Item_Type = '21'"); break; case 3: sql.Append(" AND Item_Type = '28'"); break; case 4: sql.Append(" AND Item_Type = '27'"); break; case 5: sql.Append(" AND Item_Type = '25'"); break; case 6: sql.Append(" AND Item_Type IN (35, 36)"); break; case 7: sql.Append(" AND Item_Type IN (33, 34)"); break; case 8: sql.Append(" AND Item_Type = '32'"); break; case 9: sql.Append(" AND Item_Type = '29'"); break; case 10: sql.Append(" AND Item_Type = '26'"); break; case 11: sql.Append(" AND Item_Type = '24'"); break; case 12: sql.Append(" AND Item_Type IN (10, 11)"); break; case 13: sql.Append(" AND Object_Type = '42'"); break; case 14: sql.Append(" AND Item_Type = '12'"); break; case 15: sql.Append(" AND Item_Type = '13'"); break; case 16: sql.Append(" AND Item_Type = '11'"); break; case 17: sql.Append(" AND Object_Type = '45'"); break; case 18: sql.Append(" AND (Item_Type = '0' OR Object_Type = '0')"); break; } } #endregion #region Bonus if (bonus > 0) sql.Append(" AND (Bonus >= '" + bonus + "')"); #endregion #region Price if (priceMax > 0 && priceMin < priceMax) sql.Append(" AND (SellPrice >= '" + priceMin + "' AND SellPrice <= '" + priceMax + "')"); #endregion #region Level if (levelMax > 0 && levelMin < levelMax) sql.Append(" AND (Level >= '" + levelMin + "' AND Level <= '" + levelMax + "')"); #endregion #region Visual Effect if (visual > 0) sql.Append(" AND (Effect > '0')"); #endregion #region Skill if (skill > 0) sql.Append(" AND (Bonus1Type = '" + skill + "' OR " + "Bonus2Type = '" + skill + "' OR " + "Bonus3Type = '" + skill + "' OR " + "Bonus4Type = '" + skill + "' OR " + "Bonus5Type = '" + skill + "' OR " + "Bonus6Type = '" + skill + "' OR " + "Bonus7Type = '" + skill + "' OR " + "Bonus8Type = '" + skill + "' OR " + "Bonus9Type = '" + skill + "' OR " + "Bonus10Type = '" + skill + "' OR " + "ExtraBonusType = '" + skill + "')"); #endregion #region Resist if(resist > 0) sql.Append(" AND (Bonus1Type = '" + resist + "' OR " + "Bonus2Type = '" + resist + "' OR " + "Bonus3Type = '" + resist + "' OR " + "Bonus4Type = '" + resist + "' OR " + "Bonus5Type = '" + resist + "' OR " + "Bonus6Type = '" + resist + "' OR " + "Bonus7Type = '" + resist + "' OR " + "Bonus8Type = '" + resist + "' OR " + "Bonus9Type = '" + resist + "' OR " + "Bonus10Type = '" + resist + "' OR " + "ExtraBonusType = '" + resist + "')"); #endregion #region Health if(hp > 0) sql.Append(" AND (Bonus1Type = '" + eProperty.MaxHealth + "' AND Bonus1 >= '" + hp + "' OR " + "Bonus2Type = '" + eProperty.MaxHealth + "' AND Bonus2 >= '" + hp + "' OR " + "Bonus3Type = '" + eProperty.MaxHealth + "' AND Bonus3 >= '" + hp + "' OR " + "Bonus4Type = '" + eProperty.MaxHealth + "' AND Bonus4 >= '" + hp + "' OR " + "Bonus5Type = '" + eProperty.MaxHealth + "' AND Bonus5 >= '" + hp + "' OR " + "Bonus6Type = '" + eProperty.MaxHealth + "' AND Bonus6 >= '" + hp + "' OR " + "Bonus7Type = '" + eProperty.MaxHealth + "' AND Bonus7 >= '" + hp + "' OR " + "Bonus8Type = '" + eProperty.MaxHealth + "' AND Bonus8 >= '" + hp + "' OR " + "Bonus9Type = '" + eProperty.MaxHealth + "' AND Bonus9 >= '" + hp + "' OR " + "Bonus10Type = '" + eProperty.MaxHealth + "' AND Bonus10 >= '" + hp + "' OR " + "ExtraBonusType = '" + eProperty.MaxHealth + "' AND ExtraBonus >= '" + hp + "')"); #endregion #region Power if(power > 0) sql.Append(" AND (Bonus1Type = '" + eProperty.MaxMana + "' AND Bonus1 >= '" + power + "' OR " + "Bonus2Type = '" + eProperty.MaxMana + "' AND Bonus2 >= '" + power + "' OR " + "Bonus3Type = '" + eProperty.MaxMana + "' AND Bonus3 >= '" + power + "' OR " + "Bonus4Type = '" + eProperty.MaxMana + "' AND Bonus4 >= '" + power + "' OR " + "Bonus5Type = '" + eProperty.MaxMana + "' AND Bonus5 >= '" + power + "' OR " + "Bonus6Type = '" + eProperty.MaxMana + "' AND Bonus6 >= '" + power + "' OR " + "Bonus7Type = '" + eProperty.MaxMana + "' AND Bonus7 >= '" + power + "' OR " + "Bonus8Type = '" + eProperty.MaxMana + "' AND Bonus8 >= '" + power + "' OR " + "Bonus9Type = '" + eProperty.MaxMana + "' AND Bonus9 >= '" + power + "' OR " + "Bonus10Type = '" + eProperty.MaxMana + "' AND Bonus10 >= '" + power + "' OR " + "ExtraBonusType = '" + eProperty.MaxMana + "' AND ExtraBonus >= '" + power + "')"); #endregion string qryString = GameServer.Database.Escape(sql.ToString()); var items = GameServer.Database.SelectObjects<InventoryItem>(qryString); int itemsOnPage = page < (int)Math.Ceiling((double)items.Count / 20) ? 20 : items.Count % 20; if (itemsOnPage > 0) { int itemCount = items.Count; int pageCount = (int)Math.Ceiling((double)itemCount / 20) - 1; client.Player.Out.SendMarketExplorerWindow(items, page, (byte)pageCount); client.Player.Out.SendMessage(itemsOnPage.ToString() + " Results found for page " + (page + 1) + ".", eChatType.CT_Important, eChatLoc.CL_ChatWindow); client.Player.TempProperties.removeProperty(EXPLORER_LIST); client.Player.TempProperties.setProperty(EXPLORER_LIST, items); } else client.Player.Out.SendMessage("No Items found", eChatType.CT_Important, eChatLoc.CL_ChatWindow); }
public override int HandlePacket(GamePlayer player, GSPacketIn packet) { SpaRoom room = null; string msg = ""; int id = packet.ReadInt(); string pwd = packet.ReadString(); if (id != 0) { room = SpaRoomMgr.GetSpaRoombyID(id, (pwd == null) ? "" : pwd, ref msg); } int result; if (room != null) { if (room.Count >= room.Spa_Room_Info.MaxCount) { player.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("SpaRoom.Msg1", new object[0])); } else { if (room.Spa_Room_Info.RoomType == 1) { if (player.PlayerCharacter.SpaPubGoldRoomLimit <= 0) { player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("SpaRoomLoginHandler.Failed", new object[0])); result = 0; return(result); } if (player.PlayerCharacter.IsInSpaPubGoldToday) { if (SpaRoomMgr.LoginSpaRoom(player, room, msg)) { result = 1; return(result); } result = 0; return(result); } } else { if (room.Spa_Room_Info.RoomType != 2) { result = 1; return(result); } if (player.PlayerCharacter.SpaPubMoneyRoomLimit <= 0) { player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("SpaRoomLoginHandler.Failed", new object[0])); result = 0; return(result); } if (player.PlayerCharacter.IsInSpaPubMoneyToday) { if (SpaRoomMgr.LoginSpaRoom(player, room, msg)) { result = 1; return(result); } result = 0; return(result); } } player.Out.SendSpaRoomLoginRemind(room); } } result = 0; return(result); }
public int HandlePacket(GameClient client, GSPacketIn packet) { packet.ReadInt(); return(0); }
public void HandlePacket(GameClient client, GSPacketIn packet) { if (client == null) return; uint extraID = 0; ushort objectType = packet.ReadShort(); if (client.Version >= GameClient.eClientVersion.Version186) extraID = packet.ReadInt(); ushort objectID = packet.ReadShort(); string caption = ""; var objectInfo = new List<string>(); /* Type Description Id 1 Inventory item Slot (ie. 0xC for 2 handed weapon) 2 Spell spell level + spell line ID * 100 (starting from 0) 3 ??? 4 Merchant item Slot (divide by 30 to get page) 5 Buff/effect The buff id (each buff has a unique id) 6 Style style list index = ID-100-abilities count 7 Trade window position in trade window (starting form 0) 8 Ability 100+position in players abilities list (?) 9 Trainers skill position in trainers window list 10 Market Search slot? 19 Reward Quest */ ChatUtil.SendDebugMessage(client, string.Format("Delve objectType={0}, objectID={1}, extraID={2}", objectType, objectID, extraID)); ItemTemplate item = null; InventoryItem invItem = null; switch (objectType) { #region Inventory Item case 1: //Display Infos on inventory item case 10: // market search { if (objectType == 1) { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem == null) { if (client.Player.ActiveConMerchant != null) { GameConsignmentMerchant con = client.Player.ActiveConMerchant; invItem = con.ConInventory[objectID]; if (invItem == null) return; } else if (client.Player.ActiveVault != null) { GameVault vault = client.Player.ActiveVault; invItem = vault.GetVaultInventory(client.Player)[objectID]; if (invItem == null) return; } else { return; } } } else if (objectType == 10) { List<InventoryItem> list = client.Player.TempProperties.getProperty<object>(DOL.GS.PacketHandler.Client.v168.PlayerMarketSearchRequestHandler.EXPLORER_LIST, null) as List<InventoryItem>; if (list == null) { list = client.Player.TempProperties.getProperty<object>("TempSearchKey", null) as List<InventoryItem>; if (list == null) return; } if (objectID >= list.Count) return; invItem = list[objectID]; if (invItem == null) return; } // Aredhel: Start of a more sophisticated item delve system. // The idea is to have every item inherit from an item base class, // this base class will provide a method // // public virtual void Delve(List<String>, GamePlayer player) // // which can be overridden in derived classes to provide additional // information. Same goes for spells, just add the spell delve // in the Delve() hierarchy. This will on one hand make this class // much more concise (1800 lines at the time of this writing) and // on the other hand the whole delve system much more flexible, for // example when adding new item types (artifacts, for example) you // provide *only* an overridden Delve() method, use the base // Delve() and you're done, spells, charges and everything else. // Let the player class create the appropriate item to delve caption = invItem.Name; if (client.Player.DelveItem<InventoryItem>(invItem, objectInfo)) break; #region Old Delve if (invItem is InventoryArtifact) { List<String> delve = new List<String>(); (invItem as InventoryArtifact).Delve(delve, client.Player); foreach (string line in delve) objectInfo.Add(line); break; } //********************************** //show crafter name //********************************** if (invItem.IsCrafted) { objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.CrafterName", invItem.Creator)); objectInfo.Add(" "); } else if (invItem.Description != null && invItem.Description != "") { objectInfo.Add(invItem.Description); objectInfo.Add(" "); } if ((invItem.Object_Type >= (int)eObjectType.GenericWeapon) && (invItem.Object_Type <= (int)eObjectType._LastWeapon) || invItem.Object_Type == (int)eObjectType.Instrument) { WriteUsableClasses(objectInfo, invItem, client); WriteMagicalBonuses(objectInfo, invItem, client, false); WriteClassicWeaponInfos(objectInfo, invItem, client); } if (invItem.Object_Type >= (int)eObjectType.Cloth && invItem.Object_Type <= (int)eObjectType.Scale) { WriteUsableClasses(objectInfo, invItem, client); WriteMagicalBonuses(objectInfo, invItem, client, false); WriteClassicArmorInfos(objectInfo, invItem, client); } if (invItem.Object_Type == (int)eObjectType.Shield) { WriteUsableClasses(objectInfo, invItem, client); WriteMagicalBonuses(objectInfo, invItem, client, false); WriteClassicShieldInfos(objectInfo, invItem, client); } if (invItem.Object_Type == (int)eObjectType.Magical || invItem.Object_Type == (int)eObjectType.AlchemyTincture || invItem.Object_Type == (int)eObjectType.SpellcraftGem) { WriteMagicalBonuses(objectInfo, invItem, client, false); } //*********************************** //shows info for Poison Potions //*********************************** if (invItem.Object_Type == (int)eObjectType.Poison) { WritePoisonInfo(objectInfo, invItem, client); } if (invItem.Object_Type == (int)eObjectType.Magical && invItem.Item_Type == (int)eInventorySlot.FirstBackpack) // potion { WritePotionInfo(objectInfo, invItem, client); } else if (invItem.CanUseEvery > 0) { // Items with a reuse timer (aka cooldown). objectInfo.Add(" "); int minutes = invItem.CanUseEvery / 60; int seconds = invItem.CanUseEvery % 60; if (minutes == 0) { objectInfo.Add(String.Format("Can use item every: {0} sec", seconds)); } else { objectInfo.Add(String.Format("Can use item every: {0}:{1:00} min", minutes, seconds)); } // objectInfo.Add(String.Format("Can use item every: {0:00}:{1:00}", minutes, seconds)); int cooldown = invItem.CanUseAgainIn; if (cooldown > 0) { minutes = cooldown / 60; seconds = cooldown % 60; if (minutes == 0) { objectInfo.Add(String.Format("Can use again in: {0} sec", seconds)); } else { objectInfo.Add(String.Format("Can use again in: {0}:{1:00} min", minutes, seconds)); } // objectInfo.Add(String.Format("Can use again in: {0:00}:{1:00}", minutes, seconds)); } } if (!invItem.IsDropable || !invItem.IsPickable || invItem.IsIndestructible) objectInfo.Add(" "); if (!invItem.IsPickable) objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.CannotTraded")); if (!invItem.IsDropable) objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.CannotSold")); if (invItem.IsIndestructible) objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.CannotDestroyed")); if (invItem.BonusLevel > 0) { objectInfo.Add(" "); objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.BonusLevel", invItem.BonusLevel)); } //Add admin info if (client.Account.PrivLevel > 1) { WriteTechnicalInfo(objectInfo, invItem); } break; #endregion Old Delve } #endregion #region Spell case 2: //spell { int lineID = objectID / 100; int spellID = objectID % 100; SpellLine spellLine = client.Player.GetSpellLines()[lineID] as SpellLine; if (spellLine == null) return; Spell spell = null; foreach (Spell spl in SkillBase.GetSpellList(spellLine.KeyName)) { if (spl.Level == spellID) { spell = spl; break; } } if (spell == null) return; caption = spell.Name; WriteSpellInfo(objectInfo, spell, spellLine, client); break; } case 3: //spell { IList skillList = client.Player.GetNonTrainableSkillList(); IList styles = client.Player.GetStyleList(); int index = objectID - skillList.Count - styles.Count - 100; List<SpellLine> spelllines = client.Player.GetSpellLines(); if (spelllines == null || index < 0) break; lock (client.Player.lockSpellLinesList) { Dictionary<string, KeyValuePair<Spell, SpellLine>> spelllist = client.Player.GetUsableSpells(spelllines, false); if (index >= spelllist.Count) { index -= spelllist.Count; } else { Dictionary<string, KeyValuePair<Spell, SpellLine>>.ValueCollection.Enumerator spellenum = spelllist.Values.GetEnumerator(); int i = 0; while (spellenum.MoveNext()) { if (i == index) { caption = spellenum.Current.Key.Name; WriteSpellInfo(objectInfo, spellenum.Current.Key, spellenum.Current.Value, client); break; } i++; } } } break; } #endregion #region Merchant / RewardQuest case 4: //Display Infos on Merchant objects case 19: //Display Info quest reward { if (objectType == 4) { GameMerchant merchant = null; if (client.Player.TargetObject != null && client.Player.TargetObject is GameMerchant) merchant = (GameMerchant)client.Player.TargetObject; if (merchant == null) return; int pagenumber = objectID / MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS; int slotnumber = objectID % MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS; item = merchant.TradeItems.GetItem(pagenumber, (eMerchantWindowSlot)slotnumber); } else if (objectType == 19) { ushort questID = (ushort)((extraID << 12) | (ushort)(objectID >> 4)); int index = objectID & 0x0F; GameLiving questGiver = null; if (client.Player.TargetObject != null && client.Player.TargetObject is GameLiving) questGiver = (GameLiving)client.Player.TargetObject; ChatUtil.SendDebugMessage(client, "Quest ID: " + questID); if (questID == 0) return; // questID == 0, wrong ID ? if (questID <= DataQuest.DATAQUEST_CLIENTOFFSET) { AbstractQuest q = client.Player.IsDoingQuest(QuestMgr.GetQuestTypeForID(questID)); if (q == null) { // player not doing quest, most likely on offer screen if (questGiver != null) { try { q = (AbstractQuest)Activator.CreateInstance(QuestMgr.GetQuestTypeForID(questID), new object[] { client.Player, 1 }); } catch { // we tried! } } if (q == null) { ChatUtil.SendDebugMessage(client, "Can't find or create quest!"); return; } } if (!(q is RewardQuest)) return; // this is not new quest List<ItemTemplate> rewards = null; if (index < 8) rewards = (q as RewardQuest).Rewards.BasicItems; else { rewards = (q as RewardQuest).Rewards.OptionalItems; index -= 8; } if (rewards != null && index >= 0 && index < rewards.Count) { item = rewards[index]; } } else // Data quest support, check for RewardQuest type { DataQuest dq = null; foreach (DBDataQuest d in GameObject.DataQuestCache) { if (d.ID == questID - DataQuest.DATAQUEST_CLIENTOFFSET) { dq = new DataQuest(d); break; } } if (dq != null && dq.StartType == DataQuest.eStartType.RewardQuest) { List<ItemTemplate> rewards = null; if (index < 8) rewards = dq.FinalRewards; else { rewards = dq.OptionalRewards; index -= 8; } if (rewards != null && index >= 0 && index < rewards.Count) { item = rewards[index]; } } } } if (item == null) return; caption = item.Name; if (client.Player.DelveItem<ItemTemplate>(item, objectInfo)) break; #region Old Delve // fallback to old delve if (item.Item_Type == (int)eInventorySlot.Horse) { WriteHorseInfo(objectInfo, item, client, ""); } if ((item.Item_Type == (int)eInventorySlot.HorseBarding || item.Item_Type == (int)eInventorySlot.HorseArmor) && item.Level > 0) { objectInfo.Add(" ");//empty line objectInfo.Add(" ");//empty line objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.ChampionLevel", item.Level)); } if ((item.Object_Type >= (int)eObjectType.GenericWeapon) && (item.Object_Type <= (int)eObjectType.MaulerStaff) || item.Object_Type == (int)eObjectType.Instrument) { WriteUsableClasses(objectInfo, item, client); WriteMagicalBonuses(objectInfo, item, client, false); WriteClassicWeaponInfos(objectInfo, GameInventoryItem.Create<ItemTemplate>(item), client); } if (item.Object_Type >= (int)eObjectType.Cloth && item.Object_Type <= (int)eObjectType.Scale) { WriteUsableClasses(objectInfo, item, client); WriteMagicalBonuses(objectInfo, item, client, false); WriteClassicArmorInfos(objectInfo, GameInventoryItem.Create<ItemTemplate>(item), client); } if (item.Object_Type == (int)eObjectType.Shield) { WriteUsableClasses(objectInfo, item, client); WriteMagicalBonuses(objectInfo, item, client, false); WriteClassicShieldInfos(objectInfo, item, client); } if ((item.Item_Type != (int)eInventorySlot.Horse && item.Object_Type == (int)eObjectType.Magical) || item.Object_Type == (int)eObjectType.AlchemyTincture || item.Object_Type == (int)eObjectType.SpellcraftGem) { WriteMagicalBonuses(objectInfo, item, client, false); } if (item.Object_Type == (int)eObjectType.Poison) { WritePoisonInfo(objectInfo, item, client); } if (item.Object_Type == (int)eObjectType.Magical && item.Item_Type == 40) // potion WritePotionInfo(objectInfo, item, client); //Add admin info if (client.Account.PrivLevel > 1) { WriteTechnicalInfo(objectInfo, GameInventoryItem.Create<ItemTemplate>(item), item.MaxDurability, item.MaxCondition); } break; #endregion Old Delve } #endregion #region Effect case 5: //icons on top (buffs/dots) { IGameEffect foundEffect = null; lock (client.Player.EffectList) { foreach (IGameEffect effect in client.Player.EffectList) { if (effect.InternalID == objectID) { foundEffect = effect; break; } } } if (foundEffect == null) break; caption = foundEffect.Name; objectInfo.AddRange(foundEffect.DelveInfo); if (client.Account.PrivLevel > 1 && foundEffect is GameSpellEffect) { if ((foundEffect as GameSpellEffect).Spell != null) { if (client.Account.PrivLevel > 1) { objectInfo.Add(" "); objectInfo.Add("----------Technical informations----------"); objectInfo.Add("Line: " + ((foundEffect as GameSpellEffect).SpellHandler == null ? "unknown" : (foundEffect as GameSpellEffect).SpellHandler.SpellLine.Name)); objectInfo.Add("SpellID: " + (foundEffect as GameSpellEffect).Spell.ID); objectInfo.Add("Type: " + (foundEffect as GameSpellEffect).Spell.SpellType); objectInfo.Add("ClientEffect: " + (foundEffect as GameSpellEffect).Spell.ClientEffect); objectInfo.Add("Icon: " + (foundEffect as GameSpellEffect).Spell.Icon); if ((foundEffect as GameSpellEffect).SpellHandler != null) objectInfo.Add("HasPositiveEffect: " + (foundEffect as GameSpellEffect).SpellHandler.HasPositiveEffect); } } } break; } #endregion #region Style case 6: //style { IList styleList = client.Player.GetStyleList(); IList skillList = client.Player.GetNonTrainableSkillList(); Style style = null; int styleID = objectID - skillList.Count - 100; if (styleID < 0 || styleID >= styleList.Count) break; style = styleList[styleID] as Style; if (style == null) break; caption = style.Name; WriteStyleInfo(objectInfo, style, client); break; } #endregion #region Trade Window case 7: //trade windows { ITradeWindow playerTradeWindow = client.Player.TradeWindow; if (playerTradeWindow == null) return; if (playerTradeWindow.PartnerTradeItems != null && objectID < playerTradeWindow.PartnerItemsCount) invItem = (InventoryItem)playerTradeWindow.PartnerTradeItems[objectID]; if (invItem == null) return; // Let the player class create the appropriate item to delve caption = invItem.Name; if (client.Player.DelveItem<InventoryItem>(invItem, objectInfo)) break; #region Old Delve // fallback to old delve if (invItem.Item_Type == (int)eInventorySlot.Horse) { WriteHorseInfo(objectInfo, invItem, client, ""); } if ((invItem.Item_Type == (int)eInventorySlot.HorseBarding || invItem.Item_Type == (int)eInventorySlot.HorseArmor) && invItem.Level > 0) { objectInfo.Add(" ");//empty line objectInfo.Add(" ");//empty line objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.ChampionLevel", invItem.Level)); } if ((invItem.Object_Type >= (int)eObjectType.GenericWeapon) && (invItem.Object_Type <= (int)eObjectType.MaulerStaff) || invItem.Object_Type == (int)eObjectType.Instrument) { WriteUsableClasses(objectInfo, invItem, client); WriteMagicalBonuses(objectInfo, invItem, client, false); WriteClassicWeaponInfos(objectInfo, invItem, client); } if (invItem.Object_Type >= (int)eObjectType.Cloth && invItem.Object_Type <= (int)eObjectType.Scale) { WriteUsableClasses(objectInfo, invItem, client); WriteMagicalBonuses(objectInfo, invItem, client, false); WriteClassicArmorInfos(objectInfo, invItem, client); } if (invItem.Object_Type == (int)eObjectType.Shield) { WriteUsableClasses(objectInfo, invItem, client); WriteMagicalBonuses(objectInfo, invItem, client, false); WriteClassicShieldInfos(objectInfo, invItem, client); } if ((invItem.Item_Type != (int)eInventorySlot.Horse && invItem.Object_Type == (int)eObjectType.Magical) || invItem.Object_Type == (int)eObjectType.AlchemyTincture || invItem.Object_Type == (int)eObjectType.SpellcraftGem) { WriteMagicalBonuses(objectInfo, invItem, client, false); } if (invItem.Object_Type == (int)eObjectType.Poison) { WritePoisonInfo(objectInfo, invItem, client); } if (invItem.Object_Type == (int)eObjectType.Magical && invItem.Item_Type == 40) // potion WritePotionInfo(objectInfo, invItem, client); //Add admin info if (client.Account.PrivLevel > 1) { WriteTechnicalInfo(objectInfo, invItem); } break; #endregion Old Delve } #endregion #region Ability case 8://abilities { int id = objectID - 100; IList skillList = client.Player.GetNonTrainableSkillList(); Ability abil = (Ability)skillList[id]; if (abil != null) { IList allabilitys = client.Player.GetAllAbilities(); foreach (Ability checkab in allabilitys) { if (checkab.Name == abil.Name) { if (checkab.DelveInfo.Count > 0) objectInfo.AddRange(checkab.DelveInfo); else objectInfo.Add("There is no special information."); } } } break; } #endregion #region Trainer case 9: //trainer window "info" button { IList specList = client.Player.GetSpecList(); Specialization spec; if (objectID < specList.Count) { spec = (Specialization)specList[objectID]; } else { //delve on realm abilities [by Suncheck] if (objectID >= 50) { int clientclassID = client.Player.CharacterClass.ID; int sub = 50; List<RealmAbility> ra_list = SkillBase.GetClassRealmAbilities(clientclassID); Ability ra5abil = SkillBase.getClassRealmAbility(clientclassID); RealmAbility ab = ra_list[objectID - sub]; if (ra5abil != null) //check if player have rr { if (client.Player.RealmPoints < 513500) //player have not rr5 abilty sub--; } for (int i = 0; i <= (objectID - sub); i++) //get all ra's at full level { RealmAbility raabil = ra_list[i]; RealmAbility playerra = (RealmAbility)client.Player.GetAbility(raabil.KeyName); if (playerra != null) if (playerra.Level >= playerra.MaxLevel) sub--; } ab = ra_list[objectID - sub]; if (ab != null) { caption = ab.Name; objectInfo.AddRange(ab.DelveInfo); break; } } caption = "Specialization not found"; objectInfo.Add("that specialization is not found, id=" + objectID); break; } List<Style> styles = SkillBase.GetStyleList(spec.KeyName, client.Player.CharacterClass.ID); IList playerSpells = client.Player.GetSpellLines(); SpellLine selectedSpellLine = null; lock (playerSpells.SyncRoot) { foreach (SpellLine line in playerSpells) { if (!line.IsBaseLine && line.Spec == spec.KeyName) { selectedSpellLine = line; break; } } } List<Spell> spells = new List<Spell>(); if (selectedSpellLine != null) spells = SkillBase.GetSpellList(selectedSpellLine.KeyName); caption = spec.Name; if (styles.Count <= 0 && playerSpells.Count <= 0) { objectInfo.Add("no info found for this spec"); break; } objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.LevName")); foreach (Style style in styles) { objectInfo.Add(style.Level + ": " + style.Name); } foreach (Spell spell in spells) { objectInfo.Add(spell.Level + ": " + spell.Name); } break; } #endregion #region Group case 12: // Item info to Group Chat { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem == null) return; string str = LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.Item", client.Player.Name, GetShortItemInfo(invItem, client)); if (client.Player.Group == null) { client.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.NoGroup"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } client.Player.Group.SendMessageToGroupMembers(str, eChatType.CT_Group, eChatLoc.CL_ChatWindow); return; } #endregion #region Guild case 13: // Item info to Guild Chat { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem == null) return; string str = LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.GuildItem", client.Player.Name, GetShortItemInfo(invItem, client)); if (client.Player.Guild == null) { client.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.DontBelongGuild"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (!client.Player.Guild.HasRank(client.Player, Guild.eRank.GcSpeak)) { client.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.NoPermissionToSpeak"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } foreach (GamePlayer ply in client.Player.Guild.GetListOfOnlineMembers()) { if (!client.Player.Guild.HasRank(ply, Guild.eRank.GcHear)) continue; ply.Out.SendMessage(str, eChatType.CT_Guild, eChatLoc.CL_ChatWindow); } return; } #endregion #region ChatGroup case 15: // Item info to Chat group { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem == null) return; ChatGroup mychatgroup = (ChatGroup)client.Player.TempProperties.getProperty<object>(ChatGroup.CHATGROUP_PROPERTY, null); if (mychatgroup == null) { client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.MustBeInChatGroup"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (mychatgroup.Listen == true && (((bool)mychatgroup.Members[client.Player]) == false)) { client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.OnlyModerator"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } string str = LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.ChatItem", client.Player.Name, GetShortItemInfo(invItem, client)); foreach (GamePlayer ply in mychatgroup.Members.Keys) { ply.Out.SendMessage(str, eChatType.CT_Chat, eChatLoc.CL_ChatWindow); } return; } #endregion #region Trainer Window //styles case 20: { Style style = SkillBase.GetStyleByID((int)objectID, client.Player.CharacterClass.ID); if (style == null) return; caption = style.Name; WriteStyleInfo(objectInfo, style, client); break; } //spells case 22: { Spell spell = SkillBase.GetSpellByID((int)objectID); if (spell == null) return; caption = spell.Name; WriteSpellInfo(objectInfo, spell, SkillBase.GetSpellLine(GlobalSpellsLines.Reserved_Spells), client); break; } #endregion #region Repair case 100://repair { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem != null) { client.Player.RepairItem(invItem); } else { client.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.VeryStrange"), eChatType.CT_System, eChatLoc.CL_SystemWindow); } return; } #endregion #region Self Craft case 101://selfcraft { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem != null) { client.Player.OpenSelfCraft(invItem); } else { client.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.VeryStrange"), eChatType.CT_System, eChatLoc.CL_SystemWindow); } return; } #endregion #region Salvage case 102://salvage { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem != null) { client.Player.SalvageItem(invItem); } else { client.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.VeryStrange"), eChatType.CT_System, eChatLoc.CL_SystemWindow); } return; } #endregion #region BattleGroup case 103: // Item info to battle group { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem == null) return; BattleGroup mybattlegroup = (BattleGroup)client.Player.TempProperties.getProperty<object>(BattleGroup.BATTLEGROUP_PROPERTY, null); if (mybattlegroup == null) { client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.MustBeInBattleGroup"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (mybattlegroup.Listen == true && (((bool)mybattlegroup.Members[client.Player]) == false)) { client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.OnlyModerator"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } string str = LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.ChatItem", client.Player.Name, GetShortItemInfo(invItem, client)); foreach (GamePlayer ply in mybattlegroup.Members.Keys) { ply.Out.SendMessage(str, eChatType.CT_Chat, eChatLoc.CL_ChatWindow); } return; } #endregion #region ChampionAbilities delve from trainer window default: { // Try and handle all Champion lines, including custom lines ChampSpec spec = ChampSpecMgr.GetAbilityFromIndex(objectType - 150, objectID / 256 + 1, objectID % 256 + 1); if (spec != null) { Spell spell = SkillBase.GetSpellByID(spec.SpellID); if (spell != null) { SpellLine spellLine = client.Player.GetChampionSpellLine(); if (spellLine != null) { caption = spell.Name; WriteSpellInfo(objectInfo, spell, spellLine, client); } else { objectInfo.Add("Champion spell line not found!"); } } } break; } #endregion } if (objectInfo.Count > 0) { client.Out.SendCustomTextWindow(caption, objectInfo); } else { log.WarnFormat("DetailDisplayHandler no info for objectID {0} of type {1}. Item: {2}, client: {3}", objectID, objectType, (item == null ? (invItem == null ? "null" : invItem.Id_nb) : item.Id_nb), client); } }
public int HandlePacket(GameClient client, GSPacketIn packet) { int num = packet.ReadInt(); int num2 = packet.ReadInt(); bool val = false; GSPacketIn gSPacketIn = new GSPacketIn(193, client.Player.PlayerCharacter.ID); string translateId = "AuctionUpdateHandler.Fail"; if (client.Player.PlayerCharacter.HasBagPassword && client.Player.PlayerCharacter.IsLocked) { client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("Bag.Locked", new object[0])); return(0); } using (PlayerBussiness playerBussiness = new PlayerBussiness()) { AuctionInfo auctionSingle = playerBussiness.GetAuctionSingle(num); if (auctionSingle == null) { translateId = "AuctionUpdateHandler.Msg1"; } else { if (auctionSingle.PayType == 0 && num2 > client.Player.PlayerCharacter.Gold) { translateId = "AuctionUpdateHandler.Msg2"; } else { if (auctionSingle.PayType == 1 && num2 > client.Player.PlayerCharacter.Money) { translateId = "AuctionUpdateHandler.Msg3"; } else { if (auctionSingle.BuyerID == 0 && auctionSingle.Price > num2) { translateId = "AuctionUpdateHandler.Msg4"; } else { if (auctionSingle.BuyerID != 0 && auctionSingle.Price + auctionSingle.Rise > num2 && (auctionSingle.Mouthful == 0 || auctionSingle.Mouthful > num2)) { translateId = "AuctionUpdateHandler.Msg5"; } else { int buyerID = auctionSingle.BuyerID; auctionSingle.BuyerID = client.Player.PlayerCharacter.ID; auctionSingle.BuyerName = client.Player.PlayerCharacter.NickName; auctionSingle.Price = num2; if (auctionSingle.Mouthful != 0 && num2 >= auctionSingle.Mouthful) { auctionSingle.Price = auctionSingle.Mouthful; auctionSingle.IsExist = false; } if (playerBussiness.UpdateAuction(auctionSingle)) { if (auctionSingle.PayType == 0) { client.Player.RemoveGold(auctionSingle.Price); } else { client.Player.RemoveMoney(auctionSingle.Price); LogMgr.LogMoneyAdd(LogMoneyType.Auction, LogMoneyType.Auction_Update, client.Player.PlayerCharacter.ID, auctionSingle.Price, client.Player.PlayerCharacter.Money, 0, 0, 0, 0, "", "", ""); } if (auctionSingle.IsExist) { translateId = "AuctionUpdateHandler.Msg6"; } else { translateId = "AuctionUpdateHandler.Msg7"; client.Out.SendMailResponse(auctionSingle.AuctioneerID, eMailRespose.Receiver); client.Out.SendMailResponse(auctionSingle.BuyerID, eMailRespose.Receiver); } if (buyerID != 0) { client.Out.SendMailResponse(buyerID, eMailRespose.Receiver); } val = true; } } } } } } client.Out.SendAuctionRefresh(auctionSingle, num, auctionSingle != null && auctionSingle.IsExist, null); client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation(translateId, new object[0])); } gSPacketIn.WriteBoolean(val); gSPacketIn.WriteInt(num); client.Out.SendTCP(gSPacketIn); return(0); }
public bool HandleCommand(TankHotSpringLogicProcessor process, GamePlayer player, GSPacketIn packet) { if (player.CurrentHotSpringRoom == null) { return(false); } if ((player.PlayerCharacter.ID != player.CurrentHotSpringRoom.Info.GroomID) && (player.PlayerCharacter.ID != player.CurrentHotSpringRoom.Info.playerID)) { return(false); } int time = packet.ReadInt(); string[] strArray = GameProperties.PRICE_MARRY_ROOM.Split(new char[] { ',' }); if (strArray.Length < 3) { if (log.IsErrorEnabled) { log.Error("HotSpringRoomCreateMoney node in configuration file is wrong"); } return(false); } int num2 = 0; switch (time) { case 2: num2 = int.Parse(strArray[0]); break; case 3: num2 = int.Parse(strArray[1]); break; case 4: num2 = int.Parse(strArray[2]); break; default: num2 = int.Parse(strArray[2]); time = 4; break; } if (player.PlayerCharacter.Money < num2) { player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("MarryApplyHandler.Msg1", new object[0])); return(false); } player.RemoveMoney(num2); //LogMgr.LogMoneyAdd(LogMoneyType.Marry, LogMoneyType.Marry_RoomAdd, player.PlayerCharacter.ID, num2, player.PlayerCharacter.Money, 0, 0, 0, "", "", ""); CountBussiness.InsertSystemPayCount(player.PlayerCharacter.ID, num2, 0, 0, 6); player.CurrentHotSpringRoom.RoomContinuation(time); GSPacketIn pkg = player.Out.SendContinuation(player, player.CurrentHotSpringRoom.Info); int playerId = 0; if (player.PlayerCharacter.ID == player.CurrentHotSpringRoom.Info.GroomID) { playerId = player.CurrentHotSpringRoom.Info.playerID; } else { playerId = player.CurrentHotSpringRoom.Info.GroomID; } GamePlayer playerById = WorldMgr.GetPlayerById(playerId); if (playerById != null) { playerById.Out.SendTCP(pkg); } player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("ContinuationCommand.Successed")); return(true); }
public override int HandlePacket(GamePlayer player, GSPacketIn packet) { MarryRoom room = null; string msg = ""; int id = packet.ReadInt(); string pwd = packet.ReadString(); int sceneID = packet.ReadInt(); int result; if (id != 0) { room = MarryRoomMgr.GetMarryRoombyID(id, (pwd == null) ? "" : pwd, ref msg); } else { if (player.PlayerCharacter.IsCreatedMarryRoom) { MarryRoom[] rooms = MarryRoomMgr.GetAllMarryRoom(); MarryRoom[] array = rooms; for (int i = 0; i < array.Length; i++) { MarryRoom r = array[i]; if (r.Info.GroomID == player.PlayerCharacter.ID || r.Info.BrideID == player.PlayerCharacter.ID) { room = r; break; } } } if (room == null && player.PlayerCharacter.SelfMarryRoomID != 0) { player.Out.SendMarryRoomLogin(player, false); MarryRoomInfo info = null; using (PlayerBussiness db = new PlayerBussiness()) { info = db.GetMarryRoomInfoSingle(player.PlayerCharacter.SelfMarryRoomID); } if (info != null) { player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("MarryRoomLoginHandler.RoomExist", new object[] { info.ServerID, player.PlayerCharacter.SelfMarryRoomID })); result = 0; return(result); } } } if (room != null) { if (room.CheckUserForbid(player.PlayerCharacter.ID)) { player.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("MarryRoomLoginHandler.Forbid", new object[0])); player.Out.SendMarryRoomLogin(player, false); result = 1; return(result); } if (room.RoomState == eRoomState.FREE) { if (room.AddPlayer(player)) { player.MarryMap = sceneID; GSPacketIn pkg = player.Out.SendMarryRoomLogin(player, true); room.SendMarryRoomInfoUpdateToScenePlayers(room); result = 0; return(result); } } else { player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("MarryRoomLoginHandler.AlreadyBegin", new object[0])); } player.Out.SendMarryRoomLogin(player, false); } else { player.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation(string.IsNullOrEmpty(msg) ? "MarryRoomLoginHandler.Failed" : msg, new object[0])); player.Out.SendMarryRoomLogin(player, false); } result = 1; return(result); }
public int HandlePacket(GameClient client, GSPacketIn packet) { int num = packet.ReadInt(); byte b = packet.ReadByte(); List <int> list = new List <int>(); string text = ""; eMessageType type = eMessageType.Normal; if (client.Player.PlayerCharacter.HasBagPassword && client.Player.PlayerCharacter.IsLocked) { client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("Bag.Locked", new object[0])); return(0); } GSPacketIn gSPacketIn = new GSPacketIn(113, client.Player.PlayerCharacter.ID); using (PlayerBussiness playerBussiness = new PlayerBussiness()) { MailInfo mailSingle = playerBussiness.GetMailSingle(client.Player.PlayerCharacter.ID, num); if (mailSingle != null) { bool flag = true; int money = mailSingle.Money; GamePlayer playerById = WorldMgr.GetPlayerById(mailSingle.ReceiverID); if (mailSingle.Type > 100 && mailSingle.Money > client.Player.PlayerCharacter.Money) { client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("MailGetAttachHandler.NoMoney", new object[0])); return(0); } if (!mailSingle.IsRead) { mailSingle.IsRead = true; mailSingle.ValidDate = 72; mailSingle.SendTime = DateTime.Now; } if (flag && (b == 0 || b == 1) && !string.IsNullOrEmpty(mailSingle.Annex1) && this.GetAnnex(mailSingle.Annex1, client.Player, ref text, ref flag, ref type)) { list.Add(1); mailSingle.Annex1 = null; } if (flag && (b == 0 || b == 2) && !string.IsNullOrEmpty(mailSingle.Annex2) && this.GetAnnex(mailSingle.Annex2, client.Player, ref text, ref flag, ref type)) { list.Add(2); mailSingle.Annex2 = null; } if (flag && (b == 0 || b == 3) && !string.IsNullOrEmpty(mailSingle.Annex3) && this.GetAnnex(mailSingle.Annex3, client.Player, ref text, ref flag, ref type)) { list.Add(3); mailSingle.Annex3 = null; } if (flag && (b == 0 || b == 4) && !string.IsNullOrEmpty(mailSingle.Annex4) && this.GetAnnex(mailSingle.Annex4, client.Player, ref text, ref flag, ref type)) { list.Add(4); mailSingle.Annex4 = null; } if (flag && (b == 0 || b == 5) && !string.IsNullOrEmpty(mailSingle.Annex5) && this.GetAnnex(mailSingle.Annex5, client.Player, ref text, ref flag, ref type)) { list.Add(5); mailSingle.Annex5 = null; } if ((b == 0 || b == 6) && mailSingle.Gold > 0) { list.Add(6); playerById.AddGold(mailSingle.Gold); mailSingle.Gold = 0; } if ((b == 0 || b == 7) && mailSingle.Type < 100 && mailSingle.Money > 0) { list.Add(7); playerById.AddMoney(mailSingle.Money); LogMgr.LogMoneyAdd(LogMoneyType.Mail, LogMoneyType.Mail_Money, playerById.PlayerCharacter.ID, mailSingle.Money, playerById.PlayerCharacter.Money, 0, 0, 0, 0, "", "", ""); mailSingle.Money = 0; } if (mailSingle.Type > 100 && mailSingle.GiftToken > 0) { list.Add(8); playerById.AddGiftToken(mailSingle.GiftToken); mailSingle.GiftToken = 0; } if (mailSingle.Type > 100 && mailSingle.Money > 0) { mailSingle.Money = 0; text = LanguageMgr.GetTranslation("MailGetAttachHandler.Deduct", new object[0]) + (string.IsNullOrEmpty(text) ? LanguageMgr.GetTranslation("MailGetAttachHandler.Success", new object[0]) : text); } if (playerBussiness.UpdateMail(mailSingle, money) && mailSingle.Type > 100 && money > 0) { playerById.RemoveMoney(money); LogMgr.LogMoneyAdd(LogMoneyType.Mail, LogMoneyType.Mail_Pay, client.Player.PlayerCharacter.ID, money, client.Player.PlayerCharacter.Money, 0, 0, 0, 0, "", "", ""); client.Out.SendMailResponse(mailSingle.SenderID, eMailRespose.Receiver); client.Out.SendMailResponse(mailSingle.ReceiverID, eMailRespose.Send); } gSPacketIn.WriteInt(num); gSPacketIn.WriteInt(list.Count); foreach (int current in list) { gSPacketIn.WriteInt(current); } client.Out.SendTCP(gSPacketIn); client.Out.SendMessage(type, string.IsNullOrEmpty(text) ? LanguageMgr.GetTranslation("MailGetAttachHandler.Success", new object[0]) : text); } else { client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("MailGetAttachHandler.Falied", new object[0])); } } return(0); }
public void HandlePacket(GameClient client, GSPacketIn packet) { if (client == null) { return; } string ipAddress = client.TcpEndpointAddress; byte major; byte minor; byte build; string password; string userName; /// <summary> /// Packet Format Change above 1.115 /// </summary> if (client.Version < GameClient.eClientVersion.Version1115) { packet.Skip(2); //Skip the client_type byte major = (byte)packet.ReadByte(); minor = (byte)packet.ReadByte(); build = (byte)packet.ReadByte(); password = packet.ReadString(20); bool v174; //the logger detection we had is no longer working //bool loggerUsing = false; switch (client.Version) { case GameClient.eClientVersion.Version168: case GameClient.eClientVersion.Version169: case GameClient.eClientVersion.Version170: case GameClient.eClientVersion.Version171: case GameClient.eClientVersion.Version172: case GameClient.eClientVersion.Version173: v174 = false; break; default: v174 = true; break; } if (v174) { packet.Skip(11); } else { packet.Skip(7); } uint c2 = packet.ReadInt(); uint c3 = packet.ReadInt(); uint c4 = packet.ReadInt(); if (v174) { packet.Skip(27); } else { packet.Skip(31); } userName = packet.ReadString(20); } else if (client.Version < GameClient.eClientVersion.Version1126) // 1.125+ only // we support 1.109 and 1.125+ only { // client type packet.Skip(1); //version major = (byte)packet.ReadByte(); minor = (byte)packet.ReadByte(); build = (byte)packet.ReadByte(); // revision packet.Skip(1); // build packet.Skip(2); if (client.Version <= GameClient.eClientVersion.Version1124) { userName = packet.ReadShortPascalStringLowEndian(); password = packet.ReadShortPascalStringLowEndian(); } else { userName = packet.ReadIntPascalStringLowEndian(); password = packet.ReadIntPascalStringLowEndian(); } } else { userName = packet.ReadIntPascalStringLowEndian(); password = packet.ReadIntPascalStringLowEndian(); } /* * if (c2 == 0 && c3 == 0x05000000 && c4 == 0xF4000000) * { * loggerUsing = true; * Log.Warn("logger detected (" + username + ")"); * }*/ // check server status if (GameServer.Instance.ServerStatus == eGameServerStatus.GSS_Closed) { client.IsConnected = false; client.Out.SendLoginDenied(eLoginError.GameCurrentlyClosed); Log.Info(ipAddress + " disconnected because game is closed!"); GameServer.Instance.Disconnect(client); return; } // check connection allowed with serverrules try { if (!GameServer.ServerRules.IsAllowedToConnect(client, userName)) { if (Log.IsInfoEnabled) { Log.Info(ipAddress + " disconnected because IsAllowedToConnect returned false!"); } GameServer.Instance.Disconnect(client); return; } } catch (Exception e) { if (Log.IsErrorEnabled) { Log.Error("Error shutting down Client after IsAllowedToConnect failed!", e); } } // Handle connection EnterLock(userName); try { Account playerAccount; // Make sure that client won't quit lock (client) { GameClient.eClientState state = client.ClientState; if (state != GameClient.eClientState.NotConnected) { Log.DebugFormat("wrong client state on connect {0} {1}", userName, state.ToString()); return; } if (Log.IsInfoEnabled) { Log.Info(string.Format("({0})User {1} logging on! ({2} type:{3} add:{4})", ipAddress, userName, client.Version, (client.ClientType), client.ClientAddons.ToString("G"))); } // check client already connected GameClient findclient = WorldMgr.GetClientByAccountName(userName, true); if (findclient != null) { client.IsConnected = false; if (findclient.ClientState == GameClient.eClientState.Connecting) { if (Log.IsInfoEnabled) { Log.Info("User is already connecting, ignored."); } client.Out.SendLoginDenied(eLoginError.AccountAlreadyLoggedIn); return; } // in login if (findclient.ClientState == GameClient.eClientState.Linkdead) { if (Log.IsInfoEnabled) { Log.Info("User is still being logged out from linkdeath!"); } client.Out.SendLoginDenied(eLoginError.AccountIsInLogoutProcedure); } else { if (Log.IsInfoEnabled) { Log.Info("User already logged in!"); } client.Out.SendLoginDenied(eLoginError.AccountAlreadyLoggedIn); } GameServer.Instance.Disconnect(client); return; } Regex goodName = new Regex("^[a-zA-Z0-9]*$"); if (!goodName.IsMatch(userName) || string.IsNullOrWhiteSpace(userName)) { if (Log.IsInfoEnabled) { Log.Info("Invalid symbols in account name \"" + userName + "\" found!"); } client.IsConnected = false; if (client != null && client.Out != null) { client.Out.SendLoginDenied(eLoginError.AccountInvalid); } else { Log.Warn("Client or Client.Out null on invalid name failure. Disconnecting."); } GameServer.Instance.Disconnect(client); return; } else { playerAccount = GameServer.Database.FindObjectByKey <Account>(userName); client.PingTime = DateTime.Now.Ticks; if (playerAccount == null) { //check autocreate ... if (GameServer.Instance.Configuration.AutoAccountCreation && Properties.ALLOW_AUTO_ACCOUNT_CREATION) { // autocreate account if (string.IsNullOrEmpty(password)) { client.IsConnected = false; client.Out.SendLoginDenied(eLoginError.AccountInvalid); GameServer.Instance.Disconnect(client); if (Log.IsInfoEnabled) { Log.Info("Account creation failed, no password set for Account: " + userName); } return; } // check for account bombing TimeSpan ts; var allAccByIp = DOLDB <Account> .SelectObjects(DB.Column("LastLoginIP").IsEqualTo(ipAddress)); int totalacc = 0; foreach (Account ac in allAccByIp) { ts = DateTime.Now - ac.CreationDate; if (ts.TotalMinutes < Properties.TIME_BETWEEN_ACCOUNT_CREATION_SAMEIP && totalacc > 1) { Log.Warn("Account creation: too many from same IP within set minutes - " + userName + " : " + ipAddress); client.IsConnected = false; client.Out.SendLoginDenied(eLoginError.PersonalAccountIsOutOfTime); GameServer.Instance.Disconnect(client); return; } totalacc++; } if (totalacc >= Properties.TOTAL_ACCOUNTS_ALLOWED_SAMEIP) { Log.Warn("Account creation: too many accounts created from same ip - " + userName + " : " + ipAddress); client.IsConnected = false; client.Out.SendLoginDenied(eLoginError.AccountNoAccessThisGame); GameServer.Instance.Disconnect(client); return; } // per timeslice - for preventing account bombing via different ip if (Properties.TIME_BETWEEN_ACCOUNT_CREATION > 0) { ts = DateTime.Now - m_lastAccountCreateTime; if (ts.TotalMinutes < Properties.TIME_BETWEEN_ACCOUNT_CREATION) { Log.Warn("Account creation: time between account creation too small - " + userName + " : " + ipAddress); client.IsConnected = false; client.Out.SendLoginDenied(eLoginError.PersonalAccountIsOutOfTime); GameServer.Instance.Disconnect(client); return; } } m_lastAccountCreateTime = DateTime.Now; playerAccount = new Account(); playerAccount.Name = userName; playerAccount.Password = CryptPassword(password); playerAccount.Realm = 0; playerAccount.CreationDate = DateTime.Now; playerAccount.LastLogin = DateTime.Now; playerAccount.LastLoginIP = ipAddress; playerAccount.LastClientVersion = ((int)client.Version).ToString(); playerAccount.Language = Properties.SERV_LANGUAGE; playerAccount.PrivLevel = 1; if (Log.IsInfoEnabled) { Log.Info("New account created: " + userName); } GameServer.Database.AddObject(playerAccount); // Log account creation AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.AccountCreate, "", userName); } else { if (Log.IsInfoEnabled) { Log.Info("No such account found and autocreation deactivated!"); } client.IsConnected = false; client.Out.SendLoginDenied(eLoginError.AccountNotFound); GameServer.Instance.Disconnect(client); return; } } else { // check password if (!playerAccount.Password.StartsWith("##")) { playerAccount.Password = CryptPassword(playerAccount.Password); } if (!CryptPassword(password).Equals(playerAccount.Password)) { if (Log.IsInfoEnabled) { Log.Info("(" + client.TcpEndpoint + ") Wrong password!"); } client.IsConnected = false; client.Out.SendLoginDenied(eLoginError.WrongPassword); // Log failure AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.AccountFailedLogin, "", userName); GameServer.Instance.Disconnect(client); return; } // save player infos playerAccount.LastLogin = DateTime.Now; playerAccount.LastLoginIP = ipAddress; playerAccount.LastClientVersion = ((int)client.Version).ToString(); if (string.IsNullOrEmpty(playerAccount.Language)) { playerAccount.Language = Properties.SERV_LANGUAGE; } GameServer.Database.SaveObject(playerAccount); } } //Save the account table client.Account = playerAccount; // create session ID here to disable double login bug if (WorldMgr.CreateSessionID(client) < 0) { if (Log.IsInfoEnabled) { Log.InfoFormat("Too many clients connected, denied login to " + playerAccount.Name); } client.IsConnected = false; client.Out.SendLoginDenied(eLoginError.TooManyPlayersLoggedIn); client.Disconnect(); return; } client.Out.SendLoginGranted(); client.ClientState = GameClient.eClientState.Connecting; // Log entry AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.AccountSuccessfulLogin, "", userName); } } catch (DatabaseException e) { if (Log.IsErrorEnabled) { Log.Error("LoginRequestHandler", e); } client.IsConnected = false; client.Out.SendLoginDenied(eLoginError.CannotAccessUserAccount); GameServer.Instance.Disconnect(client); } catch (Exception e) { if (Log.IsErrorEnabled) { Log.Error("LoginRequestHandler", e); } client.Out.SendLoginDenied(eLoginError.CannotAccessUserAccount); GameServer.Instance.Disconnect(client); } finally { ExitLock(userName); } }
public int HandlePacket(GameClient client, GSPacketIn packet) { if (!client.Player.PlayerCharacter.IsMarried) { return(1); } if (client.Player.PlayerCharacter.IsCreatedMarryRoom) { return(1); } if (client.Player.PlayerCharacter.HasBagPassword && client.Player.PlayerCharacter.IsLocked) { client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("Bag.Locked", new object[0])); return(0); } if (client.Player.CurrentRoom != null) { client.Player.CurrentRoom.RemovePlayerUnsafe(client.Player); } if (client.Player.CurrentMarryRoom != null) { client.Player.CurrentMarryRoom.RemovePlayer(client.Player); } MarryRoomInfo marryRoomInfo = new MarryRoomInfo(); marryRoomInfo.Name = packet.ReadString().Replace(";", ""); marryRoomInfo.Pwd = packet.ReadString(); marryRoomInfo.MapIndex = packet.ReadInt(); marryRoomInfo.AvailTime = packet.ReadInt(); marryRoomInfo.MaxCount = packet.ReadInt(); marryRoomInfo.GuestInvite = packet.ReadBoolean(); marryRoomInfo.RoomIntroduction = packet.ReadString(); marryRoomInfo.ServerID = GameServer.Instance.Configuration.ServerID; marryRoomInfo.IsHymeneal = false; string[] array = GameProperties.PRICE_MARRY_ROOM.Split(new char[] { ',' }); if (array.Length < 3) { if (MarryRoomCreateHandler.log.IsErrorEnabled) { MarryRoomCreateHandler.log.Error("MarryRoomCreateMoney node in configuration file is wrong"); } return(1); } int num; switch (marryRoomInfo.AvailTime) { case 2: num = int.Parse(array[0]); break; case 3: num = int.Parse(array[1]); break; case 4: num = int.Parse(array[2]); break; default: num = int.Parse(array[2]); marryRoomInfo.AvailTime = 4; break; } if (client.Player.PlayerCharacter.Money >= num) { MarryRoom marryRoom = MarryRoomMgr.CreateMarryRoom(client.Player, marryRoomInfo); if (marryRoom != null) { client.Player.RemoveMoney(num); LogMgr.LogMoneyAdd(LogMoneyType.Marry, LogMoneyType.Marry_Room, client.Player.PlayerCharacter.ID, num, client.Player.PlayerCharacter.Money, 0, 0, 0, 0, "", "", ""); GSPacketIn packet2 = client.Player.Out.SendMarryRoomInfo(client.Player, marryRoom); client.Player.Out.SendMarryRoomLogin(client.Player, true); marryRoom.SendToScenePlayer(packet2); CountBussiness.InsertSystemPayCount(client.Player.PlayerCharacter.ID, num, 0, 0, 0); } return(0); } client.Player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("UserFirecrackersCommand.MoneyNotEnough", new object[0])); return(1); }
public bool HandleCommand(TankHotSpringLogicProcessor process, GamePlayer player, GSPacketIn packet) { if (player.CurrentHotSpringRoom == null /*|| player.CurrentHotSpringRoom.RoomState != eRoomState.FREE*/) { return(false); } //if (player.PlayerCharacter.ID == player.CurrentHotSpringRoom.Info.GroomID || player.PlayerCharacter.ID == player.CurrentHotSpringRoom.Info.BrideID) //{ // return false; //} int num = packet.ReadInt(); if (num > 0) { if (player.PlayerCharacter.Money >= num) { //player.SetMoney(-num, MoneyAddType.Marry); player.RemoveMoney(num); LogMgr.LogMoneyAdd(LogMoneyType.Marry, LogMoneyType.Marry_Gift, player.PlayerCharacter.ID, num, player.PlayerCharacter.Money, 0, 0, 0, "", "", ""); } else { player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("UserFirecrackersCommand.MoneyNotEnough")); return(false); } using (PlayerBussiness pb = new PlayerBussiness()) { string content = LanguageMgr.GetTranslation("LargessCommand.Content", player.PlayerCharacter.NickName, num / 2); string title = LanguageMgr.GetTranslation("LargessCommand.Title", player.PlayerCharacter.NickName); MailInfo mail1 = new MailInfo(); mail1.Annex1 = ""; mail1.Content = content; mail1.Gold = 0; mail1.IsExist = true; mail1.Money = num / 2; mail1.Receiver = player.CurrentHotSpringRoom.Info.BrideName; mail1.ReceiverID = player.CurrentHotSpringRoom.Info.BrideID; mail1.Sender = LanguageMgr.GetTranslation("LargessCommand.Sender"); mail1.SenderID = 0; mail1.Title = title; mail1.Type = (int)eMailType.Marry; pb.SendMail(mail1); player.Out.SendMailResponse(mail1.ReceiverID, eMailRespose.Receiver); MailInfo mail2 = new MailInfo(); mail2.Annex1 = ""; mail2.Content = content; mail2.Gold = 0; mail2.IsExist = true; mail2.Money = num / 2; mail2.Receiver = player.CurrentHotSpringRoom.Info.GroomName; mail2.ReceiverID = player.CurrentHotSpringRoom.Info.GroomID; mail2.Sender = LanguageMgr.GetTranslation("LargessCommand.Sender"); mail2.SenderID = 0; mail2.Title = title; mail2.Type = (int)eMailType.Marry; pb.SendMail(mail2); player.Out.SendMailResponse(mail2.ReceiverID, eMailRespose.Receiver); } player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("LargessCommand.Succeed")); GSPacketIn msg = player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("LargessCommand.Notice", player.PlayerCharacter.NickName, num)); player.CurrentHotSpringRoom.SendToPlayerExceptSelf(msg, player); return(true); } return(false); }
public void HandleGameRoomCreate(GSPacketIn pkg) { int totalLevel = 0; int totalFightPower = 0; int roomId = pkg.ReadInt(); int gameType = pkg.ReadInt(); int guildId = pkg.ReadInt(); int areaId = pkg.ReadInt(); bool IsArea = pkg.ReadBoolean(); int count = pkg.ReadInt(); IGamePlayer[] players = new IGamePlayer[count]; for (int i = 0; i < count; i++) { PlayerInfo info = new PlayerInfo(); ProxyPlayerInfo proxyPlayerInfo = new ProxyPlayerInfo(); proxyPlayerInfo.m_AreaID = pkg.ReadInt(); proxyPlayerInfo.m_AreaName = pkg.ReadString(); info.ID = pkg.ReadInt(); info.NickName = pkg.ReadString(); info.Sex = pkg.ReadBoolean(); info.Hide = pkg.ReadInt(); info.Style = pkg.ReadString(); info.Colors = pkg.ReadString(); info.Skin = pkg.ReadString(); info.Offer = pkg.ReadInt(); info.GP = pkg.ReadInt(); info.Grade = pkg.ReadInt(); info.Repute = pkg.ReadInt(); info.Nimbus = pkg.ReadInt(); info.ConsortiaID = pkg.ReadInt(); info.ConsortiaName = pkg.ReadString(); info.ConsortiaLevel = pkg.ReadInt(); info.ConsortiaRepute = pkg.ReadInt(); info.Win = pkg.ReadInt(); info.Total = pkg.ReadInt(); info.Attack = pkg.ReadInt(); info.Defence = pkg.ReadInt(); info.Agility = pkg.ReadInt(); info.Luck = pkg.ReadInt(); info.FightPower = pkg.ReadInt(); info.IsMarried = pkg.ReadBoolean(); if (info.IsMarried) { info.SpouseID = pkg.ReadInt(); info.SpouseName = pkg.ReadString(); } totalFightPower += info.FightPower; proxyPlayerInfo.BaseAttack = pkg.ReadDouble(); proxyPlayerInfo.BaseDefence = pkg.ReadDouble(); proxyPlayerInfo.BaseAgility = pkg.ReadDouble(); proxyPlayerInfo.BaseBlood = pkg.ReadDouble(); proxyPlayerInfo.TemplateId = pkg.ReadInt(); proxyPlayerInfo.CanUserProp = pkg.ReadBoolean(); proxyPlayerInfo.SecondWeapon = pkg.ReadInt(); proxyPlayerInfo.StrengthLevel = pkg.ReadInt(); proxyPlayerInfo.GPAddPlus = pkg.ReadDouble(); proxyPlayerInfo.GMExperienceRate = pkg.ReadFloat(); proxyPlayerInfo.AuncherExperienceRate = pkg.ReadFloat(); proxyPlayerInfo.OfferAddPlus = pkg.ReadDouble(); proxyPlayerInfo.GMOfferRate = pkg.ReadFloat(); proxyPlayerInfo.AuncherOfferRate = pkg.ReadFloat(); proxyPlayerInfo.GMRichesRate = pkg.ReadFloat(); proxyPlayerInfo.AuncherRichesRate = pkg.ReadFloat(); proxyPlayerInfo.AntiAddictionRate = pkg.ReadDouble(); List <BufferInfo> infos = new List <BufferInfo>(); int buffercout = pkg.ReadInt(); for (int j = 0; j < buffercout; j++) { BufferInfo buffinfo = new BufferInfo(); buffinfo.Type = pkg.ReadInt(); buffinfo.IsExist = pkg.ReadBoolean(); buffinfo.BeginDate = pkg.ReadDateTime(); buffinfo.ValidDate = pkg.ReadInt(); buffinfo.Value = pkg.ReadInt(); if (info != null) { infos.Add(buffinfo); } } players[i] = new ProxyPlayer(this, info, proxyPlayerInfo, infos); players[i].CanUseProp = proxyPlayerInfo.CanUserProp; int ec = pkg.ReadInt(); for (int j = 0; j < ec; j++) { players[i].EquipEffect.Add(pkg.ReadInt()); } totalLevel += info.Grade; } if (players.Length != 0) { ProxyRoom room = new ProxyRoom(ProxyRoomMgr.NextRoomId(), roomId, players, this, totalLevel, totalFightPower, IsArea); room.GuildId = guildId; room.AreaID = areaId; room.GameType = (eGameType)gameType; ProxyRoom oldroom = null; Dictionary <int, ProxyRoom> rooms; Monitor.Enter(rooms = this.m_rooms); try { if (this.m_rooms.ContainsKey(roomId)) { oldroom = this.m_rooms[roomId]; this.m_rooms.Remove(roomId); } } finally { Monitor.Exit(rooms); } if (oldroom != null) { ProxyRoomMgr.RemoveRoom(oldroom); } Monitor.Enter(rooms = this.m_rooms); try { if (!this.m_rooms.ContainsKey(roomId)) { this.m_rooms.Add(roomId, room); this.SendFightRoomID(roomId, room.RoomId); } else { room = null; } } finally { Monitor.Exit(rooms); } if (room != null) { ProxyRoomMgr.AddRoom(room); } else { ServerClient.log.ErrorFormat("Room already exists:{0}", roomId); } } }
public bool HandleCommand(TankMarryLogicProcessor process, GamePlayer player, GSPacketIn packet) { bool result; if (player.CurrentMarryRoom == null) { result = false; } else { int num = packet.ReadInt(); if (num > 0) { if (player.PlayerCharacter.Money >= num) { player.RemoveMoney(num, LogMoneyType.Marry, LogMoneyType.Marry_Gift); using (PlayerBussiness pb = new PlayerBussiness()) { string content = LanguageMgr.GetTranslation("LargessCommand.Content", new object[] { player.PlayerCharacter.NickName, num / 2 }); string title = LanguageMgr.GetTranslation("LargessCommand.Title", new object[] { player.PlayerCharacter.NickName }); MailInfo mail = new MailInfo(); mail.Annex1 = ""; mail.Content = content; mail.Gold = 0; mail.IsExist = true; mail.Money = num / 2; mail.GiftToken = 0; mail.Receiver = player.CurrentMarryRoom.Info.BrideName; mail.ReceiverID = player.CurrentMarryRoom.Info.BrideID; mail.Sender = LanguageMgr.GetTranslation("LargessCommand.Sender", new object[0]); mail.SenderID = 0; mail.Title = title; mail.Type = 14; pb.SendMail(mail); player.Out.SendMailResponse(mail.ReceiverID, eMailRespose.Receiver); MailInfo mail2 = new MailInfo(); mail2.Annex1 = ""; mail2.Content = content; mail2.Gold = 0; mail2.IsExist = true; mail2.Money = num / 2; mail2.GiftToken = 0; mail2.Receiver = player.CurrentMarryRoom.Info.GroomName; mail2.ReceiverID = player.CurrentMarryRoom.Info.GroomID; mail2.Sender = LanguageMgr.GetTranslation("LargessCommand.Sender", new object[0]); mail2.SenderID = 0; mail2.Title = title; mail2.Type = 14; pb.SendMail(mail2); player.Out.SendMailResponse(mail2.ReceiverID, eMailRespose.Receiver); } player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("LargessCommand.Succeed", new object[0])); GSPacketIn msg = player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("LargessCommand.Notice", new object[] { player.PlayerCharacter.NickName, num })); player.CurrentMarryRoom.SendToPlayerExceptSelf(msg, player); result = true; } else { player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("UserFirecrackersCommand.MoneyNotEnough", new object[0])); result = false; } } else { result = false; } } return(result); }
/// <summary> /// door index which is unique /// </summary> public void HandlePacket(GameClient client, GSPacketIn packet) { var doorID = (int)packet.ReadInt(); m_handlerDoorID = doorID; var doorState = (byte)packet.ReadByte(); int doorType = doorID / 100000000; int radius = ServerProperties.Properties.WORLD_PICKUP_DISTANCE * 2; int zoneDoor = (int)(doorID / 1000000); string debugText = ""; // For ToA the client always sends the same ID so we need to construct an id using the current zone if (client.Player.CurrentRegion.Expansion == (int)eClientExpansion.TrialsOfAtlantis) { debugText = "ToA DoorID: " + doorID + " "; doorID -= zoneDoor * 1000000; zoneDoor = client.Player.CurrentZone.ID; doorID += zoneDoor * 1000000; m_handlerDoorID = doorID; // experimental to handle a few odd TOA door issues if (client.Player.CurrentRegion.IsDungeon) radius *= 4; } // debug text if (client.Account.PrivLevel > 1 || Properties.ENABLE_DEBUG) { if (doorType == 7) { int ownerKeepId = (doorID / 100000) % 1000; int towerNum = (doorID / 10000) % 10; int keepID = ownerKeepId + towerNum * 256; int componentID = (doorID / 100) % 100; int doorIndex = doorID % 10; client.Out.SendDebugMessage( "Keep Door ID: {0} state:{1} (Owner Keep: {6} KeepID:{2} ComponentID:{3} DoorIndex:{4} TowerNumber:{5})", doorID, doorState, keepID, componentID, doorIndex, towerNum, ownerKeepId); } else if (doorType == 9) { int doorIndex = doorID - doorType * 10000000; client.Out.SendDebugMessage("House DoorID:{0} state:{1} (doorType:{2} doorIndex:{3})", doorID, doorState, doorType, doorIndex); } else { int fixture = (doorID - zoneDoor * 1000000); int fixturePiece = fixture; fixture /= 100; fixturePiece = fixturePiece - fixture * 100; client.Out.SendDebugMessage("{6}DoorID:{0} state:{1} zone:{2} fixture:{3} fixturePiece:{4} Type:{5}", doorID, doorState, zoneDoor, fixture, fixturePiece, doorType, debugText); } } var target = client.Player.TargetObject as GameDoor; if (target != null && !client.Player.IsWithinRadius(target, radius)) { client.Player.Out.SendMessage("You are too far to open this door", eChatType.CT_Important, eChatLoc.CL_SystemWindow); return; } var door = GameServer.Database.SelectObject<DBDoor>("InternalID = '" + doorID + "'"); if (door != null) { if (doorType == 7 || doorType == 9) { new ChangeDoorAction(client.Player, doorID, doorState, radius).Start(1); return; } if (client.Account.PrivLevel == 1) { if (door.Locked == 0) { if (door.Health == 0) { new ChangeDoorAction(client.Player, doorID, doorState, radius).Start(1); return; } if (GameServer.Instance.Configuration.ServerType == eGameServerType.GST_PvP) { if (door.Realm != 0) { new ChangeDoorAction(client.Player, doorID, doorState, radius).Start(1); return; } } if (GameServer.Instance.Configuration.ServerType == eGameServerType.GST_Normal) { if (client.Player.Realm == (eRealm)door.Realm || door.Realm == 6) { new ChangeDoorAction(client.Player, doorID, doorState, radius).Start(1); return; } } } } if (client.Account.PrivLevel > 1) { client.Out.SendDebugMessage("GM: Forcing locked door open."); new ChangeDoorAction(client.Player, doorID, doorState, radius).Start(1); return; } } if (door == null) { if (doorType != 9 && client.Account.PrivLevel > 1 && client.Player.CurrentRegion.IsInstance == false) { if (client.Player.TempProperties.getProperty(DoorMgr.WANT_TO_ADD_DOORS, false)) { client.Player.Out.SendCustomDialog( "This door is not in the database. Place yourself nearest to this door and click Accept to add it.", AddingDoor); } else { client.Player.Out.SendMessage( "This door is not in the database. Use '/door show' to enable the add door dialog when targeting doors.", eChatType.CT_Important, eChatLoc.CL_SystemWindow); } } new ChangeDoorAction(client.Player, doorID, doorState, radius).Start(1); return; } }
public void HandleMailResponse(GSPacketIn pkg) { int playerid = pkg.ReadInt(); HandleUserPrivateMsg(pkg, playerid); }
public static int countConnect = 0; public int HandlePacket(GameClient client, GSPacketIn packet) { if (countConnect >= 3000) { client.Disconnect(); return(0); } GSPacketIn pkg = packet.Clone(); pkg.ClearContext(); int ItemBagType = packet.ReadInt(); int ItemPlace = packet.ReadInt(); int HoleNum = packet.ReadInt(); int GemBagType = packet.ReadInt(); int GemPlace = packet.ReadInt(); ItemInfo Item = client.Player.GetItemAt((eBageType)ItemBagType, ItemPlace); ItemInfo Gem = client.Player.GetItemAt((eBageType)GemBagType, GemPlace); string BeginProperty = null; string AddItem = ""; using (ItemRecordBussiness db = new ItemRecordBussiness()) { db.PropertyString(Item, ref BeginProperty); } int Glod = 2000; if (Item == null || Gem == null || Gem.Template.Property1 != 31) { return(0); } if (client.Player.PlayerCharacter.Gold > Glod) { string[] Hole = Item.Template.Hole.Split('|'); if (HoleNum > 0 && HoleNum < 7) { client.Player.RemoveGold(Glod); bool result = false; switch (HoleNum) { case 1: if (Item.Hole1 >= 0) { string[] str = Hole[0].Split(','); if (Convert.ToInt32(str[1]) == Gem.Template.Property2) { Item.Hole1 = Gem.TemplateID; AddItem += "," + Gem.ItemID + "," + Gem.Template.Name; result = true; } } break; case 2: if (Item.Hole2 >= 0) { string[] str = Hole[1].Split(','); if (Convert.ToInt32(str[1]) == Gem.Template.Property2) { Item.Hole2 = Gem.TemplateID; AddItem += "," + Gem.ItemID + "," + Gem.Template.Name; result = true; } } break; case 3: if (Item.Hole3 >= 0) { string[] str = Hole[2].Split(','); if (Convert.ToInt32(str[1]) == Gem.Template.Property2) { Item.Hole3 = Gem.TemplateID; AddItem += "," + Gem.ItemID + "," + Gem.Template.Name; result = true; } } break; case 4: if (Item.Hole4 >= 0) { string[] str = Hole[3].Split(','); if (Convert.ToInt32(str[1]) == Gem.Template.Property2) { Item.Hole4 = Gem.TemplateID; AddItem += "," + Gem.ItemID + "," + Gem.Template.Name; result = true; } } break; case 5: if (Item.Hole5 >= 0) { string[] str = Hole[4].Split(','); if (Convert.ToInt32(str[1]) == Gem.Template.Property2) { Item.Hole5 = Gem.TemplateID; AddItem += "," + Gem.ItemID + "," + Gem.Template.Name; result = true; } } break; case 6: if (Item.Hole6 >= 0) { string[] str = Hole[5].Split(','); if (Convert.ToInt32(str[1]) == Gem.Template.Property2) { Item.Hole6 = Gem.TemplateID; AddItem += "," + Gem.ItemID + "," + Gem.Template.Name; result = true; } } break; } if (result) { //client.Player.StoreBag2.MoveToStore(client.Player.StoreBag2, 0, client.Player.MainBag.FindFirstEmptySlot(31), client.Player.MainBag, 9); pkg.WriteInt(0); Gem.Count--; client.Player.StoreBag2.UpdateItem(Item); client.Player.UpdateItem(Gem); //client.Player.UpdateItem(Item); //client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("ItemInlayHandle.Success", Gem.Template.Name)); } LogMgr.LogItemAdd(client.Player.PlayerCharacter.ID, LogItemType.Insert, BeginProperty, Item, AddItem, Convert.ToInt32(result)); } else { pkg.WriteByte(1); client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("ItemInlayHandle.NoPlace")); } client.Player.SendTCP(pkg); client.Player.SaveIntoDatabase();//保存到数据库 } else { client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("UserBuyItemHandler.NoMoney")); } return(0); }
public int HandlePacket(GameClient client, GSPacketIn packet) { int num = packet.ReadInt(); PlayerInfo arg_12_0 = client.Player.PlayerCharacter; CardInventory cardBag = client.Player.CardBag; string text = ""; switch (num) { case 0: { int num2 = packet.ReadInt(); int num3 = packet.ReadInt(); int templateID = cardBag.GetItemAt(num2).TemplateID; if (cardBag.FindEquipCard(templateID) && num2 != num3) { text = "Thẻ này đã trang bị!"; } else { if (num2 != num3) { text = "Trang bị thành công!"; } cardBag.MoveItem(num2, num3); client.Player.MainBag.UpdatePlayerProperties(); } if (text != "") { client.Out.SendMessage(eMessageType.Normal, text); } break; } case 1: { int slot = packet.ReadInt(); int count = packet.ReadInt(); ItemInfo itemAt = client.Player.MainBag.GetItemAt(slot); int property = itemAt.Template.Property5; int place = client.Player.CardBag.FindFirstEmptySlot(5); UsersCardInfo usersCardInfo = new UsersCardInfo(); CardTemplateInfo card = CardMgr.GetCard(itemAt.Template.Property5); bool flag = false; if (card != null) { if (client.Player.CardBag.FindPlaceByTamplateId(5, property) == -1) { usersCardInfo.CardType = card.CardType; usersCardInfo.UserID = client.Player.PlayerCharacter.ID; usersCardInfo.Place = place; usersCardInfo.TemplateID = card.CardID; usersCardInfo.isFirstGet = true; usersCardInfo.Attack = 0; usersCardInfo.Agility = 0; usersCardInfo.Defence = 0; usersCardInfo.Luck = 0; usersCardInfo.Damage = 0; usersCardInfo.Guard = 0; client.Player.CardBag.AddCardTo(usersCardInfo, place); client.Out.SendGetCard(client.Player.PlayerCharacter, usersCardInfo); } else { flag = true; } } else { flag = true; } if (flag) { int num4 = CardDataHander.random.Next(5, 50); client.Player.AddCardSoul(num4); client.Player.Out.SendPlayerCardSoul(client.Player.PlayerCharacter, true, num4); } client.Player.MainBag.RemoveCountFromStack(itemAt, count); break; } case 4: { int slot2 = packet.ReadInt(); int count = packet.ReadInt(); ItemInfo itemAt = client.Player.PropBag.GetItemAt(slot2); int id = CardDataHander.random.Next(CardMgr.CardCount()); CardTemplateInfo singleCard = CardMgr.GetSingleCard(id); bool flag2 = false; if (singleCard == null) { flag2 = true; } else { int place2 = client.Player.CardBag.FindFirstEmptySlot(5); int cardID = singleCard.CardID; CardTemplateInfo card2 = CardMgr.GetCard(cardID); UsersCardInfo usersCardInfo2 = new UsersCardInfo(); if (card2 == null) { flag2 = true; } else { if (client.Player.CardBag.FindPlaceByTamplateId(5, cardID) == -1) { usersCardInfo2.CardType = card2.CardType; usersCardInfo2.UserID = client.Player.PlayerCharacter.ID; usersCardInfo2.Place = place2; usersCardInfo2.TemplateID = card2.CardID; usersCardInfo2.isFirstGet = true; usersCardInfo2.Attack = 0; usersCardInfo2.Agility = 0; usersCardInfo2.Defence = 0; usersCardInfo2.Luck = 0; usersCardInfo2.Damage = 0; usersCardInfo2.Guard = 0; client.Player.CardBag.AddCardTo(usersCardInfo2, place2); client.Out.SendGetCard(client.Player.PlayerCharacter, usersCardInfo2); } else { flag2 = true; } } } if (flag2) { int num5 = CardDataHander.random.Next(5, 50); client.Player.AddCardSoul(num5); client.Player.Out.SendPlayerCardSoul(client.Player.PlayerCharacter, true, num5); } client.Player.PropBag.RemoveCountFromStack(itemAt, count); break; } } cardBag.SaveToDatabase(); return(0); }
public int HandlePacket(GameClient client, GSPacketIn packet) { int num = packet.ReadInt(); int num2 = packet.ReadInt(); int num3 = packet.ReadInt(); string text = ""; List <UsersCardInfo> items = client.Player.CardBag.GetItems(0, 5); switch (num) { case 0: if (num3 <= client.Player.PlayerCharacter.CardSoul && num3 > 0) { int type = items[num2].Type; int gP = items[num2].CardGP + num3; int level = CardMgr.GetLevel(gP, type); int num4 = CardMgr.GetGP(level, type) - items[num2].CardGP; if (level == 40) { num3 = num4; } client.Player.CardBag.UpGraceSlot(num3, level, num2); client.Player.RemoveCardSoul(num3); client.Player.Out.SendPlayerCardSlot(client.Player.PlayerCharacter, items[num2]); client.Player.MainBag.UpdatePlayerProperties(); } else { text = "Thẻ hồn không đủ!"; } break; case 1: if (client.Player.PlayerCharacter.Money >= 300) { int num5 = 0; for (int i = 0; i < items.Count; i++) { num5 += items[i].CardGP; } client.Player.CardBag.ResetCardSoul(); client.Player.AddCardSoul(num5); text = LanguageMgr.GetTranslation("UpdateSLOT.ResetComplete", new object[] { num5 }); client.Player.RemoveMoney(300); client.Player.Out.SendPlayerCardSlot(client.Player.PlayerCharacter, items); client.Player.MainBag.UpdatePlayerProperties(); } else { text = "Xu không đủ!"; } break; } if (text != "") { client.Out.SendMessage(eMessageType.Normal, text); } return(0); }
public void HandleCommand(BaseGame game, Player player, GSPacketIn packet) { player.Direction = packet.ReadInt(); game.SendLivingUpdateDirection(player); }
public int HandlePacket(GameClient client, GSPacketIn packet) { int result2; if (client.Player.PlayerCharacter.ConsortiaID == 0) { result2 = 0; } else { int bagType = (int)packet.ReadByte(); int place = packet.ReadInt(); bool result = false; string msg = "ConsortiaUpGradeHandler.Failed"; using (ConsortiaBussiness db = new ConsortiaBussiness()) { ConsortiaInfo info = db.GetConsortiaSingle(client.Player.PlayerCharacter.ConsortiaID); if (info == null) { msg = "ConsortiaUpGradeHandler.NoConsortia"; } else { ConsortiaLevelInfo levelInfo = ConsortiaLevelMgr.FindConsortiaLevelInfo(info.Level + 1); if (levelInfo == null) { msg = "ConsortiaUpGradeHandler.NoUpGrade"; } else { if (levelInfo.NeedGold > client.Player.PlayerCharacter.Gold) { msg = "ConsortiaUpGradeHandler.NoGold"; } else { using (ConsortiaBussiness cb = new ConsortiaBussiness()) { if (cb.UpGradeConsortia(client.Player.PlayerCharacter.ConsortiaID, client.Player.PlayerCharacter.ID, ref msg)) { info.Level++; client.Player.RemoveGold(levelInfo.NeedGold); GameServer.Instance.LoginServer.SendConsortiaUpGrade(info); msg = "ConsortiaUpGradeHandler.Success"; result = true; } } } } } if (info.Level >= 5 && info.Level <= 10) { string msg2 = LanguageMgr.GetTranslation("ConsortiaUpGradeHandler.Notice", new object[] { info.ConsortiaName, info.Level }); GSPacketIn pkg = new GSPacketIn(10); pkg.WriteInt(2); pkg.WriteString(msg2); GameServer.Instance.LoginServer.SendPacket(pkg); GamePlayer[] players = WorldMgr.GetAllPlayers(); GamePlayer[] array = players; for (int i = 0; i < array.Length; i++) { GamePlayer p = array[i]; if (p != client.Player && p.PlayerCharacter.ConsortiaID != client.Player.PlayerCharacter.ConsortiaID) { p.Out.SendTCP(pkg); } } } } packet.WriteBoolean(result); packet.WriteString(LanguageMgr.GetTranslation(msg, new object[0])); client.Out.SendTCP(packet); result2 = 1; } return(result2); }
public void HandlePacket(GameClient client, GSPacketIn packet) { if (client.Account.PrivLevel == (int)ePrivLevel.Player) { GameTrainer trainer = client.Player.TargetObject as DOL.GS.GameTrainer; if (trainer == null || (trainer.CanTrain(client.Player) == false && trainer.CanTrainChampionLevels(client.Player) == false)) { client.Out.SendMessage("You must select a valid trainer for your class.", eChatType.CT_Important, eChatLoc.CL_ChatWindow); return; } } uint x = packet.ReadInt(); uint y = packet.ReadInt(); int idLine = packet.ReadByte(); int unk = packet.ReadByte(); int row = packet.ReadByte(); int skillIndex = packet.ReadByte(); // idline not null so this is a Champion level training window if (idLine > 0) { if (row > 0 && skillIndex > 0) { // Get Player CL Spec var clspec = client.Player.GetSpecList().Where(sp => sp is LiveChampionsSpecialization).Cast<LiveChampionsSpecialization>().FirstOrDefault(); // check if the tree can be used List<Tuple<MiniLineSpecialization, List<Tuple<Skill, byte>>>> tree = null; if (clspec != null) { tree = clspec.GetTrainerTreeDisplay(client.Player, clspec.RetrieveTypeForIndex(idLine)); } if (tree != null) { Tuple<byte, MiniLineSpecialization> skillstatus = clspec.GetSkillStatus(tree, row-1, skillIndex-1); if (skillstatus.Item1 == 1) { client.Out.SendMessage("You already have that ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (skillstatus.Item1 != 2) { client.Out.SendMessage("You do not meet the requirements for that ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (client.Player.ChampionSpecialtyPoints < 1) { client.Out.SendMessage("You do not have enough champion specialty points for that ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } skillstatus.Item2.Level++; client.Player.AddSpecialization(skillstatus.Item2); client.Player.RefreshSpecDependantSkills(false); client.Player.Out.SendUpdatePlayer(); client.Player.Out.SendUpdatePoints(); client.Player.Out.SendUpdatePlayerSkills(); client.Player.UpdatePlayerStatus(); client.Player.Out.SendChampionTrainerWindow(idLine); return; } else { client.Out.SendMessage("Could not find Champion Spec!", eChatType.CT_System, eChatLoc.CL_SystemWindow); log.ErrorFormat("Could not find Champion Spec idline {0}, row {1}, skillindex {2}", idLine, row, skillIndex); } } } else { // Trainable Specs or RA's IList<Specialization> speclist = client.Player.GetSpecList().Where(e => e.Trainable).ToList(); if (skillIndex < speclist.Count) { Specialization spec = (Specialization)speclist[skillIndex]; if (spec.Level >= client.Player.BaseLevel) { client.Out.SendMessage("You can't train in this specialization again this level!", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } // Graveen - autotrain 1.87 - allow players to train their AT specs even if no pts left int temp = client.Player.SkillSpecialtyPoints + client.Player.GetAutoTrainPoints(spec, 2); if (temp >= spec.Level + 1) { spec.Level++; client.Player.OnSkillTrained(spec); client.Out.SendUpdatePoints(); client.Out.SendTrainerWindow(); return; } else { client.Out.SendMessage("That specialization costs " + (spec.Level + 1) + " specialization points!", eChatType.CT_System, eChatLoc.CL_SystemWindow); client.Out.SendMessage("You don't have that many specialization points left for this level.", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } } else if (skillIndex >= 100) { // Realm Abilities var raList = SkillBase.GetClassRealmAbilities(client.Player.CharacterClass.ID).Where(ra => !(ra is RR5RealmAbility)); if (skillIndex < raList.Count() + 100) { RealmAbility ra = raList.ElementAtOrDefault(skillIndex - 100); if (ra != null) { ra.Level = client.Player.GetAbilityLevel(ra.KeyName); int cost = ra.CostForUpgrade(ra.Level); ra.Level++; if (client.Player.RealmSpecialtyPoints < cost) { client.Out.SendMessage(ra.Name + " costs " + (cost) + " realm ability points!", eChatType.CT_System, eChatLoc.CL_SystemWindow); client.Out.SendMessage("You don't have that many realm ability points left to get this.", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (!ra.CheckRequirement(client.Player)) { client.Out.SendMessage("You are not experienced enough to get " + ra.Name + " now. Come back later.", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } client.Player.AddRealmAbility(ra, true); client.Out.SendUpdatePoints(); client.Out.SendUpdatePlayer(); client.Out.SendUpdatePlayerSkills(); client.Out.SendTrainerWindow(); } else { client.Out.SendMessage("Unfortunately your training failed. Please report that to admins or game master. Thank you.", eChatType.CT_System, eChatLoc.CL_SystemWindow); log.Error("Realm Ability " + ra.Name + "(" + ra.KeyName + ") unexpected not found"); } } } if (log.IsErrorEnabled) log.Error("Player <" + client.Player.Name + "> requested to train incorrect skill index"); } }
public void HandlePacket(GameClient client, GSPacketIn packet) { // A trainer of the appropriate class must be around (or global trainer, with TrainedClass = eCharacterClass.Unknow GameTrainer trainer = client.Player.TargetObject as DOL.GS.GameTrainer; if (trainer == null || (trainer.CanTrain(client.Player) == false && trainer.CanTrainChampionLevels(client.Player) == false)) { client.Out.SendMessage("You must select a valid trainer for your class.", eChatType.CT_Important, eChatLoc.CL_ChatWindow); return; } //Specializations - 8 trainable specs max uint size = 8; long position = packet.Position; IList<uint> skills = new List<uint>(); Dictionary<uint, uint> amounts = new Dictionary<uint, uint>(); bool stop = false; for (uint i = 0; i < size; i++) { uint code = packet.ReadInt(); if (!stop) { if (code == 0xFFFFFFFF) stop = true; else { if (!skills.Contains(code)) skills.Add(code); } } } foreach (uint code in skills) { uint val = packet.ReadInt(); if (!amounts.ContainsKey(code) && val > 1) amounts.Add(code, val); } IList specs = client.Player.GetSpecList(); uint skillcount = 0; IList<string> done = new List<string>(); bool trained = false; // Graveen: the trainline command is called foreach (Specialization spec in specs) { if (amounts.ContainsKey(skillcount)) { if (spec.Level < amounts[skillcount]) { TrainCommandHandler train = new TrainCommandHandler(true); train.OnCommand(client, new string[] { "&trainline", spec.KeyName, amounts[skillcount].ToString() }); trained = true; } } skillcount++; } //RealmAbilities packet.Seek(position + 64, System.IO.SeekOrigin.Begin); size = 50;//50 RA's max? amounts.Clear(); for (uint i = 0; i < size; i++) { uint val = packet.ReadInt(); if (val > 0 && !amounts.ContainsKey(i)) { amounts.Add(i, val); } } uint index = 0; if (amounts != null && amounts.Count > 0) { List<RealmAbility> ras = SkillBase.GetClassRealmAbilities(client.Player.CharacterClass.ID); foreach (RealmAbility ra in ras) { if (ra is RR5RealmAbility) continue; if (amounts.ContainsKey(index)) { RealmAbility playerRA = (RealmAbility)client.Player.GetAbility(ra.KeyName); if (playerRA != null && (playerRA.Level >= ra.MaxLevel || playerRA.Level >= amounts[index])) { index++; continue; } int cost = 0; for (int i = playerRA != null ? playerRA.Level : 0; i < amounts[index]; i++) cost += ra.CostForUpgrade(i); if (client.Player.RealmSpecialtyPoints < cost) { client.Out.SendMessage(ra.Name + " costs " + (cost) + " realm ability points!", eChatType.CT_System, eChatLoc.CL_SystemWindow); client.Out.SendMessage("You don't have that many realm ability points left to get this.", eChatType.CT_System, eChatLoc.CL_SystemWindow); index++; continue; } if (!ra.CheckRequirement(client.Player)) { client.Out.SendMessage("You are not experienced enough to get " + ra.Name + " now. Come back later.", eChatType.CT_System, eChatLoc.CL_SystemWindow); index++; continue; } bool valid = false; if (playerRA != null) { playerRA.Level = (int)amounts[index]; valid = true; } else { RealmAbility ability = SkillBase.GetAbility(ra.KeyName, (int)amounts[index]) as RealmAbility; if (ability != null) { valid = true; client.Player.AddAbility(ability, false); } } if (valid) { client.Player.RealmSpecialtyPoints -= cost; client.Out.SendUpdatePoints(); client.Out.SendUpdatePlayer(); client.Out.SendCharResistsUpdate(); client.Out.SendCharStatsUpdate(); client.Out.SendUpdatePlayerSkills(); client.Out.SendTrainerWindow(); trained = true; } else { client.Out.SendMessage("Unfortunately your training failed. Please report that to admins or game master. Thank you.", eChatType.CT_System, eChatLoc.CL_SystemWindow); } } index++; } } if (trained) client.Player.SaveIntoDatabase(); }
public override int HandlePacket(GamePlayer player, GSPacketIn packet) { string msg = ""; bool result = false; int re_Type = 0; bool addInfo = false; int Count = 0; string PasswordTwo = packet.ReadString(); string PasswordTwo_new = packet.ReadString(); int Type = packet.ReadInt(); string PasswordQuestion = packet.ReadString(); string PasswordAnswer = packet.ReadString(); string PasswordQuestion2 = packet.ReadString(); string PasswordAnswer2 = packet.ReadString(); switch (Type) { case 1: re_Type = 1; if (string.IsNullOrEmpty(player.PlayerCharacter.PasswordTwo)) { using (PlayerBussiness db = new PlayerBussiness()) { if (PasswordTwo != "") { if (db.UpdatePasswordTwo(player.PlayerCharacter.ID, PasswordTwo)) { player.PlayerCharacter.PasswordTwo = PasswordTwo; player.PlayerCharacter.IsLocked = false; msg = "SetPassword.success"; } } if (PasswordQuestion != "" && PasswordAnswer != "" && PasswordQuestion2 != "" && PasswordAnswer2 != "") { if (db.UpdatePasswordInfo(player.PlayerCharacter.ID, PasswordQuestion, PasswordAnswer, PasswordQuestion2, PasswordAnswer2, 5)) { result = true; addInfo = false; msg = "UpdatePasswordInfo.Success"; } else { result = false; } } else { result = true; addInfo = true; } } } else { msg = "SetPassword.Fail"; result = false; addInfo = false; } break; case 2: re_Type = 2; if (PasswordTwo == player.PlayerCharacter.PasswordTwo) { player.PlayerCharacter.IsLocked = false; msg = "BagUnlock.success"; result = true; } else { msg = "PasswordTwo.error"; result = false; addInfo = false; } break; case 3: re_Type = 3; using (PlayerBussiness db = new PlayerBussiness()) { db.GetPasswordInfo(player.PlayerCharacter.ID, ref PasswordQuestion, ref PasswordAnswer, ref PasswordQuestion2, ref PasswordAnswer2, ref Count); Count--; if (Count >= 0) { db.UpdatePasswordInfo(player.PlayerCharacter.ID, PasswordQuestion, PasswordAnswer, PasswordQuestion2, PasswordAnswer2, Count); } if (PasswordTwo == player.PlayerCharacter.PasswordTwo) { if (db.UpdatePasswordTwo(player.PlayerCharacter.ID, PasswordTwo_new)) { player.PlayerCharacter.IsLocked = false; player.PlayerCharacter.PasswordTwo = PasswordTwo_new; msg = "UpdatePasswordTwo.Success"; result = true; addInfo = false; } else { msg = "UpdatePasswordTwo.Fail"; result = false; addInfo = false; } } else { msg = "UpdatePasswordTwo.Fail"; result = false; addInfo = false; } } break; case 4: { re_Type = 4; string db_PasswordAnswer = ""; string PassWordTwo = ""; string db_PasswordAnswer2 = ""; using (PlayerBussiness db = new PlayerBussiness()) { db.GetPasswordInfo(player.PlayerCharacter.ID, ref PasswordQuestion, ref db_PasswordAnswer, ref PasswordQuestion2, ref db_PasswordAnswer2, ref Count); Count--; if (Count >= 0) { db.UpdatePasswordInfo(player.PlayerCharacter.ID, PasswordQuestion, db_PasswordAnswer, PasswordQuestion2, db_PasswordAnswer2, Count); } if (db_PasswordAnswer == PasswordAnswer && db_PasswordAnswer2 == PasswordAnswer2 && db_PasswordAnswer != "" && db_PasswordAnswer2 != "") { if (db.UpdatePasswordTwo(player.PlayerCharacter.ID, PassWordTwo)) { player.PlayerCharacter.PasswordTwo = PassWordTwo; player.PlayerCharacter.IsLocked = false; msg = "DeletePassword.success"; result = true; addInfo = false; } else { msg = "DeletePassword.Fail"; result = false; } } else { if (PasswordTwo == player.PlayerCharacter.PasswordTwo) { if (db.UpdatePasswordTwo(player.PlayerCharacter.ID, PassWordTwo)) { player.PlayerCharacter.PasswordTwo = PassWordTwo; player.PlayerCharacter.IsLocked = false; msg = "DeletePassword.success"; result = true; addInfo = false; } } else { msg = "DeletePassword.Fail"; result = false; } } } break; } case 5: re_Type = 5; if (player.PlayerCharacter.PasswordTwo != null) { if (PasswordQuestion != "" && PasswordAnswer != "" && PasswordQuestion2 != "" && PasswordAnswer2 != "") { using (PlayerBussiness db = new PlayerBussiness()) { if (db.UpdatePasswordInfo(player.PlayerCharacter.ID, PasswordQuestion, PasswordAnswer, PasswordQuestion2, PasswordAnswer2, 5)) { result = true; addInfo = false; msg = "UpdatePasswordInfo.Success"; } else { result = false; msg = ""; } } } } break; } GSPacketIn pkg = packet.Clone(); pkg.ClearContext(); pkg.WriteInt(player.PlayerCharacter.ID); pkg.WriteInt(re_Type); pkg.WriteBoolean(result); pkg.WriteBoolean(addInfo); pkg.WriteString(LanguageMgr.GetTranslation(msg, new object[0])); pkg.WriteInt(Count); pkg.WriteString(PasswordQuestion); pkg.WriteString(PasswordQuestion2); player.Out.SendTCP(pkg); return(0); }
/// <summary> /// Reads up ONE character iteration on the packet stream /// </summary> /// <param name="packet"></param> /// <param name="client"></param> public CreationCharacterData(GSPacketIn packet, GameClient client) { //unk - probably indicates customize or create (these are moved from 1.99 4 added bytes) if (client.Version >= GameClient.eClientVersion.Version1104) { packet.ReadIntLowEndian(); } CharName = packet.ReadString(24); CustomMode = packet.ReadByte(); EyeSize = packet.ReadByte(); LipSize = packet.ReadByte(); EyeColor = packet.ReadByte(); HairColor = packet.ReadByte(); FaceType = packet.ReadByte(); HairStyle = packet.ReadByte(); packet.Skip(3); MoodType = packet.ReadByte(); packet.Skip(8); Operation = packet.ReadInt(); var unk = packet.ReadByte(); packet.Skip(24); //Location String packet.Skip(24); //Skip class name packet.Skip(24); //Skip race name var level = packet.ReadByte(); //not safe! Class = packet.ReadByte(); Realm = packet.ReadByte(); //The following byte contains //1bit=start location ... in ShroudedIsles you can choose ... //1bit=first race bit //1bit=unknown //1bit=gender (0=male, 1=female) //4bit=race byte startRaceGender = (byte)packet.ReadByte(); Race = (startRaceGender & 0x0F) + ((startRaceGender & 0x40) >> 2); Gender = ((startRaceGender >> 4) & 0x01); SIStartLocation = ((startRaceGender >> 7) != 0); CreationModel = packet.ReadShortLowEndian(); Region = packet.ReadByte(); packet.Skip(1); //TODO second byte of region unused currently packet.Skip(4); //TODO Unknown Int / last used? Strength = packet.ReadByte(); Dexterity = packet.ReadByte(); Constitution = packet.ReadByte(); Quickness = packet.ReadByte(); Intelligence = packet.ReadByte(); Piety = packet.ReadByte(); Empathy = packet.ReadByte(); Charisma = packet.ReadByte(); packet.Skip(40); //TODO equipment var activeRightSlot = packet.ReadByte(); // 0x9C var activeLeftSlot = packet.ReadByte(); // 0x9D var siZone = packet.ReadByte(); // 0x9E // skip 4 bytes added in 1.99 if (client.Version >= GameClient.eClientVersion.Version199 && client.Version < GameClient.eClientVersion.Version1104) { packet.Skip(4); } // New constitution must be read before skipping 4 bytes NewConstitution = packet.ReadByte(); // 0x9F }
public void HandlePacket(GameClient client, GSPacketIn packet) { string ipAddress = client.TcpEndpointAddress; packet.Skip(2); //Skip the client_type byte var major = (byte)packet.ReadByte(); var minor = (byte)packet.ReadByte(); var build = (byte)packet.ReadByte(); string password = packet.ReadString(20); bool v174; //the logger detection we had is no longer working //bool loggerUsing = false; switch (client.Version) { case GameClient.eClientVersion.Version168: case GameClient.eClientVersion.Version169: case GameClient.eClientVersion.Version170: case GameClient.eClientVersion.Version171: case GameClient.eClientVersion.Version172: case GameClient.eClientVersion.Version173: v174 = false; break; default: v174 = true; break; } if (v174) { packet.Skip(11); } else { packet.Skip(7); } uint c2 = packet.ReadInt(); uint c3 = packet.ReadInt(); uint c4 = packet.ReadInt(); if (v174) { packet.Skip(27); } else { packet.Skip(31); } string userName = packet.ReadString(20); /* if (c2 == 0 && c3 == 0x05000000 && c4 == 0xF4000000) { loggerUsing = true; Log.Warn("logger detected (" + username + ")"); }*/ // check server status if (GameServer.Instance.ServerStatus == eGameServerStatus.GSS_Closed) { client.Out.SendLoginDenied(eLoginError.GameCurrentlyClosed); Log.Info(ipAddress + " disconnected because game is closed!"); GameServer.Instance.Disconnect(client); return; } // check connection allowed with serverrules try { if (!GameServer.ServerRules.IsAllowedToConnect(client, userName)) { if (Log.IsInfoEnabled) Log.Info(ipAddress + " disconnected because IsAllowedToConnect returned false!"); GameServer.Instance.Disconnect(client); return; } } catch (Exception e) { if (Log.IsErrorEnabled) Log.Error("Error shutting down Client after IsAllowedToConnect failed!", e); } // Handle connection EnterLock(userName); try { Account playerAccount; // Make sure that client won't quit lock (client) { GameClient.eClientState state = client.ClientState; if (state != GameClient.eClientState.NotConnected) { Log.DebugFormat("wrong client state on connect {0} {1}", userName, state.ToString()); return; } if (Log.IsInfoEnabled) Log.Info(string.Format("({0})User {1} logging on! ({2} type:{3} add:{4})", ipAddress, userName, client.Version, (client.ClientType), client.ClientAddons.ToString("G"))); // check client already connected GameClient findclient = WorldMgr.GetClientByAccountName(userName, true); if (findclient != null) { if (findclient.ClientState == GameClient.eClientState.Connecting) { if (Log.IsInfoEnabled) Log.Info("User is already connecting, ignored."); client.Out.SendLoginDenied(eLoginError.AccountAlreadyLoggedIn); return; } // in login if (findclient.ClientState == GameClient.eClientState.Linkdead) { if (Log.IsInfoEnabled) Log.Info("User is still being logged out from linkdeath!"); client.Out.SendLoginDenied(eLoginError.AccountIsInLogoutProcedure); } else { if (Log.IsInfoEnabled) Log.Info("User already logged in!"); client.Out.SendLoginDenied(eLoginError.AccountAlreadyLoggedIn); } GameServer.Instance.Disconnect(client); return; } bool goodname = true; foreach (char c in userName.ToLower()) { if ((c < '0' || c > '9') && (c < 'a' || c > 'z') && client.Account.PrivLevel == (uint)ePrivLevel.Player) { goodname = false; break; } } // Yes! Stoping! if (!goodname) { if (Log.IsInfoEnabled) Log.Info("Invalid symbols in account name \"" + userName + "\" found!"); client.Out.SendLoginDenied(eLoginError.AccountInvalid); GameServer.Instance.Disconnect(client); return; } else { playerAccount = GameServer.Database.FindObjectByKey<Account>(userName); client.PingTime = DateTime.Now.Ticks; if (playerAccount == null) { //check autocreate ... if (GameServer.Instance.Configuration.AutoAccountCreation && Properties.ALLOW_AUTO_ACCOUNT_CREATION) { // autocreate account if (string.IsNullOrEmpty(password)) { client.Out.SendLoginDenied(eLoginError.AccountInvalid); GameServer.Instance.Disconnect(client); if (Log.IsInfoEnabled) Log.Info("Account creation failed, no password set for Account: " + userName); return; } // check for account bombing TimeSpan ts; IList<Account> allAccByIp = GameServer.Database.SelectObjects<Account>("LastLoginIP = '" + ipAddress + "'"); int totalacc = 0; foreach (Account ac in allAccByIp) { ts = DateTime.Now - ac.CreationDate; if (ts.TotalMinutes < Properties.TIME_BETWEEN_ACCOUNT_CREATION_SAMEIP && totalacc > 1) { Log.Warn("Account creation: too many from same IP within set minutes - " + userName + " : " + ipAddress); client.Out.SendLoginDenied(eLoginError.PersonalAccountIsOutOfTime); GameServer.Instance.Disconnect(client); return; } totalacc++; } if (totalacc >= Properties.TOTAL_ACCOUNTS_ALLOWED_SAMEIP) { Log.Warn("Account creation: too many accounts created from same ip - " + userName + " : " + ipAddress); client.Out.SendLoginDenied(eLoginError.AccountNoAccessThisGame); GameServer.Instance.Disconnect(client); return; } // per timeslice - for preventing account bombing via different ip if (Properties.TIME_BETWEEN_ACCOUNT_CREATION > 0) { ts = DateTime.Now - m_lastAccountCreateTime; if (ts.TotalMinutes < Properties.TIME_BETWEEN_ACCOUNT_CREATION) { Log.Warn("Account creation: time between account creation too small - " + userName + " : " + ipAddress); client.Out.SendLoginDenied(eLoginError.PersonalAccountIsOutOfTime); GameServer.Instance.Disconnect(client); return; } } m_lastAccountCreateTime = DateTime.Now; playerAccount = new Account(); playerAccount.Name = userName; playerAccount.Password = CryptPassword(password); playerAccount.Realm = 0; playerAccount.CreationDate = DateTime.Now; playerAccount.LastLogin = DateTime.Now; playerAccount.LastLoginIP = ipAddress; playerAccount.LastClientVersion = ((int)client.Version).ToString(); playerAccount.Language = Properties.SERV_LANGUAGE; playerAccount.PrivLevel = 1; if (Log.IsInfoEnabled) Log.Info("New account created: " + userName); GameServer.Database.AddObject(playerAccount); // Log account creation AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.AccountCreate, "", userName); } else { if (Log.IsInfoEnabled) Log.Info("No such account found and autocreation deactivated!"); client.Out.SendLoginDenied(eLoginError.AccountNotFound); GameServer.Instance.Disconnect(client); return; } } else { // check password if (!playerAccount.Password.StartsWith("##")) { playerAccount.Password = CryptPassword(playerAccount.Password); } if (!CryptPassword(password).Equals(playerAccount.Password)) { if (Log.IsInfoEnabled) Log.Info("(" + client.TcpEndpoint + ") Wrong password!"); client.Out.SendLoginDenied(eLoginError.WrongPassword); // Log failure AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.AccountFailedLogin, "", userName); GameServer.Instance.Disconnect(client); return; } // save player infos playerAccount.LastLogin = DateTime.Now; playerAccount.LastLoginIP = ipAddress; playerAccount.LastClientVersion = ((int)client.Version).ToString(); if (string.IsNullOrEmpty(playerAccount.Language)) { playerAccount.Language = Properties.SERV_LANGUAGE; } GameServer.Database.SaveObject(playerAccount); } } //Save the account table client.Account = playerAccount; // create session ID here to disable double login bug if (WorldMgr.CreateSessionID(client) < 0) { if (Log.IsInfoEnabled) Log.InfoFormat("Too many clients connected, denied login to " + playerAccount.Name); client.Out.SendLoginDenied(eLoginError.TooManyPlayersLoggedIn); client.Disconnect(); return; } client.Out.SendLoginGranted(); client.ClientState = GameClient.eClientState.Connecting; // Log entry AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.AccountSuccessfulLogin, "", userName); } } catch (DatabaseException e) { if (Log.IsErrorEnabled) Log.Error("LoginRequestHandler", e); client.Out.SendLoginDenied(eLoginError.CannotAccessUserAccount); GameServer.Instance.Disconnect(client); } catch (Exception e) { if (Log.IsErrorEnabled) Log.Error("LoginRequestHandler", e); client.Out.SendLoginDenied(eLoginError.CannotAccessUserAccount); GameServer.Instance.Disconnect(client); } finally { ExitLock(userName); } }
public int HandlePacket(GameClient client, GSPacketIn packet) { GSPacketIn pkg = packet.Clone(); pkg.ClearContext(); //eBageType bagType = (eBageType)packet.ReadByte(); int holeNum = packet.ReadInt(); //int toplace = packet.ReadInt(); int templateID = packet.ReadInt(); int mustGold = 500; if (client.Player.PlayerCharacter.HasBagPassword && client.Player.PlayerCharacter.IsLocked) { client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("Bag.Locked")); return(0); } if (client.Player.PlayerCharacter.Gold < mustGold) { client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("ItemComposeHandler.NoMoney")); return(0); } PlayerInventory storeBag = client.Player.GetInventory(eBageType.Store); ItemInfo item = storeBag.GetItemAt(0); ItemInfo gem; ItemTemplateInfo goods = Bussiness.Managers.ItemMgr.FindItemTemplate(templateID); // storeBag.a if (goods == null) { return(11); } var result = false; switch (holeNum) { case 1: if (item.Hole1 > 0) { item.Hole1 = 0; result = true; } break; case 2: if (item.Hole2 > 0) { item.Hole2 = 0; result = true; } break; case 3: if (item.Hole3 > 0) { item.Hole3 = 0; result = true; } break; case 4: if (item.Hole4 > 0) { item.Hole4 = 0; result = true; } break; case 5: if (item.Hole5 > 0) { item.Hole5 = 0; result = true; } break; case 6: if (item.Hole6 > 0) { item.Hole6 = 0; result = true; } break; default: return(1); } if (result) { pkg.WriteInt(0); client.Player.BeginChanges(); gem = ItemInfo.CreateFromTemplate(goods, 1, (int)ItemAddType.Buy); client.Player.AddItem(gem); client.Player.StoreBag2.UpdateItem(item); //client.Player.StoreBag2.MoveToStore(client.Player.StoreBag2, 0, client.Player.MainBag.FindFirstEmptySlot(31), client.Player.MainBag, 9); //client.Player.UpdateItem(item); client.Player.RemoveGold(mustGold); client.Player.CommitChanges(); //client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("OK")); } else { pkg.WriteInt(1); } client.Player.SendTCP(pkg); client.Player.SaveIntoDatabase();//保存到数据库 return(0); }
public int HandlePacket(GameClient client, GSPacketIn packet) { switch (packet.ReadInt()) { case 0: { byte roomType = packet.ReadByte(); byte timeType = packet.ReadByte(); string name = packet.ReadString(); string password = packet.ReadString(); RoomMgr.CreateRoom(client.Player, name, password, (eRoomType)roomType, timeType); break; } case 1: { packet.ReadBoolean(); int num = packet.ReadInt(); int num2 = packet.ReadInt(); int roomId = -1; string pwd = null; if (num2 == -1) { roomId = packet.ReadInt(); pwd = packet.ReadString(); } if (num == 1) { num = 0; } else { if (num == 2) { num = 4; } } RoomMgr.EnterRoom(client.Player, roomId, pwd, num); break; } case 2: if (client.Player.CurrentRoom != null && client.Player == client.Player.CurrentRoom.Host && !client.Player.CurrentRoom.IsPlaying) { int num3 = packet.ReadInt(); eRoomType roomType2 = (eRoomType)packet.ReadByte(); bool isOpenBoss = packet.ReadBoolean(); string password2 = packet.ReadString(); string roomname = packet.ReadString(); byte timeMode = packet.ReadByte(); byte hardLevel = packet.ReadByte(); int levelLimits = packet.ReadInt(); bool isCrosszone = packet.ReadBoolean(); packet.ReadInt(); Console.WriteLine("=====>MapID: " + num3.ToString() + " |roomType: " + roomType2.ToString()); if (num3 == 0) { num3 = 401; //ME CUNG } RoomMgr.UpdateRoomGameType(client.Player.CurrentRoom, roomType2, timeMode, (eHardLevel)hardLevel, levelLimits, num3, password2, roomname, isCrosszone, isOpenBoss); //log.Error("=====>1: " + client.Player.CurrentRoom + " |2: " + roomType2 + " |3: " + timeMode + " |4: " + (eHardLevel)hardLevel + " |5: " + levelLimits + " |6: " + num3 + " |7: " + password2 + " |8: " + roomname + " |9: " + isCrosszone + " |10: " + isOpenBoss); } break; case 3: if (client.Player.CurrentRoom != null && client.Player == client.Player.CurrentRoom.Host) { RoomMgr.KickPlayer(client.Player.CurrentRoom, packet.ReadByte()); } break; case 5: if (client.Player.CurrentRoom != null) { RoomMgr.ExitRoom(client.Player.CurrentRoom, client.Player); } break; case 6: if (client.Player.CurrentRoom == null || client.Player.CurrentRoom.RoomType == eRoomType.Match) { return(0); } RoomMgr.SwitchTeam(client.Player); break; case 7: { BaseRoom currentRoom = client.Player.CurrentRoom; if (currentRoom != null && currentRoom.Host == client.Player) { if (client.Player.MainWeapon == null) { client.Player.SendMessage(LanguageMgr.GetTranslation("Game.Server.SceneGames.NoEquip", new object[0])); return(0); } if (currentRoom.RoomType == eRoomType.Dungeon && !client.Player.IsPvePermission(currentRoom.MapId, currentRoom.HardLevel)) { client.Player.SendMessage("Do not PvePermission enter this map!"); return(0); } RoomMgr.StartGame(client.Player.CurrentRoom); } break; } case 9: { packet.ReadInt(); int num4 = packet.ReadInt(); int num5 = 1011; if (num4 == -2) { packet.ReadInt(); num5 = packet.ReadInt(); } BaseRoom[] rooms = RoomMgr.Rooms; List <BaseRoom> list = new List <BaseRoom>(); for (int i = 0; i < rooms.Length; i++) { if (!rooms[i].IsEmpty) { switch (num4) { case 3: if (rooms[i].RoomType == eRoomType.Match || rooms[i].RoomType == eRoomType.Freedom) { list.Add(rooms[i]); } break; case 4: if (rooms[i].RoomType == eRoomType.Match) { list.Add(rooms[i]); } break; case 5: if (rooms[i].RoomType == eRoomType.Freedom) { list.Add(rooms[i]); } break; default: if (rooms[i].RoomType == eRoomType.Dungeon) { switch (num5) { case 1007: if (rooms[i].HardLevel == eHardLevel.Simple) { list.Add(rooms[i]); } break; case 1008: if (rooms[i].HardLevel == eHardLevel.Normal) { list.Add(rooms[i]); } break; case 1009: if (rooms[i].HardLevel == eHardLevel.Hard) { list.Add(rooms[i]); } break; case 1010: if (rooms[i].HardLevel == eHardLevel.Terror) { list.Add(rooms[i]); } break; default: list.Add(rooms[i]); break; } } break; } } } if (list.Count > 0) { client.Out.SendUpdateRoomList(list); } break; } case 10: if (client.Player.CurrentRoom != null && client.Player == client.Player.CurrentRoom.Host) { byte pos = packet.ReadByte(); int place = packet.ReadInt(); bool isOpened = packet.ReadBoolean(); int placeView = packet.ReadInt(); RoomMgr.UpdateRoomPos(client.Player.CurrentRoom, (int)pos, isOpened, place, placeView); } break; case 11: if (client.Player.CurrentRoom != null && client.Player.CurrentRoom.BattleServer != null) { client.Player.CurrentRoom.BattleServer.RemoveRoom(client.Player.CurrentRoom); if (client.Player != client.Player.CurrentRoom.Host) { client.Player.CurrentRoom.Host.Out.SendMessage(eMessageType.ChatERROR, LanguageMgr.GetTranslation("Game.Server.SceneGames.PairUp.Failed", new object[0])); RoomMgr.UpdatePlayerState(client.Player, 0); } else { RoomMgr.UpdatePlayerState(client.Player, 2); } } break; case 12: packet.ReadInt(); if (client.Player.CurrentRoom != null) { int num6 = packet.ReadInt(); int num7 = num6; if (num7 == 0) { client.Player.CurrentRoom.GameType = eGameType.Free; } else { client.Player.CurrentRoom.GameType = eGameType.Guild; } GSPacketIn pkg = client.Player.Out.SendRoomType(client.Player, client.Player.CurrentRoom); client.Player.CurrentRoom.SendToAll(pkg, client.Player); } break; case 15: if (client.Player.MainWeapon == null) { client.Player.SendMessage(LanguageMgr.GetTranslation("Game.Server.SceneGames.NoEquip", new object[0])); return(0); } if (client.Player.CurrentRoom != null) { RoomMgr.UpdatePlayerState(client.Player, packet.ReadByte()); } break; } return(0); }
public int HandlePacket(GameClient client, GSPacketIn packet) { if (client.Player.CurrentRoom == null) { return(0); } int id = packet.ReadInt(); GamePlayer player = Managers.WorldMgr.GetPlayerById(id); if (player == client.Player) { return(0); } List <GamePlayer> players = client.Player.CurrentRoom.GetPlayers(); foreach (GamePlayer p in players) { if (p == player) { client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("friendnotinthesameserver.Sameroom")); return(0); } } GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_INVITE); if (player != null && player.CurrentRoom == null) { pkg.WriteInt(client.Player.PlayerCharacter.ID); pkg.WriteInt(client.Player.CurrentRoom.RoomId); pkg.WriteInt(client.Player.CurrentRoom.MapId); pkg.WriteByte((byte)client.Player.CurrentRoom.TimeMode); pkg.WriteByte((byte)client.Player.CurrentRoom.RoomType); pkg.WriteByte((byte)client.Player.CurrentRoom.HardLevel); pkg.WriteByte((byte)client.Player.CurrentRoom.LevelLimits); pkg.WriteString(client.Player.PlayerCharacter.NickName); pkg.WriteBoolean(true); pkg.WriteInt(5); pkg.WriteString(client.Player.CurrentRoom.Name); pkg.WriteString(client.Player.CurrentRoom.Password); //TrieuLSL BN IMInvite barrierNum pkg.WriteInt(50); player.Out.SendTCP(pkg); } else { if (player != null && player.CurrentRoom != null && player.CurrentRoom != client.Player.CurrentRoom) { client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("friendnotinthesameserver.Room")); } else { client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("friendnotinthesameserver.Fail")); } } return(0); }
public void HandlePacket(GameClient client, GSPacketIn packet) { GameTrainer trainer = client.Player.TargetObject as DOL.GS.GameTrainer; if (trainer == null || (trainer.CanTrain(client.Player) == false && trainer.CanTrainChampionLevels(client.Player) == false)) { client.Out.SendMessage("You must select a valid trainer for your class.", eChatType.CT_Important, eChatLoc.CL_ChatWindow); return; } uint x = packet.ReadInt(); uint y = packet.ReadInt(); int idLine = packet.ReadByte(); int unk = packet.ReadByte(); int row = packet.ReadByte(); int skillIndex = packet.ReadByte(); // idline not null so this is a Champion level training window if (idLine > 0) { if (row > 0 && skillIndex > 0) { ChampSpec spec = ChampSpecMgr.GetAbilityFromIndex(idLine, row, skillIndex); if (spec != null) { if (client.Player.HasChampionSpell(spec.SpellID)) { client.Out.SendMessage("You already have that ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (!client.Player.CanTrainChampionSpell(idLine, row, skillIndex)) { client.Out.SendMessage("You do not meet the requirements for that ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if ((client.Player.ChampionSpecialtyPoints - spec.Cost) < 0) { client.Out.SendMessage("You do not have enough champion specialty points for that ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } client.Player.ChampionSpecialtyPoints -= spec.Cost; SpellLine championPlayerSpellLine = client.Player.GetChampionSpellLine(); if (championPlayerSpellLine != null) { SkillBase.AddSpellToSpellLine(client.Player.ChampionSpellLineName, spec.SpellID); client.Player.ChampionSpells += spec.SpellID.ToString() + "|1;"; client.Player.UpdateSpellLineLevels(false); client.Player.RefreshSpecDependantSkills(true); client.Out.SendMessage("You gain a Champion ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow); client.Out.SendChampionTrainerWindow(idLine); client.Out.SendUpdatePlayerSkills(); } else { client.Out.SendMessage("Could not find Champion Spell Line!", eChatType.CT_System, eChatLoc.CL_SystemWindow); log.ErrorFormat("Could not find Champion Spell Line for player {0}", client.Player.Name); } return; } else { client.Out.SendMessage("Could not find Champion Spec!", eChatType.CT_System, eChatLoc.CL_SystemWindow); log.ErrorFormat("Could not find Champion Spec idline {0}, row {1}, skillindex {2}", idLine, row, skillIndex); } } } else { IList speclist = client.Player.GetSpecList(); if (skillIndex < speclist.Count) { Specialization spec = (Specialization)speclist[skillIndex]; if (spec.Level >= client.Player.BaseLevel) { client.Out.SendMessage("You can't train in this specialization again this level!", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } // Graveen - autotrain 1.87 - allow players to train their AT specs even if no pts left client.Player.SkillSpecialtyPoints += client.Player.GetAutoTrainPoints(spec, 2); if (client.Player.SkillSpecialtyPoints >= spec.Level + 1) { client.Player.SkillSpecialtyPoints -= (ushort)(spec.Level + 1); spec.Level++; client.Player.OnSkillTrained(spec); client.Out.SendUpdatePoints(); client.Out.SendTrainerWindow(); return; } else { client.Out.SendMessage("That specialization costs " + (spec.Level + 1) + " specialization points!", eChatType.CT_System, eChatLoc.CL_SystemWindow); client.Out.SendMessage("You don't have that many specialization points left for this level.", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } } else if (skillIndex >= 100) { IList offeredRA = (IList)client.Player.TempProperties.getProperty<object>("OFFERED_RA", null); if (offeredRA != null && skillIndex < offeredRA.Count + 100) { RealmAbility ra = (RealmAbility)offeredRA[skillIndex - 100]; int cost = ra.CostForUpgrade(ra.Level - 1); if (client.Player.RealmSpecialtyPoints < cost) { client.Out.SendMessage(ra.Name + " costs " + (cost) + " realm ability points!", eChatType.CT_System, eChatLoc.CL_SystemWindow); client.Out.SendMessage("You don't have that many realm ability points left to get this.", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (!ra.CheckRequirement(client.Player)) { client.Out.SendMessage("You are not experienced enough to get " + ra.Name + " now. Come back later.", eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } // get a copy of the ability since we use prototypes RealmAbility ability = SkillBase.GetAbility(ra.KeyName, ra.Level) as RealmAbility; if (ability != null) { client.Player.RealmSpecialtyPoints -= cost; client.Player.AddAbility(ability); client.Out.SendUpdatePoints(); client.Out.SendUpdatePlayer(); client.Out.SendUpdatePlayerSkills(); client.Out.SendTrainerWindow(); } else { client.Out.SendMessage("Unfortunately your training failed. Please report that to admins or game master. Thank you.", eChatType.CT_System, eChatLoc.CL_SystemWindow); log.Error("Realm Ability " + ra.Name + "(" + ra.KeyName + ") unexpected not found"); } return; } } if (log.IsErrorEnabled) log.Error("Player <" + client.Player.Name + "> requested to train incorrect skill index"); } }
public void HandlePing(GSPacketIn pkg) { //int playerid = pkg.ReadInt(); Info.Online = pkg.ReadInt(); Info.State = ServerMgr.GetState(Info.Online, Info.Total); }
public void HandlePacket(GameClient client, GSPacketIn packet) { if (client == null || client.Player == null) return; ushort objectType = packet.ReadShort(); uint extraID = 0; if (client.Version >= GameClient.eClientVersion.Version186) { extraID = packet.ReadInt(); } ushort objectID = packet.ReadShort(); string caption = ""; var objectInfo = new List<string>(); /* Type Description Id 1 Inventory item Slot (ie. 0xC for 2 handed weapon) 2 Spell spell level + spell line ID * 100 (starting from 0) 3 ??? 4 Merchant item Slot (divide by 30 to get page) 5 Buff/effect The buff id (each buff has a unique id) 6 Style style list index = ID-100-abilities count 7 Trade window position in trade window (starting form 0) 8 Ability 100+position in players abilities list (?) 9 Trainers skill position in trainers window list 10 Market Search slot? 19 Reward Quest */ ChatUtil.SendDebugMessage(client, string.Format("Delve objectType={0}, objectID={1}, extraID={2}", objectType, objectID, extraID)); ItemTemplate item = null; InventoryItem invItem = null; var snapSkills = client.Player.GetAllUsableSkills(); var snapLists = client.Player.GetAllUsableListSpells(); // find the first non-specialization index. int indexAtSpecOid = Math.Max(0, snapSkills.FindIndex(it => (it.Item1 is Specialization) == false)) + (objectID - 100); switch (objectType) { #region Inventory Item case 1: //Display Infos on inventory item case 10: // market search { if (objectType == 1) { IGameInventoryObject invObject = client.Player.TargetObject as IGameInventoryObject; // first try any active inventory object if (invItem == null) { if (client.Player.ActiveInventoryObject != null) { invObject = client.Player.ActiveInventoryObject; if (invObject != null && invObject.GetClientInventory(client.Player) != null) { invObject.GetClientInventory(client.Player).TryGetValue(objectID, out invItem); } } } // finally try direct inventory access if (invItem == null) { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); } // Failed to get any inventory if (invItem == null) return; } else if (objectType == 10) { List<InventoryItem> list = client.Player.TempProperties.getProperty<object>(MarketExplorer.EXPLORER_ITEM_LIST, null) as List<InventoryItem>; if (list == null) { list = client.Player.TempProperties.getProperty<object>("TempSearchKey", null) as List<InventoryItem>; if (list == null) return; } if (objectID >= list.Count) return; invItem = list[objectID]; if (invItem == null) return; } // Aredhel: Start of a more sophisticated item delve system. // The idea is to have every item inherit from an item base class, // this base class will provide a method // // public virtual void Delve(List<String>, GamePlayer player) // // which can be overridden in derived classes to provide additional // information. Same goes for spells, just add the spell delve // in the Delve() hierarchy. This will on one hand make this class // much more concise (1800 lines at the time of this writing) and // on the other hand the whole delve system much more flexible, for // example when adding new item types (artifacts, for example) you // provide *only* an overridden Delve() method, use the base // Delve() and you're done, spells, charges and everything else. // Let the player class create the appropriate item to delve caption = invItem.Name; if (client.Player.DelveItem<InventoryItem>(invItem, objectInfo)) break; #region Old Delve if (invItem is InventoryArtifact) { List<String> delve = new List<String>(); (invItem as InventoryArtifact).Delve(delve, client.Player); foreach (string line in delve) objectInfo.Add(line); break; } //********************************** //show crafter name //********************************** if (invItem.IsCrafted) { objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.CrafterName", invItem.Creator)); objectInfo.Add(" "); } else if (invItem.Description != null && invItem.Description != "") { objectInfo.Add(invItem.Description); objectInfo.Add(" "); } if ((invItem.Object_Type >= (int)eObjectType.GenericWeapon) && (invItem.Object_Type <= (int)eObjectType._LastWeapon) || invItem.Object_Type == (int)eObjectType.Instrument) { WriteUsableClasses(objectInfo, invItem, client); WriteMagicalBonuses(objectInfo, invItem, client, false); WriteClassicWeaponInfos(objectInfo, invItem, client); } if (invItem.Object_Type >= (int)eObjectType.Cloth && invItem.Object_Type <= (int)eObjectType.Scale) { WriteUsableClasses(objectInfo, invItem, client); WriteMagicalBonuses(objectInfo, invItem, client, false); WriteClassicArmorInfos(objectInfo, invItem, client); } if (invItem.Object_Type == (int)eObjectType.Shield) { WriteUsableClasses(objectInfo, invItem, client); WriteMagicalBonuses(objectInfo, invItem, client, false); WriteClassicShieldInfos(objectInfo, invItem, client); } if (invItem.Object_Type == (int)eObjectType.Magical || invItem.Object_Type == (int)eObjectType.AlchemyTincture || invItem.Object_Type == (int)eObjectType.SpellcraftGem) { WriteMagicalBonuses(objectInfo, invItem, client, false); } //*********************************** //shows info for Poison Potions //*********************************** if (invItem.Object_Type == (int)eObjectType.Poison) { WritePoisonInfo(objectInfo, invItem, client); } if (invItem.Object_Type == (int)eObjectType.Magical && invItem.Item_Type == (int)eInventorySlot.FirstBackpack) // potion { WritePotionInfo(objectInfo, invItem, client); } else if (invItem.CanUseEvery > 0) { // Items with a reuse timer (aka cooldown). objectInfo.Add(" "); int minutes = invItem.CanUseEvery / 60; int seconds = invItem.CanUseEvery % 60; if (minutes == 0) { objectInfo.Add(String.Format("Can use item every: {0} sec", seconds)); } else { objectInfo.Add(String.Format("Can use item every: {0}:{1:00} min", minutes, seconds)); } // objectInfo.Add(String.Format("Can use item every: {0:00}:{1:00}", minutes, seconds)); int cooldown = invItem.CanUseAgainIn; if (cooldown > 0) { minutes = cooldown / 60; seconds = cooldown % 60; if (minutes == 0) { objectInfo.Add(String.Format("Can use again in: {0} sec", seconds)); } else { objectInfo.Add(String.Format("Can use again in: {0}:{1:00} min", minutes, seconds)); } // objectInfo.Add(String.Format("Can use again in: {0:00}:{1:00}", minutes, seconds)); } } if (!invItem.IsDropable || !invItem.IsPickable || invItem.IsIndestructible) objectInfo.Add(" "); if (!invItem.IsPickable) objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.CannotTraded")); if (!invItem.IsDropable) objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.CannotSold")); if (invItem.IsIndestructible) objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.CannotDestroyed")); if (invItem.BonusLevel > 0) { objectInfo.Add(" "); objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.BonusLevel", invItem.BonusLevel)); } //Add admin info if (client.Account.PrivLevel > 1) { WriteTechnicalInfo(objectInfo, client, invItem); } break; #endregion Old Delve } #endregion #region Spell case 2: //spell List { int lineID = objectID / 100; int spellID = objectID % 100; Skill sk = null; SpellLine sl = null; // is spelline in index ? if (lineID < snapLists.Count) { int index = snapLists[lineID].Item2.FindIndex(s => s is Spell ? s.Level == spellID : (s is Styles.Style ? ((Styles.Style)s).SpecLevelRequirement == spellID : (s is Ability ? ((Ability)s).SpecLevelRequirement == spellID : false))); if (index > -1) { sk = snapLists[lineID].Item2[index]; } sl = snapLists[lineID].Item1; } if (sk is Spell && sl != null) { caption = sk.Name; WriteSpellInfo(objectInfo, (Spell)sk, sl, client); } else if (sk is Styles.Style) { caption = sk.Name; WriteStyleInfo(objectInfo, (Style)sk, client); } else if (sk is Ability) { caption = sk.Name; Ability abil = (Ability)sk; if (abil.DelveInfo.Count > 0) objectInfo.AddRange(abil.DelveInfo); else objectInfo.Add("There is no special information."); } break; } case 3: //spell Hybrid { SpellLine spellLine = null; Spell spell = null; // are we in list ? if (indexAtSpecOid < snapSkills.Count) { spell = (Spell)snapSkills[indexAtSpecOid].Item1; spellLine = (SpellLine)snapSkills[indexAtSpecOid].Item2; } if (spell == null || spellLine == null) return; caption = spell.Name; WriteSpellInfo(objectInfo, spell, spellLine, client); break; } #endregion #region Merchant / RewardQuest case 4: //Display Infos on Merchant objects case 19: //Display Info quest reward { if (objectType == 4) { GameMerchant merchant = null; if (client.Player.TargetObject != null && client.Player.TargetObject is GameMerchant) merchant = (GameMerchant)client.Player.TargetObject; if (merchant == null) return; byte pagenumber = (byte)(objectID / MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS); short slotnumber = (short)(objectID % MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS); item = merchant.TradeItems.GetItem(pagenumber, (eMerchantWindowSlot)slotnumber); } else if (objectType == 19) { ushort questID = (ushort)((extraID << 12) | (ushort)(objectID >> 4)); int index = objectID & 0x0F; GameLiving questGiver = null; if (client.Player.TargetObject != null && client.Player.TargetObject is GameLiving) questGiver = (GameLiving)client.Player.TargetObject; ChatUtil.SendDebugMessage(client, "Quest ID: " + questID); if (questID == 0) return; // questID == 0, wrong ID ? if (questID <= DataQuest.DATAQUEST_CLIENTOFFSET) { AbstractQuest q = client.Player.IsDoingQuest(QuestMgr.GetQuestTypeForID(questID)); if (q == null) { // player not doing quest, most likely on offer screen if (questGiver != null) { try { q = (AbstractQuest)Activator.CreateInstance(QuestMgr.GetQuestTypeForID(questID), new object[] { client.Player, 1 }); } catch { // we tried! } } if (q == null) { ChatUtil.SendDebugMessage(client, "Can't find or create quest!"); return; } } if (!(q is RewardQuest)) return; // this is not new quest List<ItemTemplate> rewards = null; if (index < 8) rewards = (q as RewardQuest).Rewards.BasicItems; else { rewards = (q as RewardQuest).Rewards.OptionalItems; index -= 8; } if (rewards != null && index >= 0 && index < rewards.Count) { item = rewards[index]; } } else // Data quest support, check for RewardQuest type { DataQuest dq = null; foreach (DBDataQuest d in GameObject.DataQuestCache) { if (d.ID == questID - DataQuest.DATAQUEST_CLIENTOFFSET) { dq = new DataQuest(d); break; } } if (dq != null && dq.StartType == DataQuest.eStartType.RewardQuest) { List<ItemTemplate> rewards = null; if (index < 8) rewards = dq.FinalRewards; else { rewards = dq.OptionalRewards; index -= 8; } if (rewards != null && index >= 0 && index < rewards.Count) { item = rewards[index]; } } } } if (item == null) return; caption = item.Name; if (client.Player.DelveItem<ItemTemplate>(item, objectInfo)) break; #region Old Delve // fallback to old delve if (item.Item_Type == (int)eInventorySlot.Horse) { WriteHorseInfo(objectInfo, item, client, ""); } if ((item.Item_Type == (int)eInventorySlot.HorseBarding || item.Item_Type == (int)eInventorySlot.HorseArmor) && item.Level > 0) { objectInfo.Add(" ");//empty line objectInfo.Add(" ");//empty line objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.ChampionLevel", item.Level)); } if ((item.Object_Type >= (int)eObjectType.GenericWeapon) && (item.Object_Type <= (int)eObjectType.MaulerStaff) || item.Object_Type == (int)eObjectType.Instrument) { WriteUsableClasses(objectInfo, item, client); WriteMagicalBonuses(objectInfo, item, client, false); WriteClassicWeaponInfos(objectInfo, GameInventoryItem.Create(item), client); } if (item.Object_Type >= (int)eObjectType.Cloth && item.Object_Type <= (int)eObjectType.Scale) { WriteUsableClasses(objectInfo, item, client); WriteMagicalBonuses(objectInfo, item, client, false); WriteClassicArmorInfos(objectInfo, GameInventoryItem.Create(item), client); } if (item.Object_Type == (int)eObjectType.Shield) { WriteUsableClasses(objectInfo, item, client); WriteMagicalBonuses(objectInfo, item, client, false); WriteClassicShieldInfos(objectInfo, item, client); } if ((item.Item_Type != (int)eInventorySlot.Horse && item.Object_Type == (int)eObjectType.Magical) || item.Object_Type == (int)eObjectType.AlchemyTincture || item.Object_Type == (int)eObjectType.SpellcraftGem) { WriteMagicalBonuses(objectInfo, item, client, false); } if (item.Object_Type == (int)eObjectType.Poison) { WritePoisonInfo(objectInfo, item, client); } if (item.Object_Type == (int)eObjectType.Magical && item.Item_Type == 40) // potion WritePotionInfo(objectInfo, item, client); //Add admin info if (client.Account.PrivLevel > 1) { WriteTechnicalInfo(objectInfo, client, GameInventoryItem.Create(item), item.MaxDurability, item.MaxCondition); } break; #endregion Old Delve } #endregion #region Effect case 5: //icons on top (buffs/dots) { IGameEffect foundEffect = null; lock (client.Player.EffectList) { foreach (IGameEffect effect in client.Player.EffectList) { if (effect.InternalID == objectID) { foundEffect = effect; break; } } } if (foundEffect == null) break; caption = foundEffect.Name; objectInfo.AddRange(foundEffect.DelveInfo); if (client.Account.PrivLevel > 1 && foundEffect is GameSpellEffect) { if ((foundEffect as GameSpellEffect).Spell != null) { if (client.Account.PrivLevel > 1) { objectInfo.Add(" "); objectInfo.Add("----------Technical informations----------"); objectInfo.Add("Line: " + ((foundEffect as GameSpellEffect).SpellHandler == null ? "unknown" : (foundEffect as GameSpellEffect).SpellHandler.SpellLine.Name)); objectInfo.Add("SpellID: " + (foundEffect as GameSpellEffect).Spell.ID); objectInfo.Add("Type: " + (foundEffect as GameSpellEffect).Spell.SpellType); objectInfo.Add("ClientEffect: " + (foundEffect as GameSpellEffect).Spell.ClientEffect); objectInfo.Add("Icon: " + (foundEffect as GameSpellEffect).Spell.Icon); if ((foundEffect as GameSpellEffect).SpellHandler != null) objectInfo.Add("HasPositiveEffect: " + (foundEffect as GameSpellEffect).SpellHandler.HasPositiveEffect); objectInfo.Add("Disabled: " + (foundEffect as GameSpellEffect).IsDisabled); } } } break; } #endregion #region Style case 6: //style { Style style = null; // are we in list ? if (indexAtSpecOid < snapSkills.Count) { style = (Style)snapSkills[indexAtSpecOid].Item1; } if (style == null) return; caption = style.Name; WriteStyleInfo(objectInfo, style, client); break; } #endregion #region Trade Window case 7: //trade windows { ITradeWindow playerTradeWindow = client.Player.TradeWindow; if (playerTradeWindow == null) return; if (playerTradeWindow.PartnerTradeItems != null && objectID < playerTradeWindow.PartnerItemsCount) invItem = (InventoryItem)playerTradeWindow.PartnerTradeItems[objectID]; if (invItem == null) return; // Let the player class create the appropriate item to delve caption = invItem.Name; if (client.Player.DelveItem<InventoryItem>(invItem, objectInfo)) break; #region Old Delve // fallback to old delve if (invItem.Item_Type == (int)eInventorySlot.Horse) { WriteHorseInfo(objectInfo, invItem, client, ""); } if ((invItem.Item_Type == (int)eInventorySlot.HorseBarding || invItem.Item_Type == (int)eInventorySlot.HorseArmor) && invItem.Level > 0) { objectInfo.Add(" ");//empty line objectInfo.Add(" ");//empty line objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.ChampionLevel", invItem.Level)); } if ((invItem.Object_Type >= (int)eObjectType.GenericWeapon) && (invItem.Object_Type <= (int)eObjectType.MaulerStaff) || invItem.Object_Type == (int)eObjectType.Instrument) { WriteUsableClasses(objectInfo, invItem, client); WriteMagicalBonuses(objectInfo, invItem, client, false); WriteClassicWeaponInfos(objectInfo, invItem, client); } if (invItem.Object_Type >= (int)eObjectType.Cloth && invItem.Object_Type <= (int)eObjectType.Scale) { WriteUsableClasses(objectInfo, invItem, client); WriteMagicalBonuses(objectInfo, invItem, client, false); WriteClassicArmorInfos(objectInfo, invItem, client); } if (invItem.Object_Type == (int)eObjectType.Shield) { WriteUsableClasses(objectInfo, invItem, client); WriteMagicalBonuses(objectInfo, invItem, client, false); WriteClassicShieldInfos(objectInfo, invItem, client); } if ((invItem.Item_Type != (int)eInventorySlot.Horse && invItem.Object_Type == (int)eObjectType.Magical) || invItem.Object_Type == (int)eObjectType.AlchemyTincture || invItem.Object_Type == (int)eObjectType.SpellcraftGem) { WriteMagicalBonuses(objectInfo, invItem, client, false); } if (invItem.Object_Type == (int)eObjectType.Poison) { WritePoisonInfo(objectInfo, invItem, client); } if (invItem.Object_Type == (int)eObjectType.Magical && invItem.Item_Type == 40) // potion WritePotionInfo(objectInfo, invItem, client); //Add admin info if (client.Account.PrivLevel > 1) { WriteTechnicalInfo(objectInfo, client, invItem); } break; #endregion Old Delve } #endregion #region Ability case 8://abilities { Ability abil = null; // are we in list ? if (indexAtSpecOid < snapSkills.Count) { abil = (Ability)snapSkills[indexAtSpecOid].Item1; } if (abil == null) return; caption = abil.Name; if (abil.DelveInfo.Count > 0) objectInfo.AddRange(abil.DelveInfo); else objectInfo.Add("There is no special information."); break; } #endregion #region Trainer case 9: //trainer window "info" button { Specialization spec = client.Player.GetSpecList().Where(e => e.Trainable).ElementAtOrDefault(objectID); if (spec != null) caption = spec.Name; if (client.TrainerSkillCache != null && objectID < client.TrainerSkillCache.Count) { objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.LevName")); foreach (Skill sk in client.TrainerSkillCache[objectID].Item2.Select(e => e.Item3)) { if (sk is Ability) objectInfo.Add(string.Format("{0}: {1}", ((Ability)sk).SpecLevelRequirement, sk.Name)); else if (sk is Style) objectInfo.Add(string.Format("{0}: {1}", ((Style)sk).SpecLevelRequirement, sk.Name)); else objectInfo.Add(string.Format("{0}: {1}", sk.Level, sk.Name)); } } else { //delve on realm abilities [by Suncheck] if (objectID >= 50) { int clientclassID = client.Player.CharacterClass.ID; int sub = 50; List<RealmAbility> ra_list = SkillBase.GetClassRealmAbilities(clientclassID); Ability ra5abil = SkillBase.GetClassRR5Ability(clientclassID); RealmAbility ab = ra_list[objectID - sub]; if (ra5abil != null) //check if player have rr { if (client.Player.RealmPoints < 513500) //player have not rr5 abilty sub--; } for (int i = 0; i <= (objectID - sub); i++) //get all ra's at full level { RealmAbility raabil = ra_list[i]; RealmAbility playerra = (RealmAbility)client.Player.GetAbility(raabil.KeyName); if (playerra != null) if (playerra.Level >= playerra.MaxLevel) sub--; } ab = ra_list[objectID - sub]; if (ab != null) { caption = ab.Name; objectInfo.AddRange(ab.DelveInfo); break; } } caption = "Specialization not found"; objectInfo.Add("that specialization is not found, id=" + objectID); break; } break; } #endregion #region Group case 12: // Item info to Group Chat { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem == null) return; string str = LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.Item", client.Player.Name, GetShortItemInfo(invItem, client)); if (client.Player.Group == null) { client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.NoGroup"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } client.Player.Group.SendMessageToGroupMembers(str, eChatType.CT_Group, eChatLoc.CL_ChatWindow); return; } #endregion #region Guild case 13: // Item info to Guild Chat { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem == null) return; string str = LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.GuildItem", client.Player.Name, GetShortItemInfo(invItem, client)); if (client.Player.Guild == null) { client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.DontBelongGuild"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (!client.Player.Guild.HasRank(client.Player, Guild.eRank.GcSpeak)) { client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.NoPermissionToSpeak"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } foreach (GamePlayer ply in client.Player.Guild.GetListOfOnlineMembers()) { if (!client.Player.Guild.HasRank(ply, Guild.eRank.GcHear)) continue; ply.Out.SendMessage(str, eChatType.CT_Guild, eChatLoc.CL_ChatWindow); } return; } #endregion #region ChatGroup case 15: // Item info to Chat group { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem == null) return; ChatGroup mychatgroup = (ChatGroup)client.Player.TempProperties.getProperty<object>(ChatGroup.CHATGROUP_PROPERTY, null); if (mychatgroup == null) { client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.MustBeInChatGroup"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (mychatgroup.Listen == true && (((bool)mychatgroup.Members[client.Player]) == false)) { client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.OnlyModerator"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } string str = LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.ChatItem", client.Player.Name, GetShortItemInfo(invItem, client)); foreach (GamePlayer ply in mychatgroup.Members.Keys) { ply.Out.SendMessage(str, eChatType.CT_Chat, eChatLoc.CL_ChatWindow); } return; } #endregion #region Trainer Window //styles case 20: { Style style = null; if (client.TrainerSkillCache != null) { // Search Id Skill sk = client.TrainerSkillCache.SelectMany(el => el.Item2).Where(e => e.Item2 == objectID && e.Item3.SkillType == eSkillPage.Styles).FirstOrDefault().Item3; if (sk is Style) style = (Style)sk; } if (style == null) return; caption = style.Name; WriteStyleInfo(objectInfo, style, client); break; } //spells case 22: //songs case 21: // Ability case 23: { Skill sk = null; if (client.TrainerSkillCache != null) { // Search Id sk = client.TrainerSkillCache.SelectMany(el => el.Item2).Where(e => ((objectType == 23 && e.Item2 == objectID && e.Item1 == 5) || (e.Item2 == objectID && e.Item1 != 5))).OrderBy(e => e.Item1).FirstOrDefault().Item3; } if (sk == null) return; if (sk is Spell) { Spell spell = (Spell)sk; caption = spell.Name; WriteSpellInfo(objectInfo, spell, SkillBase.GetSpellLine(GlobalSpellsLines.Reserved_Spells), client); } else if (sk is Ability) { Ability abil = (Ability)sk; caption = abil.Name; if (abil.DelveInfo.Count > 0) objectInfo.AddRange(abil.DelveInfo); else objectInfo.Add("There is no special information."); } break; } #endregion #region Repair case 100://repair { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem != null) { client.Player.RepairItem(invItem); } else { client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.VeryStrange"), eChatType.CT_System, eChatLoc.CL_SystemWindow); } return; } #endregion #region Self Craft case 101://selfcraft { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem != null) { client.Player.OpenSelfCraft(invItem); } else { client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.VeryStrange"), eChatType.CT_System, eChatLoc.CL_SystemWindow); } return; } #endregion #region Salvage case 102://salvage { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem != null) { client.Player.SalvageItem(invItem); } else { client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.VeryStrange"), eChatType.CT_System, eChatLoc.CL_SystemWindow); } return; } #endregion #region BattleGroup case 103: // Item info to battle group { invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID); if (invItem == null) return; BattleGroup mybattlegroup = (BattleGroup)client.Player.TempProperties.getProperty<object>(BattleGroup.BATTLEGROUP_PROPERTY, null); if (mybattlegroup == null) { client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.MustBeInBattleGroup"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (mybattlegroup.Listen == true && (((bool)mybattlegroup.Members[client.Player]) == false)) { client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.OnlyModerator"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } string str = LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.ChatItem", client.Player.Name, GetShortItemInfo(invItem, client)); foreach (GamePlayer ply in mybattlegroup.Members.Keys) { ply.Out.SendMessage(str, eChatType.CT_Chat, eChatLoc.CL_ChatWindow); } return; } #endregion #region v1.110+ case 24://SpellsNew if (client.CanSendTooltip(24, objectID)) client.Out.SendDelveInfo(DelveSpell(client, objectID)); break; case 25://StylesNew if (client.CanSendTooltip(25, objectID)) client.Out.SendDelveInfo(DelveStyle(client, objectID)); break; case 26://SongsNew if (client.CanSendTooltip(26, objectID)) client.Out.SendDelveInfo(DelveSong(client, objectID)); client.Out.SendDelveInfo(DelveSpell(client, objectID)); break; case 27://RANew if (client.CanSendTooltip(27, objectID)) client.Out.SendDelveInfo(DelveRealmAbility(client, objectID)); break; case 28://AbilityNew if (client.CanSendTooltip(28, objectID)) client.Out.SendDelveInfo(DelveAbility(client, objectID)); break; #endregion #region ChampionAbilities delve from trainer window default: { // Try retieving champion lines int clSpecID = objectType - 150; int clLineIndex = objectID >> 8; int clSkillIndex = objectID & 0x00FF; // Get Player CL Spec var clspec = client.Player.GetSpecList().Where(sp => sp is LiveChampionsSpecialization).Cast<LiveChampionsSpecialization>().FirstOrDefault(); // check if the tree can be used List<Tuple<MiniLineSpecialization, List<Tuple<Skill, byte>>>> tree = null; if (clspec != null) { tree = clspec.GetTrainerTreeDisplay(client.Player, clspec.RetrieveTypeForIndex(clSpecID)); } // Try and handle all Champion lines, including custom lines if (tree != null) { try { Skill skill = tree[clLineIndex].Item2[clSkillIndex].Item1; if (skill != null) { if (skill is Spell) { SpellLine spellLine = clspec.GetSpellLinesForLiving(client.Player).FirstOrDefault(); if (spellLine != null) { caption = skill.Name; WriteSpellInfo(objectInfo, (Spell)skill, spellLine, client); } else { objectInfo.Add("Champion spell line not found!"); } } else if (skill is Style) { caption = skill.Name; WriteStyleInfo(objectInfo, (Style)skill, client); } } } catch { } } break; } #endregion } if (objectInfo.Count > 0) { client.Out.SendCustomTextWindow(caption, objectInfo); } else if ((objectType < 24 || objectType > 28) && objectType < 150) // only warn for non v1.110+ objects { log.WarnFormat("DetailDisplayHandler no info for objectID {0} of type {1}. Item: {2}, client: {3}", objectID, objectType, (item == null ? (invItem == null ? "null" : invItem.Id_nb) : item.Id_nb), client); } }
public void HandleReload(GSPacketIn packet) { eReloadType eReloadType = (eReloadType)packet.ReadInt(); bool val = false; switch (eReloadType) { case eReloadType.ball: val = BallMgr.ReLoad(); break; case eReloadType.map: val = MapMgr.ReLoadMap(); break; case eReloadType.mapserver: val = MapMgr.ReLoadMapServer(); break; case eReloadType.item: val = ItemMgr.ReLoad(); break; case eReloadType.quest: val = QuestMgr.ReLoad(); break; case eReloadType.fusion: val = FusionMgr.ReLoad(); break; case eReloadType.server: GameServer.Instance.Configuration.Refresh(); break; case eReloadType.rate: val = RateMgr.ReLoad(); break; case eReloadType.consortia: val = ConsortiaMgr.ReLoad(); break; case eReloadType.shop: val = ShopMgr.ReLoad(); break; case eReloadType.fight: val = FightRateMgr.ReLoad(); break; case eReloadType.dailyaward: val = AwardMgr.ReLoad(); break; case eReloadType.language: val = LanguageMgr.Reload(""); break; } packet.WriteInt(GameServer.Instance.Configuration.ServerID); packet.WriteBoolean(val); this.SendTCP(packet); }
public void HandlePacket(GameClient client, GSPacketIn packet) { if (client == null || client.Player == null) return; if ((client.Player.TargetObject is IGameInventoryObject) == false) return; MarketSearch.SearchData search = new MarketSearch.SearchData(); search.name = packet.ReadString(64); search.slot = (int)packet.ReadInt(); search.skill = (int)packet.ReadInt(); search.resist = (int)packet.ReadInt(); search.bonus = (int)packet.ReadInt(); search.hp = (int)packet.ReadInt(); search.power = (int)packet.ReadInt(); search.proc = (int)packet.ReadInt(); search.qtyMin = (int)packet.ReadInt(); search.qtyMax = (int)packet.ReadInt(); search.levelMin = (int)packet.ReadInt(); search.levelMax = (int)packet.ReadInt(); search.priceMin = (int)packet.ReadInt(); search.priceMax = (int)packet.ReadInt(); search.visual = (int)packet.ReadInt(); search.page = (byte)packet.ReadByte(); byte unk1 = (byte)packet.ReadByte(); short unk2 = (short)packet.ReadShort(); byte unk3 = 0; byte unk4 = 0; byte unk5 = 0; byte unk6 = 0; byte unk7 = 0; byte unk8 = 0; if (client.Version >= GameClient.eClientVersion.Version198) { // Dunnerholl 2009-07-28 Version 1.98 introduced new options to Market search. 12 Bytes were added, but only 7 are in usage so far in my findings. // update this, when packets change and keep in mind, that this code reflects only the 1.98 changes search.armorType = search.page; // page is now used for the armorType (still has to be logged, i just checked that 2 means leather, 0 = standard search.damageType = (byte)packet.ReadByte(); // 1=crush, 2=slash, 3=thrust unk3 = (byte)packet.ReadByte(); unk4 = (byte)packet.ReadByte(); unk5 = (byte)packet.ReadByte(); search.playerCrafted = (byte)packet.ReadByte(); // 1 = show only Player crafted, 0 = all // 3 bytes unused packet.Skip(3); search.page = (byte)packet.ReadByte(); // page is now sent here unk6 = (byte)packet.ReadByte(); unk7 = (byte)packet.ReadByte(); unk8 = (byte)packet.ReadByte(); } search.clientVersion = client.Version.ToString(); (client.Player.TargetObject as IGameInventoryObject).SearchInventory(client.Player, search); }
public void HandleConsortiaUserPass(GSPacketIn packet) { packet.ReadInt(); packet.ReadBoolean(); int num = packet.ReadInt(); string consortiaName = packet.ReadString(); int num2 = packet.ReadInt(); packet.ReadString(); packet.ReadInt(); packet.ReadString(); packet.ReadInt(); string dutyName = packet.ReadString(); packet.ReadInt(); packet.ReadInt(); packet.ReadInt(); packet.ReadDateTime(); packet.ReadInt(); int dutyLevel = packet.ReadInt(); packet.ReadInt(); packet.ReadBoolean(); int right = packet.ReadInt(); packet.ReadInt(); packet.ReadInt(); packet.ReadInt(); int consortiaRepute = packet.ReadInt(); GamePlayer[] allPlayers = WorldMgr.GetAllPlayers(); GamePlayer[] array = allPlayers; for (int i = 0; i < array.Length; i++) { GamePlayer gamePlayer = array[i]; if (gamePlayer.PlayerCharacter.ID == num2) { gamePlayer.BeginChanges(); gamePlayer.PlayerCharacter.ConsortiaID = num; gamePlayer.PlayerCharacter.ConsortiaName = consortiaName; gamePlayer.PlayerCharacter.DutyName = dutyName; gamePlayer.PlayerCharacter.DutyLevel = dutyLevel; gamePlayer.PlayerCharacter.Right = right; gamePlayer.PlayerCharacter.ConsortiaRepute = consortiaRepute; ConsortiaInfo consortiaInfo = ConsortiaMgr.FindConsortiaInfo(num); if (consortiaInfo != null) { gamePlayer.PlayerCharacter.ConsortiaLevel = consortiaInfo.Level; } gamePlayer.CommitChanges(); } if (gamePlayer.PlayerCharacter.ConsortiaID == num) { gamePlayer.Out.SendTCP(packet); } } }
public bool HandleCommand(TankMarryLogicProcessor process, GamePlayer player, GSPacketIn packet) { bool result2; if (player.CurrentMarryRoom == null || player.CurrentMarryRoom.RoomState != eRoomState.FREE) { result2 = false; } else { if (player.PlayerCharacter.ID != player.CurrentMarryRoom.Info.GroomID && player.PlayerCharacter.ID != player.CurrentMarryRoom.Info.BrideID) { result2 = false; } else { int needMoney = 500; if (player.CurrentMarryRoom.Info.IsHymeneal) { if (player.PlayerCharacter.Money < needMoney) { player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("UserFirecrackersCommand.MoneyNotEnough", new object[0])); result2 = false; return(result2); } } GamePlayer Groom = player.CurrentMarryRoom.GetPlayerByUserID(player.CurrentMarryRoom.Info.GroomID); if (Groom == null) { player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("HymenealCommand.NoGroom", new object[0])); result2 = false; } else { GamePlayer Bride = player.CurrentMarryRoom.GetPlayerByUserID(player.CurrentMarryRoom.Info.BrideID); if (Bride == null) { player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("HymenealCommand.NoBride", new object[0])); result2 = false; } else { bool result = false; bool isFirst = false; GSPacketIn pkg = packet.Clone(); int hymenealState = packet.ReadInt(); if (1 == hymenealState) { player.CurrentMarryRoom.RoomState = eRoomState.FREE; } else { player.CurrentMarryRoom.RoomState = eRoomState.Hymeneal; player.CurrentMarryRoom.BeginTimerForHymeneal(170000); if (!player.PlayerCharacter.IsGotRing) { isFirst = true; ItemTemplateInfo ringTemplate = ItemMgr.FindItemTemplate(9022); ItemInfo ring = ItemInfo.CreateFromTemplate(ringTemplate, 1, 112); ring.IsBinds = true; using (PlayerBussiness pb = new PlayerBussiness()) { ring.UserID = 0; pb.AddGoods(ring); string content = LanguageMgr.GetTranslation("HymenealCommand.Content", new object[] { Bride.PlayerCharacter.NickName }); MailInfo mail = new MailInfo(); mail.Annex1 = ring.ItemID.ToString(); mail.Content = content; mail.Gold = 0; mail.IsExist = true; mail.Money = 0; mail.GiftToken = 0; mail.Receiver = Groom.PlayerCharacter.NickName; mail.ReceiverID = Groom.PlayerCharacter.ID; mail.Sender = LanguageMgr.GetTranslation("HymenealCommand.Sender", new object[0]); mail.SenderID = 0; mail.Title = LanguageMgr.GetTranslation("HymenealCommand.Title", new object[0]); mail.Type = 14; if (pb.SendMail(mail)) { result = true; } player.Out.SendMailResponse(mail.ReceiverID, eMailRespose.Receiver); } ItemInfo ring2 = ItemInfo.CreateFromTemplate(ringTemplate, 1, 112); ring2.IsBinds = true; using (PlayerBussiness pb = new PlayerBussiness()) { ring2.UserID = 0; pb.AddGoods(ring2); string content = LanguageMgr.GetTranslation("HymenealCommand.Content", new object[] { Groom.PlayerCharacter.NickName }); MailInfo mail = new MailInfo(); mail.Annex1 = ring2.ItemID.ToString(); mail.Content = content; mail.Gold = 0; mail.IsExist = true; mail.Money = 0; mail.GiftToken = 0; mail.Receiver = Bride.PlayerCharacter.NickName; mail.ReceiverID = Bride.PlayerCharacter.ID; mail.Sender = LanguageMgr.GetTranslation("HymenealCommand.Sender", new object[0]); mail.SenderID = 0; mail.Title = LanguageMgr.GetTranslation("HymenealCommand.Title", new object[0]); mail.Type = 14; if (pb.SendMail(mail)) { result = true; } player.Out.SendMailResponse(mail.ReceiverID, eMailRespose.Receiver); } player.CurrentMarryRoom.Info.IsHymeneal = true; using (PlayerBussiness db = new PlayerBussiness()) { db.UpdateMarryRoomInfo(player.CurrentMarryRoom.Info); db.UpdatePlayerGotRingProp(Groom.PlayerCharacter.ID, Bride.PlayerCharacter.ID); Groom.LoadMarryProp(); Bride.LoadMarryProp(); } } else { isFirst = false; result = true; } if (!isFirst) { player.RemoveMoney(needMoney, LogMoneyType.Marry, LogMoneyType.Marry_Hymeneal); CountBussiness.InsertSystemPayCount(player.PlayerCharacter.ID, needMoney, 0, 0, 1); } pkg.WriteInt(player.CurrentMarryRoom.Info.ID); pkg.WriteBoolean(result); player.CurrentMarryRoom.SendToAll(pkg); if (result) { string msg = LanguageMgr.GetTranslation("HymenealCommand.Succeed", new object[] { Groom.PlayerCharacter.NickName, Bride.PlayerCharacter.NickName }); GSPacketIn message = player.Out.SendMessage(eMessageType.ChatNormal, msg); player.CurrentMarryRoom.SendToPlayerExceptSelfForScene(message, player); } } result2 = true; } } } } return(result2); }
public void HandleGameRoomCreate(GSPacketIn pkg) { int roomId = pkg.ReadInt(); int gameType = pkg.ReadInt(); int guildId = pkg.ReadInt(); int count = pkg.ReadInt(); int totalLevel = 0; IGamePlayer[] players = new IGamePlayer[count]; for (int i = 0; i < count; i++) { PlayerInfo info = new PlayerInfo(); info.ID = pkg.ReadInt(); info.NickName = pkg.ReadString(); info.Sex = pkg.ReadBoolean(); info.Hide = pkg.ReadInt(); info.Style = pkg.ReadString(); info.Colors = pkg.ReadString(); info.Skin = pkg.ReadString(); info.Offer = pkg.ReadInt(); info.GP = pkg.ReadInt(); info.Grade = pkg.ReadInt(); info.Repute = pkg.ReadInt(); info.ConsortiaID = pkg.ReadInt(); info.ConsortiaName = pkg.ReadString(); info.ConsortiaLevel = pkg.ReadInt(); info.ConsortiaRepute = pkg.ReadInt(); info.Attack = pkg.ReadInt(); info.Defence = pkg.ReadInt(); info.Agility = pkg.ReadInt(); info.Luck = pkg.ReadInt(); double baseAttack = pkg.ReadDouble(); double baseDefence = pkg.ReadDouble(); double baseAgility = pkg.ReadDouble(); double baseBlood = pkg.ReadDouble(); int templateId = pkg.ReadInt(); bool canUserProp = pkg.ReadBoolean(); int secondWeapon = pkg.ReadInt(); int strengthLevel = pkg.ReadInt(); double gprate = pkg.ReadDouble(); double offerrate = pkg.ReadDouble(); double rate = pkg.ReadDouble(); int serverid = pkg.ReadInt(); ItemTemplateInfo itemTemplate = ItemMgr.FindItemTemplate(templateId); ItemInfo item = null; if (secondWeapon != 0) { ItemTemplateInfo secondWeaponTemp = ItemMgr.FindItemTemplate(secondWeapon); item = ItemInfo.CreateFromTemplate(secondWeaponTemp, 1, 1); item.StrengthenLevel = strengthLevel; } List <BufferInfo> infos = new List <BufferInfo>(); int buffercout = pkg.ReadInt(); for (int j = 0; j < buffercout; j++) { BufferInfo buffinfo = new BufferInfo(); buffinfo.Type = pkg.ReadInt(); buffinfo.IsExist = pkg.ReadBoolean(); buffinfo.BeginDate = pkg.ReadDateTime(); buffinfo.ValidDate = pkg.ReadInt(); buffinfo.Value = pkg.ReadInt(); if (info != null) { infos.Add(buffinfo); } } players[i] = new ProxyPlayer(this, info, itemTemplate, item, baseAttack, baseDefence, baseAgility, baseBlood, gprate, offerrate, rate, infos, serverid); players[i].CanUseProp = canUserProp; int ec = pkg.ReadInt(); for (int j = 0; j < ec; j++) { players[i].EquipEffect.Add(pkg.ReadInt()); } totalLevel += info.Grade; } ProxyRoom room = new ProxyRoom(ProxyRoomMgr.NextRoomId(), roomId, players, this); room.GuildId = guildId; room.GameType = (eGameType)gameType; lock (m_rooms) { if (!m_rooms.ContainsKey(roomId)) { m_rooms.Add(roomId, room); } else { room = null; } } if (room != null) { ProxyRoomMgr.AddRoom(room); } else { log.ErrorFormat("Room already exists:{0}", roomId); } }
public void HandleFriendState(GSPacketIn pkg) { WorldMgr.ChangePlayerState(pkg.ClientID, pkg.ReadInt(), pkg.ReadInt()); }
public int HandlePacket(GameClient client, GSPacketIn packet) { int bagType = packet.ReadInt(); int place = packet.ReadInt(); string msg1 = null; ItemInfo item = null; List <ShopItemInfo> ShopItem = new List <ShopItemInfo>(); if (client.Player.PlayerCharacter.HasBagPassword && client.Player.PlayerCharacter.IsLocked) { client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("Bag.Locked")); return(0); } if (place == -1) { int templateID = packet.ReadInt(); int type = packet.ReadInt(); int gold = 0; int money = 0; ItemTemplateInfo template = Bussiness.Managers.ItemMgr.FindItemTemplate(templateID); item = ItemInfo.CreateFromTemplate(template, 1, (int)ItemAddType.Buy); ShopItem = Bussiness.Managers.ShopMgr.FindShopbyTemplatID(templateID); for (int i = 0; i < ShopItem.Count; i++) { if (ShopItem[i].APrice1 == -1 && ShopItem[i].AValue1 != 0) { money = ShopItem[i].AValue1; item.ValidDate = ShopItem[i].AUnit; } } if (item != null) { // item = ItemInfo.SetItemType(item, type, ref gold, ref money, ref offer); if (gold <= client.Player.PlayerCharacter.Gold && money <= client.Player.PlayerCharacter.Money) { client.Player.RemoveMoney(money); client.Player.RemoveGold(gold); LogMgr.LogMoneyAdd(LogMoneyType.Shop, LogMoneyType.Shop_Card, client.Player.PlayerCharacter.ID, money, client.Player.PlayerCharacter.Money, gold, 0, 0, 0, "牌子编号", item.TemplateID.ToString(), type.ToString()); msg1 = "CardUseHandler.Success"; } else { item = null; } } } else { item = client.Player.PropBag.GetItemAt(place); msg1 = "CardUseHandler.Success"; } if (item != null) { string msg = string.Empty; if (item.Template.Property1 != 21) { AbstractBuffer buffer = BufferList.CreateBuffer(item.Template, item.ValidDate); if (buffer != null) { buffer.Start(client.Player); if (place != -1) { client.Player.PropBag.RemoveItem(item); } } client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation(msg1)); } else { if (item.IsValidItem()) { //client.Player.PlayerCharacter.GP += item.Template.Property1; client.Player.AddGP(item.Template.Property2); if (item.Template.CanDelete) { client.Player.RemoveItem(item); msg = "GPDanUser.Success"; } } client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation(msg, item.Template.Property2)); } } return(0); }