Example #1
0
        /// <summary>
        /// The title value, shown over player's head.
        /// </summary>
        /// <param name="source">The player looking.</param>
        /// <param name="player">The title owner.</param>
        /// <returns>The title value.</returns>
        public override string GetValue(GamePlayer source, GamePlayer player)
        {
            if (player.CraftingPrimarySkill == eCraftingSkill.NoCrafting || !player.CraftingSkills.ContainsKey(player.CraftingPrimarySkill))
            {
                return(string.Format(source.TryTranslateOrDefault("!BasicCrafting!", "Crafting.Name.BasicCrafting")));
            }

            var craftingSkill = CraftingMgr.getSkillbyEnum(player.CraftingPrimarySkill);

            if (!(craftingSkill is AbstractProfession profession))
            {
                return(craftingSkill.Name);
            }

            return(profession.GetTitle(source, player.CraftingSkills[player.CraftingPrimarySkill]));
        }
Example #2
0
        public override void SendUpdatePlayer()
        {
            GamePlayer player = m_gameClient.Player;

            if (player == null)
            {
                return;
            }

            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.VariousUpdate)))
            {
                pak.WriteByte(0x03);                 //subcode
                pak.WriteByte(0x0e);                 //number of entry
                pak.WriteByte(0x00);                 //subtype
                pak.WriteByte(0x00);                 //unk
                //entry :

                pak.WriteByte(player.GetDisplayLevel(m_gameClient.Player));                 //level
                pak.WritePascalString(player.Name);

                pak.WriteByte((byte)(player.MaxHealth >> 8));                        // maxhealth high byte ?
                pak.WritePascalString(player.CharacterClass.Name);                   // class name
                pak.WriteByte((byte)(player.MaxHealth & 0xFF));                      // maxhealth low byte ?

                pak.WritePascalString(/*"The "+*/ player.CharacterClass.Profession); // Profession

                pak.WriteByte(0x00);                                                 //unk

                pak.WritePascalString(player.CharacterClass.GetTitle(player, player.Level));

                //todo make function to calcule realm rank
                //client.Player.RealmPoints
                //todo i think it s realmpoint percent not realrank
                pak.WriteByte((byte)player.RealmLevel);                                //urealm rank
                pak.WritePascalString(player.RealmRankTitle(player.Client.Account.Language));
                pak.WriteByte((byte)player.RealmSpecialtyPoints);                      // realm skill points

                pak.WritePascalString(player.CharacterClass.BaseName);                 // base class

                pak.WriteByte((byte)(HouseMgr.GetHouseNumberByPlayer(player) >> 8));   // personal house high byte
                pak.WritePascalString(player.GuildName);
                pak.WriteByte((byte)(HouseMgr.GetHouseNumberByPlayer(player) & 0xFF)); // personal house low byte

                pak.WritePascalString(player.LastName);

                pak.WriteByte(0x0);                 // ML Level
                pak.WritePascalString(player.RaceName);

                pak.WriteByte(0x0);
                if (player.GuildRank != null)
                {
                    pak.WritePascalString(player.GuildRank.Title);
                }
                else
                {
                    pak.WritePascalString("");
                }
                pak.WriteByte(0x0);

                AbstractCraftingSkill skill = CraftingMgr.getSkillbyEnum(player.CraftingPrimarySkill);
                if (skill != null)
                {
                    pak.WritePascalString(skill.Name);                     //crafter guilde: alchemist
                }
                else
                {
                    pak.WritePascalString("None");                     //no craft skill at start
                }
                pak.WriteByte(0x0);
                pak.WritePascalString(player.CraftTitle);                 //crafter title: legendary alchemist

                pak.WriteByte(0x0);
                pak.WritePascalString("None");                 //ML title

                // new in 1.75
                pak.WriteByte(0x0);
                string title = "None";
                if (player.CurrentTitle != PlayerTitleMgr.ClearTitle)
                {
                    title = GameServer.ServerRules.GetPlayerTitle(player, player);
                }
                pak.WritePascalString(title);                 // new in 1.74
                SendTCP(pak);
            }
        }
