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); }
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); } }
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); } }
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); } }
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); }
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); }
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); }