Пример #1
0
        public IField Get(int id)
        {
            lock (this)
            {
                if (!_fields.ContainsKey(id))
                {
                    var template = _templateManager.Get <FieldTemplate>(id);

                    if (template == null)
                    {
                        return(null);
                    }

                    var generators = new List <IFieldGenerator>();
                    var field      = new Field(template, generators);

                    template.Life.ForEach(l =>
                    {
                        switch (l.Type)
                        {
                        case FieldLifeType.NPC:
                            field.Enter(new FieldNPC(_templateManager.Get <NPCTemplate>(l.ID), l.Left)
                            {
                                Position = l.Position,
                                Foothold = (short)l.FH,
                                RX0      = l.RX0,
                                RX1      = l.RX1
                            });
                            break;

                        case FieldLifeType.Monster:
                            generators.Add(new MobFieldGenerator(
                                               l,
                                               _templateManager.Get <MobTemplate>(l.ID)
                                               ));
                            break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }
                    });

                    template.Reactors.ForEach(r =>
                    {
                        generators.Add(new ReactorFieldGenerator(
                                           r,
                                           _templateManager.Get <ReactorTemplate>(r.ID)
                                           ));
                    });

                    _fields[id] = field;
                }

                return(_fields[id]);
            }
        }
Пример #2
0
        private void ApplyItemOption(ITemplateManager <ItemOptionTemplate> options, int itemOptionID, int level)
        {
            if (itemOptionID <= 0)
            {
                return;
            }
            var option = options.Get(itemOptionID);
            var data   = option.LevelData[level];

            PAD   += data.IncPAD;
            PDD   += data.IncPDD;
            MAD   += data.IncMAD;
            MDD   += data.IncMDD;
            ACC   += data.IncACC;
            EVA   += data.IncEVA;
            Speed += data.IncSpeed;
            Jump  += data.IncJump;

            Option.PADr += data.IncPADr;
            Option.PDDr += data.IncPDDr;
            Option.MADr += data.IncMADr;
            Option.MDDr += data.IncMDDr;
            Option.ACCr += data.IncACCr;
            Option.EVAr += data.IncEVAr;
        }
Пример #3
0
        public IField Get(int id)
        {
            lock (this)
            {
                if (!_fields.ContainsKey(id))
                {
                    var template = _templateManager.Get <FieldTemplate>(id);

                    if (template == null)
                    {
                        return(null);
                    }

                    var field = new Field(template);

                    field.Template.Life.ForEach(l =>
                    {
                        switch (l.Type)
                        {
                        case FieldLifeType.NPC:
                            field.Enter(new FieldNPC(_templateManager.Get <NPCTemplate>(l.ID))
                            {
                                Position   = l.Position,
                                MoveAction = l.F,
                                Foothold   = (short)l.FH,
                                RX0        = l.RX0,
                                RX1        = l.RX1
                            });
                            break;

                        case FieldLifeType.Monster:
                            break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }
                    });
                    _fields[id] = field;
                }

                return(_fields[id]);
            }
        }
Пример #4
0
        private void ApplyItemOption(ITemplateManager templates, int itemOptionID, int level)
        {
            if (itemOptionID <= 0)
            {
                return;
            }
            var option = templates.Get <ItemOptionTemplate>(itemOptionID);
            var data   = option.LevelData[level];

            STR   += data.IncSTR;
            DEX   += data.IncDEX;
            INT   += data.IncINT;
            LUK   += data.IncLUK;
            MaxHP += data.IncMaxHP;
            MaxMP += data.IncMaxMP;

            RateOption.STRr   += data.IncSTRr;
            RateOption.DEXr   += data.IncDEXr;
            RateOption.INTr   += data.IncINTr;
            RateOption.LUKr   += data.IncLUKr;
            RateOption.MaxHPr += data.IncMaxHPr;
            RateOption.MaxMPr += data.IncMaxMPr;

            PAD   += data.IncPAD;
            PDD   += data.IncPDD;
            MAD   += data.IncMAD;
            MDD   += data.IncMDD;
            ACC   += data.IncACC;
            EVA   += data.IncEVA;
            Speed += data.IncSpeed;
            Jump  += data.IncJump;

            RateOption.PADr += data.IncPADr;
            RateOption.PDDr += data.IncPDDr;
            RateOption.MADr += data.IncMADr;
            RateOption.MDDr += data.IncMDDr;
            RateOption.ACCr += data.IncACCr;
            RateOption.EVAr += data.IncEVAr;
        }
