public void Save(VMAvatar avatar) { SkinTone = (byte)avatar.SkinTone; DefaultSuits = avatar.DefaultSuits; //todo: clone? //if naked, save in daywear. BodyOutfit = (avatar.BodyOutfit.ID == 0x24E0000000D || avatar.BodyOutfit.ID == 0x10000000D)?avatar.DefaultSuits.Daywear.ID : avatar.BodyOutfit.ID; HeadOutfit = avatar.HeadOutfit.ID; Name = avatar.Name; Permissions = ((VMTSOAvatarState)avatar.TSOState).Permissions; AvatarFlags = ((VMTSOAvatarState)avatar.TSOState).Flags; Budget = avatar.TSOState.Budget.Value; for (int i = 0; i < MotiveData.Length; i++) { MotiveData[i] = avatar.GetMotiveData((VMMotive)i); } MotiveData[(int)(VMMotive.SleepState)] = 0; for (int i = 0; i < PersonDataMap.Length; i++) { PersonData[i] = avatar.GetPersonData((VMPersonDataVariable)PersonDataMap[i]); } SkillLock = avatar.SkillLocks; OnlineJobInfo = ((VMTSOAvatarState)avatar.TSOState).JobInfo; IgnoredAvatars = ((VMTSOAvatarState)avatar.TSOState).IgnoredAvatars; }
public override void Deserialize(BinaryReader reader) { base.Deserialize(reader); Permissions = (VMTSOAvatarPermissions)reader.ReadByte(); var ignored = reader.ReadInt32(); IgnoredAvatars.Clear(); for (int i = 0; i < ignored; i++) { IgnoredAvatars.Add(reader.ReadUInt32()); } JobInfo.Clear(); if (Version > 7) { var jobs = reader.ReadInt32(); for (int i = 0; i < jobs; i++) { var id = reader.ReadInt16(); var job = new VMTSOJobInfo(); job.Deserialize(reader); JobInfo[id] = job; } } if (Version > 9) { Flags = (VMTSOAvatarFlags)reader.ReadUInt32(); } if (Version > 27) { ChatColor = new Color(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), (byte)255); ChatTTSPitch = reader.ReadSByte(); ChatChannel = reader.ReadByte(); } }
public void Save(VMAvatar avatar) { SkinTone = (byte)avatar.SkinTone; DefaultSuits = avatar.DefaultSuits; //todo: clone? //if naked or using clothes rack, save in daywear. //TODO: store and check simantics outfit category, and restore using that instead. var dyn = avatar.DynamicSuits; var bID = avatar.BodyOutfit.ID; var saveDaywear = dyn.Daywear == bID || dyn.Sleepwear == bID || dyn.Swimwear == bID; saveDaywear = saveDaywear || (bID == 0x24E0000000D || bID == 0x10000000D); BodyOutfit = (saveDaywear)?avatar.DefaultSuits.Daywear.ID : bID; HeadOutfit = avatar.HeadOutfit.ID; Name = avatar.Name; Permissions = avatar.AvatarState.Permissions; AvatarFlags = ((VMTSOAvatarState)avatar.TSOState).Flags; Budget = avatar.TSOState.Budget.Value; for (int i = 0; i < MotiveData.Length; i++) { MotiveData[i] = avatar.GetMotiveData((VMMotive)i); } MotiveData[(int)(VMMotive.SleepState)] = 0; for (int i = 0; i < PersonDataMap.Length; i++) { PersonData[i] = avatar.GetPersonData((VMPersonDataVariable)PersonDataMap[i]); } SkillLock = avatar.SkillLocks; OnlineJobInfo = ((VMTSOAvatarState)avatar.TSOState).JobInfo; IgnoredAvatars = ((VMTSOAvatarState)avatar.TSOState).IgnoredAvatars; }
public override void Deserialize(BinaryReader reader) { base.Deserialize(reader); TargetUID = reader.ReadUInt32(); ReplaceUID = reader.ReadUInt32(); Level = (VMTSOAvatarPermissions)reader.ReadByte(); Mode = (VMChangePermissionsMode)reader.ReadByte(); }
public void Deserialize(BinaryReader reader) { Version = reader.ReadInt32(); Name = reader.ReadString(); PersistID = reader.ReadUInt32(); DefaultSuits = new VMAvatarDefaultSuits(reader); Permissions = (VMTSOAvatarPermissions)reader.ReadByte(); if (Version > 1) { AvatarFlags = (VMTSOAvatarFlags)reader.ReadUInt32(); } Budget = reader.ReadUInt32(); BodyOutfit = reader.ReadUInt64(); HeadOutfit = reader.ReadUInt64(); SkinTone = reader.ReadByte(); if (Version > 2) { IsWorker = reader.ReadBoolean(); } for (int i = 0; i < MotiveData.Length; i++) { MotiveData[i] = reader.ReadInt16(); } for (int i = 0; i < PersonData.Length; i++) { PersonData[i] = reader.ReadInt16(); } var count = reader.ReadInt32(); Relationships = new VMEntityPersistRelationshipMarshal[count]; for (int i = 0; i < Relationships.Length; i++) { Relationships[i] = new VMEntityPersistRelationshipMarshal(); Relationships[i].Deserialize(reader); } var jobs = reader.ReadInt32(); for (int i = 0; i < jobs; i++) { var id = reader.ReadInt16(); var job = new VMTSOJobInfo(); job.Deserialize(reader); OnlineJobInfo[id] = job; } if (Version > 3) { var ignored = reader.ReadInt32(); for (int i = 0; i < ignored; i++) { IgnoredAvatars.Add(reader.ReadUInt32()); } } }
public void Deserialize(BinaryReader reader) { ID = reader.ReadByte(); Name = reader.ReadString(); Description = reader.ReadString(); ViewPermMin = (VMTSOAvatarPermissions)reader.ReadByte(); SendPermMin = (VMTSOAvatarPermissions)reader.ReadByte(); Flags = (VMTSOChatChannelFlags)reader.ReadByte(); TextColor = new Color(reader.ReadUInt32()); }
public override void Deserialize(BinaryReader reader) { base.Deserialize(reader); Permissions = (VMTSOAvatarPermissions)reader.ReadByte(); var ignored = reader.ReadInt32(); IgnoredAvatars.Clear(); for (int i=0; i<ignored; i++) { IgnoredAvatars.Add(reader.ReadUInt32()); } }
public override void Deserialize(BinaryReader reader) { base.Deserialize(reader); Version = reader.ReadUInt16(); RequesterID = reader.ReadUInt32(); HeadID = reader.ReadUInt64(); BodyID = reader.ReadUInt64(); SkinTone = reader.ReadByte(); Gender = reader.ReadBoolean(); Name = reader.ReadString(); Permissions = (VMTSOAvatarPermissions)reader.ReadByte(); }
public override void Deserialize(BinaryReader reader) { base.Deserialize(reader); Permissions = (VMTSOAvatarPermissions)reader.ReadByte(); var ignored = reader.ReadInt32(); IgnoredAvatars.Clear(); for (int i = 0; i < ignored; i++) { IgnoredAvatars.Add(reader.ReadUInt32()); } }
public void UpdateAvatarState(VMTSOAvatarPermissions perm) { LastPermissions = perm; //personbuttontemplate_defaultthumbnail = 0x79500000001, ulong bgID = 0; ulong overlayID = 0; switch (perm) { case VMTSOAvatarPermissions.Visitor: bgID = 0x25400000001; break; //personbuttontemplate_visitorlarge case VMTSOAvatarPermissions.Roommate: case VMTSOAvatarPermissions.BuildBuyRoommate: bgID = 0x25200000001; overlayID = 0xB7F00000001; break; //personbuttontemplate_roommatelarge, personbuttonoverlay_roommatelarge case VMTSOAvatarPermissions.Admin: case VMTSOAvatarPermissions.Owner: bgID = 0x25200000001; overlayID = 0x7A000000001; break; //..., personbuttonoverlay_houseleaderlarge } if (Avatar.PersistID < 65536) { bgID = 0xCEF00000001; //peoplebuttontemplate_npclarge } if (Small) { bgID += 0x00100000000; overlayID += 0x00100000000; } /*if (Avatar.PersistID == vm.MyUID) * { * bgID = 0x25000000001; //personbuttontemplate_playerlarge * }*/ Texture = GetTexture(bgID); Icon = Avatar.GetIcon(GameFacade.GraphicsDevice, 0); if (Icon == null) { Icon = GetTexture(0x79500000001); //personbuttontemplate_defaultthumbnail } Overlay = (overlayID == 0)?null:GetTexture(overlayID); Tooltip = GetAvatarString(Avatar); }
public override bool Verify(VM vm, VMAvatar caller) { Name = Name.Replace("\r\n", ""); if (Verified == true) { return(true); } if (Ticket == null) { Ticket = "local" + ":" + Name; } var tempName = Name; //obviously not a concern for final server. but for now... prevents people logging in with 2x same persist int i = 1; while (vm.Entities.Any(x => (x is VMAvatar) && ((VMAvatar)x).Name == tempName)) { tempName = Name + " (" + (i++) + ")"; } Name = tempName; if (FromNet && RequesterID == uint.MaxValue - 1) { return(false); //only server can set themselves as server... } RequesterID = ActorUID; vm.GlobalLink.ObtainAvatarFromTicket(vm, Ticket, (uint persistID, VMTSOAvatarPermissions permissions) => { //first, verify if their sim has left the lot yet. if not, they cannot join until they have left. //(only really happens with an immediate rejoin) if (vm.Entities.FirstOrDefault(x => x.PersistID == persistID) != null && Client != null) { Client.Disconnect(); //would like to send a message but need a rework of VMServerDriver to make it happen return; } //TODO: a lot more persist state this.ActorUID = persistID; this.Permissions = permissions; this.Verified = true; vm.ForwardCommand(this); }); return(false); }
public void NotifyRoommateChange(uint avatar_id, ChangeType change) { VMTSOAvatarPermissions newLevel = VMTSOAvatarPermissions.Visitor; switch (change) { case ChangeType.ADD_ROOMMATE: newLevel = VMTSOAvatarPermissions.Roommate; break; case ChangeType.REMOVE_ROOMMATE: newLevel = VMTSOAvatarPermissions.Visitor; break; } VMDriver.SendCommand(new VMChangePermissionsCmd { TargetUID = avatar_id, Level = newLevel, Verified = true, }); }
public void UpdateAvatarState(VMTSOAvatarPermissions perm) { LastPermissions = perm; //personbuttontemplate_defaultthumbnail = 0x79500000001, ulong bgID = 0; ulong overlayID = 0; switch (perm) { case VMTSOAvatarPermissions.Visitor: bgID = 0x25400000001; break; //personbuttontemplate_visitorlarge case VMTSOAvatarPermissions.Roommate: case VMTSOAvatarPermissions.BuildBuyRoommate: bgID = 0x25200000001; overlayID = 0xB7F00000001; break; //personbuttontemplate_roommatelarge, personbuttonoverlay_roommatelarge case VMTSOAvatarPermissions.Admin: case VMTSOAvatarPermissions.Owner: bgID = 0x25200000001; overlayID = 0x7A000000001; break; //..., personbuttonoverlay_houseleaderlarge } if (Avatar.PersistID < 65536) { bgID = 0xCEF00000001; //peoplebuttontemplate_npclarge } if (Small) { bgID += 0x00100000000; overlayID += 0x00100000000; } Texture = GetTexture(bgID); Icon = Avatar.GetIcon(GameFacade.GraphicsDevice, 0); if (Icon == null) Icon = GetTexture(0x79500000001); //personbuttontemplate_defaultthumbnail Overlay = (overlayID == 0)?null:GetTexture(overlayID); Target = GetTexture(0x25700000001); Tooltip = GetAvatarString(Avatar); }
private bool ChangeUserLevel(VM vm, uint pid, VMTSOAvatarPermissions level) { var obj = vm.GetAvatarByPersist(pid); var roomieChange = false; var playerOwned = (!vm.TSOState.CommunityLot); if (obj == null) { vm.TSOState.BuildRoommates.Remove(pid); if (vm.TSOState.Roommates.Contains(pid)) { roomieChange = true; } vm.TSOState.Roommates.Remove(pid); if (level >= VMTSOAvatarPermissions.Roommate && level < VMTSOAvatarPermissions.Admin) { roomieChange = !roomieChange; vm.TSOState.Roommates.Add(pid); vm.TSOState.Names.Precache(vm, pid); if (level > VMTSOAvatarPermissions.Roommate) { vm.TSOState.BuildRoommates.Add(pid); } if (level == VMTSOAvatarPermissions.Owner) { vm.TSOState.OwnerID = pid; } } } else { var oldState = obj.AvatarState.Permissions; if (oldState >= VMTSOAvatarPermissions.Roommate) { vm.TSOState.Roommates.Remove(obj.PersistID); roomieChange = !roomieChange; if (playerOwned) { ((VMTSOAvatarState)obj.TSOState).Flags |= VMTSOAvatarFlags.CanBeRoommate; } } if (oldState >= VMTSOAvatarPermissions.BuildBuyRoommate) { vm.TSOState.BuildRoommates.Remove(obj.PersistID); } obj.AvatarState.Permissions = level; if (level >= VMTSOAvatarPermissions.Roommate) { if (playerOwned) { ((VMTSOAvatarState)obj.TSOState).Flags &= ~VMTSOAvatarFlags.CanBeRoommate; } roomieChange = !roomieChange; //flips roomie change back vm.TSOState.Roommates.Add(obj.PersistID); } if (level >= VMTSOAvatarPermissions.BuildBuyRoommate) { vm.TSOState.BuildRoommates.Add(obj.PersistID); } if (level == VMTSOAvatarPermissions.Owner) { vm.TSOState.OwnerID = pid; } else if (vm.TSOState.OwnerID == pid) { vm.TSOState.OwnerID = 0; } } return(roomieChange && playerOwned); }
public void Populate() { var childCopy = new List <UIElement>(Children); foreach (var child in childCopy) { Remove(child); } var channels = new List <VMTSOChatChannel>(); var perm = ((Dialog.Owner.ActiveEntity as VMAvatar)?.AvatarState?.Permissions ?? VMTSOAvatarPermissions.Visitor); var ui = Content.Content.Get().CustomUI; var btnTex = ui.Get("chat_cat.png").Get(GameFacade.GraphicsDevice); channels.Add(VMTSOChatChannel.MainChannel); channels.AddRange(Dialog.Owner.vm.TSOState.ChatChannels); if (perm == VMTSOAvatarPermissions.Admin) { channels.Add(VMTSOChatChannel.AdminChannel); } HasButtons = channels.Count(x => perm >= x.ViewPermMin) > 1 || (perm >= VMTSOAvatarPermissions.Owner); if (!HasButtons) { LastChannels = new List <VMTSOChatChannel>(Dialog.Owner.vm.TSOState.ChatChannels); LastPerm = perm; Invalidate(); return; } var btnCaption = TextStyle.DefaultLabel.Clone(); btnCaption.Size = 8; btnCaption.Shadow = true; var active = Dialog.Owner.ChatPanel.ActiveChannel; var xPos = 0; foreach (var channel in channels) { if (perm < channel.ViewPermMin) { continue; } var btn = new UIButton(btnTex); if (!EditMode) { btn.Selected = (channel.ID == active); if ((Dialog.ShowChannels & (1 << channel.ID)) == 0) { btn.ForceState = 3; } } if (EditMode && channel.ID == 0) { btn.Tooltip = GameFacade.Strings.GetString("f113", "18"); btn.Disabled = true; } else { btn.Tooltip = (EditMode) ? GameFacade.Strings.GetString("f113", "19") : channel.Description; } btn.Caption = channel.Name; btn.CaptionStyle = btnCaption.Clone(); btn.CaptionStyle.Color = channel.TextColor; btn.OnButtonClick += (btn2) => ChannelSelect(channel); btn.X = xPos; xPos += (int)btn.Width + 1; Add(btn); } if (EditMode) { var btn2 = new UIButton(btnTex); btn2.Caption = GameFacade.Strings.GetString("f113", "14"); btn2.Tooltip = GameFacade.Strings.GetString("f113", "16"); btn2.CaptionStyle = btnCaption; btn2.OnButtonClick += NewButton; btn2.X = xPos; if (channels.Count(x => x.ID < 7) < 5) { xPos += (int)btn2.Width + 1; Add(btn2); } btn2 = new UIButton(btnTex); btn2.Caption = GameFacade.Strings.GetString("f113", "15"); btn2.Tooltip = GameFacade.Strings.GetString("f113", "17"); btn2.CaptionStyle = btnCaption; btn2.OnButtonClick += CancelEditButton; btn2.X = xPos; xPos += (int)btn2.Width + 1; Add(btn2); } else if (perm >= VMTSOAvatarPermissions.Owner) { var btn2 = new UIButton(btnTex); btn2.Caption = GameFacade.Strings.GetString("f113", "13"); btn2.Tooltip = GameFacade.Strings.GetString("f113", "20"); btn2.CaptionStyle = btnCaption; btn2.OnButtonClick += EditButton; btn2.X = xPos; xPos += (int)btn2.Width + 1; Add(btn2); } LastPerm = perm; LastChannels = new List <VMTSOChatChannel>(Dialog.Owner.vm.TSOState.ChatChannels); Invalidate(); }
public override void Deserialize(BinaryReader reader) { base.Deserialize(reader); Permissions = (VMTSOAvatarPermissions)reader.ReadByte(); }
public override bool Verify(VM vm, VMAvatar caller) { Name = Name.Replace("\r\n", ""); if (Verified == true) return true; if (Ticket == null) Ticket = "local" + ":" + Name; var tempName = Name; //obviously not a concern for final server. but for now... prevents people logging in with 2x same persist int i = 1; while (vm.Entities.Any(x => (x is VMAvatar) && ((VMAvatar)x).Name == tempName)) { tempName = Name + " (" + (i++) + ")"; } Name = tempName; if (FromNet && RequesterID == uint.MaxValue - 1) return false; //only server can set themselves as server... RequesterID = ActorUID; vm.GlobalLink.ObtainAvatarFromTicket(vm, Ticket, (uint persistID, VMTSOAvatarPermissions permissions) => { //first, verify if their sim has left the lot yet. if not, they cannot join until they have left. //(only really happens with an immediate rejoin) if (vm.Entities.FirstOrDefault(x => x.PersistID == persistID) != null && Client != null) { Client.Disconnect(); //would like to send a message but need a rework of VMServerDriver to make it happen return; } //TODO: a lot more persist state this.ActorUID = persistID; this.Permissions = permissions; this.Verified = true; vm.ForwardCommand(this); }); return false; }
public override void Deserialize(BinaryReader reader) { base.Deserialize(reader); TargetUID = reader.ReadUInt32(); Level = (VMTSOAvatarPermissions)reader.ReadByte(); }