Esempio n. 1
0
        public int AddMesos(int value, bool isSelf = false)
        {
            var newMesos = 0;

            if (value < 0)
            {
                if ((Inventory.Mesos - value) < 0)
                {
                    newMesos = 0;
                }
                else
                {
                    newMesos = Inventory.Mesos + value;  // neg - neg = pos
                }
            }
            else
            {
                if (((long)Inventory.Mesos + value) > Int32.MaxValue)
                {
                    newMesos = Int32.MaxValue;
                }
                else
                {
                    newMesos = Inventory.Mesos + value;
                }
            }
            var mesosDiff = newMesos - Inventory.Mesos;

            Inventory.Mesos = newMesos;
            CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Mesos, Inventory.Mesos, isSelf);

            return(mesosDiff);
        }
Esempio n. 2
0
        public void ModifyHP(short value, bool sendPacket = true)
        {
            var startValue = PrimaryStats.HP;

            if ((PrimaryStats.HP + value) < 0)
            {
                PrimaryStats.HP = 0;
            }
            else if ((PrimaryStats.HP + value) > PrimaryStats.GetMaxHP(false))
            {
                PrimaryStats.HP = PrimaryStats.GetMaxHP(false);
            }
            else
            {
                PrimaryStats.HP = (short)(PrimaryStats.HP + value);
            }


            if (sendPacket)
            {
                CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Hp, PrimaryStats.HP);
            }

            if (startValue == PrimaryStats.HP)
            {
                // Doesn't matter
                return;
            }
            ModifiedHP();
        }
Esempio n. 3
0
        public void ModifyMP(short value, bool sendPacket = true)
        {
            if ((PrimaryStats.MP + value) < 0)
            {
                PrimaryStats.MP = 0;
            }
            else if ((PrimaryStats.MP + value) > PrimaryStats.GetMaxMP(false))
            {
                PrimaryStats.MP = PrimaryStats.GetMaxMP(false);
            }
            else
            {
                PrimaryStats.MP = (short)(PrimaryStats.MP + value);
            }
            if (sendPacket)
            {
                CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Mp, PrimaryStats.MP);

                /*if (this.PartyID != -1)
                 * {
                 *  MapPacket.UpdatePartyMemberMP(this);
                 *  MapPacket.ReceivePartyMemberMP(this);
                 * }*/
            }
        }
Esempio n. 4
0
 public void ModifyMaxHP(short value)
 {
     _characterLog.Info(new StatChangeLogRecord {
         value = value, type = "maxhp", add = true
     });
     PrimaryStats.MaxHP = (short)(((PrimaryStats.MaxHP + value) > Constants.MaxMaxHp) ? Constants.MaxMaxHp : (PrimaryStats.MaxHP + value));
     CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.MaxHp, PrimaryStats.MaxHP);
 }
Esempio n. 5
0
 public void SetSP(short value)
 {
     _characterLog.Info(new StatChangeLogRecord {
         value = value, type = "sp", add = false
     });
     PrimaryStats.SP = value;
     CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Sp, PrimaryStats.SP);
 }
Esempio n. 6
0
 public void SetFame(short value)
 {
     _characterLog.Info(new StatChangeLogRecord {
         value = value, type = "fame", add = false
     });
     PrimaryStats.Fame = value;
     CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Fame, value);
 }
Esempio n. 7
0
 public void SetMesos(int value, bool isSelf = false)
 {
     if (value < 0)
     {
         value = 0;
     }
     Inventory.Mesos = value;
     CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Mesos, Inventory.Mesos, isSelf);
 }
Esempio n. 8
0
 public void SetSkin(byte id)
 {
     _characterLog.Info(new StatChangeLogRecord {
         value = id, type = "skin", add = false
     });
     Skin = id;
     CharacterStatsPacket.SendStatChange(this, (byte)CharacterStatsPacket.StatFlags.Skin, id);
     MapPacket.SendAvatarModified(this, MapPacket.AvatarModFlag.Skin);
 }
Esempio n. 9
0
 public void SetHair(int id)
 {
     _characterLog.Info(new StatChangeLogRecord {
         value = id, type = "hair", add = false
     });
     Hair = id;
     CharacterStatsPacket.SendStatChange(this, (int)CharacterStatsPacket.StatFlags.Hair, id);
     MapPacket.SendAvatarModified(this, MapPacket.AvatarModFlag.Equips);//Because hair is a equip I guess
 }
Esempio n. 10
0
 public void SetFace(int id)
 {
     _characterLog.Info(new StatChangeLogRecord {
         value = id, type = "face", add = false
     });
     Face = id;
     CharacterStatsPacket.SendStatChange(this, (int)CharacterStatsPacket.StatFlags.Eyes, id);
     MapPacket.SendAvatarModified(this, MapPacket.AvatarModFlag.Face);
 }
