private void Load(WZObject mapNode)//WzManager wzMan) { Portals.Load(mapNode); Footholds.Load(mapNode); Npcs.Load(mapNode); Mobs.Load(mapNode); Mobs.DoMobLogic(); }
private void Load(WZProperty mapNode) { Portals.Load(mapNode); Footholds.Load(mapNode); Npcs.Load(mapNode); Mobs.Load(mapNode); Mobs.DoMobLogic(); }
public void CalculateBounds() { var allPoints = Footholds .Select(x => x.Line.Start) .Union(Footholds.Select(x => x.Line.End)) .ToList(); var xMin = allPoints.Min(p => p.X); var xMax = allPoints.Max(p => p.X); var yMin = allPoints.Min(p => p.Y); var yMax = allPoints.Max(p => p.Y); Bounds = new Rectangle(new Point(xMin, yMax), new Point(xMax, yMin)); }
/// <summary> /// Clears all higher and lower object pools. /// Field will be ready for disposal and can not be used after this is called. /// </summary> public void Dispose() { Users.Dispose(); Npcs.Dispose(); Footholds.Dispose(); Portals.Dispose(); Mobs.Dispose(); Reactors.Dispose(); Drops.Dispose(); AffectedAreas.Dispose(); MiniRooms.Dispose(); Kites.Dispose(); TownPortals.Dispose(); OpenGates1.Dispose(); OpenGates2.Dispose(); CurrentWeather.Dispose(); }
public bool HasWallBetween(Point p1, Point p2) { if (p1.Y != p2.Y) { return(false); } var exactMatch = Footholds .Where(x => x.IsWall) .Where(foothold => foothold.Line.Start.X >= p1.X) .Where(foothold => foothold.Line.Start.X <= p2.X) .Where(foothold => foothold.Line.Start.Y >= p1.Y) .Any(foothold => foothold.Line.End.Y <= p1.Y); if (exactMatch) { return(true); } return(p1.X - Bounds.Lt.X > 0 && p2.X - Bounds.Lt.X < 0 || p1.X - Bounds.Lt.X < 0 && p2.X - Bounds.Lt.X > 0 || p1.X - Bounds.Rb.X > 0 && p2.X - Bounds.Rb.X < 0 || p1.X - Bounds.Rb.X < 0 && p2.X - Bounds.Rb.X > 0); }
public MapReference(WzImage img) { var name = img.Name.Remove(9); if (!int.TryParse(name, out var id)) { return; } MapleId = id; var info = img["info"]; foreach (var node in info.WzProperties) { switch (node.Name) { case "mapMark": case "cloud": case "snow": case "rain": case "fs": case "bgm": case "version": case "mapDesc": case "mapName": case "help": case "streetName": case "moveLimit": case "hideMinimap": break; case "town": IsTown = node.GetInt() > 0; break; case "mobRate": SpawnRate = node.GetDouble(); break; case "returnMap": ReturnMapId = node.GetInt(); break; case "forcedReturn": ForcedReturnMapId = node.GetInt(); break; case "fieldLimit": FieldLimit = (FieldLimitFlags)node.GetInt(); break; case "bUnableToChangeChannel": IsUnableToChangeChannel = node.GetInt() > 0; break; case "bUnableToShop": IsUnableToShop = node.GetInt() > 0; break; case "everlast": IsEverlastDrops = node.GetInt() > 0; break; case "personalShop": IsPersonalShop = node.GetInt() > 0; break; case "recovery": RecoveryHp = (byte)node.GetInt(); break; case "decHP": DecreaseHp = (byte)node.GetInt(); break; case "scrollDisable": IsScrollDisable = node.GetInt() > 0; break; case "timeLimit": TimeLimit = node.GetInt(); break; case "VRTop": VrTop = node.GetInt(); break; case "VRLeft": VrLeft = node.GetInt(); break; case "VRBottom": VrBottom = node.GetInt(); break; case "VRRight": VrRight = node.GetInt(); break; case "fieldType": FieldType = (MapFieldType)node.GetInt(); break; default: _log.Warning( $"Unknown map node Skill={MapleId} Name={node.Name} Value={node.WzValue}"); break; } } HasClock = img["clock"] != null; HasShip = img["shipObj"] != null; img["portal"]?.WzProperties?.ForEach(x => Portals.Add(new PortalReference(x))); img["seat"]?.WzProperties?.ForEach(x => Seats.Add(new SeatReference(x))); img["foothold"]?.WzProperties.SelectMany(x => x.WzProperties).SelectMany(x => x.WzProperties).ToList() .ForEach(x => Footholds.Add(new FootholdReference(x))); img["seat"]?.WzProperties?.ForEach(x => Seats.Add(new SeatReference(x))); img["life"]?.WzProperties?.ForEach(life => { var type = life["type"].GetString(); switch (type) { case "n": Npcs.Add(new MapNpcReference(life)); break; case "m": SpawnPoints.Add(new SpawnPointReference(life, LifeObjectType.Mob)); break; } }); }
public void AddFoothold(Foothold FH) { Footholds.Add(FH); }
/// <summary> /// Sends migratein packet depending on character migration status. /// Triggers OnUserEnter() for child classes /// Notifies proper social channels /// </summary> /// <param name="c"></param> public void AddClient(WvsGameClient c) { var character = c.Character; var bSendPartyMapChangeUpdate = c.MigratedIn; if (Template.HasNoPetLimit()) { character.Stats.aliPetLockerSN = new long[3]; // clear pets character.Pets.Dispose(); } if (Template.HasSummonLimit()) { MasterManager.SummonStorage.Retrieve(character.dwId); // clear incoming summons } if (c.MigratedIn) { var p = CPacket.SetField(character, c.ChannelId, c.WorldID); c.SendPacket(p); } else { c.MigratedIn = true; #if DEBUG character.Stats.nPortal = 0; //Spawn everyone in same place #else var sp = Portals.GetRandStartPoint(); if (sp != null) { var foothold = Footholds.FindBelow(sp.nX, sp.nY); if (foothold != null) { character.Stats.nPortal = (byte)sp.nIdx; character.Position.X = foothold.X1; character.Position.Y = foothold.Y1; character.Position.Foothold = foothold.Id; } } #endif //TODO: Refine our flags for production var dbFlag = (DbCharFlags)0; //dbFlag |= DbCharFlags.ALL; dbFlag |= DbCharFlags.CHARACTER; dbFlag |= DbCharFlags.MONEY; dbFlag |= DbCharFlags.INVENTORYSIZE; dbFlag |= DbCharFlags.ITEMSLOTEQUIP; dbFlag |= DbCharFlags.ITEMSLOTCONSUME; dbFlag |= DbCharFlags.ITEMSLOTINSTALL; dbFlag |= DbCharFlags.ITEMSLOTETC; dbFlag |= DbCharFlags.ITEMSLOTCASH; dbFlag |= DbCharFlags.SKILLRECORD; dbFlag |= DbCharFlags.SKILLCOOLTIME; dbFlag |= DbCharFlags.QUESTRECORD; dbFlag |= DbCharFlags.QUESTCOMPLETE; //dbFlag |= DbCharFlags.MINIGAMERECORD; dbFlag |= DbCharFlags.COUPLERECORD; dbFlag |= DbCharFlags.MONSTERBOOKCOVER; dbFlag |= DbCharFlags.MONSTERBOOKCARD; dbFlag |= DbCharFlags.QUESTRECORDEX; if (JobLogic.IsWildhunterJob(character.Stats.nJob)) { dbFlag |= DbCharFlags.WILDHUNTERINFO; } dbFlag |= DbCharFlags.MAPTRANSFER; c.SendPacket(CPacket.SetField(character, c.ChannelId, c.WorldID, Constants.LogoutGift, dbFlag)); } OnUserEnter(c.Character); if (bSendPartyMapChangeUpdate) { c.Character.NotifySocialChannels(SocialNotiflag.ChangeMap); } }