Exemplo n.º 1
0
        public void RegisterPCToNPCForSkill(NWPlayer pc, NWCreature npc, int skillID)
        {
            if (!pc.IsPlayer || !pc.IsValid)
            {
                return;
            }
            if (npc.IsPlayer || npc.IsDM || !npc.IsValid)
            {
                return;
            }
            if (skillID <= 0)
            {
                return;
            }

            PCSkill pcSkill = GetPCSkill(pc, skillID);

            if (pcSkill == null)
            {
                return;
            }

            CreatureSkillRegistration reg = GetCreatureSkillRegistration(npc.GlobalID);

            reg.AddSkillRegistrationPoint(pc, skillID, pcSkill.Rank);
        }
Exemplo n.º 2
0
 private CreatureSkillRegistration GetCreatureSkillRegistration(Guid creatureUUID)
 {
     if (_cache.CreatureSkillRegistrations.ContainsKey(creatureUUID))
     {
         return(_cache.CreatureSkillRegistrations[creatureUUID]);
     }
     else
     {
         var reg = new CreatureSkillRegistration(creatureUUID);
         _cache.CreatureSkillRegistrations[creatureUUID] = reg;
         return(reg);
     }
 }
Exemplo n.º 3
0
        private static void OnHitCastSpell()
        {
            NWPlayer oPC = Object.OBJECT_SELF;

            if (!oPC.IsValid || !oPC.IsPlayer)
            {
                return;
            }
            NWItem     oSpellOrigin = (_.GetSpellCastItem());
            NWCreature oTarget      = (_.GetSpellTargetObject());

            SkillType skillType = ItemService.GetSkillTypeForItem(oSpellOrigin);

            if (skillType == SkillType.Unknown ||
                skillType == SkillType.LightArmor ||
                skillType == SkillType.HeavyArmor ||
                skillType == SkillType.ForceArmor ||
                skillType == SkillType.Shields)
            {
                return;
            }
            if (oTarget.IsPlayer || oTarget.IsDM)
            {
                return;
            }
            if (oTarget.ObjectType != OBJECT_TYPE_CREATURE)
            {
                return;
            }

            int skillID = (int)skillType;
            CreatureSkillRegistration reg = GetCreatureSkillRegistration(oTarget.GlobalID);
            int rank = GetPCSkillRank(oPC, skillID);

            reg.AddSkillRegistrationPoint(oPC, skillID, oSpellOrigin.RecommendedLevel, rank);

            // Add a registration point if a shield is equipped. This is to prevent players from swapping out a weapon for a shield
            // just before they kill an enemy.
            NWItem oShield = oPC.LeftHand;

            if (oShield.BaseItemType == BASE_ITEM_SMALLSHIELD ||
                oShield.BaseItemType == BASE_ITEM_LARGESHIELD ||
                oShield.BaseItemType == BASE_ITEM_TOWERSHIELD)
            {
                rank = GetPCSkillRank(oPC, SkillType.Shields);
                reg.AddSkillRegistrationPoint(oPC, (int)SkillType.Shields, oShield.RecommendedLevel, rank);
            }
        }
Exemplo n.º 4
0
        public void OnHitCastSpell(NWPlayer oPC)
        {
            if (!oPC.IsPlayer)
            {
                return;
            }
            NWItem     oSpellOrigin = NWItem.Wrap(_.GetSpellCastItem());
            NWCreature oTarget      = NWCreature.Wrap(_.GetSpellTargetObject());

            int skillID = GetWeaponSkillID(oSpellOrigin);

            if (skillID <= -1)
            {
                return;
            }
            if (oTarget.IsPlayer || oTarget.IsDM)
            {
                return;
            }
            if (oTarget.ObjectType != OBJECT_TYPE_CREATURE)
            {
                return;
            }

            CreatureSkillRegistration reg = GetCreatureSkillRegistration(oTarget.GlobalID);

            reg.AddSkillRegistrationPoint(oPC, skillID, oSpellOrigin.RecommendedLevel);

            // Add a registration point if a shield is equipped. This is to prevent players from swapping out a weapon for a shield
            // just before they kill an enemy.
            NWItem oShield = oPC.LeftHand;

            if (oShield.BaseItemType == BASE_ITEM_SMALLSHIELD ||
                oShield.BaseItemType == BASE_ITEM_LARGESHIELD ||
                oShield.BaseItemType == BASE_ITEM_TOWERSHIELD)
            {
                reg.AddSkillRegistrationPoint(oPC, (int)SkillType.Shields, oShield.RecommendedLevel);
            }

            if (_random.Random(100) + 1 <= 3)
            {
                _food.DecreaseHungerLevel(oPC, 1);
            }
        }