Example #3
0
        /// <summary>
        /// 1.109 items have an additional byte prior to item.Weight
        /// </summary>
        /// <param name="pak"></param>
        /// <param name="item"></param>
        protected override void WriteItemData(GSTCPPacketOut pak, InventoryItem item)
        {
            if (item == null)
            {
                pak.Fill(0x00, 20);                 // 1.109 +1 byte
                return;
            }

            // Create a GameInventoryItem so item will display correctly in inventory window
            item = GameInventoryItem.Create(item);

            pak.WriteByte((byte)item.Level);

            int value1;             // some object types use this field to display count
            int value2;             // some object types use this field to display count

            switch (item.Object_Type)
            {
            case (int)eObjectType.GenericItem:
                value1 = item.Count & 0xFF;
                value2 = (item.Count >> 8) & 0xFF;
                break;

            case (int)eObjectType.Arrow:
            case (int)eObjectType.Bolt:
            case (int)eObjectType.Poison:
                value1 = item.Count;
                value2 = item.SPD_ABS;
                break;

            case (int)eObjectType.Thrown:
                value1 = item.DPS_AF;
                value2 = item.Count;
                break;

            case (int)eObjectType.Instrument:
                value1 = (item.DPS_AF == 2 ? 0 : item.DPS_AF);
                value2 = 0;
                break;                         // unused

            case (int)eObjectType.Shield:
                value1 = item.Type_Damage;
                value2 = item.DPS_AF;
                break;

            case (int)eObjectType.AlchemyTincture:
            case (int)eObjectType.SpellcraftGem:
                value1 = 0;
                value2 = 0;

                /*
                 * must contain the quality of gem for spell craft and think same for tincture
                 */
                break;

            case (int)eObjectType.HouseWallObject:
            case (int)eObjectType.HouseFloorObject:
            case (int)eObjectType.GardenObject:
                value1 = 0;
                value2 = item.SPD_ABS;

                /*
                 * Value2 byte sets the width, only lower 4 bits 'seem' to be used (so 1-15 only)
                 *
                 * The byte used for "Hand" (IE: Mini-delve showing a weapon as Left-Hand
                 * usabe/TwoHanded), the lower 4 bits store the height (1-15 only)
                 */
                break;

            default:
                value1 = item.DPS_AF;
                value2 = item.SPD_ABS;
                break;
            }
            pak.WriteByte((byte)value1);
            pak.WriteByte((byte)value2);

            if (item.Object_Type == (int)eObjectType.GardenObject)
            {
                pak.WriteByte((byte)(item.DPS_AF));
            }
            else
            {
                pak.WriteByte((byte)(item.Hand << 6));
            }
            pak.WriteByte((byte)((item.Type_Damage > 3 ? 0 : item.Type_Damage << 6) | item.Object_Type));

            pak.Fill(0x00, 1);             // 1.109, +1 byte, no clue what this is  - Tolakram

            pak.WriteShort((ushort)item.Weight);
            pak.WriteByte(item.ConditionPercent);        // % of con
            pak.WriteByte(item.DurabilityPercent);       // % of dur
            pak.WriteByte((byte)item.Quality);           // % of qua
            pak.WriteByte((byte)item.Bonus);             // % bonus
            pak.WriteShort((ushort)item.Model);
            pak.WriteByte((byte)item.Extension);
            int flag = 0;

            if (item.Emblem != 0)
            {
                pak.WriteShort((ushort)item.Emblem);
                flag |= (item.Emblem & 0x010000) >> 16;                 // = 1 for newGuildEmblem
            }
            else
            {
                pak.WriteShort((ushort)item.Color);
            }
            //						flag |= 0x01; // newGuildEmblem
            flag |= 0x02;             // enable salvage button
            AbstractCraftingSkill skill = CraftingMgr.getSkillbyEnum(m_gameClient.Player.CraftingPrimarySkill);

            if (skill != null && skill is AdvancedCraftingSkill /* && ((AdvancedCraftingSkill)skill).IsAllowedToCombine(m_gameClient.Player, item)*/)
            {
                flag |= 0x04;                 // enable craft button
            }
            ushort icon1       = 0;
            ushort icon2       = 0;
            string spell_name1 = "";
            string spell_name2 = "";

            if (item.Object_Type != (int)eObjectType.AlchemyTincture)
            {
                SpellLine chargeEffectsLine = SkillBase.GetSpellLine(GlobalSpellsLines.Item_Effects);

                if (chargeEffectsLine != null)
                {
                    if (item.SpellID > 0 /* && item.Charges > 0*/)
                    {
                        Spell spell = SkillBase.FindSpell(item.SpellID, chargeEffectsLine);
                        if (spell != null)
                        {
                            flag       |= 0x08;
                            icon1       = spell.Icon;
                            spell_name1 = spell.Name;                             // or best spl.Name ?
                        }
                    }
                    if (item.SpellID1 > 0 /* && item.Charges > 0*/)
                    {
                        Spell spell = SkillBase.FindSpell(item.SpellID1, chargeEffectsLine);
                        if (spell != null)
                        {
                            flag       |= 0x10;
                            icon2       = spell.Icon;
                            spell_name2 = spell.Name;                             // or best spl.Name ?
                        }
                    }
                }
            }
            pak.WriteByte((byte)flag);
            if ((flag & 0x08) == 0x08)
            {
                pak.WriteShort((ushort)icon1);
                pak.WritePascalString(spell_name1);
            }
            if ((flag & 0x10) == 0x10)
            {
                pak.WriteShort((ushort)icon2);
                pak.WritePascalString(spell_name2);
            }
            pak.WriteByte((byte)item.Effect);
            string name = item.Name;

            if (item.Count > 1)
            {
                name = item.Count + " " + name;
            }
            if (item.SellPrice > 0)
            {
                if (ServerProperties.Properties.CONSIGNMENT_USE_BP)
                {
                    name += "[" + item.SellPrice.ToString() + " BP]";
                }
                else
                {
                    name += "[" + Money.GetShortString(item.SellPrice) + "]";
                }
            }

            if (name.Length > MAX_NAME_LENGTH)
            {
                name = name.Substring(0, MAX_NAME_LENGTH);
            }

            pak.WritePascalString(name);
        }