Пример #5
0
        private void ApplyItemOption(ITemplateManager <ItemOptionTemplate> options, int itemOptionID, int level)
        {
            if (itemOptionID <= 0)
            {
                return;
            }
            var option = options.Get(itemOptionID);
            var data   = option.LevelData[level];

            STR   += data.IncSTR;
            DEX   += data.IncDEX;
            INT   += data.IncINT;
            LUK   += data.IncLUK;
            MaxHP += data.IncMaxHP;
            MaxMP += data.IncMaxMP;

            Option.STRr   += data.IncSTRr;
            Option.DEXr   += data.IncDEXr;
            Option.INTr   += data.IncINTr;
            Option.LUKr   += data.IncLUKr;
            Option.MaxHPr += data.IncMaxHPr;
            Option.MaxMPr += data.IncMaxMPr;
        }
Пример #6
0
        public Commodity Get(int id)
        {
            lock (this)
            {
                if (!_commodities.ContainsKey(id))
                {
                    var       t = _templateManager.Get <CommodityTemplate>(id);
                    var       m = _templateManager.Get <ModifiedCommodityTemplate>(id);
                    Commodity c = null;

                    if (t != null)
                    {
                        c = new Commodity
                        {
                            SN             = id,
                            ItemID         = t.ItemID,
                            Count          = t.Count,
                            Priority       = t.Priority,
                            Price          = t.Price,
                            Bonus          = t.Bonus,
                            Period         = t.Period,
                            ReqPOP         = t.ReqPOP,
                            ReqLEV         = t.ReqLEV,
                            MaplePoint     = t.MaplePoint,
                            Meso           = t.Meso,
                            ForPremiumUser = t.ForPremiumUser,
                            Gender         = t.Gender,
                            OnSale         = t.OnSale,
                            Class          = t.Class,
                            Limit          = t.Limit,
                            PbCash         = t.PbCash,
                            PbPoint        = t.PbPoint,
                            PbGift         = t.PbGift
                        };

                        var p = _templateManager.Get <CashPackageTemplate>(c.ItemID);

                        if (p != null)
                        {
                            c.PackageSN = p.PackageSN;
                        }
                    }

                    if (m != null)
                    {
                        if (c == null)
                        {
                            c = new Commodity();
                        }

                        if (m.ItemID.HasValue)
                        {
                            c.ItemID = m.ItemID.Value;
                        }
                        if (m.Count.HasValue)
                        {
                            c.Count = m.Count.Value;
                        }
                        if (m.Priority.HasValue)
                        {
                            c.Priority = m.Priority.Value;
                        }
                        if (m.Price.HasValue)
                        {
                            c.Price = m.Price.Value;
                        }
                        if (m.Bonus.HasValue)
                        {
                            c.Bonus = m.Bonus.Value;
                        }
                        if (m.Period.HasValue)
                        {
                            c.Period = m.Period.Value;
                        }
                        if (m.ReqPOP.HasValue)
                        {
                            c.ReqPOP = m.ReqPOP.Value;
                        }
                        if (m.ReqLEV.HasValue)
                        {
                            c.ReqLEV = m.ReqLEV.Value;
                        }
                        if (m.MaplePoint.HasValue)
                        {
                            c.MaplePoint = m.MaplePoint.Value;
                        }
                        if (m.Meso.HasValue)
                        {
                            c.Meso = m.Meso.Value;
                        }
                        if (m.ForPremiumUser.HasValue)
                        {
                            c.ForPremiumUser = m.ForPremiumUser.Value;
                        }
                        if (m.Gender.HasValue)
                        {
                            c.Gender = Convert.ToSByte(m.Gender.Value);
                        }
                        if (m.OnSale.HasValue)
                        {
                            c.OnSale = m.OnSale.Value;
                        }
                        if (m.Class.HasValue)
                        {
                            c.Class = m.Class.Value;
                        }
                        if (m.Limit.HasValue)
                        {
                            c.Limit = m.Limit.Value;
                        }
                        if (m.PbCash.HasValue)
                        {
                            c.PbCash = m.PbCash.Value;
                        }
                        if (m.PbPoint.HasValue)
                        {
                            c.PbPoint = m.PbPoint.Value;
                        }
                        if (m.PbGift.HasValue)
                        {
                            c.PbGift = m.PbGift.Value;
                        }
                        if (m.PackageSN != null)
                        {
                            c.PackageSN = m.PackageSN;
                        }
                    }

                    c.OnSale = _templateManager.Get <NotSaleTemplate>(id) == null;

                    if (c == null)
                    {
                        return(null);
                    }
                    _commodities[id] = c;
                }

                return(_commodities[id]);
            }
        }
