using System; using System.Collections.Generic; using System.Linq; using System.Text; using WingsAPI.Data.Character; using WingsAPI.Packets.Enums.Act4; using WingsEmu.DTOs.Items; using WingsEmu.DTOs.Relations; using WingsEmu.Game._enum; using WingsEmu.Game._i18n; using WingsEmu.Game.Act4; using WingsEmu.Game.Algorithm; using WingsEmu.Game.Buffs; using WingsEmu.Game.Characters; using WingsEmu.Game.Configurations; using WingsEmu.Game.Entities; using WingsEmu.Game.Extensions.Mates; using WingsEmu.Game.Groups; using WingsEmu.Game.Items; using WingsEmu.Game.Managers; using WingsEmu.Game.Managers.StaticData; using WingsEmu.Game.Maps; using WingsEmu.Game.Mates; using WingsEmu.Game.Networking; using WingsEmu.Game.Networking.Broadcasting; using WingsEmu.Game.Shops; using WingsEmu.Packets; using WingsEmu.Packets.Enums; using WingsEmu.Packets.Enums.Battle; using WingsEmu.Packets.Enums.Chat; using WingsEmu.Packets.Enums.Relations; namespace WingsEmu.Game.Extensions; public static class UiPacketExtension { #region Generate Packets // family public static string GeneratePetBasketPacket(this IClientSession session, bool isOn) => $"ib 1278 {(isOn ? 1 : 0)}"; public static string GenerateQna(this IClientSession session, string packet, string message) => $"qna #{packet.Replace(' ', '^')} {message}"; public static string GenerateMapClear(this IMapInstance mapInstance) => "mapclear"; public static string GenerateAct6EmptyPacket(this IClientSession session) => "act6"; public static string GenerateEmptyRcScalc(this IClientSession session) => "rc_scalc 0 -1 -1 -1 -1 -1 "; public static string GenerateRcScalc(this IClientSession session, string name, byte type, long price, int amount, int bzAmount, long taxes, long priceTaxes) => $"rc_scalc {type} {price} {amount} {bzAmount} {taxes} {priceTaxes} {name ?? ""}"; public static string GenerateBlinit(this IClientSession session) { string result = "blinit"; foreach (CharacterRelationDTO relation in session.PlayerEntity.GetBlockedRelations()) { result += $" {relation.RelatedCharacterId}|{relation.RelatedName}"; } return result; } public static string GenerateFinit(this IClientSession session, ISessionManager sessionManager) { string result = "finit"; foreach (CharacterRelationDTO relation in session.PlayerEntity.GetRelations().Where(x => x.RelationType != CharacterRelationType.Blocked)) { bool isOnline = sessionManager.IsOnline(relation.RelatedCharacterId); result += $" {relation.RelatedCharacterId}|{(short)relation.RelationType}|{(isOnline ? 1 : 0)}|{relation.RelatedName}"; } return result; } public static string GenerateDir(this IBattleEntity entity) => $"dir {(byte)entity.Type} {entity.Id} {entity.Direction}"; public static string GenerateDamage(this IBattleEntity entity, int damage) => $"dm {(byte)entity.Type} {entity.Id} {damage}"; public static string GenerateHeal(this IBattleEntity entity, int heal) => $"rc {(byte)entity.Type} {entity.Id} {heal} 0"; public static string GenerateSmemo(this IClientSession session, SmemoType type, string message) => $"s_memo {(byte)type} {message}"; public static string GenerateGb(this IClientSession session, BankType type, IReputationConfiguration reputationConfiguration, IBankReputationConfiguration bankReputationConfiguration, IReadOnlyList topReputation) => $"gb {(byte)type} {session.Account.BankMoney / 1000} {session.PlayerEntity.Gold} {(byte)session.PlayerEntity.GetBankRank(reputationConfiguration, bankReputationConfiguration, topReputation)} {session.PlayerEntity.GetBankPenalty(reputationConfiguration, bankReputationConfiguration, topReputation)}"; public static string GenerateRcPacket(this IBattleEntity entity, int health) => $"rc {(byte)entity.Type} {entity.Id} {health} 0"; public static string GenerateSpectatorWindow(this IClientSession session) => "taw_open"; public static string GenerateMovement(this IBattleEntity entity) => $"mv {(byte)entity.Type} {entity.Id} {entity.PositionX} {entity.PositionY} {entity.Speed}"; public static string GenerateEffectObject(this IBattleEntity entity, bool first, EffectType effect) => $"eff_ob {(byte)entity.Type} {entity.Id} {(first ? 1 : 0)} {(int)effect}"; public static string GenerateEffectGround(this IBattleEntity entity, EffectType effectType, short x, short y, bool remove) => $"eff_g {(short)effectType} {entity.Id} {x} {y} {(remove ? 1 : 0)}"; public static string GenerateEffectTarget(this IBattleEntity entity, IBattleEntity target, EffectType effectType) => $"eff_t {(byte)entity.Type} {entity.Id} {(byte)target.Type} {target.Id} {(short)effectType}"; public static string GenerateSayPacket(this IClientSession session, string msg, ChatMessageColorType color) => $"say {(byte)session.PlayerEntity.Type} {session.PlayerEntity.Id} {(byte)color} {msg}"; public static string GenerateSayNoIdPacket(string msg, ChatMessageColorType color) => $"say 1 -1 {((byte)color).ToString()} {msg}"; public static string GenerateCancelPacket(this IClientSession session, CancelType cancelType, int id) => $"cancel {(byte)cancelType} {id} 1"; public static string GenerateInfoPacket(this IClientSession session, string message) => $"info {message}"; public static string GenerateMsgPacket(this IClientSession session, string message, MsgMessageType type) => $"msg {(byte)type} {message}"; public static string GenerateSpkPacket(this IClientSession session, string message, SpeakType type) => $"spk 1 {session.PlayerEntity.Id} {(byte)type} {session.PlayerEntity.Name} {message}"; public static string GenerateSpkPacket(long senderId, string senderName, string message, SpeakType type) => $"spk 1 {senderId.ToString()} {(byte)type} {senderName} {message}"; public static string GenerateGuriPacket(this IClientSession session, byte type, short argument = 0, long value = 0, int secondValue = 0) { switch (type) { case 2: return $"guri 2 {argument} {session.PlayerEntity.Id}"; case 4: return $"guri 4 {session.PlayerEntity.AdditionalHp} {session.PlayerEntity.AdditionalMp}"; case 6: return $"guri 6 {argument} {value} {secondValue} 0"; case 10: return $"guri 10 {argument} {value} {session.PlayerEntity.Id}"; case 12: return $"guri 12 1 {session.PlayerEntity.Id} {value}"; case 15: return $"guri 15 {argument} 0 0"; case (int)GuriType.ShellEffect: return $"guri {type} 0 0 {argument}"; case 19: return $"guri 19 0 0 {value}"; case 25: return "guri 25"; default: return $"guri {type} {argument} {value} {session.PlayerEntity.Id}"; } } public static string GenerateRestPacket(this IClientSession session) => $"rest 1 {session.PlayerEntity.Id} {(session.PlayerEntity.IsSitting ? 1 : 0)}"; public static string GenerateFcPacket(FactionType faction, Act4Status act4Status) => $"fc {((byte)faction).ToString()} {((int)act4Status.TimeBeforeReset.TotalMinutes).ToString()} {GenerateSubFcPacket(FactionType.Angel, act4Status)} {GenerateSubFcPacket(FactionType.Demon, act4Status)}"; public static string GenerateGuriFactionOverridePacket(this IClientSession session) => $"guri 5 1 {session.PlayerEntity.Id} {(session.PlayerEntity.Faction == FactionType.Angel ? 3 : 4).ToString()}"; public static string GenerateEndDancingGuriPacket(this IPlayerEntity playerEntity) => $"guri 6 1 {playerEntity.Id} 0 0"; private static string GenerateSubFcPacket(FactionType faction, Act4Status act4Status) { if (faction == act4Status.RelevantFaction) { return $"{(faction == FactionType.Angel ? act4Status.AngelPointsPercentage : act4Status.DemonPointsPercentage).ToString()} " + //percentage $"{((byte)act4Status.FactionStateType).ToString()} " + //mode $"{((int)act4Status.CurrentTimeBeforeMukrajuDespawn.TotalSeconds).ToString()} " + //currentTime $"{((int)act4Status.TimeBeforeMukrajuDespawn.TotalSeconds).ToString()} " + //totalTime "0 " + //$"{(act4Status.DungeonType == DungeonType.Morcos ? 1 : 0).ToString()} " + //morcos "0 " + //$"{(act4Status.DungeonType == DungeonType.Hatus ? 1 : 0).ToString()} " + //hatus "0 " + //$"{(act4Status.DungeonType == DungeonType.Calvinas ? 1 : 0).ToString()} " + //calvina "0 " + //$"{(act4Status.DungeonType == DungeonType.Berios ? 1 : 0).ToString()} " + //berios "0"; //no idea } return $"{(faction == FactionType.Angel ? act4Status.AngelPointsPercentage : act4Status.DemonPointsPercentage).ToString()} 0 0 0 0 0 0 0 0"; } public static string GenerateDungeonPacket(this IClientSession session, DungeonInstance dungeonInstance, DungeonSubInstance dungeonSubInstance, IAct4DungeonManager act4DungeonManager, DateTime currentTime) { DungeonEventType dungeonEventType = AssertDungeonEventType(dungeonInstance, dungeonSubInstance); int secondsBeforeEnd = (int)(act4DungeonManager.DungeonEnd - currentTime).TotalSeconds; return $"dg {(byte)dungeonInstance.DungeonType} {(byte)dungeonEventType} {secondsBeforeEnd.ToString()} 0"; } private static DungeonEventType AssertDungeonEventType(DungeonInstance dungeonInstance, DungeonSubInstance dungeonSubInstance) { //quick win if (dungeonInstance.FinishSlowMoDate != null) { return DungeonEventType.BossRoomFinished; } if (dungeonSubInstance.Bosses.Count > 0) { return DungeonEventType.InBossRoom; } if (dungeonInstance.SpawnInstance.PortalGenerators.Count < 1) { return DungeonEventType.BossRoomOpen; } return DungeonEventType.BossRoomClosed; } public static string GenerateAct6Packet(this IClientSession session) => "act6 " + "1 " + "0 " + "0 " + "0 " + "0 " + "0 " + "0 " + "0 " + "0 " + "0"; public static string GenerateDlgPacket(this IClientSession session, string yesPacket, string noPacket, string message) => $"dlg #{yesPacket.Replace(' ', '^')} #{noPacket.Replace(' ', '^')} {message}"; public static string GenerateRpPacket(this IClientSession session, int mapId, int x, int y, string param) => $"rp {mapId} {x} {y} {param}"; public static string GenerateSpPointPacket(this IClientSession session) => $"sp {session.PlayerEntity.SpPointsBonus} {StaticServerManager.Instance.MaxAdditionalSpPoints} {session.PlayerEntity.SpPointsBasic} {StaticServerManager.Instance.MaxBasicSpPoints}"; public static string GenerateEsfPacket(this IClientSession session, byte type) => $"esf {type}"; public static string GenerateDeletePost(this IClientSession session, byte type, int id) => $"post {type} {id}"; public static string GenerateNpcDialogSession(this IClientSession session, int value) => GenerateNpcDialog(session.PlayerEntity.Id, value); public static string GenerateNpcDialog(long characterId, int value) => $"npc_req 1 {characterId.ToString()} {value}"; public static string GenerateItemSpeaker(this IClientSession session, GameItemInstance item, string message, IItemsManager itemsManager, ICharacterAlgorithm algorithm) { string itemInfo = item.Type switch { ItemInstanceType.BoxInstance => $"{item.GenerateEInfo(itemsManager, algorithm)}", ItemInstanceType.SpecialistInstance => $"{(item.GameItem.IsPartnerSpecialist ? item.GeneratePslInfo() : session.GenerateSlInfo(item, algorithm))}", ItemInstanceType.WearableInstance => $"{item.GenerateEInfo(itemsManager, algorithm)}", _ => $"IconInfo {item.ItemVNum}" }; return $"sayitemt 1 {session.PlayerEntity.Id} 17 1 {item.ItemVNum} {session.PlayerEntity.Name} {message} {itemInfo}"; } public static string GenerateInboxPacket(this IClientSession session, string message) => $"inbox {message}"; public static string GenerateMsCPacket(this IClientSession session, byte type) => $"ms_c {type}"; public static string GenerateMSlotPacket(this IClientSession session, byte slot) => $"mslot {slot} -1"; public static string GenerateScpPacket(this IClientSession session, byte type) => $"scp {type}"; public static string GenerateObArPacket(this IClientSession session) => "ob_ar"; public static string GenerateClockPacket(this IClientSession session, ClockType type, sbyte subType, TimeSpan time1, TimeSpan time2) => $"evnt {(byte)type} {subType} {(int)time1.TotalMilliseconds / 100} {(int)time2.TotalMilliseconds / 100}"; public static string GenerateTsClockPacket(this IClientSession session, TimeSpan time1, bool isVisible) => $"evnt {(byte)ClockType.TimeSpaceClock} {(isVisible ? 0 : -1)} {(int)time1.TotalMilliseconds / 100} 1"; public static string GenerateRemoveClockPacket(this IClientSession session) => "evnt 10 0 -1 -1"; public static string GenerateRemoveRedClock(this IClientSession session) => "evnt 3 1 -1 -1"; public static string GenerateInvisible(this IClientSession session) => $"cl {session.PlayerEntity.Id} {(session.PlayerEntity.Invisible || session.PlayerEntity.CheatComponent.IsInvisible ? 1 : 0)} {(session.PlayerEntity.CheatComponent.IsInvisible ? 1 : 0)}"; public static string GenerateOppositeMove(this IClientSession session, bool enabled) => $"rv_m {session.PlayerEntity.Id} 1 {(enabled ? 1 : 0)}"; public static string GenerateBubble(this IClientSession session, string message) => $"csp {session.PlayerEntity.Id} {message.Replace(' ', (char)0xB)}"; public static string GenerateIncreaseRange(this IClientSession session, short range, bool enabled) => $"bf_d {range} {(enabled ? 1 : 0)}"; public static string GenerateGenderPacket(this IClientSession session) => $"p_sex {(byte)session.PlayerEntity.Gender}"; //pflag packet's argument doesn't seem useful as it only makes the client do "npc_req", without this argument that theoretically represents the dialog the server should return public static string GeneratePlayerFlag(this IClientSession session, long flag) => $"pflag 1 {session.PlayerEntity.Id} {flag.ToString()}"; public static string GenerateShopPacket(this IClientSession session) { IEnumerable items = session.PlayerEntity.ShopComponent.Items; return $"shop {(byte)session.PlayerEntity.Type} {session.PlayerEntity.Id} {(items == null ? 0 : 1)} {(items == null ? 0 : 3)} {(items == null ? string.Empty : 0.ToString())} {(items == null ? string.Empty : session.PlayerEntity.ShopComponent.Name)}"; } public static string GenerateGbexPacket(this IClientSession session, IReputationConfiguration reputationConfiguration, IBankReputationConfiguration bankReputationConfiguration, IReadOnlyList topReputation) => $"gbex {session.Account.BankMoney / 1000} {session.PlayerEntity.Gold} {(byte)session.PlayerEntity.GetBankRank(reputationConfiguration, bankReputationConfiguration, topReputation)} {session.PlayerEntity.GetBankPenalty(reputationConfiguration, bankReputationConfiguration, topReputation)}"; private static string GenerateScene(this IClientSession session, byte type, bool skip) => $"scene {type} {(skip ? 1 : 0)}"; public static string GenerateDragonPacket(this IBattleEntity entity, byte amountOfDragons) => $"eff_d 2 {amountOfDragons} "; public static string GenerateEmptyHatusHeads(this IClientSession session) => "bc 0 0 0"; public static string GenerateArenaStatistics(this IClientSession session, bool leavingArena, PlayerGroup playerGroup) { CharacterLifetimeStatsDto lifetimeStats = session.PlayerEntity.LifetimeStats; var stringBuilder = new StringBuilder($"ascr {lifetimeStats.TotalArenaKills} {lifetimeStats.TotalArenaDeaths} 0 {session.PlayerEntity.ArenaKills} {session.PlayerEntity.ArenaDeaths} 0"); if (playerGroup == null) { stringBuilder.Append($" 0 0 {(leavingArena ? -1 : 0)}"); return stringBuilder.ToString(); } stringBuilder.Append($" {playerGroup.ArenaKills} {playerGroup.ArenaDeaths} {(leavingArena ? -1 : 1)}"); return stringBuilder.ToString(); } #endregion #region Send Packets /// /// Qna packet is supposed to trigger a dialog box on the client side, which, once confirmed, will make the client send /// the packet given in parameter /// /// /// Packet you want the client to send when he will confirm the dialog box /// public static void SendQnaPacket(this IClientSession session, string packet, string message) => session.SendPacket(session.GenerateQna(packet, message)); public static void SendPlayerShopTitle(this IClientSession packetReceiver, IClientSession shopOwner) => packetReceiver.SendPacket(shopOwner.GenerateShopPacket()); public static void SendPlayerFlag(this IClientSession receiverSession, IClientSession targetSession, long flag) => receiverSession.SendPacket(targetSession.GeneratePlayerFlag(flag)); public static void SendInboxPacket(this IClientSession session, string message) => session.SendPacket(session.GenerateInboxPacket(message)); public static void SendGuriPacket(this IClientSession session, byte type, short argument = 0, long value = 0, int secondValue = 0) => session.SendPacket(session.GenerateGuriPacket(type, argument, value, secondValue)); public static void SendEsfPacket(this IClientSession session, byte type) => session.SendPacket(session.GenerateEsfPacket(type)); public static void RefreshSpPoint(this IClientSession session) => session.SendPacket(session.GenerateSpPointPacket()); public static void SendRpPacket(this IClientSession session, int mapId, int x, int y, string param) => session.SendPacket(session.GenerateRpPacket(mapId, x, y, param)); public static void SendEsfPacket(this IClientSession session) => session.SendPacket("esf 4"); public static void SendDialog(this IClientSession session, string yesPacket, string noPacket, string dialog) => session.SendPacket(session.GenerateDlgPacket(yesPacket, noPacket, dialog)); public static void SendSpeak(this IClientSession session, string message, SpeakType type) => session.SendPacket(session.GenerateSpkPacket(message, type)); public static void SendSpeakToTarget(this IClientSession session, IClientSession target, string message, SpeakType type) => target.SendPacket(session.GenerateSpkPacket(message, type)); public static void ReceiveSpeakWhisper(this IClientSession receiver, long senderId, string senderName, string message, SpeakType type) => receiver.SendPacket(GenerateSpkPacket(senderId, senderName, message, type)); public static void BroadcastRest(this IClientSession session) => session.Broadcast(session.GenerateRestPacket()); public static void BroadcastRevive(this IClientSession session) => session.Broadcast(session.PlayerEntity.GenerateRevive()); public static void BroadcastGuri(this IClientSession session, byte type, byte argument, long value = 0, params IBroadcastRule[] rules) => session.Broadcast(session.GenerateGuriPacket(type, argument, value), rules); public static void BroadcastIn(this IClientSession session, IReputationConfiguration reputationConfiguration, IReadOnlyList topReputation, params IBroadcastRule[] rules) => session.Broadcast(session.GenerateInPacket(reputationConfiguration, topReputation), rules); public static void BroadcastOut(this IClientSession session, params IBroadcastRule[] rules) => session.Broadcast(session.GenerateOutPacket(), rules); public static void BroadcastMateOut(this IMateEntity mateEntity) => mateEntity.MapInstance?.Broadcast(mateEntity.GenerateOut()); public static void BroadcastMateTeleport(this IClientSession session, IMateEntity mateEntity, params IBroadcastRule[] rules) => session.Broadcast(mateEntity.GenerateTeleportPacket(mateEntity.PositionX, mateEntity.PositionY), rules); /// /// By default it will send a TeleportPacket to where the character is, you can also define the coords manually. /// /// /// /// /// public static void BroadcastTeleportPacket(this IClientSession session, short? x = null, short? y = null, params IBroadcastRule[] rules) { short teleportX = session.PlayerEntity.PositionX; short teleportY = session.PlayerEntity.PositionY; if (x != null) { teleportX = (short)x; } if (y != null) { teleportY = (short)y; } session.Broadcast(session.PlayerEntity.GenerateTeleportPacket(teleportX, teleportY), rules); } public static void BroadcastSpeak(this IClientSession session, string message, SpeakType type, params IBroadcastRule[] rules) => session.PlayerEntity.MapInstance.Broadcast(session.GenerateSpkPacket(message, type), rules); public static void BroadcastTitleInfo(this IClientSession session) => session.CurrentMapInstance.Broadcast(session.GenerateTitInfoPacket()); public static void BroadcastEffect(this IClientSession session, EffectType effectType, params IBroadcastRule[] rules) => session.Broadcast(session.GenerateEffectPacket(effectType), rules); public static void BroadcastEffectInRange(this IClientSession session, EffectType effectType) => session.Broadcast(session.GenerateEffectPacket(effectType), new RangeBroadcast(session.PlayerEntity.PositionX, session.PlayerEntity.PositionY)); public static void BroadcastEffectInRange(this IClientSession session, int effectId) => session.Broadcast(session.GenerateEffectPacket(effectId), new RangeBroadcast(session.PlayerEntity.PositionX, session.PlayerEntity.PositionY)); public static void BroadcastEffect(this IClientSession session, int effectId, params IBroadcastRule[] rules) => session.Broadcast(session.GenerateEffectPacket(effectId), rules); public static void BroadcastCMode(this IClientSession session, params IBroadcastRule[] rules) => session.Broadcast(session.GenerateCModePacket(), rules); public static void BroadcastEq(this IClientSession session, params IBroadcastRule[] rules) => session.Broadcast(session.GenerateEqPacket(), rules); public static void BroadcastPairy(this IClientSession session, params IBroadcastRule[] rules) => session.Broadcast(session.GeneratePairyPacket(), rules); public static void BroadcastTargetConstBuffEffects(this IClientSession session, IMateEntity mateEntity, params IBroadcastRule[] rules) => session.CurrentMapInstance?.Broadcast(mateEntity.GenerateConstBuffEffects(), rules); public static void SendTargetInPacket(this IClientSession session, IClientSession target, IReputationConfiguration reputationConfiguration, IReadOnlyList topReputation, bool foe = false, bool showInEffect = false) => session.SendPacket(target.GenerateInPacket(reputationConfiguration, topReputation, foe, showInEffect)); public static void BroadcastMovement(this IClientSession session, IBattleEntity entity, params IBroadcastRule[] rules) => session.Broadcast(GenerateMovement(entity), rules); public static void Broadcast(this IClientSession session, string packet, params IBroadcastRule[] rules) => session.CurrentMapInstance?.Broadcast(packet, rules); public static void Broadcast(this IClientSession session, T packet, params IBroadcastRule[] rules) where T : IServerPacket => session.CurrentMapInstance?.Broadcast(packet, rules); public static void SendChatMessage(this IClientSession session, string msg, ChatMessageColorType color) => session.SendPacket(session.GenerateSayPacket(msg, color)); public static void SendChatMessageNoPlayer(this IClientSession session, string msg, ChatMessageColorType color) => session.SendPacket($"say {(byte)session.PlayerEntity.Type} 0 {(byte)color} {msg}"); public static void SendChatMessageNoId(this IClientSession session, string msg, ChatMessageColorType color) => session.SendPacket(GenerateSayNoIdPacket(msg, color)); public static void SendInformationChatMessage(this IClientSession session, string msg) => session.SendChatMessage(msg, ChatMessageColorType.Yellow); public static void SendSuccessChatMessage(this IClientSession session, string msg) => session.SendChatMessage(msg, ChatMessageColorType.Green); public static void SendErrorChatMessage(this IClientSession session, string msg) => session.SendChatMessage(msg, ChatMessageColorType.Red); public static void SendSpCooldownUi(this IClientSession session, int seconds) => session.SendPacket(session.GenerateSpCooldownPacket(seconds)); public static void ResetSpCooldownUi(this IClientSession session) => session.SendPacket(session.GenerateSpCooldownPacket(0)); public static string GenerateSpCooldownPacket(this IClientSession session, int seconds) => $"sd {seconds}"; public static void SendDebugMessage(this IClientSession session, string msg, ChatMessageColorType color = ChatMessageColorType.Yellow) { if (!session.DebugMode) { return; } session.SendChatMessage($"[DEBUG] {msg}", color); } public static void SendCancelPacket(this IClientSession session, CancelType cancelType, int id = 0) { session.SendPacket(session.GenerateCancelPacket(cancelType, id)); session.SendDebugMessage("Battle cancel"); } public static void SendGuriFactionOverridePacket(this IClientSession session) => session.SendPacket(session.GenerateGuriFactionOverridePacket()); public static void SendDungeonPacket(this IClientSession session, DungeonInstance dungeonInstance, DungeonSubInstance dungeonSubInstance, IAct4DungeonManager act4DungeonManager, DateTime currentTime) => session.SendPacket(session.GenerateDungeonPacket(dungeonInstance, dungeonSubInstance, act4DungeonManager, currentTime)); public static void SendInfo(this IClientSession session, string msg) => session.SendPacket(session.GenerateInfoPacket(msg)); public static void SendInfo(this IClientSession session, GameDialogKey msg) => session.SendPacket(session.GenerateInfoPacket(session.GetLanguage(msg))); public static void SendInfo(this IClientSession session, GameDialogKey msg, params object[] formatParams) => session.SendPacket(session.GenerateInfoPacket(session.GetLanguageFormat(msg))); public static void SendMsg(this IClientSession session, string msg, MsgMessageType type) => session.SendPacket(session.GenerateMsgPacket(msg, type)); public static void SendMsg(this IClientSession session, GameDialogKey msg, MsgMessageType type) => session.SendPacket(session.GenerateMsgPacket(session.GetLanguage(msg), type)); public static void BroadcastHeal(this IBattleEntity entity, int heal) => entity.MapInstance.Broadcast(entity.GenerateRcPacket(heal)); public static void BroadcastDamage(this IBattleEntity entity, int damage) => entity.MapInstance.Broadcast(entity.GenerateDamage(damage)); public static void SendPost(this IClientSession session, byte type, int id) => session.SendPacket(session.GenerateDeletePost(type, id)); public static void SendSMemo(this IClientSession session, SmemoType type, string message) => session.SendPacket(session.GenerateSmemo(type, message)); public static void SendRcScalcPacket(this IClientSession session, byte type, long price, int amount, int bzAmount, long taxes, long priceTaxes, string name) => session.SendPacket(session.GenerateRcScalc(name, type, price, amount, bzAmount, taxes, priceTaxes)); public static void SendEmptyRcScalcPacket(this IClientSession session) => session.SendPacket(session.GenerateEmptyRcScalc()); public static void SendNpcDialog(this IClientSession session, int value) => session.SendPacket(session.GenerateNpcDialogSession(value)); public static void SendTargetNpcDialog(this IClientSession session, long targetCharacterId, int value) => session.SendPacket(GenerateNpcDialog(targetCharacterId, value)); public static void SendSpectatorWindow(this IClientSession session) => session.SendPacket(session.GenerateSpectatorWindow()); public static void SendPslInfoPacket(this IClientSession session, GameItemInstance item) => session.SendPacket(item.GeneratePslInfo()); public static void SendMsCPacket(this IClientSession session, byte type) => session.SendPacket(session.GenerateMsCPacket(type)); public static void SendMSlotPacket(this IClientSession session, byte slot) => session.SendPacket(session.GenerateMSlotPacket(slot)); public static void SendScpPacket(this IClientSession session, byte type) => session.SendPacket(session.GenerateScpPacket(type)); public static void SendObArPacket(this IClientSession session) => session.SendPacket(session.GenerateObArPacket()); public static void SendEffectEntity(this IClientSession session, IBattleEntity battleEntity, EffectType effectId) => session.SendPacket(battleEntity.GenerateEffectPacket(effectId)); public static void SendClockPacket(this IClientSession session, ClockType type, sbyte subType, TimeSpan time1, TimeSpan time2) => session.SendPacket(session.GenerateClockPacket(type, subType, time1, time2)); public static void SendTsClockPacket(this IClientSession session, TimeSpan time, bool isVisible) => session.SendPacket(session.GenerateTsClockPacket(time, isVisible)); public static void SendRemoveClockPacket(this IClientSession session) => session.SendPacket(session.GenerateRemoveClockPacket()); public static void SendRemoveRedClockPacket(this IClientSession session) => session.SendPacket(session.GenerateRemoveRedClock()); public static void SendEffectObject(this IClientSession session, IBattleEntity entity, bool first, EffectType effect) => session.SendPacket(entity.GenerateEffectObject(first, effect)); public static void RefreshFriendList(this IClientSession session, ISessionManager sessionManager) => session.SendPacket(session.GenerateFinit(sessionManager)); public static void RefreshBlackList(this IClientSession session) => session.SendPacket(session.GenerateBlinit()); public static void SendOppositeMove(this IClientSession session, bool enabled) => session.SendPacket(session.GenerateOppositeMove(enabled)); public static void BroadcastBubbleMessage(this IClientSession session, string message) => session.Broadcast(session.GenerateBubble(message)); public static void SendIncreaseRange(this IClientSession session) { int range = session.PlayerEntity.BCardComponent.GetAllBCardsInformation(BCardType.FearSkill, (byte)AdditionalTypes.FearSkill.AttackRangedIncreased, session.PlayerEntity.Level).firstData; session.SendPacket(session.GenerateIncreaseRange((short)range, range > 0)); if (session.PlayerEntity.UseSp && session.PlayerEntity.Specialist != null) { } } public static void BroadcastEffectGround(this IBattleEntity entity, EffectType effectType, short x, short y, bool remove) => entity.MapInstance.Broadcast(entity.GenerateEffectGround(effectType, x, y, remove)); public static void SendGenderPacket(this IClientSession session) => session.SendPacket(session.GenerateGenderPacket()); public static void BroadcastPlayerShopFlag(this IClientSession session, long flag) => session.Broadcast(session.GeneratePlayerFlag(flag), new ExceptSessionBroadcast(session)); public static void BroadcastShop(this IClientSession session) => session.Broadcast(session.GenerateShopPacket()); public static void BroadcastEffectTarget(this IBattleEntity entity, IBattleEntity target, EffectType effectType) => entity.MapInstance.Broadcast(entity.GenerateEffectTarget(target, effectType)); public static void SendGbexPacket(this IClientSession session, IReputationConfiguration reputationConfiguration, IBankReputationConfiguration bankReputationConfiguration, IReadOnlyList topReputation) => session.SendPacket(session.GenerateGbexPacket(reputationConfiguration, bankReputationConfiguration, topReputation)); public static void SendScene(this IClientSession session, byte type, bool skip) => session.SendPacket(session.GenerateScene(type, skip)); public static void SendEmptyHatusHeads(this IClientSession session) => session.SendPacket(session.GenerateEmptyHatusHeads()); public static void SendPetBasketPacket(this IClientSession session, bool isOn) => session.SendPacket(session.GeneratePetBasketPacket(isOn)); public static void BroadcastEndDancingGuriPacket(this IPlayerEntity playerEntity) => playerEntity.MapInstance.Broadcast(playerEntity.GenerateEndDancingGuriPacket()); public static void SendMapClear(this IClientSession session) => session.SendPacket(session.CurrentMapInstance.GenerateMapClear()); public static void SendArenaStatistics(this IClientSession session, bool leavingArena, PlayerGroup playerGroup = null) => session.SendPacket(session.GenerateArenaStatistics(leavingArena, playerGroup)); #endregion }