Example #4
0
        // make /who line using GamePlayer
        private string FormatLine(GamePlayer player, uint PrivLevel, GameClient source)
        {
            /*
             * /setwho class | trade
             * Sets how the player wishes to be displayed on a /who inquery.
             * Class displays the character's class and level.
             * Trade displays the tradeskill type and level of the character.
             * and it is saved after char logs out
             */

            if (player == null)
            {
                if (log.IsErrorEnabled)
                {
                    log.Error("null player in who command");
                }
                return("???");
            }

            StringBuilder result = new StringBuilder(player.Name, 100);

            if (player.GuildName != "")
            {
                result.Append(" <");
                result.Append(player.GuildName);
                result.Append(">");
            }

            // simle format for PvP
            if (GameServer.Instance.Configuration.ServerType == eGameServerType.GST_PvP && PrivLevel == 1)
            {
                return(result.ToString());
            }

            result.Append(" the Level ");
            result.Append(player.Level);
            if (player.ClassNameFlag)
            {
                result.Append(" ");
                result.Append(player.CharacterClass.Name);
            }
            else if (player.CharacterClass != null)
            {
                result.Append(" ");
                AbstractCraftingSkill skill = CraftingMgr.getSkillbyEnum(player.CraftingPrimarySkill);
                result.Append(player.CraftTitle.GetValue(source.Player, player));
            }
            else
            {
                if (log.IsErrorEnabled)
                {
                    log.Error("no character class spec in who commandhandler for player " + player.Name);
                }
            }
            if (player.CurrentZone != null)
            {
                result.Append(" in ");
                result.Append(player.CurrentZone.Description);
            }
            else
            {
                if (log.IsErrorEnabled)
                {
                    log.Error("no currentzone in who commandhandler for player " + player.Name);
                }
            }
            ChatGroup mychatgroup = (ChatGroup)player.TempProperties.getProperty <object>(ChatGroup.CHATGROUP_PROPERTY, null);

            if (mychatgroup != null && (mychatgroup.Members.Contains(player) || mychatgroup.IsPublic && (bool)mychatgroup.Members[player] == true))
            {
                result.Append(" [CG]");
            }
            BattleGroup mybattlegroup = (BattleGroup)player.TempProperties.getProperty <object>(BattleGroup.BATTLEGROUP_PROPERTY, null);

            if (mybattlegroup != null && (mybattlegroup.Members.Contains(player) || mybattlegroup.IsPublic && (bool)mybattlegroup.Members[player] == true))
            {
                result.Append(" [BG]");
            }
            if (player.IsAnonymous)
            {
                result.Append(" <ANON>");
            }
            if (player.TempProperties.getProperty <string>(GamePlayer.AFK_MESSAGE) != null)
            {
                result.Append(" <AFK>");
            }
            if (player.Advisor)
            {
                result.Append(" <ADV>");
            }
            if (player.Client.Account.PrivLevel == (uint)ePrivLevel.GM)
            {
                result.Append(" <GM>");
            }
            if (player.Client.Account.PrivLevel == (uint)ePrivLevel.Admin)
            {
                result.Append(" <Admin>");
            }
            if (ServerProperties.Properties.ALLOW_CHANGE_LANGUAGE)
            {
                result.Append(" <" + player.Client.Account.Language + ">");
            }

            return(result.ToString());
        }