Exemplo n.º 5
0
        private void RegisterPCToNPCForSkill(NWPlayer pc, NWObject npc, int skillID)
        {
            if (!pc.IsPlayer || !pc.IsValid)
            {
                return;
            }
            if (npc.IsPlayer || npc.IsDM || !npc.IsValid)
            {
                return;
            }
            if (skillID <= 0)
            {
                return;
            }

            int rank = GetPCSkillRank(pc, skillID);

            CreatureSkillRegistration reg = GetCreatureSkillRegistration(npc.GlobalID);

            reg.AddSkillRegistrationPoint(pc, skillID, rank, rank);
        }
Exemplo n.º 6
0
        public void OnCreatureDeath(NWCreature creature)
        {
            CreatureSkillRegistration      reg        = GetCreatureSkillRegistration(creature.GlobalID);
            List <PlayerSkillRegistration> playerRegs = reg.GetAllRegistrations();
            var registration = reg.Registrations.OrderByDescending(o => o.Value.HighestRank).FirstOrDefault();

            if (registration.Value == null)
            {
                return;
            }

            int partyLevel = registration.Value.HighestRank;

            // Identify base XP using delta between party level and enemy level.
            float cr         = creature.ChallengeRating;
            int   enemyLevel = (int)(cr * 5.0f);
            int   delta      = enemyLevel - partyLevel;
            float baseXP     = 0;

            if (delta >= 6)
            {
                baseXP = 400;
            }
            else if (delta == 5)
            {
                baseXP = 350;
            }
            else if (delta == 4)
            {
                baseXP = 325;
            }
            else if (delta == 3)
            {
                baseXP = 300;
            }
            else if (delta == 2)
            {
                baseXP = 250;
            }
            else if (delta == 1)
            {
                baseXP = 225;
            }
            else if (delta == 0)
            {
                baseXP = 200;
            }
            else if (delta == -1)
            {
                baseXP = 150;
            }
            else if (delta == -2)
            {
                baseXP = 100;
            }
            else if (delta == -3)
            {
                baseXP = 50;
            }
            else if (delta == -4)
            {
                baseXP = 25;
            }

            float bonusXPPercentage = creature.GetLocalFloat("BONUS_XP_PERCENTAGE");

            if (bonusXPPercentage > 1)
            {
                bonusXPPercentage = 1;
            }
            else if (bonusXPPercentage < 0)
            {
                bonusXPPercentage = 0;
            }

            baseXP = baseXP + (baseXP * bonusXPPercentage);

            // Process each player skill registration.
            foreach (PlayerSkillRegistration preg in playerRegs)
            {
                // Rules for acquiring skill XP:
                // Player must be valid.
                // Player must be in the same area as the creature that just died.
                // Player must be within 30 meters of the creature that just died.
                if (!preg.Player.IsValid ||
                    preg.Player.Area.Resref != creature.Area.Resref ||
                    _.GetDistanceBetween(preg.Player.Object, creature.Object) > 40.0f)
                {
                    continue;
                }

                List <Tuple <int, PlayerSkillPointTracker> > skillRegs = preg.GetSkillRegistrationPoints();
                int totalPoints = preg.GetTotalSkillRegistrationPoints();

                // Retrieve all necessary PC skills up front
                int[] skillIDsToSearchFor = skillRegs.Select(x => x.Item2.SkillID).ToArray();

                var pcSkills = GetAllPCSkills(preg.Player)
                               .Where(x => skillIDsToSearchFor.Contains(x.SkillID))
                               .ToList();

                // Grant XP based on points acquired during combat.
                foreach (Tuple <int, PlayerSkillPointTracker> skreg in skillRegs)
                {
                    int skillID   = skreg.Item1;
                    int skillRank = pcSkills.Single(x => x.SkillID == skillID).Rank;

                    int points = skreg.Item2.Points;

                    float percentage = points / (float)totalPoints;
                    float skillLDP   = CalculatePartyLevelDifferencePenalty(partyLevel, skillRank);
                    float adjustedXP = baseXP * percentage * skillLDP;
                    adjustedXP = CalculateRegisteredSkillLevelAdjustedXP(adjustedXP, skillRank, skillRank);

                    GiveSkillXP(preg.Player, skillID, (int)adjustedXP);
                }

                float armorXP          = baseXP * 0.20f;
                int   lightArmorPoints = 0;
                int   heavyArmorPoints = 0;
                int   forceArmorPoints = 0;

                for (int slot = 0; slot < NUM_INVENTORY_SLOTS; slot++)
                {
                    NWItem item = _.GetItemInSlot(slot, preg.Player.Object);
                    if (item.CustomItemType == CustomItemType.LightArmor)
                    {
                        lightArmorPoints++;
                    }
                    else if (item.CustomItemType == CustomItemType.HeavyArmor)
                    {
                        heavyArmorPoints++;
                    }
                    else if (item.CustomItemType == CustomItemType.ForceArmor)
                    {
                        forceArmorPoints++;
                    }
                }
                totalPoints = lightArmorPoints + heavyArmorPoints + forceArmorPoints;
                if (totalPoints <= 0)
                {
                    continue;
                }

                int   armorRank = GetPCSkillRank(preg.Player, SkillType.LightArmor);
                float armorLDP  = CalculatePartyLevelDifferencePenalty(partyLevel, armorRank);
                float percent   = lightArmorPoints / (float)totalPoints;

                GiveSkillXP(preg.Player, SkillType.LightArmor, (int)(armorXP * percent * armorLDP));

                armorRank = GetPCSkillRank(preg.Player, SkillType.HeavyArmor);
                armorLDP  = CalculatePartyLevelDifferencePenalty(partyLevel, armorRank);
                percent   = heavyArmorPoints / (float)totalPoints;

                GiveSkillXP(preg.Player, SkillType.HeavyArmor, (int)(armorXP * percent * armorLDP));

                armorRank = GetPCSkillRank(preg.Player, SkillType.ForceArmor);
                armorLDP  = CalculatePartyLevelDifferencePenalty(partyLevel, armorRank);
                percent   = forceArmorPoints / (float)totalPoints;

                GiveSkillXP(preg.Player, SkillType.ForceArmor, (int)(armorXP * percent * armorLDP));
            }

            _cache.CreatureSkillRegistrations.Remove(creature.GlobalID);
        }
