public async Task UpdateFieldSplit( Func <IPacket> getEnterPacket = null, Func <IPacket> getLeavePacket = null ) { if (Field == null && FieldSplit != null) { if (this is IFieldObjUser user) { await Task.WhenAll(user.Watching .ToImmutableList() .Select(w => w.Unwatch(user))); } await FieldSplit.Leave(this); return; } var split = Field.GetSplit(Position); if (FieldSplit != split) { await split.Enter(this, getEnterPacket, getLeavePacket); } }
public async Task UpdateAvatar() { var avatarPacket = new UnstructuredOutgoingPacket(PacketSendOperations.UserAvatarModified); avatarPacket.WriteInt(ID); avatarPacket.WriteByte(0x1); // Flag avatarPacket.WriteCharacterLook(Character); avatarPacket.WriteBool(false); avatarPacket.WriteBool(false); avatarPacket.WriteBool(false); avatarPacket.WriteInt(0); await FieldSplit.Dispatch(this, avatarPacket); }
public async Task ModifySecondaryStats(Action <IModifySecondaryStatContext> action = null, bool exclRequest = false) { var context = new ModifySecondaryStatContext(SecondaryStats as SecondaryStats); action?.Invoke(context); await UpdateStats(); if (context.ResetHistory.ToDictionary().Any()) { var resetLocalPacket = new UnstructuredOutgoingPacket(PacketSendOperations.TemporaryStatReset); var resetRemotePacket = new UnstructuredOutgoingPacket(PacketSendOperations.UserTemporaryStatReset); resetLocalPacket.WriteSecondaryStatsFlag(context.ResetHistory); resetLocalPacket.WriteBool(false); // IsMovementAffectingStat resetRemotePacket.WriteInt(ID); resetRemotePacket.WriteSecondaryStatsFlag(context.ResetHistory); await Dispatch(resetLocalPacket); await FieldSplit.Dispatch(resetRemotePacket); } if (context.SetHistory.ToDictionary().Any()) { var setLocalPacket = new UnstructuredOutgoingPacket(PacketSendOperations.TemporaryStatSet); var setRemotePacket = new UnstructuredOutgoingPacket(PacketSendOperations.UserTemporaryStatSet); setLocalPacket.WriteSecondaryStatsToLocal(context.SetHistory); setLocalPacket.WriteShort(0); // tDelay setLocalPacket.WriteBool(false); // IsMovementAffectingStat setRemotePacket.WriteInt(ID); setRemotePacket.WriteSecondaryStatsToLocal(context.SetHistory); setRemotePacket.WriteShort(0); // tDelay await Dispatch(setLocalPacket); await FieldSplit.Dispatch(setRemotePacket); } }