Example #5
0
        public void OnCommand(GameClient client, string[] args)
        {
            if (args.Length < 2)
            {
                DisplaySyntax(client);
                return;
            }

            try
            {
                #region List
                if (args[1].ToLower() == "list")
                {
                    List <string> list  = new List <string>();
                    int           count = 0;
                    foreach (int value in Enum.GetValues(typeof(eCraftingSkill)))
                    {
                        if (++count < 16)                         // get rid of duplicate due to _Last
                        {
                            list.Add(value + " = " + Enum.GetName(typeof(eCraftingSkill), value));
                        }
                    }

                    client.Out.SendCustomTextWindow(LanguageMgr.GetTranslation(client.Account.Language, "GMCommands.Crafting.SkillDescription"), list);
                    return;
                }
                #endregion List

                #region Salvage

                if (args[1].ToLower() == "salvageinfo")
                {
                    List <string> list      = new List <string>();
                    int           salvageID = Convert.ToInt32(args[2]);
                    SalvageYield  salvage   = GameServer.Database.SelectObject <SalvageYield>("ID=" + salvageID);

                    if (salvage == null)
                    {
                        DisplayMessage(client, "SalvageYield ID not found!");
                        return;
                    }

                    ItemTemplate template     = GameServer.Database.FindObjectByKey <ItemTemplate>(salvage.MaterialId_nb);
                    string       materialName = "Not Found!";

                    if (template != null)
                    {
                        materialName = template.Name;
                    }

                    list.Add("SalvageYield ID: " + salvageID);
                    list.Add("     ObjectType: " + (salvage.ObjectType == 0 ? "Unused" : salvage.ObjectType.ToString()));
                    list.Add("   SalvageLevel: " + (salvage.SalvageLevel == 0 ? "Unused" : salvage.SalvageLevel.ToString()));
                    list.Add("       Material: " + materialName + " (" + salvage.MaterialId_nb + ")");
                    list.Add("          Count: " + (salvage.Count == 0 ? "Calculated" : salvage.Count.ToString()));
                    list.Add("          Realm: " + (salvage.Realm == 0 ? "Any" : GlobalConstants.RealmToName((eRealm)salvage.Realm)));
                    list.Add("      PackageID: " + salvage.PackageID);

                    client.Out.SendCustomTextWindow("SalvageYield ID " + salvageID, list);
                    return;
                }

                if (args[1].ToLower() == "salvageadd" || args[1].ToLower() == "salvageupdate")
                {
                    try
                    {
                        int    salvageID = Convert.ToInt32(args[2]);
                        string material  = args[3];
                        int    count     = Convert.ToInt32(args[4]);
                        byte   realm     = 0;
                        string package   = "";

                        if (args.Length > 5)
                        {
                            realm = Convert.ToByte(args[5]);
                        }

                        if (args.Length > 6)
                        {
                            package = args[6];
                        }

                        ItemTemplate template = GameServer.Database.FindObjectByKey <ItemTemplate>(material);

                        if (template == null)
                        {
                            DisplayMessage(client, "Material id_nb " + material + " not found!");
                            return;
                        }

                        SalvageYield salvage = GameServer.Database.SelectObject <SalvageYield>("ID=" + salvageID);

                        if (args[1].ToLower() == "salvageadd")
                        {
                            if (salvage != null)
                            {
                                DisplayMessage(client, "This SalvageYield ID already exists, use salvageupdate to change it.");
                                return;
                            }

                            salvage = new SalvageYield();
                            if (salvageID > 0)
                            {
                                salvage.ID = salvageID;
                            }

                            salvage.MaterialId_nb = material;
                            salvage.Count         = Math.Max(1, count);
                            salvage.Realm         = realm;

                            if (package == "")
                            {
                                package = client.Player.Name;
                            }

                            salvage.PackageID = package;

                            GameServer.Database.AddObject(salvage);

                            DisplayMessage(client, string.Format("Created SalvageYield ID: {0}, Material: {1}, Count: {2}, Realm: {3}, PackageID: {4}",
                                                                 salvage.ID, salvage.MaterialId_nb, salvage.Count, salvage.Realm, salvage.PackageID));
                        }
                        else
                        {
                            if (salvage == null)
                            {
                                DisplayMessage(client, "SalvageID not found!");
                                return;
                            }

                            if (salvage.PackageID == SalvageYield.LEGACY_SALVAGE_ID)
                            {
                                DisplayMessage(client, "This SalvageYield ID is used for legacy salvage support and can not be updated.");
                                return;
                            }

                            salvage.MaterialId_nb = material;
                            salvage.Count         = Math.Max(1, count);
                            salvage.Realm         = realm;

                            if (string.IsNullOrEmpty(salvage.PackageID) && package == "")
                            {
                                package = client.Player.Name;
                            }

                            if (package != "")
                            {
                                salvage.PackageID = package;
                            }

                            GameServer.Database.SaveObject(salvage);

                            DisplayMessage(client, string.Format("Updated SalvageYield ID: {0}, Material: {1}, Count: {2}, Realm: {3}, PackageID: {4}",
                                                                 salvage.ID, salvage.MaterialId_nb, salvage.Count, salvage.Realm, salvage.PackageID));
                        }
                    }
                    catch
                    {
                        DisplaySyntax(client);
                    }

                    return;
                }

                #endregion Salvage

                GamePlayer target = null;
                if ((client.Player.TargetObject != null) && (client.Player.TargetObject is GamePlayer))
                {
                    target = client.Player.TargetObject as GamePlayer;
                }
                else
                {
                    DisplayMessage(client, LanguageMgr.GetTranslation(client.Account.Language, "GMCommands.Crafting.NoPlayerTarget"));
                    return;
                }

                switch (args[1].ToLower())
                {
                    #region Add
                case "add":
                {
                    eCraftingSkill craftingSkillID = eCraftingSkill.NoCrafting;
                    int            startLevel      = 1;
                    try
                    {
                        craftingSkillID = (eCraftingSkill)Convert.ToUInt16(args[2]);
                        if (args.Length > 3)
                        {
                            startLevel = Convert.ToUInt16(args[3]);
                        }

                        AbstractCraftingSkill skill = CraftingMgr.getSkillbyEnum(craftingSkillID);
                        if (skill == null)
                        {
                            DisplayMessage(client, LanguageMgr.GetTranslation(client.Account.Language, "GMCommands.Crafting.InvalidSkill"));
                        }
                        else
                        {
                            if (target.AddCraftingSkill(craftingSkillID, startLevel))
                            {
                                target.Out.SendUpdateCraftingSkills();
                                target.SaveIntoDatabase();
                                DisplayMessage(client, LanguageMgr.GetTranslation(client.Account.Language, "GMCommands.Crafting.SkillAdded", skill.Name));
                            }
                            else
                            {
                                DisplayMessage(client, LanguageMgr.GetTranslation(client.Account.Language, "GMCommands.Crafting.AlreadyHaveSkill", target.Name, skill.Name));
                            }
                        }
                    }
                    catch (Exception)
                    {
                        DisplaySyntax(client);
                    }
                    break;
                }

                    #endregion Add
                    #region Change
                case "change":
                {
                    eCraftingSkill craftingSkillID = eCraftingSkill.NoCrafting;
                    int            amount          = 1;
                    try
                    {
                        craftingSkillID = (eCraftingSkill)Convert.ToUInt16(args[2]);

                        if (args.Length > 3)
                        {
                            amount = Convert.ToInt32(args[3]);
                        }

                        AbstractCraftingSkill skill = CraftingMgr.getSkillbyEnum(craftingSkillID);
                        if (skill == null)
                        {
                            DisplayMessage(client, LanguageMgr.GetTranslation(client.Account.Language, "GMCommands.Crafting.InvalidSkill"));
                        }
                        else
                        {
                            if (target.GetCraftingSkillValue(craftingSkillID) < 0)
                            {
                                DisplayMessage(client, LanguageMgr.GetTranslation(client.Account.Language, "GMCommands.Crafting.NotHaveSkillAddIt", target.Name, skill.Name));
                                return;
                            }

                            if (amount > 0)
                            {
                                target.GainCraftingSkill(craftingSkillID, amount);
                            }
                            else
                            {
                                target.CraftingSkills[craftingSkillID] += amount;
                            }
                            target.Out.SendUpdateCraftingSkills();
                            target.SaveIntoDatabase();
                            DisplayMessage(client, LanguageMgr.GetTranslation(client.Account.Language, "GMCommands.Crafting.SkillChanged", skill.Name));
                            DisplayMessage(client, LanguageMgr.GetTranslation(client.Account.Language, "GMCommands.Crafting.NowHasSkillPoints", target.Name, target.GetCraftingSkillValue(craftingSkillID), (eCraftingSkill)craftingSkillID));
                        }
                    }
                    catch (Exception)
                    {
                        DisplaySyntax(client);
                        return;
                    }
                    break;
                }

                    #endregion Change
                    #region Default
                default:
                {
                    DisplaySyntax(client);
                    break;
                }
                    #endregion Default
                }
            }
            catch
            {
                DisplaySyntax(client);
            }
        }