Пример #7
0
 public Task <IActionResult> Get([FromRoute] Guid templateId, CancellationToken cancellationToken)
 {
     return(SafeInvoke(async() => Ok(_mapper.Map <TemplateDetails>(await _templateManager.Get(templateId, cancellationToken)))));
 }
Пример #8
0
        public async Task OnTick(DateTime now)
        {
            var eventState = State;
            var nextState  = State;

            switch (State)
            {
            case ContinentState.Dormant:
                if (now > NextBoarding)
                {
                    eventState = ContinentState.Wait;
                    nextState  = ContinentState.Wait;
                }

                break;

            case ContinentState.Wait:
                if (now > NextBoarding.AddMinutes(Template.Wait))
                {
                    eventState = ContinentState.Start;
                    nextState  = ContinentState.Move;
                }

                break;

            case ContinentState.Move:
                if (NextEvent.HasValue &&
                    !EventDoing &&
                    now > NextEvent.Value)
                {
                    eventState = ContinentState.MobGen;
                }
                if (EventDoing &&
                    (now > NextBoarding
                     .AddMinutes(Template.Wait)
                     .AddMinutes(Template.EventEnd) ||
                     MoveField.GetObjects <FieldMob>().Any()))
                {
                    eventState = ContinentState.MobDestroy;
                }
                if (now > NextBoarding
                    .AddMinutes(Template.Wait)
                    .AddMinutes(Template.Required))
                {
                    eventState = ContinentState.End;
                    nextState  = ContinentState.Dormant;
                }

                break;
            }

            if (State != nextState)
            {
                State = nextState;
                Logger.Debug($"{Template.Info} continent state has been updated to {State}");
            }

            switch (eventState)
            {
            case ContinentState.Start:
                using (var p = new Packet(SendPacketOperations.CONTIMOVE))
                {
                    p.Encode <byte>((byte)ContinentState.TargetStartShipMoveField);
                    p.Encode <byte>((byte)ContinentState.Start);
                    await StartShipMoveField.BroadcastPacket(p);
                }

                await Move(WaitField, MoveField);

                break;

            case ContinentState.MobGen:
                NextEvent  = null;
                EventDoing = true;
                Logger.Debug($"{Template.Info} started the {eventState} event");

                await Task.WhenAll(((MobSummonItemTemplate)_templateManager
                                    .Get <ItemTemplate>(Template.GenMob.TemplateID)).Mobs
                                   .Select(m => _templateManager.Get <MobTemplate>(m.TemplateID))
                                   .Select(m => MoveField.Enter(new FieldMob(m)
                {
                    Position = Template.GenMob.Position
                })));

                using (var p = new Packet(SendPacketOperations.CONTIMOVE))
                {
                    p.Encode <byte>((byte)ContinentState.TargetMoveField);
                    p.Encode <byte>((byte)ContinentState.MobGen);
                    await MoveField.BroadcastPacket(p);
                }

                break;

            case ContinentState.MobDestroy:
                EventDoing = false;
                Logger.Debug($"{Template.Info} started the {eventState} event");

                await Task.WhenAll(MoveField
                                   .GetObjects <FieldMob>()
                                   .Select(m => MoveField.Leave(m)));

                using (var p = new Packet(SendPacketOperations.CONTIMOVE))
                {
                    p.Encode <byte>((byte)ContinentState.TargetMoveField);
                    p.Encode <byte>((byte)ContinentState.MobDestroy);
                    await MoveField.BroadcastPacket(p);
                }

                break;

            case ContinentState.End:
                using (var p = new Packet(SendPacketOperations.CONTIMOVE))
                {
                    p.Encode <byte>((byte)ContinentState.TargetEndShipMoveField);
                    p.Encode <byte>((byte)ContinentState.End);
                    await EndShipMoveField.BroadcastPacket(p);
                }

                await Move(MoveField, EndField);

                if (CabinField != null)
                {
                    await Move(CabinField, EndField);
                }

                NextBoarding = NextBoarding.AddMinutes(Template.Term);
                ResetEvent();
                break;
            }
        }