public void OnHitCastSpell(NWPlayer oPC) { NWObject oTarget = NWObject.Wrap(_.GetSpellTargetObject()); int activeWeaponSkillID = oPC.GetLocalInt("ACTIVE_WEAPON_SKILL"); if (activeWeaponSkillID <= 0) { return; } Data.Entities.Perk entity = _db.Perks.Single(x => x.PerkID == activeWeaponSkillID); IPerk perk = App.ResolveByInterface <IPerk>("Perk." + entity.JavaScriptName); if (perk.CanCastSpell(oPC, oTarget)) { perk.OnImpact(oPC, oTarget); if (oTarget.IsNPC) { ApplyEnmity(oPC, NWCreature.Wrap(oTarget.Object), entity); } } else { oPC.SendMessage(perk.CannotCastSpellMessage(oPC, oTarget) ?? "That ability cannot be used at this time."); } oPC.DeleteLocalString("ACTIVE_WEAPON_SKILL_UUID"); oPC.DeleteLocalInt("ACTIVE_WEAPON_SKILL"); }
public void OnModuleItemActivated() { NWPlayer pc = NWPlayer.Wrap(_.GetItemActivator()); NWItem item = NWItem.Wrap(_.GetItemActivated()); NWPlayer target = NWPlayer.Wrap(_.GetItemActivatedTarget()); int perkID = item.GetLocalInt("ACTIVATION_PERK_ID"); if (perkID <= 0) { return; } Data.Entities.Perk perk = _db.Perks.SingleOrDefault(x => x.PerkID == perkID); if (perk == null) { return; } IPerk perkAction = App.ResolveByInterface <IPerk>("Perk." + perk.JavaScriptName); if (perkAction == null) { return; } PlayerCharacter playerEntity = _db.PlayerCharacters.Single(x => x.PlayerID == pc.GlobalID); if (_perk.GetPCPerkLevel(pc, perk.PerkID) <= 0) { pc.SendMessage("You do not meet the prerequisites to use this ability."); return; } if (perkAction.IsHostile() && target.IsPlayer) { if (!_pvpSanctuary.IsPVPAttackAllowed(pc, target)) { return; } } if (pc.Area.Resref != target.Area.Resref || _.LineOfSightObject(pc.Object, target.Object) == 0) { pc.SendMessage("You cannot see your target."); return; } if (!perkAction.CanCastSpell(pc, target)) { pc.SendMessage(perkAction.CannotCastSpellMessage() ?? "That ability cannot be used at this time."); return; } int manaCost = perkAction.ManaCost(pc, perkAction.ManaCost(pc, perk.BaseManaCost)); if (playerEntity.CurrentMana < manaCost) { pc.SendMessage("You do not have enough mana. (Required: " + manaCost + ". You have: " + playerEntity.CurrentMana + ")"); return; } if (pc.IsBusy || pc.CurrentHP <= 0) { pc.SendMessage("You are too busy to activate that ability."); return; } // Check cooldown PCCooldown pcCooldown = _db.PCCooldowns.SingleOrDefault(x => x.PlayerID == pc.GlobalID && x.CooldownCategoryID == perk.CooldownCategoryID); if (pcCooldown == null) { pcCooldown = new PCCooldown { CooldownCategoryID = Convert.ToInt32(perk.CooldownCategoryID), DateUnlocked = DateTime.UtcNow.AddSeconds(-1), PlayerID = pc.GlobalID }; _db.PCCooldowns.Add(pcCooldown); _db.SaveChanges(); } DateTime unlockDateTime = pcCooldown.DateUnlocked; DateTime now = DateTime.UtcNow; if (unlockDateTime > now) { string timeToWait = _time.GetTimeToWaitLongIntervals(now, unlockDateTime, false); pc.SendMessage("That ability can be used again in " + timeToWait + "."); return; } // Spells w/ casting time if (perk.PerkExecutionType.PerkExecutionTypeID == (int)PerkExecutionType.Spell) { CastSpell(pc, target, perk, perkAction, perk.CooldownCategory); } // Combat Abilities w/o casting time else if (perk.PerkExecutionType.PerkExecutionTypeID == (int)PerkExecutionType.CombatAbility) { perkAction.OnImpact(pc, target); if (manaCost > 0) { playerEntity.CurrentMana = playerEntity.CurrentMana - manaCost; _db.SaveChanges(); } ApplyCooldown(pc, perk.CooldownCategory, perkAction); } // Queued Weapon Skills else if (perk.PerkExecutionType.PerkExecutionTypeID == (int)PerkExecutionType.QueuedWeaponSkill) { HandleQueueWeaponSkill(pc, perk, perkAction); } }