public void Leave() { if (!Fight.Started) { RemoveCompanion(); Fight.Send(new GameFightRemoveTeamMemberMessage((short)Fight.Id, Team.Id, ContextualId)); if (Fight.FightType != FightTypeEnum.FIGHT_TYPE_PVP_ARENA) { Fight.Map.Instance.OnFighterRemoved(Fight.Id, Team.Id, ContextualId); } Team.RemoveFighter(this); Fight.CheckFightEnd(); Client.Character.RejoinMap(Fight.SpawnJoin, false); } else { if (HasLeft) { Client.Character.NotificationError("You already left the fight"); return; } RemoveCompanion(); if (!Dead) { Die(); } HasLeft = true; Fight.Synchronizer.Start(AknowlegeAndLeave); } }
public void HandleWeaponEffect(short cellid, List <ExtendedSpellEffect> handledEffects, FightSpellCastCriticalEnum critical) { foreach (var effect in handledEffects) { Fight.TryStartSequence(ContextualId, 1); short[] cells = ShapesProvider.Handle(effect.ZoneShape, cellid, CellId, effect.ZoneSize).ToArray(); var actors = GetAffectedActors(cells, effect.Targets); SpellEffectsHandler.Handle(this, null, effect, actors, cellid); Fight.TryEndSequence(1, 0); } Fight.CheckFightEnd(); }
public virtual void StartTurn() { if (CheckFighterDie()) { Fight.CheckFightEnd(); return; } IncrementBombs(); LastTurnPosition = CellId; UpdateBuffs(); DecrementGlyphsDuration(); ApplyFighterEvent(FighterEventType.ON_TURN_STARTED, null); Fight.Send(new GameFightTurnStartMessage(ContextualId, FightTurnEngine.TURN_TIMEMOUT / 100)); IsPlaying = true; RefreshStats(); m_turnEngine.StartTurn(); }
public void KillTeam() { bool sequence = Fight.SequencesManager.StartSequence(SequenceTypeEnum.SEQUENCE_SPELL); foreach (var fighter in GetFighters()) { fighter.Stats.CurrentLifePoints = 0; } Fight.CheckDeads(); if (sequence) { Fight.SequencesManager.EndSequence(SequenceTypeEnum.SEQUENCE_SPELL); } Fight.CheckFightEnd(); }
private bool CloseCombat(SpellLevelRecord level, MapPoint castPoint, string rawZone, ushort weaponGId = 0) { SpellCastResultEnum canCast = CanCastSpell(level, CellId, castPoint.CellId); if (canCast != SpellCastResultEnum.Ok) { OnSpellCastFailed(canCast, level); return(false); } if (OnWeaponUsedEvt != null) { OnWeaponUsedEvt(this); } Fight.SequencesManager.StartSequence(SequenceTypeEnum.SEQUENCE_WEAPON); FightSpellCastCriticalEnum fightSpellCastCriticalEnum = this.RollCriticalDice(level); bool criticalHit = fightSpellCastCriticalEnum == FightSpellCastCriticalEnum.CRITICAL_HIT; EffectInstance[] effects = (criticalHit ? level.CriticalEffects : level.Effects).ToArray(); Fight.Send(new GameActionFightCloseCombatMessage((ushort)ActionsEnum.ACTION_FIGHT_CLOSE_COMBAT, Id, false, false, 0, castPoint.CellId, (sbyte)fightSpellCastCriticalEnum, weaponGId)); SpellEffectsManager.Instance.HandleEffects(this, effects, level, castPoint, rawZone, WeaponManager.WeaponTargetMask, criticalHit); this.UseAp(level.ApCost); this.OnSpellCasted(level, CellId, fightSpellCastCriticalEnum); Fight.SequencesManager.EndSequence(SequenceTypeEnum.SEQUENCE_WEAPON); Fight.CheckDeads(); Fight.CheckFightEnd(); return(true); }
public void UsePunch(short cellid) { Fight.TryStartSequence(this.ContextualId, 2); Fighter target = Fight.GetFighter(cellid); SpellLevelRecord spell = GetSpellLevel((ushort)PUNCH_SPELL); if (target != null) { Fight.Send(new GameActionFightCloseCombatMessage(0, this.ContextualId, target.ContextualId, cellid, 0, false, 0)); var jet = CalculateJet(spell.Effects[0], FighterStats.Stats.Strength); target.TakeDamages(new TakenDamages(jet, ElementType.Earth), this.ContextualId); } else { Fight.Send(new GameActionFightCloseCombatMessage(0, this.ContextualId, 0, cellid, 0, false, 0)); } GameActionFightPointsVariation(ActionsEnum.ACTION_CHARACTER_ACTION_POINTS_USE, (short)-spell.ApCost); FighterStats.Stats.ActionPoints -= spell.ApCost; RefreshStats(); Fight.TryEndSequence(2, 0); Fight.CheckFightEnd(); }
public void AknowlegeAndLeave() { try // if two players leave at the same time, because of non acknowlege action { if (IsPlaying) { EndTurn(); } Fight.CheckFightEnd(); Fight.Send(new GameFightLeaveMessage(ContextualId)); if (Fight.Started && Fight.FightType != FightTypeEnum.FIGHT_TYPE_PVP_ARENA) { Fight.ShowFightResults(Fight.GetFightResults(GetOposedTeam().TeamColor), Client); } if (Fight.FightType == FightTypeEnum.FIGHT_TYPE_PVP_ARENA) { Client.Send(new GameRolePlayArenaRegistrationStatusMessage(false, (sbyte)PvpArenaStepEnum.ARENA_STEP_UNREGISTER, ArenaProvider.FIGHTERS_PER_TEAM)); } Client.Character.RejoinMap(Fight.SpawnJoin, false); } catch { } }
public void Leave(bool teleportToSpawn) { if (!Fight.Started) { Team.RemoveFighter(this); if (OnLeavePreFightEvt != null) { OnLeavePreFightEvt(); } if (!Fight.CheckFightEnd()) { Fight.CheckFightStart(); } if (teleportToSpawn) { Character.RejoinMap(Fight.FightType, false, Fight.SpawnJoin); } else { Character.RejoinMap(Fight.FightType, false, false); } } else { if (!Left) { if (Alive) { this.Stats.CurrentLifePoints = 0; this.Fight.CheckDeads(); } if (!Fight.Ended) { Synchronizer sync = new Synchronizer(this.Fight, new PlayableFighter[] { this }); sync.Success += delegate(Synchronizer obj) { this.OnPlayerReadyToLeave(); }; sync.Timeout += delegate(Synchronizer obj, PlayableFighter[] laggers) { this.OnPlayerReadyToLeave(); }; this.PersonalSynchronizer = sync; sync.Start(); } //if (Fight.SequencesManager.SequencesCount == 0) // OnPlayerReadyToLeave(); //else //{ // this.WaitAcknolegement = true; // this.OnSequencesAcknowleged = OnPlayerReadyToLeave; //} this.Left = true; } } }
public virtual bool CastSpellOnCell(ushort spellid, short cellid, int targetId = 0) { SpellLevelRecord spellLevl = GetSpellLevel(spellid); if (!IsPlaying) { OnSpellCastFailed(CastFailedReason.NOT_PLAYING, spellLevl); return(false); } if (Fight.Ended) { OnSpellCastFailed(CastFailedReason.FIGHT_ENDED, spellLevl); return(false); } if (!ValidState(spellLevl)) { OnSpellCastFailed(CastFailedReason.FORBIDDEN_STATE, spellLevl); return(false); } if (spellLevl.ApCost > FighterStats.Stats.ActionPoints) { OnSpellCastFailed(CastFailedReason.AP_COST, spellLevl); return(false); } if ((SpellIdEnum)spellid == SpellIdEnum.Punch) { UsingWeapon = true; bool result = UseWeapon(cellid); UsingWeapon = false; return(result); } if (targetId == 0) { var target = Fight.GetFighter(cellid); if (target != null) { targetId = target.ContextualId; } } if (!SpellHistory.CanCast(spellLevl, targetId)) { OnSpellCastFailed(CastFailedReason.CAST_LIMIT, spellLevl); return(false); } this.Fight.TryStartSequence(this.ContextualId, 1); FightSpellCastCriticalEnum critical = RollCriticalDice(spellLevl); short[] portals = new short[0];// WHAT THE F**K this.Fight.Send(new GameActionFightSpellCastMessage(0, ContextualId, targetId, cellid, (sbyte)critical, false, spellid, spellLevl.Grade, portals)); this.SpellHistory.Add(spellLevl, targetId); #region EffectHandler if (CustomSpellEffectsProvider.Exist(spellid)) { Fight.TryStartSequence(ContextualId, 1); CustomSpellEffectsProvider.Handle(spellid, spellLevl.Effects, this); Fight.TryEndSequence(1, 0); } else { HandleSpellEffects(spellLevl, cellid, critical); } #endregion FighterStats.Stats.ActionPoints -= spellLevl.ApCost; GameActionFightPointsVariation(ActionsEnum.ACTION_CHARACTER_ACTION_POINTS_USE, (short)-spellLevl.ApCost); if (CharacterRecord.GetCharacterRecordById(this.ContextualId) != null && CharacterRecord.GetCharacterRecordById(this.ContextualId).GodMod) { FighterStats.Stats.ActionPoints += spellLevl.ApCost; GameActionFightPointsVariation(ActionsEnum.ACTION_CHARACTER_ACTION_POINTS_WIN, (short)spellLevl.ApCost); } Fight.CheckFightEnd(); if (Fight.Ended) { return(true); } RefreshStats(); OnSpellCasted(spellLevl); this.Fight.TryEndSequence(1, 100); ApplyFighterEvent(FighterEventType.AFTER_USED_AP, spellLevl.ApCost); return(true); }
public override bool CastSpell(SpellCastInformations cast) { if (!IsFighterTurn() && !cast.Force) { return(false); } // not a weapon attack if (cast.Spell.Id != 0 || Character.Inventory.TryGetItem(CharacterInventoryPositionEnum.ACCESSORY_POSITION_WEAPON) == null) { return(base.CastSpell(cast)); } var weapon = Character.Inventory.TryGetItem(CharacterInventoryPositionEnum.ACCESSORY_POSITION_WEAPON); if (!(weapon.Template is WeaponTemplate weaponTemplate) || !CanUseWeapon(cast.TargetedCell, weaponTemplate)) { OnSpellCastFailed(cast); return(false); } using (Fight.StartSequence(SequenceTypeEnum.SEQUENCE_WEAPON)) { var random = new AsyncRandom(); var critical = RollCriticalDice(weaponTemplate); switch (critical) { case FightSpellCastCriticalEnum.CRITICAL_FAIL: OnWeaponUsed(weaponTemplate, cast.TargetedCell, critical, false); if (!cast.ApFree) { UseAP((short)weaponTemplate.ApCost); } PassTurn(); return(false); case FightSpellCastCriticalEnum.CRITICAL_HIT: m_criticalWeaponBonus = weaponTemplate.CriticalHitBonus; break; } m_isUsingWeapon = true; var effects = weapon.Effects.Where(entry => EffectManager.Instance.IsUnRandomableWeaponEffect(entry.EffectId)).OfType <EffectDice>(); var handlers = new List <SpellEffectHandler>(); foreach (var effect in effects) { if (effect.Random > 0) { if (random.NextDouble() > effect.Random / 100d) { // effect ignored continue; } } var handler = EffectManager.Instance.GetSpellEffectHandler(effect, this, new DefaultSpellCastHandler(cast), cast.TargetedCell, critical == FightSpellCastCriticalEnum.CRITICAL_HIT); handler.EffectZone = new Zone(weaponTemplate.Type.ZoneShape, (byte)weaponTemplate.Type.ZoneSize, (byte)weaponTemplate.Type.ZoneMinSize, handler.CastPoint.OrientationTo(handler.TargetedPoint), (int)weaponTemplate.Type.ZoneEfficiencyPercent, (int)weaponTemplate.Type.ZoneMaxEfficiency); handler.Targets = new TargetCriterion[] { new TargetTypeCriterion(SpellTargetType.ALLY_ALL_EXCEPT_SELF, false), new TargetTypeCriterion(SpellTargetType.ENEMY_ALL, false) }; // everyone but caster handlers.Add(handler); } var silentCast = handlers.Any(entry => entry.RequireSilentCast()); OnWeaponUsed(weaponTemplate, cast.TargetedCell, critical, silentCast); if (!cast.ApFree) { UseAP((short)weaponTemplate.ApCost); } foreach (var handler in handlers) { handler.Apply(); } } m_isUsingWeapon = false; m_criticalWeaponBonus = 0; // is it the right place to do that ? Fight.CheckFightEnd(); return(true); }