Esempio n. 11
0
        public void SetLuk(short value)
        {
            _characterLog.Info(new StatChangeLogRecord {
                value = value, type = "luk", add = false
            });
            PrimaryStats.Luk = value;
            CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Luk, PrimaryStats.Luk);

            this.FlushDamageLog();
        }
Esempio n. 12
0
        public void SetJob(short value)
        {
            _characterLog.Info(new StatChangeLogRecord {
                value = value, type = "job", add = false
            });
            PrimaryStats.Job = value;
            CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Job, value);

            this.FlushDamageLog();
            Server.Instance.CenterConnection.UpdatePlayerJobLevel(this);
        }
Esempio n. 13
0
        public void SetLevel(byte value)
        {
            _characterLog.Info(new StatChangeLogRecord {
                value = value, type = "level", add = false
            });
            PrimaryStats.Level = value;
            CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Level, value);
            MapPacket.SendPlayerLevelupAnim(this);

            this.FlushDamageLog();
            Server.Instance.CenterConnection.UpdatePlayerJobLevel(this);
        }
Esempio n. 14
0
        public void SetMPAndMaxMP(short value, bool isBySelf = false, bool sendPacket = true)
        {
            if (value < 0)
            {
                value = 0;
            }

            SetMaxMP(value);
            PrimaryStats.MP = value;

            if (sendPacket == true)
            {
                CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Mp, value, isBySelf);
            }
        }
Esempio n. 15
0
 public void AddSP(short value)
 {
     _characterLog.Info(new StatChangeLogRecord {
         value = value, type = "sp", add = true
     });
     if (value + PrimaryStats.SP > Int16.MaxValue)
     {
         PrimaryStats.SP = Int16.MaxValue;
     }
     else
     {
         PrimaryStats.SP += value;
     }
     CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Sp, PrimaryStats.SP);
 }
Esempio n. 16
0
 public void AddAP(short value, bool isSelf = false)
 {
     _characterLog.Info(new StatChangeLogRecord {
         value = value, type = "ap", add = true
     });
     if (value + PrimaryStats.AP > Int16.MaxValue)
     {
         PrimaryStats.AP = Int16.MaxValue;
     }
     else
     {
         PrimaryStats.AP += value;
     }
     CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Ap, PrimaryStats.AP, isSelf);
 }
Esempio n. 17
0
        public void SetHPAndMaxHP(short value, bool sendPacket = true)
        {
            if (value <= 0)
            {
                value = 1;
            }

            SetMaxHP(value);
            PrimaryStats.HP = value;

            if (sendPacket == true)
            {
                CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Hp, value);
            }
        }
Esempio n. 18
0
 public void SetMaxMP(short value)
 {
     _characterLog.Info(new StatChangeLogRecord {
         value = value, type = "maxmp", add = false
     });
     if (value > Constants.MaxMaxMp)
     {
         value = Constants.MaxMaxMp;
     }
     else if (value < Constants.MinMaxMp)
     {
         value = Constants.MinMaxMp;
     }
     PrimaryStats.MaxMP = value;
     CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.MaxMp, value);
 }
Esempio n. 19
0
        public void AddLuk(short value)
        {
            _characterLog.Info(new StatChangeLogRecord {
                value = value, type = "luk", add = true
            });
            if (value + PrimaryStats.Luk > Int16.MaxValue)
            {
                PrimaryStats.Luk = Int16.MaxValue;
            }
            else
            {
                PrimaryStats.Luk += value;
            }
            CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Luk, PrimaryStats.Luk);

            this.FlushDamageLog();
        }
Esempio n. 20
0
 public void DamageMP(short amount)
 {
     PrimaryStats.MP = (short)(amount > PrimaryStats.MP ? 0 : PrimaryStats.MP - amount);
     CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Mp, PrimaryStats.MP, false);
 }