Example #6
0
        protected override void SendInventorySlotsUpdateRange(ICollection <int> slots, eInventoryWindowType windowType)
        {
            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.InventoryUpdate)))
            {
                pak.WriteByte((byte)(slots == null ? 0 : slots.Count));
                pak.WriteByte((byte)((m_gameClient.Player.IsCloakHoodUp ? 0x01 : 0x00) | (int)m_gameClient.Player.ActiveQuiverSlot));                 //bit0 is hood up bit4 to 7 is active quiver
                pak.WriteByte((byte)m_gameClient.Player.VisibleActiveWeaponSlots);
                pak.WriteByte((byte)windowType);
                if (slots != null)
                {
                    foreach (int updatedSlot in slots)
                    {
                        if (updatedSlot >= (int)eInventorySlot.Consignment_First && updatedSlot <= (int)eInventorySlot.Consignment_Last)
                        {
                            pak.WriteByte((byte)(updatedSlot - (int)eInventorySlot.Consignment_First + (int)eInventorySlot.HousingInventory_First));
                        }
                        else
                        {
                            pak.WriteByte((byte)(updatedSlot));
                        }

                        InventoryItem item = null;
                        item = m_gameClient.Player.Inventory.GetItem((eInventorySlot)updatedSlot);

                        if (item == null)
                        {
                            pak.Fill(0x00, 19);
                            continue;
                        }
                        pak.WriteByte((byte)item.Level);

                        int value1;                         // some object types use this field to display count
                        int value2;                         // some object types use this field to display count
                        switch (item.Object_Type)
                        {
                        case (int)eObjectType.Arrow:
                        case (int)eObjectType.Bolt:
                        case (int)eObjectType.Poison:
                        case (int)eObjectType.GenericItem:
                            value1 = item.Count;
                            value2 = item.SPD_ABS;
                            break;

                        case (int)eObjectType.Thrown:
                            value1 = item.DPS_AF;
                            value2 = item.Count;
                            break;

                        case (int)eObjectType.Instrument:
                            value1 = (item.DPS_AF == 2 ? 0 : item.DPS_AF);
                            value2 = 0;
                            break;                                     // unused

                        case (int)eObjectType.Shield:
                            value1 = item.Type_Damage;
                            value2 = item.DPS_AF;
                            break;

                        case (int)eObjectType.AlchemyTincture:
                        case (int)eObjectType.SpellcraftGem:
                            value1 = 0;
                            value2 = 0;

                            /*
                             * must contain the quality of gem for spell craft and think same for tincture
                             */
                            break;

                        case (int)eObjectType.HouseWallObject:
                        case (int)eObjectType.HouseFloorObject:
                        case (int)eObjectType.GardenObject:
                            value1 = 0;
                            value2 = item.SPD_ABS;

                            /*
                             * Value2 byte sets the width, only lower 4 bits 'seem' to be used (so 1-15 only)
                             *
                             * The byte used for "Hand" (IE: Mini-delve showing a weapon as Left-Hand
                             * usabe/TwoHanded), the lower 4 bits store the height (1-15 only)
                             */
                            break;

                        default:
                            value1 = item.DPS_AF;
                            value2 = item.SPD_ABS;
                            break;
                        }
                        pak.WriteByte((byte)value1);
                        pak.WriteByte((byte)value2);

                        if (item.Object_Type == (int)eObjectType.GardenObject)
                        {
                            pak.WriteByte((byte)(item.DPS_AF));
                        }
                        else
                        {
                            pak.WriteByte((byte)(item.Hand << 6));
                        }
                        pak.WriteByte((byte)((item.Type_Damage > 3 ? 0 : item.Type_Damage << 6) | item.Object_Type));
                        pak.WriteShort((ushort)item.Weight);
                        pak.WriteByte(item.ConditionPercent);                    // % of con
                        pak.WriteByte(item.DurabilityPercent);                   // % of dur
                        pak.WriteByte((byte)item.Quality);                       // % of qua
                        pak.WriteByte((byte)item.Bonus);                         // % bonus
                        pak.WriteShort((ushort)item.Model);
                        pak.WriteByte((byte)item.Extension);
                        int flag = 0;
                        if (item.Emblem != 0)
                        {
                            pak.WriteShort((ushort)item.Emblem);
                            flag |= (item.Emblem & 0x010000) >> 16;                             // = 1 for newGuildEmblem
                        }
                        else
                        {
                            pak.WriteShort((ushort)item.Color);
                        }
                        //						flag |= 0x01; // newGuildEmblem
                        flag |= 0x02;                                 // enable salvage button
                        AbstractCraftingSkill skill = CraftingMgr.getSkillbyEnum(m_gameClient.Player.CraftingPrimarySkill);
                        if (skill != null && skill is AdvancedCraftingSkill /* && ((AdvancedCraftingSkill)skill).IsAllowedToCombine(m_gameClient.Player, item)*/)
                        {
                            flag |= 0x04;                             // enable craft button
                        }
                        ushort icon1       = 0;
                        ushort icon2       = 0;
                        string spell_name1 = "";
                        string spell_name2 = "";
                        if (item.Object_Type != (int)eObjectType.AlchemyTincture)
                        {
                            SpellLine chargeEffectsLine = SkillBase.GetSpellLine(GlobalSpellsLines.Item_Effects);

                            if (chargeEffectsLine != null)
                            {
                                if (item.SpellID > 0 /* && item.Charges > 0*/)
                                {
                                    Spell spell = SkillBase.FindSpell(item.SpellID, chargeEffectsLine);
                                    if (spell != null)
                                    {
                                        flag       |= 0x08;
                                        icon1       = spell.Icon;
                                        spell_name1 = spell.Name;                                         // or best spl.Name ?
                                    }
                                }
                                if (item.SpellID1 > 0 /* && item.Charges > 0*/)
                                {
                                    Spell spell = SkillBase.FindSpell(item.SpellID1, chargeEffectsLine);
                                    if (spell != null)
                                    {
                                        flag       |= 0x10;
                                        icon2       = spell.Icon;
                                        spell_name2 = spell.Name;                                         // or best spl.Name ?
                                    }
                                }
                            }
                        }
                        pak.WriteByte((byte)flag);
                        if ((flag & 0x08) == 0x08)
                        {
                            pak.WriteShort((ushort)icon1);
                            pak.WritePascalString(spell_name1);
                        }
                        if ((flag & 0x10) == 0x10)
                        {
                            pak.WriteShort((ushort)icon2);
                            pak.WritePascalString(spell_name2);
                        }
                        pak.WriteByte((byte)item.Effect);
                        string name = item.Name;
                        if (item.Count > 1)
                        {
                            name = item.Count + " " + name;
                        }
                        if (item.SellPrice > 0)
                        {
                            if (ServerProperties.Properties.CONSIGNMENT_USE_BP)
                            {
                                name += "[" + item.SellPrice.ToString() + " BP]";
                            }
                            else
                            {
                                name += "[" + Money.GetString(item.SellPrice) + "]";
                            }
                        }
                        pak.WritePascalString(name);
                    }
                }
                SendTCP(pak);
            }
        }