Exemplo n.º 7
0
        public void OnCreatureDeath(NWCreature creature)
        {
            CreatureSkillRegistration      reg        = GetCreatureSkillRegistration(creature.GlobalID);
            List <PlayerSkillRegistration> playerRegs = reg.GetAllRegistrations();

            foreach (PlayerSkillRegistration preg in playerRegs)
            {
                // Rules for acquiring skill XP:
                // Player must be valid.
                // Player must be in the same area as the creature that just died.
                // Player must be within 30 meters of the creature that just died.
                if (!preg.Player.IsValid ||
                    preg.Player.Area.Resref != creature.Area.Resref ||
                    _.GetDistanceBetween(preg.Player.Object, creature.Object) > 30.0f)
                {
                    continue;
                }

                float cr                 = creature.ChallengeRating;
                float baseXP             = cr * 400 + _random.Random(20);
                float moduleXPAdjustment = _.GetLocalFloat(_.GetModule(), "SKILL_SYSTEM_MODULE_XP_MODIFIER");
                if (moduleXPAdjustment <= 0.0f)
                {
                    moduleXPAdjustment = 1.0f;
                }
                baseXP = baseXP * moduleXPAdjustment;

                List <Tuple <int, PlayerSkillPointTracker> > skillRegs = preg.GetSkillRegistrationPoints();
                int  totalPoints = preg.GetTotalSkillRegistrationPoints();
                bool receivesMartialArtsPenalty = CheckForMartialArtsPenalty(skillRegs);

                // Grant XP based on points acquired during combat.
                foreach (Tuple <int, PlayerSkillPointTracker> skreg in skillRegs)
                {
                    int   skillID    = skreg.Item1;
                    int   skillRank  = GetPCSkillByID(preg.Player.GlobalID, skillID).Rank;
                    int   points     = skreg.Item2.Points;
                    float percentage = points / (float)totalPoints;
                    float adjustedXP = baseXP * percentage;
                    adjustedXP = CalculateSkillAdjustedXP(adjustedXP, skreg.Item2.RegisteredLevel, skillRank);

                    // Penalty to martial arts XP for using a shield.
                    if (skillID == (int)SkillType.MartialArts && receivesMartialArtsPenalty)
                    {
                        adjustedXP = adjustedXP * 0.4f;
                    }

                    GiveSkillXP(preg.Player, skillID, (int)(adjustedXP));
                }

                float armorXP          = baseXP * 0.20f;
                int   lightArmorPoints = 0;
                int   heavyArmorPoints = 0;

                for (int slot = 0; slot < NUM_INVENTORY_SLOTS; slot++)
                {
                    NWItem item = NWItem.Wrap(_.GetItemInSlot(slot, preg.Player.Object));
                    if (item.CustomItemType == CustomItemType.LightArmor)
                    {
                        lightArmorPoints++;
                    }
                    else if (item.CustomItemType == CustomItemType.HeavyArmor)
                    {
                        heavyArmorPoints++;
                    }
                }
                totalPoints = lightArmorPoints + heavyArmorPoints;
                if (totalPoints <= 0)
                {
                    continue;
                }

                float percent = lightArmorPoints / (float)totalPoints;
                GiveSkillXP(preg.Player, SkillType.LightArmor, (int)(armorXP * percent));

                percent = heavyArmorPoints / (float)totalPoints;
                GiveSkillXP(preg.Player, SkillType.HeavyArmor, (int)(armorXP * percent));
            }

            _state.CreatureSkillRegistrations.Remove(creature.GlobalID);
        }