/// <summary> /// Builds a SpellEffectAnimation packet /// </summary> /// <returns>byte[] for packetProcessor.Send()</returns> public static byte[] SpellEffectAnimationTCP(GameObject spellCaster, GameObject spellTarget, ushort spellid, ushort boltTime, bool noSound, byte success) { var pak = new GSTCPPacketOut((byte)ePackets.SpellEffectAnimation); pak.WriteShort((ushort)spellCaster.ObjectID); pak.WriteShort(spellid); pak.WriteShort((ushort)(spellTarget == null ? 0 : spellTarget.ObjectID)); pak.WriteShort(boltTime); pak.WriteByte((byte)(noSound ? 1 : 0)); pak.WriteByte(success); //Get the packet buffer pak.WritePacketLength(); return(pak.GetBuffer()); //packet.WritePacketLength sets the Capacity }
public void HandlePacket(GameClient client, GSPacketIn packet) { ushort housenumber = packet.ReadShort(); var index = (byte) packet.ReadByte(); var unk1 = (byte) packet.ReadByte(); // house is null, return var house = HouseMgr.GetHouse(housenumber); if (house == null) return; // player is null, return if (client.Player == null) return; // rotation only works for inside items if (!client.Player.InHouse) return; // no permission to change the interior, return if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add)) return; var pak = new GSTCPPacketOut(client.Out.GetPacketCode(eServerPackets.HouseDecorationRotate)); pak.WriteShort(housenumber); pak.WriteByte(index); pak.WriteByte(0x01); client.Out.SendTCP(pak); }
public void HandlePacket(GameClient client, GSPacketIn packet) { packet.ReadShort(); // pid ushort housenumber = packet.ReadShort(); // house is null, return var house = HouseMgr.GetHouse(housenumber); if (house == null) { return; } // player is null, return if (client.Player == null) { return; } // player has no owner permissions and isn't a GM or admin, return if (!house.HasOwnerPermissions(client.Player) && client.Account.PrivLevel <= 1) { return; } // send out the house permissions using (var pak = new GSTCPPacketOut(client.Out.GetPacketCode(eServerPackets.HousingPermissions))) { pak.WriteByte(HousingConstants.MaxPermissionLevel); // number of permissions ? pak.WriteByte(0x00); // unknown pak.WriteShort((ushort)house.HouseNumber); foreach (var entry in house.PermissionLevels) { var level = entry.Key; var permission = entry.Value; pak.WriteByte((byte)level); pak.WriteByte(permission.CanEnterHouse ? (byte)1 : (byte)0); pak.WriteByte(permission.Vault1); pak.WriteByte(permission.Vault2); pak.WriteByte(permission.Vault3); pak.WriteByte(permission.Vault4); pak.WriteByte(permission.CanChangeExternalAppearance ? (byte)1 : (byte)0); pak.WriteByte(permission.ChangeInterior); pak.WriteByte(permission.ChangeGarden); pak.WriteByte(permission.CanBanish ? (byte)1 : (byte)0); pak.WriteByte(permission.CanUseMerchants ? (byte)1 : (byte)0); pak.WriteByte(permission.CanUseTools ? (byte)1 : (byte)0); pak.WriteByte(permission.CanBindInHouse ? (byte)1 : (byte)0); pak.WriteByte(permission.ConsignmentMerchant); pak.WriteByte(permission.CanPayRent ? (byte)1 : (byte)0); pak.WriteByte(0x00); // ?? } client.Out.SendTCP(pak); } }
public void HandlePacket(GameClient client, GSPacketIn packet) { int pid = packet.ReadShort(); ushort housenumber = packet.ReadShort(); // house is null, return var house = HouseMgr.GetHouse(housenumber); if (house == null) return; // player is null, return if (client.Player == null) return; // player has no owner permissions and isn't a GM or admin, return if (!house.HasOwnerPermissions(client.Player) && client.Account.PrivLevel <= 1) return; // send out the house permissions using (var pak = new GSTCPPacketOut(client.Out.GetPacketCode(eServerPackets.HousingPermissions))) { pak.WriteByte(HousingConstants.MaxPermissionLevel); // number of permissions ? pak.WriteByte(0x00); // unknown pak.WriteShort((ushort)house.HouseNumber); foreach (var entry in house.PermissionLevels) { var level = entry.Key; var permission = entry.Value; pak.WriteByte((byte)level); pak.WriteByte(permission.CanEnterHouse ? (byte)1 : (byte)0); pak.WriteByte(permission.Vault1); pak.WriteByte(permission.Vault2); pak.WriteByte(permission.Vault3); pak.WriteByte(permission.Vault4); pak.WriteByte(permission.CanChangeExternalAppearance ? (byte)1 : (byte)0); pak.WriteByte(permission.ChangeInterior); pak.WriteByte(permission.ChangeGarden); pak.WriteByte(permission.CanBanish ? (byte)1 : (byte)0); pak.WriteByte(permission.CanUseMerchants ? (byte)1 : (byte)0); pak.WriteByte(permission.CanUseTools ? (byte)1 : (byte)0); pak.WriteByte(permission.CanBindInHouse ? (byte)1 : (byte)0); pak.WriteByte(permission.ConsignmentMerchant); pak.WriteByte(permission.CanPayRent ? (byte)1 : (byte)0); pak.WriteByte(0x00); // ?? } client.Out.SendTCP(pak); } }
public void HandlePacket(GameClient client, GSPacketIn packet) { ushort housenumber = packet.ReadShort(); var index = (byte)packet.ReadByte(); packet.ReadByte(); // unk1 // house is null, return var house = HouseMgr.GetHouse(housenumber); if (house == null) { return; } // player is null, return if (client.Player == null) { return; } // rotation only works for inside items if (!client.Player.InHouse) { return; } // no permission to change the interior, return if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add)) { return; } var pak = new GSTCPPacketOut(client.Out.GetPacketCode(eServerPackets.HouseDecorationRotate)); pak.WriteShort(housenumber); pak.WriteByte(index); pak.WriteByte(0x01); client.Out.SendTCP(pak); }
/// <summary> /// Builds a combat animation packet for broadcast use. /// TODO: Might not work for attacker==defender -- unsure about this. /// len=14 /// </summary> public static byte[] CombatAnimation(GameObject attacker, GameLiving defender, ushort weaponID, ushort shieldID, int style, byte stance, byte result) { var pak = new GSTCPPacketOut((byte)ePackets.CombatAnimation); if (attacker != null) { pak.WriteShort((ushort)(attacker.ObjectState == GameObject.eObjectState.Deleted ? attacker.LastObjectID : attacker.ObjectID)); } else { pak.WriteShort(0x00); } byte health = 0x00; if (defender != null) { pak.WriteShort((ushort)(defender.ObjectState == GameObject.eObjectState.Deleted ? defender.LastObjectID : defender.ObjectID)); health = defender.HealthPercent; } else { pak.WriteShort(0x00); } pak.WriteShort(weaponID); pak.WriteShort(shieldID); pak.WriteShortLowEndian((ushort)style); pak.WriteByte(stance); pak.WriteByte(result); pak.WriteByte(health); pak.WriteByte(0x6F); // TODO: Check whether this still needs to be 0x6F for attacker==player / 0x00 otherwise pak.WritePacketLength(); return(pak.GetBuffer()); }
/// <summary> /// Handle the packet /// </summary> /// <param name="client"></param> /// <param name="packet"></param> /// <returns></returns> public void HandlePacket(GameClient client, GSPacketIn packet) { int unknown = packet.ReadByte(); int position = packet.ReadByte(); int housenumber = packet.ReadShort(); int method = packet.ReadByte(); House house = HouseMgr.GetHouse(client.Player.CurrentRegionID, housenumber); if (house == null) return; if (client.Player == null) return; //log.DebugFormat("House PickupItem - Method: {0}, Position: {0}", method, position); switch (method) { case 1: //garden item // no permission to remove items from the garden, return if (!house.CanChangeGarden(client.Player, DecorationPermissions.Remove)) return; foreach (var entry in house.OutdoorItems) { // continue if this is not the item in question OutdoorItem oitem = entry.Value; if (oitem.Position != position) continue; int i = entry.Key; GameServer.Database.DeleteObject(oitem.DatabaseItem); //delete the database instance // return indoor item into inventory item, add to player inventory var invitem = GameInventoryItem.Create((house.OutdoorItems[i]).BaseItem); if (client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, invitem)) InventoryLogging.LogInventoryAction("(HOUSE;" + house.HouseNumber + ")", client.Player, eInventoryActionType.Other, invitem.Template, invitem.Count); house.OutdoorItems.Remove(i); // update garden client.Out.SendGarden(house); ChatUtil.SendSystemMessage(client, "Garden object removed."); ChatUtil.SendSystemMessage(client, string.Format("You get {0} and put it in your backpack.", invitem.Name)); return; } //no object @ position ChatUtil.SendSystemMessage(client, "There is no Garden Tile at slot " + position + "!"); break; case 2: case 3: //wall/floor mode // no permission to remove items from the interior, return if (!house.CanChangeInterior(client.Player, DecorationPermissions.Remove)) return; if (house.IndoorItems.ContainsKey(position) == false) return; IndoorItem iitem = house.IndoorItems[position]; if (iitem == null) { client.Player.Out.SendMessage("error: id was null", eChatType.CT_Help, eChatLoc.CL_SystemWindow); return; } if (iitem.BaseItem != null) { var item = GameInventoryItem.Create((house.IndoorItems[(position)]).BaseItem); if (GetItemBack(item)) { if (client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, item)) { string removalMsg = string.Format("The {0} is cleared from the {1}.", item.Name, (method == 2 ? "wall surface" : "floor")); ChatUtil.SendSystemMessage(client, removalMsg); InventoryLogging.LogInventoryAction("(HOUSE;" + house.HouseNumber + ")", client.Player, eInventoryActionType.Other, item.Template, item.Count); } else { ChatUtil.SendSystemMessage(client, "You need place in your inventory !"); return; } } else { ChatUtil.SendSystemMessage(client, "The " + item.Name + " is cleared from the wall surface."); } } else if (iitem.DatabaseItem.BaseItemID.Contains("GuildBanner")) { var it = new ItemTemplate { Id_nb = iitem.DatabaseItem.BaseItemID, CanDropAsLoot = false, IsDropable = true, IsPickable = true, IsTradable = true, Item_Type = 41, Level = 1, MaxCharges = 1, MaxCount = 1, Model = iitem.DatabaseItem.Model, Emblem = iitem.DatabaseItem.Emblem, Object_Type = (int) eObjectType.HouseWallObject, Realm = 0, Quality = 100 }; string[] idnb = iitem.DatabaseItem.BaseItemID.Split('_'); it.Name = idnb[1] + "'s Banner"; // TODO: Once again with guild banners, templates are memory only and will not load correctly once player logs out - tolakram var inv = GameInventoryItem.Create(it); if (client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, inv)) { string invMsg = string.Format("The {0} is cleared from the {1}.", inv.Name, (method == 2 ? "wall surface" : "floor")); ChatUtil.SendSystemMessage(client, invMsg); InventoryLogging.LogInventoryAction("(HOUSE;" + house.HouseNumber + ")", client.Player, eInventoryActionType.Other, inv.Template, inv.Count); } else { ChatUtil.SendSystemMessage(client, "You need place in your inventory !"); return; } } else if (method == 2) { ChatUtil.SendSystemMessage(client, "The decoration item is cleared from the wall surface."); } else { ChatUtil.SendSystemMessage(client, "The decoration item is cleared from the floor."); } GameServer.Database.DeleteObject((house.IndoorItems[(position)]).DatabaseItem); house.IndoorItems.Remove(position); var pak = new GSTCPPacketOut(client.Out.GetPacketCode(eServerPackets.HousingItem)); pak.WriteShort((ushort) housenumber); pak.WriteByte(0x01); pak.WriteByte(0x00); pak.WriteByte((byte) position); pak.WriteByte(0x00); foreach (GamePlayer plr in house.GetAllPlayersInHouse()) { plr.Out.SendTCP(pak); } break; } }
/// <summary> /// Handle the packet /// </summary> /// <param name="client"></param> /// <param name="packet"></param> /// <returns></returns> public void HandlePacket(GameClient client, GSPacketIn packet) { packet.ReadByte(); // unknown int position = packet.ReadByte(); int housenumber = packet.ReadShort(); int method = packet.ReadByte(); House house = HouseMgr.GetHouse(client.Player.CurrentRegionID, housenumber); if (house == null) { return; } if (client.Player == null) { return; } // log.DebugFormat("House PickupItem - Method: {0}, Position: {0}", method, position); switch (method) { case 1: // garden item // no permission to remove items from the garden, return if (!house.CanChangeGarden(client.Player, DecorationPermissions.Remove)) { return; } foreach (var entry in house.OutdoorItems) { // continue if this is not the item in question OutdoorItem oitem = entry.Value; if (oitem.Position != position) { continue; } int i = entry.Key; GameServer.Database.DeleteObject(oitem.DatabaseItem); // delete the database instance // return indoor item into inventory item, add to player inventory var invitem = GameInventoryItem.Create(house.OutdoorItems[i].BaseItem); if (client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, invitem)) { InventoryLogging.LogInventoryAction($"(HOUSE;{house.HouseNumber})", client.Player, eInventoryActionType.Other, invitem.Template, invitem.Count); } house.OutdoorItems.Remove(i); // update garden client.Out.SendGarden(house); ChatUtil.SendSystemMessage(client, "Garden object removed."); ChatUtil.SendSystemMessage(client, $"You get {invitem.Name} and put it in your backpack."); return; } // no object @ position ChatUtil.SendSystemMessage(client, $"There is no Garden Tile at slot {position}!"); break; case 2: case 3: // wall/floor mode // no permission to remove items from the interior, return if (!house.CanChangeInterior(client.Player, DecorationPermissions.Remove)) { return; } if (house.IndoorItems.ContainsKey(position) == false) { return; } IndoorItem iitem = house.IndoorItems[position]; if (iitem == null) { client.Player.Out.SendMessage("error: id was null", eChatType.CT_Help, eChatLoc.CL_SystemWindow); return; } if (iitem.BaseItem != null) { var item = GameInventoryItem.Create(house.IndoorItems[position].BaseItem); if (GetItemBack(item)) { if (client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, item)) { string removalMsg = $"The {item.Name} is cleared from the {(method == 2 ? "wall surface" : "floor")}."; ChatUtil.SendSystemMessage(client, removalMsg); InventoryLogging.LogInventoryAction($"(HOUSE;{house.HouseNumber})", client.Player, eInventoryActionType.Other, item.Template, item.Count); } else { ChatUtil.SendSystemMessage(client, "You need place in your inventory !"); return; } } else { ChatUtil.SendSystemMessage(client, $"The {item.Name} is cleared from the wall surface."); } } else if (iitem.DatabaseItem.BaseItemID.Contains("GuildBanner")) { var it = new ItemTemplate { Id_nb = iitem.DatabaseItem.BaseItemID, CanDropAsLoot = false, IsDropable = true, IsPickable = true, IsTradable = true, Item_Type = 41, Level = 1, MaxCharges = 1, MaxCount = 1, Model = iitem.DatabaseItem.Model, Emblem = iitem.DatabaseItem.Emblem, Object_Type = (int)eObjectType.HouseWallObject, Realm = 0, Quality = 100 }; string[] idnb = iitem.DatabaseItem.BaseItemID.Split('_'); it.Name = $"{idnb[1]}\'s Banner"; // TODO: Once again with guild banners, templates are memory only and will not load correctly once player logs out - tolakram var inv = GameInventoryItem.Create(it); if (client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, inv)) { string invMsg = $"The {inv.Name} is cleared from the {(method == 2 ? "wall surface" : "floor")}."; ChatUtil.SendSystemMessage(client, invMsg); InventoryLogging.LogInventoryAction($"(HOUSE;{house.HouseNumber})", client.Player, eInventoryActionType.Other, inv.Template, inv.Count); } else { ChatUtil.SendSystemMessage(client, "You need place in your inventory !"); return; } } else if (method == 2) { ChatUtil.SendSystemMessage(client, "The decoration item is cleared from the wall surface."); } else { ChatUtil.SendSystemMessage(client, "The decoration item is cleared from the floor."); } GameServer.Database.DeleteObject(house.IndoorItems[position].DatabaseItem); house.IndoorItems.Remove(position); var pak = new GSTCPPacketOut(client.Out.GetPacketCode(eServerPackets.HousingItem)); if (client.Version >= GameClient.eClientVersion.Version1125) { pak.WriteShortLowEndian((ushort)housenumber); pak.WriteByte(0x01); pak.WriteByte(0x00); pak.WriteByte((byte)position); pak.Fill(0x00, 11); } else { pak.WriteShort((ushort)housenumber); pak.WriteByte(0x01); pak.WriteByte(0x00); pak.WriteByte((byte)position); pak.WriteByte(0x00); } foreach (GamePlayer plr in house.GetAllPlayersInHouse()) { plr.Out.SendTCP(pak); } break; } }