private bool AddToGroup(NebulaObject obj, List <NebulaObject> groupObjects) { var character = obj.GetComponent <PlayerCharacterObject>(); if (character != null && character.hasGroup) { if (false == ContainsGroupObject(groupObjects, obj)) { groupObjects.Add(obj); } foreach (var member in character.group.members) { NebulaObject go; if (obj.mmoWorld().TryGetObject((byte)ItemType.Avatar, member.Value.gameRefID, out go)) { if (false == ContainsGroupObject(groupObjects, go)) { groupObjects.Add(go); } } } return(true); } return(false); }
protected ConcurrentDictionary <string, Item> GetTargets(NebulaObject source, NebulaObject centerObject, float radius) { var sourceCharacter = source.Character(); return(source.mmoWorld().GetItems((item) => { if (centerObject.transform.DistanceTo(item.transform) < radius) { var damagable = item.Damagable(); var bonuses = item.Bonuses(); var character = item.Character(); bool allComponentsPresent = damagable && bonuses && character; if (allComponentsPresent) { if (item.Id != centerObject.Id && (item.Id != source.Id)) { var relation = sourceCharacter.RelationTo(character); if (relation == FractionRelation.Enemy || relation == FractionRelation.Neutral) { return true; } //} } } } return false; })); }
/// <summary> /// Get items which allowed be targets on healing when used area healing /// </summary> /// <param name="source">Who healed</param> /// <param name="target">What center object</param> /// <param name="radius">Radius where see items</param> /// <returns>Return dictionary of founded items</returns> protected ConcurrentDictionary <string, Item> GetHealTargets(NebulaObject source, NebulaObject target, float radius) { var sourceCharacter = source.Character(); return(source.mmoWorld().GetItems((item) => { float distance = target.transform.DistanceTo(item.transform); if (distance < radius) { var itemDamagable = item.Damagable(); var itemCharacter = item.Character(); var itemBonuses = item.Bonuses(); bool allItemComponentsPresent = itemDamagable && itemCharacter && itemBonuses; if (allItemComponentsPresent) { if (item.Id != target.Id && (item.Id != source.Id)) { var relation = sourceCharacter.RelationTo(itemCharacter); if (relation == FractionRelation.Friend) { return true; } } } } return false; })); }
public static bool IAmBotAndNoPlayers(this NebulaObject nebulaObject) { if (nebulaObject.IAmBot()) { if (nebulaObject.mmoWorld().playerCountOnStartFrame == 0) { return(true); } } return(false); }
public override bool TryCast(NebulaObject source, PlayerSkill skill, out Hashtable info) { info = new Hashtable(); float hpPc = skill.data.Inputs.GetValue <float>("hp_pc", 0f); float hpAlliesPc = skill.data.Inputs.GetValue <float>("hp_allies_pc", 0f); float hpRestoreTime = skill.data.Inputs.GetValue <float>("hp_pc_time", 0f); var selfDamagable = source.Damagable(); var selfCharacter = source.Character(); var selfWeapon = source.Weapon(); float selfRestoreHP = selfDamagable.maximumHealth * hpPc; float alliesRestoreHP = selfDamagable.maximumHealth * hpAlliesPc; bool mastery = RollMastery(source); if (mastery) { selfRestoreHP *= 2; alliesRestoreHP *= 2; } selfDamagable.SetRestoreHPPerSec(selfRestoreHP / hpRestoreTime, hpRestoreTime, source.Id + skill.data.Id.ToString()); var allies = source.mmoWorld().GetItems(ItemType.Avatar, (item) => { if (item.Id != source.Id) { var character = item.Character(); var damagable = item.Damagable(); if (character && damagable) { if (selfCharacter.RelationTo(character) == FractionRelation.Friend) { if (item.transform.DistanceTo(source.transform) < selfWeapon.optimalDistance) { return(true); } } } } return(false); }); foreach (var friend in allies) { friend.Value.Damagable().RestoreHealth(source, alliesRestoreHP); } return(true); }
private ConcurrentDictionary <string, Item> GetNearestEnemies(NebulaObject centerObj, NebulaObject myObj, float radius) { var myCharacter = myObj.Character(); return(centerObj.mmoWorld().GetItems(item => { if (item.Character() && item.Damagable() && item.Bonuses()) { if (centerObj.transform.DistanceTo(item.transform) <= radius) { var relation = myCharacter.RelationTo(item.Character()); if (relation == Common.FractionRelation.Enemy || relation == Common.FractionRelation.Neutral) { return true; } } } return false; })); }
protected ConcurrentDictionary <string, Item> GetEnemiesAndNeutrals(NebulaObject source, float radius) { var sourceCharacter = source.Character(); return(source.mmoWorld().GetItems((item) => { var damagable = item.Damagable(); var bonuses = item.Bonuses(); var character = item.Character(); bool allComponentsPresent = damagable && bonuses && character; if (allComponentsPresent) { var relation = sourceCharacter.RelationTo(character); if (relation == FractionRelation.Enemy || relation == FractionRelation.Neutral) { return true; } } return false; })); }
public override bool TryCast(NebulaObject source, PlayerSkill skill, out Hashtable info) { info = new Hashtable(); var targetObject = source.Target().targetObject; if (!targetObject) { return(false); } var weapon = source.Weapon(); if (Mathf.Approximately(weapon.HitProbTo(targetObject), 0f)) { log.InfoFormat("Skill {0} error: hit prob is 0", skill.data.Id.ToString("X8")); return(false); } float dmgMult = skill.GetFloatInput("dmg_mult"); float critChanceForBot = skill.GetFloatInput("crit_chance"); float maxCrit = skill.GetFloatInput("max_crit"); float time = skill.GetFloatInput("time"); float radius = skill.GetFloatInput("radius"); var character = source.Character(); var targets = source.mmoWorld().GetItems((item) => { var damagable = item.Damagable(); var itemCharacter = item.Character(); if (damagable && itemCharacter) { var relation = character.RelationTo(itemCharacter); if (relation == FractionRelation.Enemy || relation == FractionRelation.Neutral) { if (targetObject.transform.DistanceTo(item.transform) <= radius) { return(true); } } } return(false); }); bool mastery = RollMastery(source); if (mastery) { dmgMult *= 2; time *= 2; } foreach (var pTarget in targets) { WeaponHitInfo hit; var shot = weapon.Fire(pTarget.Value, out hit, skill.data.Id, dmgMult, forceShot: true); source.GetComponent <MmoMessageComponent>().SendShot(EventReceiver.OwnerAndSubscriber, shot); } float critChanceBuffValue = Mathf.Clamp(targets.Count * critChanceForBot, 0, maxCrit); if (!Mathf.Approximately(0f, critChanceBuffValue)) { Buff buff = new Buff(skill.data.Id.ToString(), null, BonusType.increase_crit_chance_on_cnt, time, critChanceBuffValue); source.Bonuses().SetBuff(buff, source); } return(true); }
public override bool TryCast(NebulaObject source, PlayerSkill skill, out Hashtable info) { info = new Hashtable(); if (NotEnemyCheck(source, skill, info)) { return(false); } var targ = source.Target().targetObject; var sourceCharacter = source.Character(); var sourceWeapon = source.Weapon(); var message = source.GetComponent <MmoMessageComponent>(); float dmgMult = skill.GetFloatInput("dmg_mult"); float radius = skill.GetFloatInput("radius"); bool mastery = RollMastery(source); if (mastery) { dmgMult *= 2; radius *= 2; } WeaponHitInfo hit; var shot = sourceWeapon.Fire(out hit, skill.data.Id, dmgMult); BonusType[] speedDebuffs = BuffUtils.GetDebuffsForParameter(BuffParameter.speed); if (hit.normalOrMissed) { message.SendShot(EventReceiver.OwnerAndSubscriber, shot); var items = source.mmoWorld().GetItems((item) => { var itemBonuses = item.Bonuses(); var itemCharacter = item.Character(); var itemDamagable = item.Damagable(); bool allComponentPresent = itemBonuses && itemCharacter && itemDamagable; if (allComponentPresent) { if (item.Id != targ.Id) { float distanceToTarg = targ.transform.DistanceTo(item.transform); if (distanceToTarg <= radius) { if (itemBonuses.ContainsAny(speedDebuffs)) { var relation = sourceCharacter.RelationTo(itemCharacter); if (relation == FractionRelation.Enemy || relation == FractionRelation.Neutral) { return(true); } } } } } return(false); }); foreach (var pitem in items) { WeaponHitInfo itemHit; var itemShot = sourceWeapon.Fire(pitem.Value, out itemHit, skill.data.Id, dmgMult); if (hit.normalOrMissed) { message.SendShot(EventReceiver.OwnerAndSubscriber, itemShot); } else { message.SendShot(EventReceiver.OwnerAndSubscriber, shot); } } return(true); } else { source.GetComponent <MmoMessageComponent>().SendShot(EventReceiver.OwnerAndSubscriber, shot); return(false); } }
private NebulaObject GetNearestFriend(NebulaObject centerObj, NebulaObject myObj, float radius) { var centerCharacter = centerObj.Character(); var myCharacter = myObj.Character(); var playerItems = centerObj.mmoWorld().GetItems(item => { if (item.getItemType() == Common.ItemType.Avatar) { if (myCharacter.RelationTo(item.Character()) == Common.FractionRelation.Friend) { if (item.Id != myObj.Id && item.Id != centerObj.Id) { return(true); } } } return(false); }); Item nearestPlayerItem = null; float curDist = float.MaxValue; foreach (var kvp in playerItems) { float dist = kvp.Value.transform.DistanceTo(centerObj.transform); if (dist < curDist) { nearestPlayerItem = kvp.Value; curDist = dist; } } if (curDist <= radius) { if (nearestPlayerItem != null) { return(nearestPlayerItem); } } var nonPlayerItems = centerObj.mmoWorld().GetItems(item => { if (item.getItemType() != Common.ItemType.Avatar) { var itemCharacter = item.Character(); var itemDamagable = item.Damagable(); var itemBonuses = item.Bonuses(); if (itemCharacter && itemDamagable && itemBonuses) { if (item.Id != myObj.Id && item.Id != centerObj.Id) { if (myCharacter.RelationTo(itemCharacter) == Common.FractionRelation.Friend) { return(true); } } } } return(false); }); Item nearestNonPlayerItem = null; curDist = float.MaxValue; foreach (var kvp in nonPlayerItems) { float dist = centerObj.transform.DistanceTo(kvp.Value.transform); if (dist < curDist) { nearestNonPlayerItem = kvp.Value; curDist = dist; } } if (curDist <= radius) { return(nearestNonPlayerItem); } return(null); }