Exemple #1
0
        private void Load(WZObject mapNode)//WzManager wzMan)
        {
            Portals.Load(mapNode);
            Footholds.Load(mapNode);
            Npcs.Load(mapNode);

            Mobs.Load(mapNode);
            Mobs.DoMobLogic();
        }
Exemple #2
0
        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));
        }
Exemple #4
0
 /// <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);
        }
Exemple #6
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;
                }
            });
        }
Exemple #7
0
 public void AddFoothold(Foothold FH)
 {
     Footholds.Add(FH);
 }
Exemple #8
0
        /// <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);
            }
        }