Example #7
0
        /// <summary>
        /// New item data packet for 1.119
        /// </summary>
        protected override void WriteItemData(GSTCPPacketOut pak, InventoryItem item)
        {
            if (item == null)
            {
                pak.Fill(0x00, 24);                 // +1 byte: item.Effect changed to short
                return;
            }
            pak.WriteShort((ushort)0);             // item uniqueID
            pak.WriteByte((byte)item.Level);

            int value1;             // some object types use this field to display count
            int value2;             // some object types use this field to display count

            switch (item.Object_Type)
            {
            case (int)eObjectType.GenericItem:
                value1 = item.Count & 0xFF;
                value2 = (item.Count >> 8) & 0xFF;
                break;

            case (int)eObjectType.Arrow:
            case (int)eObjectType.Bolt:
            case (int)eObjectType.Poison:
                value1 = item.Count;
                value2 = item.SPD_ABS;
                break;

            case (int)eObjectType.Thrown:
                value1 = item.DPS_AF;
                value2 = item.Count;
                break;

            case (int)eObjectType.Instrument:
                value1 = (item.DPS_AF == 2 ? 0 : item.DPS_AF);
                value2 = 0;
                break;                         // unused

            case (int)eObjectType.Shield:
                value1 = item.Type_Damage;
                value2 = item.DPS_AF;
                break;

            case (int)eObjectType.AlchemyTincture:
            case (int)eObjectType.SpellcraftGem:
                value1 = 0;
                value2 = 0;

                /*
                 * must contain the quality of gem for spell craft and think same for tincture
                 */
                break;

            case (int)eObjectType.HouseWallObject:
            case (int)eObjectType.HouseFloorObject:
            case (int)eObjectType.GardenObject:
                value1 = 0;
                value2 = item.SPD_ABS;

                /*
                 * Value2 byte sets the width, only lower 4 bits 'seem' to be used (so 1-15 only)
                 *
                 * The byte used for "Hand" (IE: Mini-delve showing a weapon as Left-Hand
                 * usabe/TwoHanded), the lower 4 bits store the height (1-15 only)
                 */
                break;

            default:
                value1 = item.DPS_AF;
                value2 = item.SPD_ABS;
                break;
            }
            pak.WriteByte((byte)value1);
            pak.WriteByte((byte)value2);

            if (item.Object_Type == (int)eObjectType.GardenObject)
            {
                pak.WriteByte((byte)(item.DPS_AF));
            }
            else
            {
                pak.WriteByte((byte)(item.Hand << 6));
            }

            pak.WriteByte((byte)((item.Type_Damage > 3 ? 0 : item.Type_Damage << 6) | item.Object_Type));
            pak.WriteByte(0x00);                   //unk 1.112
            pak.WriteShort((ushort)item.Weight);
            pak.WriteByte(item.ConditionPercent);  // % of con
            pak.WriteByte(item.DurabilityPercent); // % of dur
            pak.WriteByte((byte)item.Quality);     // % of qua
            pak.WriteByte((byte)item.Bonus);       // % bonus
            pak.WriteByte((byte)item.BonusLevel);  // 1.109
            pak.WriteShort((ushort)item.Model);
            pak.WriteByte((byte)item.Extension);
            int flag   = 0;
            int emblem = item.Emblem;
            int color  = item.Color;

            if (emblem != 0)
            {
                pak.WriteShort((ushort)emblem);
                flag |= (emblem & 0x010000) >> 16;                 // = 1 for newGuildEmblem
            }
            else
            {
                pak.WriteShort((ushort)color);
            }
            //						flag |= 0x01; // newGuildEmblem
            flag |= 0x02;             // enable salvage button

            // Enable craft button if the item can be modified and the player has alchemy or spellcrafting
            eCraftingSkill skill = CraftingMgr.GetCraftingSkill(item);

            switch (skill)
            {
            case eCraftingSkill.ArmorCrafting:
            case eCraftingSkill.Fletching:
            case eCraftingSkill.Tailoring:
            case eCraftingSkill.WeaponCrafting:
                if (m_gameClient.Player.CraftingSkills.ContainsKey(eCraftingSkill.Alchemy) ||
                    m_gameClient.Player.CraftingSkills.ContainsKey(eCraftingSkill.SpellCrafting))
                {
                    flag |= 0x04;                             // enable craft button
                }
                break;

            default:
                break;
            }

            ushort icon1       = 0;
            ushort icon2       = 0;
            string spell_name1 = "";
            string spell_name2 = "";

            if (item.Object_Type != (int)eObjectType.AlchemyTincture)
            {
                if (item.SpellID > 0 /* && item.Charges > 0*/)
                {
                    SpellLine chargeEffectsLine = SkillBase.GetSpellLine(GlobalSpellsLines.Item_Effects);
                    if (chargeEffectsLine != null)
                    {
                        List <Spell> spells = SkillBase.GetSpellList(chargeEffectsLine.KeyName);
                        foreach (Spell spl in spells)
                        {
                            if (spl.ID == item.SpellID)
                            {
                                flag       |= 0x08;
                                icon1       = spl.Icon;
                                spell_name1 = spl.Name;                                 // or best spl.Name ?
                                break;
                            }
                        }
                    }
                }
                if (item.SpellID1 > 0 /* && item.Charges > 0*/)
                {
                    SpellLine chargeEffectsLine = SkillBase.GetSpellLine(GlobalSpellsLines.Item_Effects);
                    if (chargeEffectsLine != null)
                    {
                        List <Spell> spells = SkillBase.GetSpellList(chargeEffectsLine.KeyName);
                        foreach (Spell spl in spells)
                        {
                            if (spl.ID == item.SpellID1)
                            {
                                flag       |= 0x10;
                                icon2       = spl.Icon;
                                spell_name2 = spl.Name;                                 // or best spl.Name ?
                                break;
                            }
                        }
                    }
                }
            }
            pak.WriteByte((byte)flag);
            if ((flag & 0x08) == 0x08)
            {
                pak.WriteShort((ushort)icon1);
                pak.WritePascalString(spell_name1);
            }
            if ((flag & 0x10) == 0x10)
            {
                pak.WriteShort((ushort)icon2);
                pak.WritePascalString(spell_name2);
            }
            pak.WriteShort((ushort)item.Effect);             // item effect changed to short
            string name = item.Name;

            if (item.Count > 1)
            {
                name = item.Count + " " + name;
            }
            if (item.SellPrice > 0)
            {
                if (ServerProperties.Properties.CONSIGNMENT_USE_BP)
                {
                    name += "[" + item.SellPrice.ToString() + " BP]";
                }
                else
                {
                    name += "[" + Money.GetString(item.SellPrice) + "]";
                }
            }
            if (name == null)
            {
                name = "";
            }
            if (name.Length > 55)
            {
                name = name.Substring(0, 55);
            }
            pak.WritePascalString(name);
        }