예제 #1
0
        private Task StartRegen(PlayerStatId statId, PlayerStatId regenStatId, PlayerStatId timeStatId)
        {
            // TODO: merge regen updates with larger packets
            return(Task.Run(async() =>
            {
                while (true)
                {
                    await Task.Delay(Stats[timeStatId].Current);

                    lock (Stats)
                    {
                        if (Stats[statId].Current >= Stats[statId].Max)
                        {
                            return;
                        }

                        // TODO: Check if regen-enabled
                        Stats[statId] = AddStatRegen(statId, regenStatId);
                        Session?.FieldManager.BroadcastPacket(StatPacket.UpdateStats(Session.FieldPlayer, statId));
                        if (Party != null)
                        {
                            Party.BroadcastPacketParty(PartyPacket.UpdateHitpoints(this));
                        }
                    }
                }
            }));
        }
예제 #2
0
        public void DecreaseBase(PlayerStatId statIndex, int amount)
        {
            // Clamp Min to 0?
            PlayerStat stat = this[statIndex];

            Data[statIndex] = new PlayerStat(stat.Max - amount, stat.Min - amount, stat.Current - amount);
        }
예제 #3
0
        public void Increase(PlayerStatId statIndex, int amount)
        {
            PlayerStat stat       = this[statIndex];
            int        newCurrent = Math.Min(stat.Max, stat.Current + amount);

            Data[statIndex] = new PlayerStat(stat.Max, stat.Min, newCurrent);
        }
예제 #4
0
        private PlayerStat AddStatRegen(PlayerStatId statIndex, PlayerStatId regenStatIndex)
        {
            PlayerStat stat      = Stats[statIndex];
            int        regen     = Stats[regenStatIndex].Current;
            int        postRegen = Math.Clamp(stat.Current + regen, 0, stat.Max);

            return(new PlayerStat(stat.Max, stat.Min, postRegen));
        }
예제 #5
0
 public static void WriteStat(this PacketWriter pWriter, PlayerStatId statId, PlayerStat stat)
 {
     if (statId == PlayerStatId.Hp)
     {
         for (int i = 0; i < 3; i++)
         {
             pWriter.WriteLong(stat[i]);
         }
         return;
     }
     pWriter.Write(stat);
 }
예제 #6
0
        public void DecreaseMax(PlayerStatId statIndex, int amount)
        {
            PlayerStat stat       = this[statIndex];
            int        newMax     = Math.Clamp(stat.Max - amount, stat.Min, stat.Max);
            int        newCurrent = stat.Current - amount;

            if (statIndex == PlayerStatId.Hp || statIndex == PlayerStatId.Spirit)
            {
                newCurrent = Math.Clamp(newCurrent, 50, newMax);    // TODO: Find Hp/Sp reset formula
            }
            Data[statIndex] = new PlayerStat(newMax, stat.Min, newCurrent);
        }
예제 #7
0
        public PlayerStat this[PlayerStatId statIndex]
        {
            get
            {
                return((PlayerStat)Data[statIndex]);
            }

            set
            {
                Data[statIndex] = value;
            }
        }
예제 #8
0
 private Task OnlineTimer(PlayerStatId statId)
 {
     return(Task.Run(async() =>
     {
         await Task.Delay(60000);
         lock (Timestamps)
         {
             Timestamps.OnlineDuration += 1;
             Timestamps.LastOnline = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
             TrophyUpdate(23100001, 1);
         }
     }));
 }
예제 #9
0
        public static Packet UpdateStats(IFieldObject<Player> player, PlayerStatId statId, params PlayerStatId[] otherIds)
        {
            PacketWriter pWriter = PacketWriter.Of(SendOp.STAT);
            pWriter.WriteInt(player.ObjectId);
            pWriter.WriteEnum(StatsMode.UpdateStats);
            pWriter.WriteByte((byte) (1 + otherIds.Length));
            pWriter.WriteEnum(statId);
            pWriter.WriteStat(statId, player.Value.Stats[statId]);
            foreach (PlayerStatId otherId in otherIds)
            {
                pWriter.WriteEnum(otherId);
                pWriter.WriteStat(otherId, player.Value.Stats[otherId]);
            }

            return pWriter;
        }
예제 #10
0
        private Task StartRegen(PlayerStatId statId, PlayerStatId regenStatId, PlayerStatId timeStatId)
        {
            return(Task.Run(async() =>
            {
                await Task.Delay(Stats[timeStatId].Current);

                // TODO: Check if regen-enabled
                while (Stats[statId].Current < Stats[statId].Max)
                {
                    lock (Stats)
                    {
                        Stats[statId] = AddStatRegen(statId, regenStatId);
                        Session.Send(StatPacket.UpdateStats(Session.FieldPlayer, statId));
                    }
                    await Task.Delay(Stats[timeStatId].Current);
                }
            }));
        }
        public void Allocate(PlayerStatId statIndex)
        {
            int gainAmount = 1;

            switch (statIndex)
            {
            case PlayerStatId.Hp:
                gainAmount = 10;
                break;

            case PlayerStatId.CritRate:
                gainAmount = 3;
                break;

            default:
                break;
            }
            IncreaseMax(statIndex, gainAmount);
        }
예제 #12
0
        private Task StartRegen(PlayerStatId statId, PlayerStatId regenStatId, PlayerStatId timeStatId)
        {
            // TODO: merge regen updates with larger packets
            return(Task.Run(async() =>
            {
                while (true)
                {
                    await Task.Delay(Stats[timeStatId].Current);

                    lock (Stats)
                    {
                        if (Stats[statId].Current >= Stats[statId].Max)
                        {
                            return;
                        }

                        // TODO: Check if regen-enabled
                        Stats[statId] = AddStatRegen(statId, regenStatId);
                        Session.Send(StatPacket.UpdateStats(Session.FieldPlayer, statId));
                    }
                }
            }));
        }
예제 #13
0
        public void Decrease(PlayerStatId statIndex, int amount)
        {
            PlayerStat stat = this[statIndex];

            Data[statIndex] = new PlayerStat(stat.Max, stat.Min, stat.Current - amount);
        }
예제 #14
0
        public void IncreaseBase(PlayerStatId statIndex, int amount)
        {
            PlayerStat stat = this[statIndex];

            Data[statIndex] = new PlayerStat(stat.Max + amount, stat.Min + amount, stat.Current + amount);
        }