Esempio n. 21
0
        public void AddEXP(uint value, bool IsLastHit = false, bool Quest = false)
        {
            if (value == 0 || PrimaryStats.Level >= 200 || PrimaryStats.HP <= 0)
            {
                return;
            }

            var amount = (int)(value > Int32.MaxValue ? Int32.MaxValue : value);
            var amnt   = (uint)(PrimaryStats.EXP + amount);

            CharacterStatsPacket.SendGainEXP(this, amount, IsLastHit, Quest);
            var level = PrimaryStats.Level;

            var save        = false;
            var expRequired = Constants.GetLevelEXP(PrimaryStats.Level);

            if (amnt >= expRequired)
            {
                short apgain = 0;
                short spgain = 0;
                short mpgain = 0;
                short hpgain = 0;
                var   job    = (short)(PrimaryStats.Job / 100);

                var intt = PrimaryStats.GetIntAddition(true);

                amnt -= (uint)expRequired;

                level++;

                // Update EXP required...
                expRequired = Constants.GetLevelEXP(level);

                apgain += Constants.ApPerLevel;
                hpgain += RNG.Range.generate(
                    Constants.HpMpFormulaArguments[job, 0, (int)Constants.HpMpFormulaFields.HPMin],
                    Constants.HpMpFormulaArguments[job, 0, (int)Constants.HpMpFormulaFields.HPMax],
                    true
                    );

                mpgain += RNG.Range.generate(
                    Constants.HpMpFormulaArguments[job, 0, (int)Constants.HpMpFormulaFields.MPMin],
                    Constants.HpMpFormulaArguments[job, 0, (int)Constants.HpMpFormulaFields.MPMax],
                    true
                    );

                // Additional buffing through INT stats
                mpgain += (short)(
                    intt *
                    Constants.HpMpFormulaArguments[job, 0, (int)Constants.HpMpFormulaFields.MPIntStatMultiplier] /
                    200
                    );

                var improvedMaxHpIncreaseLvl = Skills.GetSkillLevel(Constants.Swordsman.Skills.ImprovedMaxHpIncrease);
                if (improvedMaxHpIncreaseLvl > 0)
                {
                    hpgain += CharacterSkills.GetSkillLevelData(Constants.Swordsman.Skills.ImprovedMaxHpIncrease, improvedMaxHpIncreaseLvl).XValue;
                }

                var improvedMaxMpIncreaseLvl = Skills.GetSkillLevel(Constants.Magician.Skills.ImprovedMaxMpIncrease);
                if (improvedMaxMpIncreaseLvl > 0)
                {
                    mpgain += CharacterSkills.GetSkillLevelData(Constants.Magician.Skills.ImprovedMaxMpIncrease, improvedMaxMpIncreaseLvl).XValue;
                }

                if (PrimaryStats.Job != 0)
                {
                    spgain = Constants.SpPerLevel;
                }

                if (level >= 200)
                {
                    amnt = 0;
                    // TODO: Announce max level!
                }

                // Overflow? lets reduce it
                if (amnt >= expRequired)
                {
                    amnt = (uint)(expRequired - 1);
                }

                _levelLog.Info(new LevelLogRecord
                {
                    level = level,
                    posX  = Position.X,
                    posY  = Position.Y,
                });

                ModifyMaxHP(hpgain);
                ModifyMaxMP(mpgain);
                SetLevel(level);
                AddAP(apgain);
                AddSP(spgain);
                ModifyHP(PrimaryStats.GetMaxHP(false));
                ModifyMP(PrimaryStats.GetMaxMP(false));
                save = true;
            }

            PrimaryStats.EXP = (int)amnt;

            // Calculate savepoints

            var stepOfSave  = CalculateSaveStep();
            var curDateTime = MasterThread.CurrentDate;

            if (!save)
            {
                if (lastSaveStep != stepOfSave)
                {
                    var levelTimeSpan = curDateTime - LastSavepoint;

                    if (levelTimeSpan.TotalSeconds >= 30)
                    {
                        _characterLog.Debug(
                            $"Saving because user reached save threshold. Current {stepOfSave} last {lastSaveStep}");
                        save          = true;
                        LastSavepoint = curDateTime;
                    }
                    else
                    {
                        AssertForHack(
                            levelTimeSpan.TotalSeconds < 20,
                            $"Getting fast EXP ({levelTimeSpan.TotalSeconds} seconds since last savepoint)",
                            levelTimeSpan.TotalSeconds < 15
                            );
                    }
                    _characterLog.Debug(
                        new SavepointLogRecord
                    {
                        level = PrimaryStats.Level,
                        posX  = Position.X,
                        posY  = Position.Y,
                        totalMillisBetween = (int)levelTimeSpan.TotalMilliseconds,
                        blocked            = save == false
                    }
                        );

                    lastSaveStep = stepOfSave;
                }
            }
            else
            {
                lastSaveStep = stepOfSave;
            }


            if (save)
            {
                LastSavepoint = curDateTime;
                Save();
            }

            CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Exp, PrimaryStats.EXP);
        }
Esempio n. 22
0
 public void SetEXP(int value)
 {
     PrimaryStats.EXP = value;
     CharacterStatsPacket.SendStatChange(this, (uint)CharacterStatsPacket.StatFlags.Exp, value);
 }