private void B_LoadHouse_Click(object sender, EventArgs e) { var name = GetVillagerName(Houses[Index]); using var ofd = new OpenFileDialog { Filter = "New Horizons Villager House (*.nhvh)|*.nhvh|All files (*.*)|*.*", FileName = $"{name}.nhvh", }; if (ofd.ShowDialog() != DialogResult.OK) { return; } var file = ofd.FileName; var fi = new FileInfo(file); const int expectLength = VillagerHouse.SIZE; if (fi.Length != expectLength) { WinFormsUtil.Error(MessageStrings.MsgCanceling, string.Format(MessageStrings.MsgDataSizeMismatchImport, fi.Length, expectLength)); return; } var data = File.ReadAllBytes(file); var h = new VillagerHouse(data); var current = Houses[Index]; h.NPC1 = current.NPC1; Houses[Index] = h; PG_Item.SelectedObject = h; }
private static VillagerData AdaptVillager(VillagerInfo exist, VillagerData replace, bool prepMoveOut = false) { var ov = exist.Villager; var oh = exist.House; var nv = new Villager2(replace.Villager); _ = new VillagerHouse(replace.House) { NPC1 = oh.NPC1, NPC2 = oh.NPC2, BuildPlayer = oh.BuildPlayer }; // Copy Memories var om = nv.GetMemory(0); var nm = ov.GetMemory(0); nm.PlayerId = om.PlayerId; nv.SetMemory(nm, 0); if (!prepMoveOut) { return(replace); } nv.MovingOut = true; return(replace); }
private void loadVillagerData(Villager2 v, VillagerHouse vh, bool raw = false) { try { Villager2 newV = v; VillagerHouse newVH = vh; VillagerHouse loadedVillagerHouse = GetCurrentLoadedVillagerHouse(); // non indexed so search for the correct one int index = loadedVillagerHouses.IndexOf(loadedVillagerHouse); if (!raw && index != -1) { newV.SetMemories(loadedVillager.GetMemories()); newV.SetEventFlagsSave(loadedVillager.GetEventFlagsSave()); newV.CatchPhrase = GameInfo.Strings.GetVillagerDefaultPhrase(newV.InternalName); } if (index == -1) { //inject to earliest available house foreach (var house in loadedVillagerHouses) { if (house.NPC1 == -1) { loadedVillagerHouse = house; index = loadedVillagerHouses.IndexOf(loadedVillagerHouse); house.NPC1 = (sbyte)currentlyLoadedVillagerIndex; break; } } if (index == -1) { throw new Exception("Selected villager has no house, and no houses are available."); } } // check if they are moving in if (loadedVillagerHouse.WallUniqueID == WallType.HouseWallNForSale || loadedVillagerHouse.WallUniqueID == WallType.HouseWallNSoldOut) { loadedVillagerHouse.WallUniqueID = newVH.WallUniqueID; } if (checkIfMovingIn(loadedVillagerHouse)) { newVH = combineHouseOrders(newVH, loadedVillagerHouse); } newVH.NPC1 = loadedVillagerHouse.NPC1; loadedVillagerHouses[index] = newVH; loadedVillager = newV; loadedVillagerShellsList[currentlyLoadedVillagerIndex] = newV; TenVillagers[currentlyLoadedVillagerIndex].texture = SpriteBehaviour.PullTextureFromParser(villagerSprites, newV.InternalName); setCurrentVillager(); // where the magic happens VillagerToUI(loadedVillager); } catch (Exception e) { Debug.LogError(e.Message); PopupHelper.CreateError(e.Message, 2f); } }
public void loadVillager(int index) { try { byte[] loaded = CurrentConnection.ReadBytes(CurrentVillagerAddress + (uint)(index * Villager.SIZE), Villager.SIZE); if (villagerIsNull(loaded)) { return; } currentlyLoadedVillagerIndex = index; loadedVillager = new Villager(loaded); // get their house byte[] loadedHouse = CurrentConnection.ReadBytes(CurrentVillagerHouseAddress + (uint)(currentlyLoadedVillagerIndex * VillagerHouse.SIZE), VillagerHouse.SIZE); loadedVillagerHouse = new VillagerHouse(loadedHouse); VillagerToUI(loadedVillager); } catch (Exception e) { Debug.LogError(e.Message); PopupHelper.CreateError(e.Message, 2f); } }
private void loadVillagerData() { try { string newVillager = Selector.LastSelectedVillager; byte[] villagerDump = ((TextAsset)Resources.Load("DefaultVillagers/" + newVillager + "V")).bytes; byte[] villagerHouse = ((TextAsset)Resources.Load("DefaultVillagers/" + newVillager + "H")).bytes; if (villagerDump == null || villagerHouse == null) { return; } Villager newV = new Villager(villagerDump); newV.SetMemories(loadedVillager.GetMemories()); newV.CatchPhrase = GameInfo.Strings.GetVillagerDefaultPhrase(newVillager); VillagerHouse newVH = new VillagerHouse(villagerHouse); newVH.NPC1 = loadedVillagerHouse.NPC1; loadedVillager = newV; loadedVillagerHouse = newVH; SetCurrentVillager(true); TenVillagers[currentlyLoadedVillagerIndex].texture = SpriteBehaviour.PullTextureFromParser(villagerSprites, newVillager); VillagerToUI(loadedVillager); } catch (Exception e) { Debug.LogError(e.Message); PopupHelper.CreateError(e.Message, 2f); } }
private string GetVillagerName(VillagerHouse house) { var villagerIndex = house.NPC1; var v = (uint)villagerIndex >= Villagers.Count ? "???" : Villagers[villagerIndex].InternalName; var name = GameInfo.Strings.GetVillager(v); return(name); }
private VillagerHouse combineHouseOrders(VillagerHouse vNew, VillagerHouse vOld) { VillagerHouse vTmp = new VillagerHouse(vOld.Data); vTmp.OrderWallUniqueID = vNew.OrderWallUniqueID; vTmp.OrderRoofUniqueID = vNew.OrderRoofUniqueID; vTmp.OrderDoorUniqueID = vNew.OrderDoorUniqueID; return(vTmp); }
public void WriteVillagerDataVillager(Villager2 v) { checkReloadVillager(); VillagerHouse loadedVillagerHouse = loadedVillagerHouses.Find(x => x.NPC1 == (sbyte)currentlyLoadedVillagerIndex); // non indexed so search for the correct one int index = loadedVillagerHouses.IndexOf(loadedVillagerHouse); if (index == -1) { throw new Exception("The villager having their house replaced doesn't have a house on your island."); // not sure why but it can get unloaded during the check } loadVillagerData(v, loadedVillagerHouse, true); }
public static async Task <VillagerHelper> GenerateHelper(CrossBot bot, CancellationToken token) { LogUtil.LogInfo("Fetching villager data, please wait...", bot.Config.IP); // houses var housesData = await bot.Connection.ReadBytesAsync((uint)OffsetHelper.VillagerHouseAddress, ExpectedHouseSize, token).ConfigureAwait(false); var houses = new VillagerHouse[10]; for (int i = 0; i < 10; ++i) { houses[i] = new VillagerHouse(housesData.Skip(i * VillagerHouse.SIZE).Take(VillagerHouse.SIZE).ToArray()); } // villager shells var villagers = await GetVillagerShells(bot.Connection, true, token).ConfigureAwait(false); LogUtil.LogInfo("Villager data loaded...", bot.Config.IP); return(new VillagerHelper(bot, houses, villagers)); }
private void B_ReplaceVillager_Click(object sender, EventArgs e) { if (!Clipboard.ContainsText()) { WinFormsUtil.Error(MessageStrings.MsgVillagerReplaceNoText); return; } var internalName = Clipboard.GetText(); if (!VillagerResources.IsVillagerDataKnown(internalName)) { internalName = GameInfo.Strings.VillagerMap.FirstOrDefault(z => string.Equals(z.Value, internalName, StringComparison.InvariantCultureIgnoreCase)).Key; if (internalName == default) { WinFormsUtil.Error(string.Format(MessageStrings.MsgVillagerReplaceUnknownName, internalName)); return; } } var index = VillagerIndex; var villager = Villagers[index]; if (villager is not Villager2 v2) { WinFormsUtil.Error(MessageStrings.MsgVillagerReplaceOutdatedSaveFormat); return; } var houses = SAV.GetVillagerHouses(); var houseIndex = Array.FindIndex(houses, z => z.NPC1 == index); var exist = new VillagerInfo(v2, houses[houseIndex]); var replace = VillagerSwap.GetReplacementVillager(exist, internalName); var nh = new VillagerHouse(replace.House); SAV.SetVillagerHouse(nh, houseIndex); var nv = new Villager2(replace.Villager); LoadVillager(Villagers[index] = nv); System.Media.SystemSounds.Asterisk.Play(); }
private void loadVillagerData(Villager2 v, VillagerHouse vh, bool raw = false) { try { Villager2 newV = v; VillagerHouse newVH = vh; if (!raw) { newV.SetMemories(loadedVillager.GetMemories()); newV.SetEventFlagsSave(loadedVillager.GetEventFlagsSave()); newV.CatchPhrase = GameInfo.Strings.GetVillagerDefaultPhrase(newV.InternalName); } VillagerHouse loadedVillagerHouse = GetCurrentLoadedVillagerHouse(); // non indexed so search for the correct one int index = loadedVillagerHouses.IndexOf(loadedVillagerHouse); if (index == -1) { throw new Exception("The villager being replaced doesn't have a house on your island."); } // check if they are moving in if (checkIfMovingIn(loadedVillagerHouse)) { newVH = combineHouseOrders(newVH, loadedVillagerHouse); } newVH.NPC1 = loadedVillagerHouse.NPC1; loadedVillagerHouses[index] = newVH; loadedVillager = newV; loadedVillagerShellsList[currentlyLoadedVillagerIndex] = newV; TenVillagers[currentlyLoadedVillagerIndex].texture = SpriteBehaviour.PullTextureFromParser(villagerSprites, newV.InternalName); setCurrentVillager(); // where the magic happens VillagerToUI(loadedVillager); } catch (Exception e) { Debug.LogError(e.Message); PopupHelper.CreateError(e.Message, 2f); } }
protected override void LoadContent() { new Registry(); this.SpriteBatch = new SpriteBatch(this.GraphicsDevice); var data = SaveManager.Load("save"); this.MapSeed = data?.Seed ?? new Random().Next(); var town = this.AddMap(MapGenerator.GenerateTown(this.MapSeed, data == null)); var villager = new Villager("Player", town, new Vector2(35.5F, 32.5F)); town.AddObject(villager); var houseMap = this.AddMap(MapGenerator.GenerateHouse("House1", new Point(20, 20))); var house = new VillagerHouse(0, town, new Vector2(20, 20), houseMap.Name); town.AddObject(house); if (data != null) { foreach (var map in data.Maps) { map.Load(this.Maps); } this.Player = data.Player.Load(this.Maps); this.lastRealTimeUpdate = data.LastRealTimeUpdate; this.ForceRealTimeUpdate(); } else { this.Player = new Player(town, new Vector2(22.5F, 22.5F)); town.AddObject(this.Player); } this.Camera = new Camera(this.Player); this.Camera.FixPosition(this.CurrentMap); }
public async Task <bool> InjectVillager(VillagerRequest vr, CancellationToken token) { var vd = vr.Item; var index = vr.Index; if (VillagerHouses == null || VillagerShells == null || Connection == null || Bot == null) { return(false); } VillagerHouse?house = VillagerHouses.Find(x => x.NPC1 == (sbyte)index); if (house == null) { LogUtil.LogInfo($"House {index} requested but does not exist. Injecting to first available house", Bot.Config.IP); for (int i = 0; i < VillagerHouses.Count; ++i) { if (VillagerHouses[i].HouseStatus == 0) { house = VillagerHouses[i]; break; } } } if (house == null) { LogUtil.LogInfo($"No house found to inject to.", Bot.Config.IP); return(false); } var houseIndex = VillagerHouses.IndexOf(house); var villagerToInject = (byte[])vd.Villager.Clone(); var villagerAsVillager = new Villager2(villagerToInject); LogUtil.LogInfo($"Beginning injection for: {GameInfo.Strings.GetVillager(villagerAsVillager.InternalName)}", Bot.Config.IP); // update moving out state villagerAsVillager.MoveType = 0; villagerAsVillager.MovingOut = true; ushort[] flags = villagerAsVillager.GetEventFlagsSave(); flags[05] = 1; // flag 5 = MoveInCompletion flags[09] = 0; // flag 9 = AbandonedHouse flags[24] = 0; // flag 24 = ForceMoveOut villagerAsVillager.SetEventFlagsSave(flags); var houseToInject = (byte[])vd.House.Clone(); var houseAsHouse = new VillagerHouse(houseToInject) { HouseStatus = house.HouseStatus == 0 ? 2 : house.HouseStatus, NPC1 = house.NPC1 == -1 ? (sbyte)index : house.NPC1, NPC2 = house.NPC2 }; // inject villager await Connection.WriteBytesAsync(villagerAsVillager.Data, (uint)OffsetHelper.VillagerAddress + ((uint)index *Villager2.SIZE), token).ConfigureAwait(false); await Connection.WriteBytesAsync(villagerAsVillager.Data, (uint)OffsetHelper.VillagerAddress + ((uint)index *Villager2.SIZE) + (uint)OffsetHelper.BackupSaveDiff, token).ConfigureAwait(false); // inject house await Connection.WriteBytesAsync(houseAsHouse.Data, (uint)OffsetHelper.VillagerHouseAddress + ((uint)houseIndex *VillagerHouse.SIZE), token).ConfigureAwait(false); await Connection.WriteBytesAsync(houseAsHouse.Data, (uint)OffsetHelper.VillagerHouseAddress + ((uint)houseIndex *VillagerHouse.SIZE) + (uint)OffsetHelper.BackupSaveDiff, token).ConfigureAwait(false); LogUtil.LogInfo($"Villager injection complete.", Bot.Config.IP); vr.OnFinish?.Invoke(true); return(true); }
// villager data public void WriteVillagerDataHouse(VillagerHouse vh) { checkReloadVillager(); loadVillagerData(loadedVillager, vh, true); }
private string GetHouseSummary(VillagerHouse house) => $"{GetVillagerName(house)}'s House";
private bool checkIfMovingIn(VillagerHouse vOld) => vOld.WallUniqueID == WallType.HouseWallNSoldOut;
public VillagerInfo(Villager2 villager, VillagerHouse house) { Villager = villager; House = house; }